vp8_dx_iface.c revision 1b362b15af34006e6a11974088a46d42b903418e
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> 141b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_rtcd.h" 15f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vpx_decoder.h" 16f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/vp8dx.h" 17f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "vpx/internal/vpx_codec_internal.h" 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_version.h" 1979f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "common/onyxd.h" 2079f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "decoder/onyxd_int.h" 211b362b15af34006e6a11974088a46d42b903418eJohann#include "common/alloccommon.h" 221b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h" 231b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 241b362b15af34006e6a11974088a46d42b903418eJohann#include "decoder/error_concealment.h" 251b362b15af34006e6a11974088a46d42b903418eJohann#endif 261b362b15af34006e6a11974088a46d42b903418eJohann#include "decoder/decoderthreading.h" 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VP8_CAP_POSTPROC (CONFIG_POSTPROC ? VPX_CODEC_CAP_POSTPROC : 0) 291b362b15af34006e6a11974088a46d42b903418eJohann#define VP8_CAP_ERROR_CONCEALMENT (CONFIG_ERROR_CONCEALMENT ? \ 301b362b15af34006e6a11974088a46d42b903418eJohann VPX_CODEC_CAP_ERROR_CONCEALMENT : 0) 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef vpx_codec_stream_info_t vp8_stream_info_t; 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* Structures for handling memory allocations */ 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef enum 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8_SEG_ALG_PRIV = 256, 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8_SEG_MAX 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} mem_seg_id_t; 40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define NELEMENTS(x) ((int)(sizeof(x)/sizeof(x[0]))) 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t); 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int id; 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned long sz; 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int align; 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int flags; 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned long(*calc_sz)(const vpx_codec_dec_cfg_t *, vpx_codec_flags_t); 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} mem_req_t; 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const mem_req_t vp8_mem_req_segs[] = 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {VP8_SEG_ALG_PRIV, 0, 8, VPX_CODEC_MEM_ZERO, vp8_priv_sz}, 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {VP8_SEG_MAX, 0, 0, 0, NULL} 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstruct vpx_codec_alg_priv 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_priv_t base; 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_mmap_t mmaps[NELEMENTS(vp8_mem_req_segs)-1]; 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_dec_cfg_t cfg; 6479f15823c34ae1e423108295e416213200bb280fAndreas Huber vp8_stream_info_t si; 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int defer_alloc; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int decoder_init; 671b362b15af34006e6a11974088a46d42b903418eJohann struct VP8D_COMP *pbi; 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int postproc_cfg_set; 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_postproc_cfg_t postproc_cfg; 7079f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER 7179f15823c34ae1e423108295e416213200bb280fAndreas Huber unsigned int dbg_postproc_flag; 7279f15823c34ae1e423108295e416213200bb280fAndreas Huber int dbg_color_ref_frame_flag; 7379f15823c34ae1e423108295e416213200bb280fAndreas Huber int dbg_color_mb_modes_flag; 7479f15823c34ae1e423108295e416213200bb280fAndreas Huber int dbg_color_b_modes_flag; 7579f15823c34ae1e423108295e416213200bb280fAndreas Huber int dbg_display_mv_flag; 7679f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_image_t img; 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int img_setup; 791b362b15af34006e6a11974088a46d42b903418eJohann void *user_priv; 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t flags) 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Although this declaration is constant, we can't use it in the requested 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * segments list because we want to define the requested segments list 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * before defining the private type (so that the number of memory maps is 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * known) 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (void)si; 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return sizeof(vpx_codec_alg_priv_t); 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_mmap_dtor(vpx_codec_mmap_t *mmap) 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber free(mmap->priv); 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_mmap_alloc(vpx_codec_mmap_t *mmap) 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res; 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int align; 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber align = mmap->align ? mmap->align - 1 : 0; 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (mmap->flags & VPX_CODEC_MEM_ZERO) 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->priv = calloc(1, mmap->sz + align); 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->priv = malloc(mmap->sz + align); 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = (mmap->priv) ? VPX_CODEC_OK : VPX_CODEC_MEM_ERROR; 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->base = (void *)((((uintptr_t)mmap->priv) + align) & ~(uintptr_t)align); 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->dtor = vp8_mmap_dtor; 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_validate_mmaps(const vp8_stream_info_t *si, 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const vpx_codec_mmap_t *mmaps, 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_flags_t init_flags) 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < NELEMENTS(vp8_mem_req_segs) - 1; i++) 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Ensure the segment has been allocated */ 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!mmaps[i].base) 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_MEM_ERROR; 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Verify variable size segment is big enough for the current si. */ 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (vp8_mem_req_segs[i].calc_sz) 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_dec_cfg_t cfg; 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cfg.w = si->w; 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cfg.h = si->h; 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (mmaps[i].sz < vp8_mem_req_segs[i].calc_sz(&cfg, init_flags)) 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_MEM_ERROR; 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_init_ctx(vpx_codec_ctx_t *ctx, const vpx_codec_mmap_t *mmap) 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv = mmap->base; 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->sz = sizeof(*ctx->priv); 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->iface = ctx->iface; 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv = mmap->base; 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++) 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->mmaps[i].id = vp8_mem_req_segs[i].id; 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->mmaps[0] = *mmap; 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->si.sz = sizeof(ctx->priv->alg_priv->si); 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->init_flags = ctx->init_flags; 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->config.dec) 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Update the reference to the config structure to an internal copy. */ 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->cfg = *ctx->config.dec; 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->config.dec = &ctx->priv->alg_priv->cfg; 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 176538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic void *mmap_lkup(vpx_codec_alg_priv_t *ctx, unsigned int id) 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18079f15823c34ae1e423108295e416213200bb280fAndreas Huber for (i = 0; i < NELEMENTS(ctx->mmaps); i++) 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->mmaps[i].id == id) 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return ctx->mmaps[i].base; 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return NULL; 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_finalize_mmaps(vpx_codec_alg_priv_t *ctx) 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 18879f15823c34ae1e423108295e416213200bb280fAndreas Huber /* nothing to clean up */ 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1911b362b15af34006e6a11974088a46d42b903418eJohannstatic vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx, 1921b362b15af34006e6a11974088a46d42b903418eJohann vpx_codec_priv_enc_mr_cfg_t *data) 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 1951b362b15af34006e6a11974088a46d42b903418eJohann (void) data; 1961b362b15af34006e6a11974088a46d42b903418eJohann 1971b362b15af34006e6a11974088a46d42b903418eJohann vpx_rtcd(); 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* This function only allocates space for the vpx_codec_alg_priv_t 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * structure. More memory may be required at the time the stream 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * information becomes known. 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->priv) 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_mmap_t mmap; 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap.id = vp8_mem_req_segs[0].id; 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap.sz = sizeof(vpx_codec_alg_priv_t); 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap.align = vp8_mem_req_segs[0].align; 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap.flags = vp8_mem_req_segs[0].flags; 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = vp8_mmap_alloc(&mmap); 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res) 215f71323e297a928af368937089d3ed71239786f86Andreas Huber { 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_init_ctx(ctx, &mmap); 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 218f71323e297a928af368937089d3ed71239786f86Andreas Huber ctx->priv->alg_priv->defer_alloc = 1; 219f71323e297a928af368937089d3ed71239786f86Andreas Huber /*post processing level initialized to do nothing */ 220f71323e297a928af368937089d3ed71239786f86Andreas Huber } 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_destroy(vpx_codec_alg_priv_t *ctx) 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8dx_remove_decompressor(ctx->pbi); 23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = NELEMENTS(ctx->mmaps) - 1; i >= 0; i--) 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->mmaps[i].dtor) 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].dtor(&ctx->mmaps[i]); 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_OK; 23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_peek_si(const uint8_t *data, 24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int data_sz, 24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_stream_info_t *si) 24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 246538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 247538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if(data + data_sz <= data) 248538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber res = VPX_CODEC_INVALID_PARAM; 249538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 251f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Parse uncompresssed part of key frame header. 252f71323e297a928af368937089d3ed71239786f86Andreas Huber * 3 bytes:- including version, frame type and an offset 253f71323e297a928af368937089d3ed71239786f86Andreas Huber * 3 bytes:- sync code (0x9d, 0x01, 0x2a) 254f71323e297a928af368937089d3ed71239786f86Andreas Huber * 4 bytes:- including image width and height in the lowest 14 bits 255f71323e297a928af368937089d3ed71239786f86Andreas Huber * of each 2-byte value. 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber si->is_kf = 0; 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (data_sz >= 10 && !(data[0] & 0x01)) /* I-Frame */ 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const uint8_t *c = data + 3; 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber si->is_kf = 1; 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 264538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* vet via sync code */ 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (c[0] != 0x9d || c[1] != 0x01 || c[2] != 0x2a) 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_UNSUP_BITSTREAM; 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26879f15823c34ae1e423108295e416213200bb280fAndreas Huber si->w = (c[3] | (c[4] << 8)) & 0x3fff; 26979f15823c34ae1e423108295e416213200bb280fAndreas Huber si->h = (c[5] | (c[6] << 8)) & 0x3fff; 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 271538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*printf("w=%d, h=%d\n", si->w, si->h);*/ 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!(si->h | si->w)) 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_UNSUP_BITSTREAM; 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_UNSUP_BITSTREAM; 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_get_si(vpx_codec_alg_priv_t *ctx, 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_stream_info_t *si) 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int sz; 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (si->sz >= sizeof(vp8_stream_info_t)) 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sz = sizeof(vp8_stream_info_t); 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sz = sizeof(vpx_codec_stream_info_t); 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber memcpy(si, &ctx->si, sz); 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber si->sz = sz; 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_OK; 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberupdate_error_state(vpx_codec_alg_priv_t *ctx, 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const struct vpx_internal_error_info *error) 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res; 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ((res = error->error_code)) 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->base.err_detail = error->has_detail 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ? error->detail 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber : NULL; 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3151b362b15af34006e6a11974088a46d42b903418eJohannstatic void yuvconfig2image(vpx_image_t *img, 3161b362b15af34006e6a11974088a46d42b903418eJohann const YV12_BUFFER_CONFIG *yv12, 3171b362b15af34006e6a11974088a46d42b903418eJohann void *user_priv) 3181b362b15af34006e6a11974088a46d42b903418eJohann{ 3191b362b15af34006e6a11974088a46d42b903418eJohann /** vpx_img_wrap() doesn't allow specifying independent strides for 3201b362b15af34006e6a11974088a46d42b903418eJohann * the Y, U, and V planes, nor other alignment adjustments that 3211b362b15af34006e6a11974088a46d42b903418eJohann * might be representable by a YV12_BUFFER_CONFIG, so we just 3221b362b15af34006e6a11974088a46d42b903418eJohann * initialize all the fields.*/ 3231b362b15af34006e6a11974088a46d42b903418eJohann img->fmt = yv12->clrtype == REG_YUV ? 3241b362b15af34006e6a11974088a46d42b903418eJohann VPX_IMG_FMT_I420 : VPX_IMG_FMT_VPXI420; 3251b362b15af34006e6a11974088a46d42b903418eJohann img->w = yv12->y_stride; 3261b362b15af34006e6a11974088a46d42b903418eJohann img->h = (yv12->y_height + 2 * VP8BORDERINPIXELS + 15) & ~15; 3271b362b15af34006e6a11974088a46d42b903418eJohann img->d_w = yv12->y_width; 3281b362b15af34006e6a11974088a46d42b903418eJohann img->d_h = yv12->y_height; 3291b362b15af34006e6a11974088a46d42b903418eJohann img->x_chroma_shift = 1; 3301b362b15af34006e6a11974088a46d42b903418eJohann img->y_chroma_shift = 1; 3311b362b15af34006e6a11974088a46d42b903418eJohann img->planes[VPX_PLANE_Y] = yv12->y_buffer; 3321b362b15af34006e6a11974088a46d42b903418eJohann img->planes[VPX_PLANE_U] = yv12->u_buffer; 3331b362b15af34006e6a11974088a46d42b903418eJohann img->planes[VPX_PLANE_V] = yv12->v_buffer; 3341b362b15af34006e6a11974088a46d42b903418eJohann img->planes[VPX_PLANE_ALPHA] = NULL; 3351b362b15af34006e6a11974088a46d42b903418eJohann img->stride[VPX_PLANE_Y] = yv12->y_stride; 3361b362b15af34006e6a11974088a46d42b903418eJohann img->stride[VPX_PLANE_U] = yv12->uv_stride; 3371b362b15af34006e6a11974088a46d42b903418eJohann img->stride[VPX_PLANE_V] = yv12->uv_stride; 3381b362b15af34006e6a11974088a46d42b903418eJohann img->stride[VPX_PLANE_ALPHA] = yv12->y_stride; 3391b362b15af34006e6a11974088a46d42b903418eJohann img->bps = 12; 3401b362b15af34006e6a11974088a46d42b903418eJohann img->user_priv = user_priv; 3411b362b15af34006e6a11974088a46d42b903418eJohann img->img_data = yv12->buffer_alloc; 3421b362b15af34006e6a11974088a46d42b903418eJohann img->img_data_owner = 0; 3431b362b15af34006e6a11974088a46d42b903418eJohann img->self_allocd = 0; 3441b362b15af34006e6a11974088a46d42b903418eJohann} 34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, 34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const uint8_t *data, 34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned int data_sz, 34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void *user_priv, 35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber long deadline) 35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 3531b362b15af34006e6a11974088a46d42b903418eJohann unsigned int resolution_change = 0; 3541b362b15af34006e6a11974088a46d42b903418eJohann unsigned int w, h; 35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 356538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Determine the stream parameters. Note that we rely on peek_si to 357538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * validate that we have a buffer that does not wrap around the top 358538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * of the heap. 359538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 3601b362b15af34006e6a11974088a46d42b903418eJohann w = ctx->si.w; 3611b362b15af34006e6a11974088a46d42b903418eJohann h = ctx->si.h; 3621b362b15af34006e6a11974088a46d42b903418eJohann 3631b362b15af34006e6a11974088a46d42b903418eJohann res = ctx->base.iface->dec.peek_si(data, data_sz, &ctx->si); 3641b362b15af34006e6a11974088a46d42b903418eJohann 3651b362b15af34006e6a11974088a46d42b903418eJohann if((res == VPX_CODEC_UNSUP_BITSTREAM) && !ctx->si.is_kf) 3661b362b15af34006e6a11974088a46d42b903418eJohann { 3671b362b15af34006e6a11974088a46d42b903418eJohann /* the peek function returns an error for non keyframes, however for 3681b362b15af34006e6a11974088a46d42b903418eJohann * this case, it is not an error */ 3691b362b15af34006e6a11974088a46d42b903418eJohann res = VPX_CODEC_OK; 3701b362b15af34006e6a11974088a46d42b903418eJohann } 3711b362b15af34006e6a11974088a46d42b903418eJohann 3721b362b15af34006e6a11974088a46d42b903418eJohann if(!ctx->decoder_init && !ctx->si.is_kf) 3731b362b15af34006e6a11974088a46d42b903418eJohann res = VPX_CODEC_UNSUP_BITSTREAM; 37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3751b362b15af34006e6a11974088a46d42b903418eJohann if ((ctx->si.h != h) || (ctx->si.w != w)) 3761b362b15af34006e6a11974088a46d42b903418eJohann resolution_change = 1; 37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Perform deferred allocations, if required */ 37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res && ctx->defer_alloc) 38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 1; !res && i < NELEMENTS(ctx->mmaps); i++) 38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_dec_cfg_t cfg; 38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cfg.w = ctx->si.w; 38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cfg.h = ctx->si.h; 38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].id = vp8_mem_req_segs[i].id; 39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].sz = vp8_mem_req_segs[i].sz; 39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].align = vp8_mem_req_segs[i].align; 39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].flags = vp8_mem_req_segs[i].flags; 39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->mmaps[i].sz) 39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->mmaps[i].sz = vp8_mem_req_segs[i].calc_sz(&cfg, 39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->base.init_flags); 39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = vp8_mmap_alloc(&ctx->mmaps[i]); 39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res) 40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_finalize_mmaps(ctx); 40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->defer_alloc = 0; 40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Initialize the decoder instance on the first frame*/ 40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res && !ctx->decoder_init) 40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = vp8_validate_mmaps(&ctx->si, ctx->mmaps, ctx->base.init_flags); 41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res) 41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8D_CONFIG oxcf; 4151b362b15af34006e6a11974088a46d42b903418eJohann struct VP8D_COMP* optr; 41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.Width = ctx->si.w; 41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.Height = ctx->si.h; 41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.Version = 9; 42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.postprocess = 0; 42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oxcf.max_threads = ctx->cfg.threads; 4221b362b15af34006e6a11974088a46d42b903418eJohann oxcf.error_concealment = 4231b362b15af34006e6a11974088a46d42b903418eJohann (ctx->base.init_flags & VPX_CODEC_USE_ERROR_CONCEALMENT); 4241b362b15af34006e6a11974088a46d42b903418eJohann oxcf.input_fragments = 4251b362b15af34006e6a11974088a46d42b903418eJohann (ctx->base.init_flags & VPX_CODEC_USE_INPUT_FRAGMENTS); 42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber optr = vp8dx_create_decompressor(&oxcf); 42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* If postprocessing was enabled by the application and a 43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * configuration has not been provided, default it. 43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->postproc_cfg_set 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber && (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)) 43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg.post_proc_flag = 4361b362b15af34006e6a11974088a46d42b903418eJohann VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE; 43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg.deblocking_level = 4; 43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg.noise_level = 0; 43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!optr) 44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_ERROR; 44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->pbi = optr; 44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->decoder_init = 1; 44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!res && ctx->pbi) 45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 4521b362b15af34006e6a11974088a46d42b903418eJohann if(resolution_change) 4531b362b15af34006e6a11974088a46d42b903418eJohann { 4541b362b15af34006e6a11974088a46d42b903418eJohann VP8D_COMP *pbi = ctx->pbi; 4551b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *const pc = & pbi->common; 4561b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *const xd = & pbi->mb; 4571b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD 4581b362b15af34006e6a11974088a46d42b903418eJohann int i; 4591b362b15af34006e6a11974088a46d42b903418eJohann#endif 4601b362b15af34006e6a11974088a46d42b903418eJohann pc->Width = ctx->si.w; 4611b362b15af34006e6a11974088a46d42b903418eJohann pc->Height = ctx->si.h; 4621b362b15af34006e6a11974088a46d42b903418eJohann { 4631b362b15af34006e6a11974088a46d42b903418eJohann int prev_mb_rows = pc->mb_rows; 4641b362b15af34006e6a11974088a46d42b903418eJohann 4651b362b15af34006e6a11974088a46d42b903418eJohann if (setjmp(pbi->common.error.jmp)) 4661b362b15af34006e6a11974088a46d42b903418eJohann { 4671b362b15af34006e6a11974088a46d42b903418eJohann pbi->common.error.setjmp = 0; 4681b362b15af34006e6a11974088a46d42b903418eJohann /* same return value as used in vp8dx_receive_compressed_data */ 4691b362b15af34006e6a11974088a46d42b903418eJohann return -1; 4701b362b15af34006e6a11974088a46d42b903418eJohann } 4711b362b15af34006e6a11974088a46d42b903418eJohann 4721b362b15af34006e6a11974088a46d42b903418eJohann pbi->common.error.setjmp = 1; 4731b362b15af34006e6a11974088a46d42b903418eJohann 4741b362b15af34006e6a11974088a46d42b903418eJohann if (pc->Width <= 0) 4751b362b15af34006e6a11974088a46d42b903418eJohann { 4761b362b15af34006e6a11974088a46d42b903418eJohann pc->Width = w; 4771b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 4781b362b15af34006e6a11974088a46d42b903418eJohann "Invalid frame width"); 4791b362b15af34006e6a11974088a46d42b903418eJohann } 4801b362b15af34006e6a11974088a46d42b903418eJohann 4811b362b15af34006e6a11974088a46d42b903418eJohann if (pc->Height <= 0) 4821b362b15af34006e6a11974088a46d42b903418eJohann { 4831b362b15af34006e6a11974088a46d42b903418eJohann pc->Height = h; 4841b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 4851b362b15af34006e6a11974088a46d42b903418eJohann "Invalid frame height"); 4861b362b15af34006e6a11974088a46d42b903418eJohann } 4871b362b15af34006e6a11974088a46d42b903418eJohann 4881b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_alloc_frame_buffers(pc, pc->Width, pc->Height)) 4891b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 4901b362b15af34006e6a11974088a46d42b903418eJohann "Failed to allocate frame buffers"); 4911b362b15af34006e6a11974088a46d42b903418eJohann 4921b362b15af34006e6a11974088a46d42b903418eJohann xd->pre = pc->yv12_fb[pc->lst_fb_idx]; 4931b362b15af34006e6a11974088a46d42b903418eJohann xd->dst = pc->yv12_fb[pc->new_fb_idx]; 4941b362b15af34006e6a11974088a46d42b903418eJohann 4951b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD 4961b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < pbi->allocated_decoding_thread_count; i++) 4971b362b15af34006e6a11974088a46d42b903418eJohann { 4981b362b15af34006e6a11974088a46d42b903418eJohann pbi->mb_row_di[i].mbd.dst = pc->yv12_fb[pc->new_fb_idx]; 4991b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_block_doffsets(&pbi->mb_row_di[i].mbd); 5001b362b15af34006e6a11974088a46d42b903418eJohann } 5011b362b15af34006e6a11974088a46d42b903418eJohann#endif 5021b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_block_doffsets(&pbi->mb); 5031b362b15af34006e6a11974088a46d42b903418eJohann 5041b362b15af34006e6a11974088a46d42b903418eJohann /* allocate memory for last frame MODE_INFO array */ 5051b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 5061b362b15af34006e6a11974088a46d42b903418eJohann 5071b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_enabled) 5081b362b15af34006e6a11974088a46d42b903418eJohann { 5091b362b15af34006e6a11974088a46d42b903418eJohann /* old prev_mip was released by vp8_de_alloc_frame_buffers() 5101b362b15af34006e6a11974088a46d42b903418eJohann * called in vp8_alloc_frame_buffers() */ 5111b362b15af34006e6a11974088a46d42b903418eJohann pc->prev_mip = vpx_calloc( 5121b362b15af34006e6a11974088a46d42b903418eJohann (pc->mb_cols + 1) * (pc->mb_rows + 1), 5131b362b15af34006e6a11974088a46d42b903418eJohann sizeof(MODE_INFO)); 5141b362b15af34006e6a11974088a46d42b903418eJohann 5151b362b15af34006e6a11974088a46d42b903418eJohann if (!pc->prev_mip) 5161b362b15af34006e6a11974088a46d42b903418eJohann { 5171b362b15af34006e6a11974088a46d42b903418eJohann vp8_de_alloc_frame_buffers(pc); 5181b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 5191b362b15af34006e6a11974088a46d42b903418eJohann "Failed to allocate" 5201b362b15af34006e6a11974088a46d42b903418eJohann "last frame MODE_INFO array"); 5211b362b15af34006e6a11974088a46d42b903418eJohann } 5221b362b15af34006e6a11974088a46d42b903418eJohann 5231b362b15af34006e6a11974088a46d42b903418eJohann pc->prev_mi = pc->prev_mip + pc->mode_info_stride + 1; 5241b362b15af34006e6a11974088a46d42b903418eJohann 5251b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_alloc_overlap_lists(pbi)) 5261b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 5271b362b15af34006e6a11974088a46d42b903418eJohann "Failed to allocate overlap lists " 5281b362b15af34006e6a11974088a46d42b903418eJohann "for error concealment"); 5291b362b15af34006e6a11974088a46d42b903418eJohann } 5301b362b15af34006e6a11974088a46d42b903418eJohann 5311b362b15af34006e6a11974088a46d42b903418eJohann#endif 5321b362b15af34006e6a11974088a46d42b903418eJohann 5331b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD 5341b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->b_multithreaded_rd) 5351b362b15af34006e6a11974088a46d42b903418eJohann vp8mt_alloc_temp_buffers(pbi, pc->Width, prev_mb_rows); 5361b362b15af34006e6a11974088a46d42b903418eJohann#else 5371b362b15af34006e6a11974088a46d42b903418eJohann (void)prev_mb_rows; 5381b362b15af34006e6a11974088a46d42b903418eJohann#endif 5391b362b15af34006e6a11974088a46d42b903418eJohann } 5401b362b15af34006e6a11974088a46d42b903418eJohann 5411b362b15af34006e6a11974088a46d42b903418eJohann pbi->common.error.setjmp = 0; 5421b362b15af34006e6a11974088a46d42b903418eJohann 5431b362b15af34006e6a11974088a46d42b903418eJohann /* required to get past the first get_free_fb() call */ 5441b362b15af34006e6a11974088a46d42b903418eJohann ctx->pbi->common.fb_idx_ref_cnt[0] = 0; 5451b362b15af34006e6a11974088a46d42b903418eJohann } 5461b362b15af34006e6a11974088a46d42b903418eJohann 5471b362b15af34006e6a11974088a46d42b903418eJohann ctx->user_priv = user_priv; 5481b362b15af34006e6a11974088a46d42b903418eJohann if (vp8dx_receive_compressed_data(ctx->pbi, data_sz, data, deadline)) 5491b362b15af34006e6a11974088a46d42b903418eJohann { 5501b362b15af34006e6a11974088a46d42b903418eJohann VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; 5511b362b15af34006e6a11974088a46d42b903418eJohann res = update_error_state(ctx, &pbi->common.error); 5521b362b15af34006e6a11974088a46d42b903418eJohann } 5531b362b15af34006e6a11974088a46d42b903418eJohann } 5541b362b15af34006e6a11974088a46d42b903418eJohann 5551b362b15af34006e6a11974088a46d42b903418eJohann return res; 5561b362b15af34006e6a11974088a46d42b903418eJohann} 5571b362b15af34006e6a11974088a46d42b903418eJohann 5581b362b15af34006e6a11974088a46d42b903418eJohannstatic vpx_image_t *vp8_get_frame(vpx_codec_alg_priv_t *ctx, 5591b362b15af34006e6a11974088a46d42b903418eJohann vpx_codec_iter_t *iter) 5601b362b15af34006e6a11974088a46d42b903418eJohann{ 5611b362b15af34006e6a11974088a46d42b903418eJohann vpx_image_t *img = NULL; 5621b362b15af34006e6a11974088a46d42b903418eJohann 5631b362b15af34006e6a11974088a46d42b903418eJohann /* iter acts as a flip flop, so an image is only returned on the first 5641b362b15af34006e6a11974088a46d42b903418eJohann * call to get_frame. 5651b362b15af34006e6a11974088a46d42b903418eJohann */ 5661b362b15af34006e6a11974088a46d42b903418eJohann if (!(*iter)) 5671b362b15af34006e6a11974088a46d42b903418eJohann { 56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber YV12_BUFFER_CONFIG sd; 5691b362b15af34006e6a11974088a46d42b903418eJohann int64_t time_stamp = 0, time_end_stamp = 0; 57079f15823c34ae1e423108295e416213200bb280fAndreas Huber vp8_ppflags_t flags = {0}; 57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC) 57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 57479f15823c34ae1e423108295e416213200bb280fAndreas Huber flags.post_proc_flag= ctx->postproc_cfg.post_proc_flag 57579f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER 57679f15823c34ae1e423108295e416213200bb280fAndreas Huber 57779f15823c34ae1e423108295e416213200bb280fAndreas Huber | ((ctx->dbg_color_ref_frame_flag != 0) ? VP8D_DEBUG_CLR_FRM_REF_BLKS : 0) 57879f15823c34ae1e423108295e416213200bb280fAndreas Huber | ((ctx->dbg_color_mb_modes_flag != 0) ? VP8D_DEBUG_CLR_BLK_MODES : 0) 57979f15823c34ae1e423108295e416213200bb280fAndreas Huber | ((ctx->dbg_color_b_modes_flag != 0) ? VP8D_DEBUG_CLR_BLK_MODES : 0) 58079f15823c34ae1e423108295e416213200bb280fAndreas Huber | ((ctx->dbg_display_mv_flag != 0) ? VP8D_DEBUG_DRAW_MV : 0) 58179f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif 58279f15823c34ae1e423108295e416213200bb280fAndreas Huber ; 58379f15823c34ae1e423108295e416213200bb280fAndreas Huber flags.deblocking_level = ctx->postproc_cfg.deblocking_level; 58479f15823c34ae1e423108295e416213200bb280fAndreas Huber flags.noise_level = ctx->postproc_cfg.noise_level; 58579f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER 58679f15823c34ae1e423108295e416213200bb280fAndreas Huber flags.display_ref_frame_flag= ctx->dbg_color_ref_frame_flag; 58779f15823c34ae1e423108295e416213200bb280fAndreas Huber flags.display_mb_modes_flag = ctx->dbg_color_mb_modes_flag; 58879f15823c34ae1e423108295e416213200bb280fAndreas Huber flags.display_b_modes_flag = ctx->dbg_color_b_modes_flag; 58979f15823c34ae1e423108295e416213200bb280fAndreas Huber flags.display_mv_flag = ctx->dbg_display_mv_flag; 59079f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif 59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5931b362b15af34006e6a11974088a46d42b903418eJohann if (0 == vp8dx_get_raw_frame(ctx->pbi, &sd, &time_stamp, &time_end_stamp, &flags)) 59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 5951b362b15af34006e6a11974088a46d42b903418eJohann yuvconfig2image(&ctx->img, &sd, ctx->user_priv); 59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber img = &ctx->img; 59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *iter = img; 59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return img; 60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic 60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_err_t vp8_xma_get_mmap(const vpx_codec_ctx_t *ctx, 60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_mmap_t *mmap, 60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_iter_t *iter) 61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res; 61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const mem_req_t *seg_iter = *iter; 61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* Get address of next segment request */ 61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber do 61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!seg_iter) 61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber seg_iter = vp8_mem_req_segs; 61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (seg_iter->id != VP8_SEG_MAX) 62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber seg_iter++; 62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *iter = (vpx_codec_iter_t)seg_iter; 62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (seg_iter->id != VP8_SEG_MAX) 62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->id = seg_iter->id; 62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->sz = seg_iter->sz; 62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->align = seg_iter->align; 62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->flags = seg_iter->flags; 63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!seg_iter->sz) 63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mmap->sz = seg_iter->calc_sz(ctx->config.dec, ctx->init_flags); 63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_OK; 63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_LIST_END; 63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber while (!mmap->sz && res != VPX_CODEC_LIST_END); 64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_xma_set_mmap(vpx_codec_ctx_t *ctx, 64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber const vpx_codec_mmap_t *mmap) 64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_MEM_ERROR; 64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i, done; 64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->priv) 65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (mmap->id == VP8_SEG_ALG_PRIV) 65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->priv) 65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_init_ctx(ctx, mmap); 65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_OK; 65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber done = 1; 66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 664f71323e297a928af368937089d3ed71239786f86Andreas Huber if (!res && ctx->priv->alg_priv) 66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 66679f15823c34ae1e423108295e416213200bb280fAndreas Huber for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++) 66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ctx->priv->alg_priv->mmaps[i].id == mmap->id) 66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!ctx->priv->alg_priv->mmaps[i].base) 67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->priv->alg_priv->mmaps[i] = *mmap; 67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber res = VPX_CODEC_OK; 67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber done &= (ctx->priv->alg_priv->mmaps[i].base != NULL); 67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (done && !res) 68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_finalize_mmaps(ctx->priv->alg_priv); 6821b362b15af34006e6a11974088a46d42b903418eJohann res = ctx->iface->init(ctx, NULL); 68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, 68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber YV12_BUFFER_CONFIG *yv12) 69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_codec_err_t res = VPX_CODEC_OK; 692f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->y_buffer = img->planes[VPX_PLANE_Y]; 693f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->u_buffer = img->planes[VPX_PLANE_U]; 694f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->v_buffer = img->planes[VPX_PLANE_V]; 69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber yv12->y_width = img->d_w; 69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber yv12->y_height = img->d_h; 69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber yv12->uv_width = yv12->y_width / 2; 69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber yv12->uv_height = yv12->y_height / 2; 70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 701f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->y_stride = img->stride[VPX_PLANE_Y]; 702f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->uv_stride = img->stride[VPX_PLANE_U]; 70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 704f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->border = (img->stride[VPX_PLANE_Y] - img->d_w) / 2; 705f71323e297a928af368937089d3ed71239786f86Andreas Huber yv12->clrtype = (img->fmt == VPX_IMG_FMT_VPXI420 || img->fmt == VPX_IMG_FMT_VPXYV12); 70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return res; 70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_set_reference(vpx_codec_alg_priv_t *ctx, 71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ctr_id, 71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_list args) 71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); 71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (data) 71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; 72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber YV12_BUFFER_CONFIG sd; 72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber image2yuvconfig(&frame->img, &sd); 72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7251b362b15af34006e6a11974088a46d42b903418eJohann return vp8dx_set_reference(ctx->pbi, frame->frame_type, &sd); 72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_INVALID_PARAM; 72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_get_reference(vpx_codec_alg_priv_t *ctx, 73390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ctr_id, 73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_list args) 73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); 73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (data) 74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; 74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber YV12_BUFFER_CONFIG sd; 74390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber image2yuvconfig(&frame->img, &sd); 74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7461b362b15af34006e6a11974088a46d42b903418eJohann return vp8dx_get_reference(ctx->pbi, frame->frame_type, &sd); 74790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 74890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_INVALID_PARAM; 75090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 75190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic vpx_codec_err_t vp8_set_postproc(vpx_codec_alg_priv_t *ctx, 75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ctr_id, 75590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber va_list args) 75690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 75790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_POSTPROC 7581b362b15af34006e6a11974088a46d42b903418eJohann vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *); 75990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (data) 76190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg_set = 1; 76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ctx->postproc_cfg = *((vp8_postproc_cfg_t *)data); 76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_OK; 76590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 76690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_INVALID_PARAM; 76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 76990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return VPX_CODEC_INCAPABLE; 77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 77290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 77479f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic vpx_codec_err_t vp8_set_dbg_options(vpx_codec_alg_priv_t *ctx, 77579f15823c34ae1e423108295e416213200bb280fAndreas Huber int ctrl_id, 77679f15823c34ae1e423108295e416213200bb280fAndreas Huber va_list args) 77779f15823c34ae1e423108295e416213200bb280fAndreas Huber{ 77879f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_POSTPROC_VISUALIZER && CONFIG_POSTPROC 77979f15823c34ae1e423108295e416213200bb280fAndreas Huber int data = va_arg(args, int); 78079f15823c34ae1e423108295e416213200bb280fAndreas Huber 78179f15823c34ae1e423108295e416213200bb280fAndreas Huber#define MAP(id, var) case id: var = data; break; 78279f15823c34ae1e423108295e416213200bb280fAndreas Huber 78379f15823c34ae1e423108295e416213200bb280fAndreas Huber switch (ctrl_id) 78479f15823c34ae1e423108295e416213200bb280fAndreas Huber { 78579f15823c34ae1e423108295e416213200bb280fAndreas Huber MAP (VP8_SET_DBG_COLOR_REF_FRAME, ctx->dbg_color_ref_frame_flag); 78679f15823c34ae1e423108295e416213200bb280fAndreas Huber MAP (VP8_SET_DBG_COLOR_MB_MODES, ctx->dbg_color_mb_modes_flag); 78779f15823c34ae1e423108295e416213200bb280fAndreas Huber MAP (VP8_SET_DBG_COLOR_B_MODES, ctx->dbg_color_b_modes_flag); 78879f15823c34ae1e423108295e416213200bb280fAndreas Huber MAP (VP8_SET_DBG_DISPLAY_MV, ctx->dbg_display_mv_flag); 78979f15823c34ae1e423108295e416213200bb280fAndreas Huber } 79079f15823c34ae1e423108295e416213200bb280fAndreas Huber 79179f15823c34ae1e423108295e416213200bb280fAndreas Huber return VPX_CODEC_OK; 79279f15823c34ae1e423108295e416213200bb280fAndreas Huber#else 79379f15823c34ae1e423108295e416213200bb280fAndreas Huber return VPX_CODEC_INCAPABLE; 79479f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif 79579f15823c34ae1e423108295e416213200bb280fAndreas Huber} 79679f15823c34ae1e423108295e416213200bb280fAndreas Huber 79779f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic vpx_codec_err_t vp8_get_last_ref_updates(vpx_codec_alg_priv_t *ctx, 79879f15823c34ae1e423108295e416213200bb280fAndreas Huber int ctrl_id, 79979f15823c34ae1e423108295e416213200bb280fAndreas Huber va_list args) 80079f15823c34ae1e423108295e416213200bb280fAndreas Huber{ 80179f15823c34ae1e423108295e416213200bb280fAndreas Huber int *update_info = va_arg(args, int *); 80279f15823c34ae1e423108295e416213200bb280fAndreas Huber VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; 80379f15823c34ae1e423108295e416213200bb280fAndreas Huber 80479f15823c34ae1e423108295e416213200bb280fAndreas Huber if (update_info) 80579f15823c34ae1e423108295e416213200bb280fAndreas Huber { 80679f15823c34ae1e423108295e416213200bb280fAndreas Huber *update_info = pbi->common.refresh_alt_ref_frame * (int) VP8_ALTR_FRAME 80779f15823c34ae1e423108295e416213200bb280fAndreas Huber + pbi->common.refresh_golden_frame * (int) VP8_GOLD_FRAME 80879f15823c34ae1e423108295e416213200bb280fAndreas Huber + pbi->common.refresh_last_frame * (int) VP8_LAST_FRAME; 80979f15823c34ae1e423108295e416213200bb280fAndreas Huber 81079f15823c34ae1e423108295e416213200bb280fAndreas Huber return VPX_CODEC_OK; 81179f15823c34ae1e423108295e416213200bb280fAndreas Huber } 81279f15823c34ae1e423108295e416213200bb280fAndreas Huber else 81379f15823c34ae1e423108295e416213200bb280fAndreas Huber return VPX_CODEC_INVALID_PARAM; 81479f15823c34ae1e423108295e416213200bb280fAndreas Huber} 81579f15823c34ae1e423108295e416213200bb280fAndreas Huber 8161b362b15af34006e6a11974088a46d42b903418eJohannextern int vp8dx_references_buffer( VP8_COMMON *oci, int ref_frame ); 8171b362b15af34006e6a11974088a46d42b903418eJohannstatic vpx_codec_err_t vp8_get_last_ref_frame(vpx_codec_alg_priv_t *ctx, 8181b362b15af34006e6a11974088a46d42b903418eJohann int ctrl_id, 8191b362b15af34006e6a11974088a46d42b903418eJohann va_list args) 8201b362b15af34006e6a11974088a46d42b903418eJohann{ 8211b362b15af34006e6a11974088a46d42b903418eJohann int *ref_info = va_arg(args, int *); 8221b362b15af34006e6a11974088a46d42b903418eJohann VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; 8231b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *oci = &pbi->common; 8241b362b15af34006e6a11974088a46d42b903418eJohann 8251b362b15af34006e6a11974088a46d42b903418eJohann if (ref_info) 8261b362b15af34006e6a11974088a46d42b903418eJohann { 8271b362b15af34006e6a11974088a46d42b903418eJohann *ref_info = 8281b362b15af34006e6a11974088a46d42b903418eJohann (vp8dx_references_buffer( oci, ALTREF_FRAME )?VP8_ALTR_FRAME:0) | 8291b362b15af34006e6a11974088a46d42b903418eJohann (vp8dx_references_buffer( oci, GOLDEN_FRAME )?VP8_GOLD_FRAME:0) | 8301b362b15af34006e6a11974088a46d42b903418eJohann (vp8dx_references_buffer( oci, LAST_FRAME )?VP8_LAST_FRAME:0); 8311b362b15af34006e6a11974088a46d42b903418eJohann 8321b362b15af34006e6a11974088a46d42b903418eJohann return VPX_CODEC_OK; 8331b362b15af34006e6a11974088a46d42b903418eJohann } 8341b362b15af34006e6a11974088a46d42b903418eJohann else 8351b362b15af34006e6a11974088a46d42b903418eJohann return VPX_CODEC_INVALID_PARAM; 8361b362b15af34006e6a11974088a46d42b903418eJohann} 83779f15823c34ae1e423108295e416213200bb280fAndreas Huber 83879f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic vpx_codec_err_t vp8_get_frame_corrupted(vpx_codec_alg_priv_t *ctx, 83979f15823c34ae1e423108295e416213200bb280fAndreas Huber int ctrl_id, 84079f15823c34ae1e423108295e416213200bb280fAndreas Huber va_list args) 84179f15823c34ae1e423108295e416213200bb280fAndreas Huber{ 84279f15823c34ae1e423108295e416213200bb280fAndreas Huber 84379f15823c34ae1e423108295e416213200bb280fAndreas Huber int *corrupted = va_arg(args, int *); 84479f15823c34ae1e423108295e416213200bb280fAndreas Huber 84579f15823c34ae1e423108295e416213200bb280fAndreas Huber if (corrupted) 84679f15823c34ae1e423108295e416213200bb280fAndreas Huber { 84779f15823c34ae1e423108295e416213200bb280fAndreas Huber VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; 84879f15823c34ae1e423108295e416213200bb280fAndreas Huber *corrupted = pbi->common.frame_to_show->corrupted; 84979f15823c34ae1e423108295e416213200bb280fAndreas Huber 85079f15823c34ae1e423108295e416213200bb280fAndreas Huber return VPX_CODEC_OK; 85179f15823c34ae1e423108295e416213200bb280fAndreas Huber } 85279f15823c34ae1e423108295e416213200bb280fAndreas Huber else 85379f15823c34ae1e423108295e416213200bb280fAndreas Huber return VPX_CODEC_INVALID_PARAM; 85479f15823c34ae1e423108295e416213200bb280fAndreas Huber 85579f15823c34ae1e423108295e416213200bb280fAndreas Huber} 85690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_codec_ctrl_fn_map_t vp8_ctf_maps[] = 85890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 85979f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8_SET_REFERENCE, vp8_set_reference}, 86079f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8_COPY_REFERENCE, vp8_get_reference}, 86179f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8_SET_POSTPROC, vp8_set_postproc}, 86279f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8_SET_DBG_COLOR_REF_FRAME, vp8_set_dbg_options}, 86379f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8_SET_DBG_COLOR_MB_MODES, vp8_set_dbg_options}, 86479f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8_SET_DBG_COLOR_B_MODES, vp8_set_dbg_options}, 86579f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8_SET_DBG_DISPLAY_MV, vp8_set_dbg_options}, 86679f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8D_GET_LAST_REF_UPDATES, vp8_get_last_ref_updates}, 86779f15823c34ae1e423108295e416213200bb280fAndreas Huber {VP8D_GET_FRAME_CORRUPTED, vp8_get_frame_corrupted}, 8681b362b15af34006e6a11974088a46d42b903418eJohann {VP8D_GET_LAST_REF_USED, vp8_get_last_ref_frame}, 86990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { -1, NULL}, 87090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 87190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 87290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 87390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VERSION_STRING 87490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VERSION_STRING 87590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 876538f6170b788de7408b06efc6613dc98579aa6a6Andreas HuberCODEC_INTERFACE(vpx_codec_vp8_dx) = 87790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 878f71323e297a928af368937089d3ed71239786f86Andreas Huber "WebM Project VP8 Decoder" VERSION_STRING, 87990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VPX_CODEC_INTERNAL_ABI_VERSION, 8801b362b15af34006e6a11974088a46d42b903418eJohann VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC | VP8_CAP_ERROR_CONCEALMENT | 8811b362b15af34006e6a11974088a46d42b903418eJohann VPX_CODEC_CAP_INPUT_FRAGMENTS, 88290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* vpx_codec_caps_t caps; */ 88390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_init, /* vpx_codec_init_fn_t init; */ 88490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_destroy, /* vpx_codec_destroy_fn_t destroy; */ 88590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */ 88690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_xma_get_mmap, /* vpx_codec_get_mmap_fn_t get_mmap; */ 88790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_xma_set_mmap, /* vpx_codec_set_mmap_fn_t set_mmap; */ 88890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 88990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_peek_si, /* vpx_codec_peek_si_fn_t peek_si; */ 89090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_get_si, /* vpx_codec_get_si_fn_t get_si; */ 89190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_decode, /* vpx_codec_decode_fn_t decode; */ 89290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_get_frame, /* vpx_codec_frame_get_fn_t frame_get; */ 89390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber }, 894538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { /* encoder functions */ 895538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 896538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 897538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 898538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 899538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED, 900538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber NOT_IMPLEMENTED 901538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 90290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 903