1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdlib.h> 13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <string.h> 146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h" 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx/vpx_decoder.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx/vp8dx.h" 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx/internal/vpx_codec_internal.h" 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_version.h" 19693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "common/alloccommon.h" 20693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "common/common.h" 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "common/onyxd.h" 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "decoder/onyxd_int.h" 23ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vpx_mem/vpx_mem.h" 24ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_ERROR_CONCEALMENT 25ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "decoder/error_concealment.h" 26ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif 27ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "decoder/decoderthreading.h" 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define VP8_CAP_POSTPROC (CONFIG_POSTPROC ? VPX_CODEC_CAP_POSTPROC : 0) 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define VP8_CAP_ERROR_CONCEALMENT (CONFIG_ERROR_CONCEALMENT ? \ 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPX_CODEC_CAP_ERROR_CONCEALMENT : 0) 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef vpx_codec_stream_info_t vp8_stream_info_t; 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Structures for handling memory allocations */ 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef enum 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_SEG_ALG_PRIV = 256, 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_SEG_MAX 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} mem_seg_id_t; 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define NELEMENTS(x) ((int)(sizeof(x)/sizeof(x[0]))) 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t); 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct vpx_codec_alg_priv 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_priv_t base; 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_dec_cfg_t cfg; 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_stream_info_t si; 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int decoder_init; 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int postproc_cfg_set; 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_postproc_cfg_t postproc_cfg; 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_POSTPROC_VISUALIZER 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int dbg_postproc_flag; 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dbg_color_ref_frame_flag; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dbg_color_mb_modes_flag; 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dbg_color_b_modes_flag; 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int dbg_display_mv_flag; 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 60693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_decrypt_cb decrypt_cb; 616ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com void *decrypt_state; 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_image_t img; 6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int flushed; 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int img_setup; 65fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org struct frame_buffers yv12_frame_buffers; 66ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org void *user_priv; 67da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org FRAGMENT_DATA fragments; 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}; 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic unsigned long vp8_priv_sz(const vpx_codec_dec_cfg_t *si, vpx_codec_flags_t flags) 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Although this declaration is constant, we can't use it in the requested 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * segments list because we want to define the requested segments list 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * before defining the private type (so that the number of memory maps is 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * known) 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void)si; 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return sizeof(vpx_codec_alg_priv_t); 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 81693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comstatic void vp8_init_ctx(vpx_codec_ctx_t *ctx) 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 83d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_codec_alg_priv_t *priv = 84d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org (vpx_codec_alg_priv_t *)vpx_calloc(1, sizeof(*priv)); 85d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 86d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ctx->priv = (vpx_codec_priv_t *)priv; 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ctx->priv->init_flags = ctx->init_flags; 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 89d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->si.sz = sizeof(priv->si); 90d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->decrypt_cb = NULL; 91d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->decrypt_state = NULL; 92d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->flushed = 0; 93d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (ctx->config.dec) 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Update the reference to the config structure to an internal copy. */ 97d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->cfg = *ctx->config.dec; 98d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ctx->config.dec = &priv->cfg; 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 102167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx, 103167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_codec_priv_enc_mr_cfg_t *data) 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 105d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_codec_err_t res = VPX_CODEC_OK; 106d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org vpx_codec_alg_priv_t *priv = NULL; 107167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (void) data; 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vp8_rtcd(); 1100f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* This function only allocates space for the vpx_codec_alg_priv_t 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * structure. More memory may be required at the time the stream 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * information becomes known. 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!ctx->priv) 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 117693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vp8_init_ctx(ctx); 118d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv = (vpx_codec_alg_priv_t *)ctx->priv; 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1204b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org /* initialize number of fragments to zero */ 121d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->fragments.count = 0; 1224b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org /* is input fragments enabled? */ 123d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->fragments.enabled = 124d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org (priv->base.init_flags & VPX_CODEC_USE_INPUT_FRAGMENTS); 125da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 1264b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org /*post processing level initialized to do nothing */ 127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 128d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org else 129d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org { 130d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv = (vpx_codec_alg_priv_t *)ctx->priv; 131d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org } 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 133d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->yv12_frame_buffers.use_frame_threads = 134d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org (ctx->priv->init_flags & VPX_CODEC_USE_FRAME_THREADING); 135fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org 136fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org /* for now, disable frame threading */ 137d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org priv->yv12_frame_buffers.use_frame_threads = 0; 138fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org 139d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if (priv->yv12_frame_buffers.use_frame_threads && 140d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org ((ctx->priv->init_flags & VPX_CODEC_USE_ERROR_CONCEALMENT) || 141d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org (ctx->priv->init_flags & VPX_CODEC_USE_INPUT_FRAGMENTS))) 142fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org { 143fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org /* row-based threading, error concealment, and input fragments will 144fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org * not be supported when using frame-based threading */ 145fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org res = VPX_CODEC_INVALID_PARAM; 146fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org } 147fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return res; 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t vp8_destroy(vpx_codec_alg_priv_t *ctx) 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 153fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org vp8_remove_decoder_instances(&ctx->yv12_frame_buffers); 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 155693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_free(ctx); 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_OK; 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1606ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.comstatic vpx_codec_err_t vp8_peek_si_internal(const uint8_t *data, 1616ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com unsigned int data_sz, 162ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org vpx_codec_stream_info_t *si, 163693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_decrypt_cb decrypt_cb, 1646ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com void *decrypt_state) 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_err_t res = VPX_CODEC_OK; 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if(data + data_sz <= data) 169ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org { 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org res = VPX_CODEC_INVALID_PARAM; 171ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org } 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Parse uncompresssed part of key frame header. 175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 3 bytes:- including version, frame type and an offset 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 3 bytes:- sync code (0x9d, 0x01, 0x2a) 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4 bytes:- including image width and height in the lowest 14 bits 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * of each 2-byte value. 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 1806ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com uint8_t clear_buffer[10]; 1816ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com const uint8_t *clear = data; 1826ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (decrypt_cb) 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 184693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com int n = MIN(sizeof(clear_buffer), data_sz); 1856ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com decrypt_cb(decrypt_state, data, clear_buffer, n); 1866ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com clear = clear_buffer; 1876ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com } 1886ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com si->is_kf = 0; 189ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org 1906ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (data_sz >= 10 && !(clear[0] & 0x01)) /* I-Frame */ 1916ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com { 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org si->is_kf = 1; 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* vet via sync code */ 1956ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (clear[3] != 0x9d || clear[4] != 0x01 || clear[5] != 0x2a) 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org res = VPX_CODEC_UNSUP_BITSTREAM; 197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1986ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com si->w = (clear[6] | (clear[7] << 8)) & 0x3fff; 1996ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com si->h = (clear[8] | (clear[9] << 8)) & 0x3fff; 200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /*printf("w=%d, h=%d\n", si->w, si->h);*/ 202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!(si->h | si->w)) 203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org res = VPX_CODEC_UNSUP_BITSTREAM; 204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 206ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org { 207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org res = VPX_CODEC_UNSUP_BITSTREAM; 208ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org } 209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return res; 212ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org} 213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 214ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.orgstatic vpx_codec_err_t vp8_peek_si(const uint8_t *data, 215ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org unsigned int data_sz, 216ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org vpx_codec_stream_info_t *si) { 2176ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com return vp8_peek_si_internal(data, data_sz, si, NULL, NULL); 218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t vp8_get_si(vpx_codec_alg_priv_t *ctx, 221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_stream_info_t *si) 222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int sz; 225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (si->sz >= sizeof(vp8_stream_info_t)) 227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sz = sizeof(vp8_stream_info_t); 228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sz = sizeof(vpx_codec_stream_info_t); 230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org memcpy(si, &ctx->si, sz); 232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org si->sz = sz; 233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_OK; 235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t 239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgupdate_error_state(vpx_codec_alg_priv_t *ctx, 240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const struct vpx_internal_error_info *error) 241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_err_t res; 243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if ((res = error->error_code)) 245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ctx->base.err_detail = error->has_detail 246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ? error->detail 247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org : NULL; 248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return res; 250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void yuvconfig2image(vpx_image_t *img, 253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const YV12_BUFFER_CONFIG *yv12, 254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void *user_priv) 255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /** vpx_img_wrap() doesn't allow specifying independent strides for 257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * the Y, U, and V planes, nor other alignment adjustments that 258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * might be representable by a YV12_BUFFER_CONFIG, so we just 259474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * initialize all the fields.*/ 26047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org img->fmt = VPX_IMG_FMT_I420; 261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->w = yv12->y_stride; 262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->h = (yv12->y_height + 2 * VP8BORDERINPIXELS + 15) & ~15; 263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->d_w = yv12->y_width; 264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->d_h = yv12->y_height; 265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->x_chroma_shift = 1; 266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->y_chroma_shift = 1; 267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->planes[VPX_PLANE_Y] = yv12->y_buffer; 268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->planes[VPX_PLANE_U] = yv12->u_buffer; 269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->planes[VPX_PLANE_V] = yv12->v_buffer; 270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->planes[VPX_PLANE_ALPHA] = NULL; 271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->stride[VPX_PLANE_Y] = yv12->y_stride; 272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->stride[VPX_PLANE_U] = yv12->uv_stride; 273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->stride[VPX_PLANE_V] = yv12->uv_stride; 274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->stride[VPX_PLANE_ALPHA] = yv12->y_stride; 275ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org img->bit_depth = 8; 276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->bps = 12; 277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->user_priv = user_priv; 278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->img_data = yv12->buffer_alloc; 279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->img_data_owner = 0; 280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img->self_allocd = 0; 281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 283da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.orgstatic int 284da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.orgupdate_fragments(vpx_codec_alg_priv_t *ctx, 285da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org const uint8_t *data, 286da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org unsigned int data_sz, 287da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org vpx_codec_err_t *res) 288da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org{ 289da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org *res = VPX_CODEC_OK; 290da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 291da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org if (ctx->fragments.count == 0) 292da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org { 293da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org /* New frame, reset fragment pointers and sizes */ 294da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org vpx_memset((void*)ctx->fragments.ptrs, 0, sizeof(ctx->fragments.ptrs)); 295da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org vpx_memset(ctx->fragments.sizes, 0, sizeof(ctx->fragments.sizes)); 296da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org } 297da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org if (ctx->fragments.enabled && !(data == NULL && data_sz == 0)) 298da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org { 299da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org /* Store a pointer to this fragment and return. We haven't 300da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org * received the complete frame yet, so we will wait with decoding. 301da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org */ 302da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org ctx->fragments.ptrs[ctx->fragments.count] = data; 303da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org ctx->fragments.sizes[ctx->fragments.count] = data_sz; 304da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org ctx->fragments.count++; 305da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org if (ctx->fragments.count > (1 << EIGHT_PARTITION) + 1) 306da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org { 307da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org ctx->fragments.count = 0; 308da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org *res = VPX_CODEC_INVALID_PARAM; 309da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org return -1; 310da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org } 311da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org return 0; 312da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org } 313da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 314da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org if (!ctx->fragments.enabled) 315da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org { 316da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org ctx->fragments.ptrs[0] = data; 317da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org ctx->fragments.sizes[0] = data_sz; 318da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org ctx->fragments.count = 1; 319da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org } 320da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 321da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org return 1; 322da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org} 323da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, 325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const uint8_t *data, 326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int data_sz, 327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void *user_priv, 328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org long deadline) 329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_err_t res = VPX_CODEC_OK; 331ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int resolution_change = 0; 332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int w, h; 333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 33441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (data == NULL && data_sz == 0) { 33541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ctx->flushed = 1; 33641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return VPX_CODEC_OK; 33741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 33841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 33941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org /* Reset flushed when receiving a valid frame */ 34041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ctx->flushed = 0; 341da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 342da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org /* Update the input fragment data */ 343da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org if(update_fragments(ctx, data, data_sz, &res) <= 0) 344da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org return res; 345da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Determine the stream parameters. Note that we rely on peek_si to 347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * validate that we have a buffer that does not wrap around the top 348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * of the heap. 349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 350ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org w = ctx->si.w; 351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org h = ctx->si.h; 352ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 3536ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com res = vp8_peek_si_internal(ctx->fragments.ptrs[0], ctx->fragments.sizes[0], 3546ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com &ctx->si, ctx->decrypt_cb, ctx->decrypt_state); 355ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 356ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if((res == VPX_CODEC_UNSUP_BITSTREAM) && !ctx->si.is_kf) 357ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 358ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* the peek function returns an error for non keyframes, however for 359ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * this case, it is not an error */ 360ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org res = VPX_CODEC_OK; 361ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 362ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 363ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(!ctx->decoder_init && !ctx->si.is_kf) 364ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org res = VPX_CODEC_UNSUP_BITSTREAM; 365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 366ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if ((ctx->si.h != h) || (ctx->si.w != w)) 367ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org resolution_change = 1; 368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Initialize the decoder instance on the first frame*/ 370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!res && !ctx->decoder_init) 371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 372693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com VP8D_CONFIG oxcf; 373693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 374693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com oxcf.Width = ctx->si.w; 375693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com oxcf.Height = ctx->si.h; 376693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com oxcf.Version = 9; 377693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com oxcf.postprocess = 0; 378693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com oxcf.max_threads = ctx->cfg.threads; 379693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com oxcf.error_concealment = 380693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com (ctx->base.init_flags & VPX_CODEC_USE_ERROR_CONCEALMENT); 381693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 382693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com /* If postprocessing was enabled by the application and a 383693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * configuration has not been provided, default it. 384693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com */ 385693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com if (!ctx->postproc_cfg_set 386693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com && (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)) { 387693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ctx->postproc_cfg.post_proc_flag = 388693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE; 389693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ctx->postproc_cfg.deblocking_level = 4; 390693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ctx->postproc_cfg.noise_level = 0; 391693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com } 392693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 393693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com res = vp8_create_decoder_instances(&ctx->yv12_frame_buffers, &oxcf); 394693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ctx->decoder_init = 1; 395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 397693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com /* Set these even if already initialized. The caller may have changed the 398693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com * decrypt config between frames. 399693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com */ 40088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org if (ctx->decoder_init) { 40188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ctx->yv12_frame_buffers.pbi[0]->decrypt_cb = ctx->decrypt_cb; 40288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ctx->yv12_frame_buffers.pbi[0]->decrypt_state = ctx->decrypt_state; 40388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } 404693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com 405fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org if (!res) 406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 407fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org VP8D_COMP *pbi = ctx->yv12_frame_buffers.pbi[0]; 408ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(resolution_change) 409ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 410ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org VP8_COMMON *const pc = & pbi->common; 411ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org MACROBLOCKD *const xd = & pbi->mb; 412ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_MULTITHREAD 413ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int i; 414ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif 415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pc->Width = ctx->si.w; 416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pc->Height = ctx->si.h; 417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int prev_mb_rows = pc->mb_rows; 419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 420ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (setjmp(pbi->common.error.jmp)) 421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pbi->common.error.setjmp = 0; 42395aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com vp8_clear_system_state(); 424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* same return value as used in vp8dx_receive_compressed_data */ 425ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org return -1; 426ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 427ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 428ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pbi->common.error.setjmp = 1; 429ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 430ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (pc->Width <= 0) 431ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 432ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pc->Width = w; 433ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 434ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "Invalid frame width"); 435ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 436ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 437ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (pc->Height <= 0) 438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 439ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pc->Height = h; 440ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 441ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "Invalid frame height"); 442ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 444ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (vp8_alloc_frame_buffers(pc, pc->Width, pc->Height)) 445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 446ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "Failed to allocate frame buffers"); 447ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 448ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->pre = pc->yv12_fb[pc->lst_fb_idx]; 449ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->dst = pc->yv12_fb[pc->new_fb_idx]; 450ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 451ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_MULTITHREAD 452ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < pbi->allocated_decoding_thread_count; i++) 453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 454ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pbi->mb_row_di[i].mbd.dst = pc->yv12_fb[pc->new_fb_idx]; 455ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_build_block_doffsets(&pbi->mb_row_di[i].mbd); 456ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 457ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif 458ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_build_block_doffsets(&pbi->mb); 459ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 460ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* allocate memory for last frame MODE_INFO array */ 461ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_ERROR_CONCEALMENT 462ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 463ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (pbi->ec_enabled) 464ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* old prev_mip was released by vp8_de_alloc_frame_buffers() 466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * called in vp8_alloc_frame_buffers() */ 467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pc->prev_mip = vpx_calloc( 468ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (pc->mb_cols + 1) * (pc->mb_rows + 1), 469ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org sizeof(MODE_INFO)); 470ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 471ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (!pc->prev_mip) 472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 473ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_de_alloc_frame_buffers(pc); 474ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 475ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "Failed to allocate" 476ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "last frame MODE_INFO array"); 477ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 478ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 479ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pc->prev_mi = pc->prev_mip + pc->mode_info_stride + 1; 480ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 481ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (vp8_alloc_overlap_lists(pbi)) 482ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 483ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "Failed to allocate overlap lists " 484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org "for error concealment"); 485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 486ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 487ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif 488ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 489ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#if CONFIG_MULTITHREAD 490ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (pbi->b_multithreaded_rd) 491ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8mt_alloc_temp_buffers(pbi, pc->Width, prev_mb_rows); 492ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#else 493ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (void)prev_mb_rows; 494ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif 495ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 497ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pbi->common.error.setjmp = 0; 498ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* required to get past the first get_free_fb() call */ 500fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org pbi->common.fb_idx_ref_cnt[0] = 0; 501ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 502ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 503da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org /* update the pbi fragment data */ 504fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org pbi->fragments = ctx->fragments; 505da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 506ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ctx->user_priv = user_priv; 507fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org if (vp8dx_receive_compressed_data(pbi, data_sz, data, deadline)) 508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 509ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org res = update_error_state(ctx, &pbi->common.error); 510ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 511da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org 512da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org /* get ready for the next series of fragments */ 513da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org ctx->fragments.count = 0; 514ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 515ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 516ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org return res; 517ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 518ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 519ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic vpx_image_t *vp8_get_frame(vpx_codec_alg_priv_t *ctx, 520ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_codec_iter_t *iter) 521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_image_t *img = NULL; 523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* iter acts as a flip flop, so an image is only returned on the first 525ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * call to get_frame. 526ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */ 52710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org if (!(*iter) && ctx->yv12_frame_buffers.pbi[0]) 528ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YV12_BUFFER_CONFIG sd; 530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t time_stamp = 0, time_end_stamp = 0; 531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_ppflags_t flags = {0}; 532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC) 534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org flags.post_proc_flag= ctx->postproc_cfg.post_proc_flag 536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_POSTPROC_VISUALIZER 537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org | ((ctx->dbg_color_ref_frame_flag != 0) ? VP8D_DEBUG_CLR_FRM_REF_BLKS : 0) 539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org | ((ctx->dbg_color_mb_modes_flag != 0) ? VP8D_DEBUG_CLR_BLK_MODES : 0) 540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org | ((ctx->dbg_color_b_modes_flag != 0) ? VP8D_DEBUG_CLR_BLK_MODES : 0) 541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org | ((ctx->dbg_display_mv_flag != 0) ? VP8D_DEBUG_DRAW_MV : 0) 542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ; 544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org flags.deblocking_level = ctx->postproc_cfg.deblocking_level; 545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org flags.noise_level = ctx->postproc_cfg.noise_level; 546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_POSTPROC_VISUALIZER 547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org flags.display_ref_frame_flag= ctx->dbg_color_ref_frame_flag; 548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org flags.display_mb_modes_flag = ctx->dbg_color_mb_modes_flag; 549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org flags.display_b_modes_flag = ctx->dbg_color_b_modes_flag; 550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org flags.display_mv_flag = ctx->dbg_display_mv_flag; 551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 554fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org if (0 == vp8dx_get_raw_frame(ctx->yv12_frame_buffers.pbi[0], &sd, 555fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org &time_stamp, &time_end_stamp, &flags)) 556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 557ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yuvconfig2image(&ctx->img, &sd, ctx->user_priv); 558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org img = &ctx->img; 560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *iter = img; 561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return img; 565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, 568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YV12_BUFFER_CONFIG *yv12) 569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 57041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int y_w = img->d_w; 57141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int y_h = img->d_h; 57241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int uv_w = (img->d_w + 1) / 2; 57341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int uv_h = (img->d_h + 1) / 2; 574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_err_t res = VPX_CODEC_OK; 575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org yv12->y_buffer = img->planes[VPX_PLANE_Y]; 576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org yv12->u_buffer = img->planes[VPX_PLANE_U]; 577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org yv12->v_buffer = img->planes[VPX_PLANE_V]; 578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 57941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org yv12->y_crop_width = y_w; 58041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org yv12->y_crop_height = y_h; 58141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org yv12->y_width = y_w; 58241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org yv12->y_height = y_h; 58341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org yv12->uv_crop_width = uv_w; 58441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org yv12->uv_crop_height = uv_h; 58541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org yv12->uv_width = uv_w; 58641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org yv12->uv_height = uv_h; 587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org yv12->y_stride = img->stride[VPX_PLANE_Y]; 589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org yv12->uv_stride = img->stride[VPX_PLANE_U]; 590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org yv12->border = (img->stride[VPX_PLANE_Y] - img->d_w) / 2; 592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return res; 593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t vp8_set_reference(vpx_codec_alg_priv_t *ctx, 59788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org va_list args) 598474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 600474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); 601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 602fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org if (data && !ctx->yv12_frame_buffers.use_frame_threads) 603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 604474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; 605474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YV12_BUFFER_CONFIG sd; 606474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 607474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org image2yuvconfig(&frame->img, &sd); 608474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 609fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org return vp8dx_set_reference(ctx->yv12_frame_buffers.pbi[0], 610fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org frame->frame_type, &sd); 611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_INVALID_PARAM; 614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t vp8_get_reference(vpx_codec_alg_priv_t *ctx, 61888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org va_list args) 619474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); 622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 623fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org if (data && !ctx->yv12_frame_buffers.use_frame_threads) 624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 625474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; 626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YV12_BUFFER_CONFIG sd; 627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 628474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org image2yuvconfig(&frame->img, &sd); 629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 630fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org return vp8dx_get_reference(ctx->yv12_frame_buffers.pbi[0], 631fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org frame->frame_type, &sd); 632474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 633474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 634474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_INVALID_PARAM; 635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t vp8_set_postproc(vpx_codec_alg_priv_t *ctx, 639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org va_list args) 640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_POSTPROC 642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *); 643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (data) 645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ctx->postproc_cfg_set = 1; 647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ctx->postproc_cfg = *((vp8_postproc_cfg_t *)data); 648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_OK; 649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_INVALID_PARAM; 652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else 654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_INCAPABLE; 655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 65888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 65988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic vpx_codec_err_t vp8_set_dbg_color_ref_frame(vpx_codec_alg_priv_t *ctx, 66088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org va_list args) { 661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_POSTPROC_VISUALIZER && CONFIG_POSTPROC 66288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ctx->dbg_color_ref_frame_flag = va_arg(args, int); 66388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org return VPX_CODEC_OK; 66488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#else 66588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org (void)ctx; 66688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org (void)args; 66788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org return VPX_CODEC_INCAPABLE; 66888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif 66988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org} 670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 67188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic vpx_codec_err_t vp8_set_dbg_color_mb_modes(vpx_codec_alg_priv_t *ctx, 67288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org va_list args) { 67388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_POSTPROC_VISUALIZER && CONFIG_POSTPROC 67488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ctx->dbg_color_mb_modes_flag = va_arg(args, int); 67588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org return VPX_CODEC_OK; 67688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#else 67788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org (void)ctx; 67888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org (void)args; 67988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org return VPX_CODEC_INCAPABLE; 68088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif 68188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org} 682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 68388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic vpx_codec_err_t vp8_set_dbg_color_b_modes(vpx_codec_alg_priv_t *ctx, 68488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org va_list args) { 68588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_POSTPROC_VISUALIZER && CONFIG_POSTPROC 68688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ctx->dbg_color_b_modes_flag = va_arg(args, int); 68788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org return VPX_CODEC_OK; 68888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#else 68988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org (void)ctx; 69088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org (void)args; 69188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org return VPX_CODEC_INCAPABLE; 69288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif 69388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org} 694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 69588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic vpx_codec_err_t vp8_set_dbg_display_mv(vpx_codec_alg_priv_t *ctx, 69688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org va_list args) { 69788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if CONFIG_POSTPROC_VISUALIZER && CONFIG_POSTPROC 69888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ctx->dbg_display_mv_flag = va_arg(args, int); 69988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org return VPX_CODEC_OK; 700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else 70188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org (void)ctx; 70288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org (void)args; 70388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org return VPX_CODEC_INCAPABLE; 704474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 705474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 706474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t vp8_get_last_ref_updates(vpx_codec_alg_priv_t *ctx, 708474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org va_list args) 709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int *update_info = va_arg(args, int *); 711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 712fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org if (update_info && !ctx->yv12_frame_buffers.use_frame_threads) 713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 714fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org VP8D_COMP *pbi = (VP8D_COMP *)ctx->yv12_frame_buffers.pbi[0]; 715fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org 716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *update_info = pbi->common.refresh_alt_ref_frame * (int) VP8_ALTR_FRAME 717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org + pbi->common.refresh_golden_frame * (int) VP8_GOLD_FRAME 718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org + pbi->common.refresh_last_frame * (int) VP8_LAST_FRAME; 719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_OK; 721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_INVALID_PARAM; 724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 726167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgextern int vp8dx_references_buffer( VP8_COMMON *oci, int ref_frame ); 727167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic vpx_codec_err_t vp8_get_last_ref_frame(vpx_codec_alg_priv_t *ctx, 728167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org va_list args) 729167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 730167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int *ref_info = va_arg(args, int *); 731167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 732fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org if (ref_info && !ctx->yv12_frame_buffers.use_frame_threads) 733167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 734fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org VP8D_COMP *pbi = (VP8D_COMP *)ctx->yv12_frame_buffers.pbi[0]; 735fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org VP8_COMMON *oci = &pbi->common; 736167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org *ref_info = 737167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (vp8dx_references_buffer( oci, ALTREF_FRAME )?VP8_ALTR_FRAME:0) | 738167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (vp8dx_references_buffer( oci, GOLDEN_FRAME )?VP8_GOLD_FRAME:0) | 739167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (vp8dx_references_buffer( oci, LAST_FRAME )?VP8_LAST_FRAME:0); 740167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 741167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org return VPX_CODEC_OK; 742167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 743167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 744167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org return VPX_CODEC_INVALID_PARAM; 745167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic vpx_codec_err_t vp8_get_frame_corrupted(vpx_codec_alg_priv_t *ctx, 748474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org va_list args) 749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 750474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 751474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int *corrupted = va_arg(args, int *); 75210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org VP8D_COMP *pbi = (VP8D_COMP *)ctx->yv12_frame_buffers.pbi[0]; 753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 75410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org if (corrupted && pbi) 755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 75641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const YV12_BUFFER_CONFIG *const frame = pbi->common.frame_to_show; 75741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (frame == NULL) return VPX_CODEC_ERROR; 75841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *corrupted = frame->corrupted; 759474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_OK; 760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 761474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 762474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return VPX_CODEC_INVALID_PARAM; 763474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 764474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 7666ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.comstatic vpx_codec_err_t vp8_set_decryptor(vpx_codec_alg_priv_t *ctx, 7676ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com va_list args) 768ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org{ 769693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_decrypt_init *init = va_arg(args, vpx_decrypt_init *); 770ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org 7716ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (init) 7726ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com { 7736ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com ctx->decrypt_cb = init->decrypt_cb; 7746ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com ctx->decrypt_state = init->decrypt_state; 7756ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com } 7766ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com else 7776ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com { 7786ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com ctx->decrypt_cb = NULL; 7796ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com ctx->decrypt_state = NULL; 7806ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com } 781ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org return VPX_CODEC_OK; 782ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org} 783ba5ab470649de22c7c2c0b8cf4726a08b2058b44johannkoenig@chromium.org 784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvpx_codec_ctrl_fn_map_t vp8_ctf_maps[] = 785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 786474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org {VP8_SET_REFERENCE, vp8_set_reference}, 787474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org {VP8_COPY_REFERENCE, vp8_get_reference}, 788474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org {VP8_SET_POSTPROC, vp8_set_postproc}, 78988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org {VP8_SET_DBG_COLOR_REF_FRAME, vp8_set_dbg_color_ref_frame}, 79088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org {VP8_SET_DBG_COLOR_MB_MODES, vp8_set_dbg_color_mb_modes}, 79188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org {VP8_SET_DBG_COLOR_B_MODES, vp8_set_dbg_color_b_modes}, 79288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org {VP8_SET_DBG_DISPLAY_MV, vp8_set_dbg_display_mv}, 793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org {VP8D_GET_LAST_REF_UPDATES, vp8_get_last_ref_updates}, 794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org {VP8D_GET_FRAME_CORRUPTED, vp8_get_frame_corrupted}, 795167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org {VP8D_GET_LAST_REF_USED, vp8_get_last_ref_frame}, 796693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com {VPXD_SET_DECRYPTOR, vp8_set_decryptor}, 797474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { -1, NULL}, 798474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}; 799474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 800474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 801474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifndef VERSION_STRING 802474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define VERSION_STRING 803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgCODEC_INTERFACE(vpx_codec_vp8_dx) = 805474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 806474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org "WebM Project VP8 Decoder" VERSION_STRING, 807474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPX_CODEC_INTERNAL_ABI_VERSION, 808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VPX_CODEC_CAP_DECODER | VP8_CAP_POSTPROC | VP8_CAP_ERROR_CONCEALMENT | 809167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org VPX_CODEC_CAP_INPUT_FRAGMENTS, 810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* vpx_codec_caps_t caps; */ 811474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_init, /* vpx_codec_init_fn_t init; */ 812474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_destroy, /* vpx_codec_destroy_fn_t destroy; */ 813474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */ 814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_peek_si, /* vpx_codec_peek_si_fn_t peek_si; */ 816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_get_si, /* vpx_codec_get_si_fn_t get_si; */ 817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_decode, /* vpx_codec_decode_fn_t decode; */ 818474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_get_frame, /* vpx_codec_frame_get_fn_t frame_get; */ 819d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org NULL, 820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org }, 821474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { /* encoder functions */ 82241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 0, 823d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org NULL, 824d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org NULL, 825d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org NULL, 826d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org NULL, 827d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org NULL, 828d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org NULL 829474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}; 831