vp8_dx_iface.c revision 538f6170b788de7408b06efc6613dc98579aa6a6
190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdlib.h> 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <string.h> 14f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vpx_decoder.h" 15f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vp8dx.h" 16f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/internal/vpx_codec_internal.h" 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_version.h" 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyxd.h" 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyxd_int.h" 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VP8_CAP_POSTPROC (CONFIG_POSTPROC ? VPX_CODEC_CAP_POSTPROC : 0) 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_BIG_ENDIAN 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define swap4(d)\ 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((d&0x000000ff)<<24) | \ 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((d&0x0000ff00)<<8) | \ 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((d&0x00ff0000)>>8) | \ 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((d&0xff000000)>>24) 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define swap2(d)\ 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((d&0x000000ff)<<8) | \ 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ((d&0x0000ff00)>>8) 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define swap4(d) d 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define swap2(d) d 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_stream_info_t vp8_stream_info_t; 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* Structures for handling memory allocations */ 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef enum 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8_SEG_ALG_PRIV = 256, 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8_SEG_MAX 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} mem_seg_id_t; 44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NELEMENTS(x) ((int)(sizeof(x)/sizeof(x[0]))) 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t); 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int id; 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned long sz; 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int align; 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int flags; 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned long(*calc_sz)(const vpx_codec_dec_cfg_t *, vpx_codec_flags_t); 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} mem_req_t; 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const mem_req_t vp8_mem_req_segs[] = 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {VP8_SEG_ALG_PRIV, 0, 8, VPX_CODEC_MEM_ZERO, vp8_priv_sz}, 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {VP8_SEG_MAX, 0, 0, 0, NULL} 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstruct vpx_codec_alg_priv 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_priv_t base; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_mmap_t mmaps[NELEMENTS(vp8_mem_req_segs)-1]; 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_dec_cfg_t cfg; 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_stream_info_t si; 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int defer_alloc; 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int decoder_init; 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8D_PTR pbi; 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int postproc_cfg_set; 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_postproc_cfg_t postproc_cfg; 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_image_t img; 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int img_setup; 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int img_avail; 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t flags) 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Although this declaration is constant, we can't use it in the requested 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * segments list because we want to define the requested segments list 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * before defining the private type (so that the number of memory maps is 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * known) 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (void)si; 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return sizeof(vpx_codec_alg_priv_t); 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_mmap_dtor(vpx_codec_mmap_t *mmap) 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber free(mmap->priv); 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_mmap_alloc(vpx_codec_mmap_t *mmap) 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res; 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int align; 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber align = mmap->align ? mmap->align - 1 : 0; 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (mmap->flags & VPX_CODEC_MEM_ZERO) 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->priv = calloc(1, mmap->sz + align); 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->priv = malloc(mmap->sz + align); 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = (mmap->priv) ? VPX_CODEC_OK : VPX_CODEC_MEM_ERROR; 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->base = (void *)((((uintptr_t)mmap->priv) + align) & ~(uintptr_t)align); 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->dtor = vp8_mmap_dtor; 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_validate_mmaps(const vp8_stream_info_t *si, 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const vpx_codec_mmap_t *mmaps, 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_flags_t init_flags) 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < NELEMENTS(vp8_mem_req_segs) - 1; i++) 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Ensure the segment has been allocated */ 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!mmaps[i].base) 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_MEM_ERROR; 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Verify variable size segment is big enough for the current si. */ 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (vp8_mem_req_segs[i].calc_sz) 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_dec_cfg_t cfg; 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cfg.w = si->w; 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cfg.h = si->h; 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (mmaps[i].sz < vp8_mem_req_segs[i].calc_sz(&cfg, init_flags)) 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_MEM_ERROR; 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_init_ctx(vpx_codec_ctx_t *ctx, const vpx_codec_mmap_t *mmap) 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv = mmap->base; 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->sz = sizeof(*ctx->priv); 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->iface = ctx->iface; 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv = mmap->base; 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++) 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->mmaps[i].id = vp8_mem_req_segs[i].id; 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->mmaps[0] = *mmap; 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->si.sz = sizeof(ctx->priv->alg_priv->si); 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->init_flags = ctx->init_flags; 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->config.dec) 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Update the reference to the config structure to an internal copy. */ 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->cfg = *ctx->config.dec; 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->config.dec = &ctx->priv->alg_priv->cfg; 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 173538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic void *mmap_lkup(vpx_codec_alg_priv_t *ctx, unsigned int id) 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < NELEMENTS(vp8_mem_req_segs); i++) 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->mmaps[i].id == id) 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return ctx->mmaps[i].base; 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return NULL; 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_finalize_mmaps(vpx_codec_alg_priv_t *ctx) 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi = mmap_lkup(ctx, VP6_SEG_PB_INSTANCE); 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->mbi.block_dx_info[0].idct_output_ptr = mmap_lkup(ctx, VP6_SEG_IDCT_BUFFER); 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->loop_filtered_block = mmap_lkup(ctx, VP6_SEG_LF_BLOCK); 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->huff = mmap_lkup(ctx, VP6_SEG_HUFF); 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->mbi.coeffs_base_ptr = mmap_lkup(ctx, VP6_SEG_COEFFS); 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->fc.above_y = mmap_lkup(ctx, VP6_SEG_ABOVEY); 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->fc.above_u = mmap_lkup(ctx, VP6_SEG_ABOVEU); 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->fc.above_v = mmap_lkup(ctx, VP6_SEG_ABOVEV); 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->prediction_mode = mmap_lkup(ctx, VP6_SEG_PRED_MODES); 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->mbmotion_vector = mmap_lkup(ctx, VP6_SEG_MV_FIELD); 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->fb_storage_ptr[0] = mmap_lkup(ctx, VP6_SEG_IMG0_STRG); 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->fb_storage_ptr[1] = mmap_lkup(ctx, VP6_SEG_IMG1_STRG); 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->fb_storage_ptr[2] = mmap_lkup(ctx, VP6_SEG_IMG2_STRG); 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber #if CONFIG_POSTPROC 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->postproc.deblock.fragment_variances = mmap_lkup(ctx, VP6_SEG_DEBLOCKER); 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi->fb_storage_ptr[3] = mmap_lkup(ctx, VP6_SEG_PP_IMG_STRG); 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber #endif 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx) 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* This function only allocates space for the vpx_codec_alg_priv_t 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * structure. More memory may be required at the time the stream 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * information becomes known. 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->priv) 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_mmap_t mmap; 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap.id = vp8_mem_req_segs[0].id; 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap.sz = sizeof(vpx_codec_alg_priv_t); 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap.align = vp8_mem_req_segs[0].align; 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap.flags = vp8_mem_req_segs[0].flags; 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = vp8_mmap_alloc(&mmap); 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res) 226f71323e297a928af368937089d3ed71239786f86Andreas Huber { 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_init_ctx(ctx, &mmap); 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 229f71323e297a928af368937089d3ed71239786f86Andreas Huber ctx->priv->alg_priv->defer_alloc = 1; 230f71323e297a928af368937089d3ed71239786f86Andreas Huber /*post processing level initialized to do nothing */ 231f71323e297a928af368937089d3ed71239786f86Andreas Huber } 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_destroy(vpx_codec_alg_priv_t *ctx) 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8dx_remove_decompressor(ctx->pbi); 24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = NELEMENTS(ctx->mmaps) - 1; i >= 0; i--) 24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->mmaps[i].dtor) 24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].dtor(&ctx->mmaps[i]); 24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_OK; 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_peek_si(const uint8_t *data, 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int data_sz, 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_stream_info_t *si) 25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 257538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 258538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if(data + data_sz <= data) 259538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber res = VPX_CODEC_INVALID_PARAM; 260538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 262f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Parse uncompresssed part of key frame header. 263f71323e297a928af368937089d3ed71239786f86Andreas Huber * 3 bytes:- including version, frame type and an offset 264f71323e297a928af368937089d3ed71239786f86Andreas Huber * 3 bytes:- sync code (0x9d, 0x01, 0x2a) 265f71323e297a928af368937089d3ed71239786f86Andreas Huber * 4 bytes:- including image width and height in the lowest 14 bits 266f71323e297a928af368937089d3ed71239786f86Andreas Huber * of each 2-byte value. 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber si->is_kf = 0; 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (data_sz >= 10 && !(data[0] & 0x01)) /* I-Frame */ 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const uint8_t *c = data + 3; 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber si->is_kf = 1; 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 275538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* vet via sync code */ 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (c[0] != 0x9d || c[1] != 0x01 || c[2] != 0x2a) 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_UNSUP_BITSTREAM; 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber si->w = swap2(*(const unsigned short *)(c + 3)) & 0x3fff; 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber si->h = swap2(*(const unsigned short *)(c + 5)) & 0x3fff; 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 282538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*printf("w=%d, h=%d\n", si->w, si->h);*/ 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!(si->h | si->w)) 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_UNSUP_BITSTREAM; 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_UNSUP_BITSTREAM; 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_get_si(vpx_codec_alg_priv_t *ctx, 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_stream_info_t *si) 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int sz; 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (si->sz >= sizeof(vp8_stream_info_t)) 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sz = sizeof(vp8_stream_info_t); 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sz = sizeof(vpx_codec_stream_info_t); 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber memcpy(si, &ctx->si, sz); 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber si->sz = sz; 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_OK; 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberupdate_error_state(vpx_codec_alg_priv_t *ctx, 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const struct vpx_internal_error_info *error) 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res; 31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ((res = error->error_code)) 31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->base.err_detail = error->has_detail 32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ? error->detail 32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber : NULL; 32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, 32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const uint8_t *data, 32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int data_sz, 33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void *user_priv, 33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber long deadline) 33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->img_avail = 0; 33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 337538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Determine the stream parameters. Note that we rely on peek_si to 338538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * validate that we have a buffer that does not wrap around the top 339538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * of the heap. 340538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->si.h) 34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = ctx->base.iface->dec.peek_si(data, data_sz, &ctx->si); 34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Perform deferred allocations, if required */ 34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res && ctx->defer_alloc) 34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 1; !res && i < NELEMENTS(ctx->mmaps); i++) 35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_dec_cfg_t cfg; 35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cfg.w = ctx->si.w; 35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cfg.h = ctx->si.h; 35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].id = vp8_mem_req_segs[i].id; 35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].sz = vp8_mem_req_segs[i].sz; 35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].align = vp8_mem_req_segs[i].align; 35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].flags = vp8_mem_req_segs[i].flags; 36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->mmaps[i].sz) 36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].sz = vp8_mem_req_segs[i].calc_sz(&cfg, 36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->base.init_flags); 36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = vp8_mmap_alloc(&ctx->mmaps[i]); 36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res) 36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_finalize_mmaps(ctx); 37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->defer_alloc = 0; 37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Initialize the decoder instance on the first frame*/ 37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res && !ctx->decoder_init) 37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = vp8_validate_mmaps(&ctx->si, ctx->mmaps, ctx->base.init_flags); 37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res) 38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8D_CONFIG oxcf; 38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8D_PTR optr; 38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8dx_initialize(); 38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.Width = ctx->si.w; 38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.Height = ctx->si.h; 38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.Version = 9; 38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.postprocess = 0; 39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.max_threads = ctx->cfg.threads; 39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber optr = vp8dx_create_decompressor(&oxcf); 39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* If postprocessing was enabled by the application and a 39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * configuration has not been provided, default it. 39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->postproc_cfg_set 39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber && (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)) 39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg.post_proc_flag = 40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8_DEBLOCK | VP8_DEMACROBLOCK; 40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg.deblocking_level = 4; 40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg.noise_level = 0; 40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!optr) 40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_ERROR; 40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi = optr; 41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->decoder_init = 1; 41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res && ctx->pbi) 41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber YV12_BUFFER_CONFIG sd; 41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber INT64 time_stamp = 0, time_end_stamp = 0; 41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ppflag = 0; 42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ppdeblocking = 0; 42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ppnoise = 0; 42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC) 42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ppflag = ctx->postproc_cfg.post_proc_flag; 42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ppdeblocking = ctx->postproc_cfg.deblocking_level; 42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ppnoise = ctx->postproc_cfg.noise_level; 42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (vp8dx_receive_compressed_data(ctx->pbi, data_sz, data, deadline)) 43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = update_error_state(ctx, &pbi->common.error); 43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res && 0 == vp8dx_get_raw_frame(ctx->pbi, &sd, &time_stamp, &time_end_stamp, ppdeblocking, ppnoise, ppflag)) 43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Align width/height */ 43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int a_w = (sd.y_width + 15) & ~15; 44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int a_h = (sd.y_height + 15) & ~15; 44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 442f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_img_wrap(&ctx->img, VPX_IMG_FMT_I420, 44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber a_w + 2 * VP8BORDERINPIXELS, 44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber a_h + 2 * VP8BORDERINPIXELS, 44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1, 44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sd.buffer_alloc); 44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_img_set_rect(&ctx->img, 44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8BORDERINPIXELS, VP8BORDERINPIXELS, 44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sd.y_width, sd.y_height); 45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->img_avail = 1; 45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_image_t *vp8_get_frame(vpx_codec_alg_priv_t *ctx, 45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_iter_t *iter) 46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_image_t *img = NULL; 46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->img_avail) 46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* iter acts as a flip flop, so an image is only returned on the first 46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * call to get_frame. 46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!(*iter)) 46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber img = &ctx->img; 47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *iter = img; 47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return img; 47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic 48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_err_t vp8_xma_get_mmap(const vpx_codec_ctx_t *ctx, 48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_mmap_t *mmap, 48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_iter_t *iter) 48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res; 48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const mem_req_t *seg_iter = *iter; 48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Get address of next segment request */ 48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber do 48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!seg_iter) 49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber seg_iter = vp8_mem_req_segs; 49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (seg_iter->id != VP8_SEG_MAX) 49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber seg_iter++; 49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *iter = (vpx_codec_iter_t)seg_iter; 49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (seg_iter->id != VP8_SEG_MAX) 49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->id = seg_iter->id; 50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->sz = seg_iter->sz; 50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->align = seg_iter->align; 50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->flags = seg_iter->flags; 50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!seg_iter->sz) 50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->sz = seg_iter->calc_sz(ctx->config.dec, ctx->init_flags); 50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_OK; 50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_LIST_END; 51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber while (!mmap->sz && res != VPX_CODEC_LIST_END); 51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_xma_set_mmap(vpx_codec_ctx_t *ctx, 51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const vpx_codec_mmap_t *mmap) 51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_MEM_ERROR; 52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i, done; 52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->priv) 52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (mmap->id == VP8_SEG_ALG_PRIV) 52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->priv) 52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_init_ctx(ctx, mmap); 53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_OK; 53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber done = 1; 53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 537f71323e297a928af368937089d3ed71239786f86Andreas Huber if (!res && ctx->priv->alg_priv) 53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < NELEMENTS(vp8_mem_req_segs); i++) 54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->priv->alg_priv->mmaps[i].id == mmap->id) 54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->priv->alg_priv->mmaps[i].base) 54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->mmaps[i] = *mmap; 54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_OK; 54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber done &= (ctx->priv->alg_priv->mmaps[i].base != NULL); 54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (done && !res) 55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_finalize_mmaps(ctx->priv->alg_priv); 55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = ctx->iface->init(ctx); 55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, 56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber YV12_BUFFER_CONFIG *yv12) 56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 565f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->y_buffer = img->planes[VPX_PLANE_Y]; 566f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->u_buffer = img->planes[VPX_PLANE_U]; 567f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->v_buffer = img->planes[VPX_PLANE_V]; 56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber yv12->y_width = img->d_w; 57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber yv12->y_height = img->d_h; 57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber yv12->uv_width = yv12->y_width / 2; 57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber yv12->uv_height = yv12->y_height / 2; 57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 574f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->y_stride = img->stride[VPX_PLANE_Y]; 575f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->uv_stride = img->stride[VPX_PLANE_U]; 57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 577f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->border = (img->stride[VPX_PLANE_Y] - img->d_w) / 2; 578f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->clrtype = (img->fmt == VPX_IMG_FMT_VPXI420 || img->fmt == VPX_IMG_FMT_VPXYV12); 57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_set_reference(vpx_codec_alg_priv_t *ctx, 58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ctr_id, 58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_list args) 58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); 59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (data) 59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; 59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber YV12_BUFFER_CONFIG sd; 59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber image2yuvconfig(&frame->img, &sd); 59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8dx_set_reference(ctx->pbi, frame->frame_type, &sd); 59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_OK; 60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_INVALID_PARAM; 60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_get_reference(vpx_codec_alg_priv_t *ctx, 60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ctr_id, 60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_list args) 60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); 61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (data) 61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; 61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber YV12_BUFFER_CONFIG sd; 61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber image2yuvconfig(&frame->img, &sd); 61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8dx_get_reference(ctx->pbi, frame->frame_type, &sd); 62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_OK; 62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_INVALID_PARAM; 62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_set_postproc(vpx_codec_alg_priv_t *ctx, 62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ctr_id, 63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_list args) 63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *); 63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_POSTPROC 63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (data) 63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg_set = 1; 63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg = *((vp8_postproc_cfg_t *)data); 63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_OK; 64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_INVALID_PARAM; 64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_INCAPABLE; 64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_ctrl_fn_map_t vp8_ctf_maps[] = 65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {VP8_SET_REFERENCE, vp8_set_reference}, 65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {VP8_COPY_REFERENCE, vp8_get_reference}, 65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {VP8_SET_POSTPROC, vp8_set_postproc}, 65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { -1, NULL}, 65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VERSION_STRING 66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VERSION_STRING 66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 662538f6170b788de7408b06efc6613dc98579aa6a6Andreas HuberCODEC_INTERFACE(vpx_codec_vp8_dx) = 66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 664f71323e297a928af368937089d3ed71239786f86Andreas Huber "WebM Project VP8 Decoder" VERSION_STRING, 66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VPX_CODEC_INTERNAL_ABI_VERSION, 66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC, 66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* vpx_codec_caps_t caps; */ 66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_init, /* vpx_codec_init_fn_t init; */ 66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_destroy, /* vpx_codec_destroy_fn_t destroy; */ 67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */ 67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_xma_get_mmap, /* vpx_codec_get_mmap_fn_t get_mmap; */ 67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_xma_set_mmap, /* vpx_codec_set_mmap_fn_t set_mmap; */ 67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_peek_si, /* vpx_codec_peek_si_fn_t peek_si; */ 67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_get_si, /* vpx_codec_get_si_fn_t get_si; */ 67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_decode, /* vpx_codec_decode_fn_t decode; */ 67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_get_frame, /* vpx_codec_frame_get_fn_t frame_get; */ 67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber }, 679538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { /* encoder functions */ 680538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 681538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 682538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 683538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 684538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 685538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED 686538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * BEGIN BACKWARDS COMPATIBILITY SHIM. 69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_iface_t vpx_codec_vp8_algo = 69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 694f71323e297a928af368937089d3ed71239786f86Andreas Huber "WebM Project VP8 Decoder (Deprecated API)" VERSION_STRING, 69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VPX_CODEC_INTERNAL_ABI_VERSION, 69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC, 69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* vpx_codec_caps_t caps; */ 69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_init, /* vpx_codec_init_fn_t init; */ 69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_destroy, /* vpx_codec_destroy_fn_t destroy; */ 70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */ 70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_xma_get_mmap, /* vpx_codec_get_mmap_fn_t get_mmap; */ 70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_xma_set_mmap, /* vpx_codec_set_mmap_fn_t set_mmap; */ 70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_peek_si, /* vpx_codec_peek_si_fn_t peek_si; */ 70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_get_si, /* vpx_codec_get_si_fn_t get_si; */ 70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_decode, /* vpx_codec_decode_fn_t decode; */ 70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_get_frame, /* vpx_codec_frame_get_fn_t frame_get; */ 70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber }, 709538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { /* encoder functions */ 710538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 711538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 712538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 713538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 714538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 715538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED 716538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 718