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 125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vpx_config.h" 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h" 146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "./vpx_scale_rtcd.h" 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "onyxd_int.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/header.h" 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/reconintra4x4.h" 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/reconinter.h" 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "detokenize.h" 20693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "vp8/common/common.h" 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/invtrans.h" 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/alloccommon.h" 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/entropymode.h" 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/quant_common.h" 25d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#include "vpx_scale/vpx_scale.h" 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/setupintrarecon.h" 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "decodemv.h" 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/extend.h" 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "error_concealment.h" 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h" 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/threading.h" 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "decoderthreading.h" 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "dboolhuff.h" 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <assert.h> 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdio.h> 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8cx_init_de_quantizer(VP8D_COMP *pbi) 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int Q; 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *const pc = & pbi->common; 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (Q = 0; Q < QINDEX_RANGE; Q++) 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->Y1dequant[Q][0] = (short)vp8_dc_quant(Q, pc->y1dc_delta_q); 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->Y2dequant[Q][0] = (short)vp8_dc2quant(Q, pc->y2dc_delta_q); 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->UVdequant[Q][0] = (short)vp8_dc_uv_quant(Q, pc->uvdc_delta_q); 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 52167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->Y1dequant[Q][1] = (short)vp8_ac_yquant(Q); 53167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->Y2dequant[Q][1] = (short)vp8_ac2quant(Q, pc->y2ac_delta_q); 54167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->UVdequant[Q][1] = (short)vp8_ac_uv_quant(Q, pc->uvac_delta_q); 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_mb_init_dequantizer(VP8D_COMP *pbi, MACROBLOCKD *xd) 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int QIndex; 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *const pc = & pbi->common; 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Decide whether to use the default or alternate baseline Q value. */ 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->segmentation_enabled) 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Abs Value */ 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA) 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][mbmi->segment_id]; 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Delta Value */ 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org QIndex = pc->base_qindex + xd->segment_feature_data[MB_LVL_ALT_Q][mbmi->segment_id]; 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0; /* Clamp to valid range */ 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org QIndex = pc->base_qindex; 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 82167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Set up the macroblock dequant constants */ 83167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dequant_y1_dc[0] = 1; 84167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dequant_y1[0] = pc->Y1dequant[QIndex][0]; 85167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dequant_y2[0] = pc->Y2dequant[QIndex][0]; 86167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dequant_uv[0] = pc->UVdequant[QIndex][0]; 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 88167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (i = 1; i < 16; i++) 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 90167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dequant_y1_dc[i] = 91167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dequant_y1[i] = pc->Y1dequant[QIndex][1]; 92167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dequant_y2[i] = pc->Y2dequant[QIndex][1]; 93167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dequant_uv[i] = pc->UVdequant[QIndex][1]; 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int mb_idx) 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MB_PREDICTION_MODE mode; 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 1025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 103167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int corruption_detected = 0; 1045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_info_context->mbmi.mb_skip_coeff) 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_reset_mb_tokens_context(xd); 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 110167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else if (!vp8dx_bool_error(xd->current_bc)) 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 112167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int eobtotal; 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org eobtotal = vp8_decode_mb_tokens(pbi, xd); 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 115167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Special case: Force the loopfilter to skip when eobtotal is zero */ 116167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->mode_info_context->mbmi.mb_skip_coeff = (eobtotal==0); 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode = xd->mode_info_context->mbmi.mode; 120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 121167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (xd->segmentation_enabled) 1225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_mb_init_dequantizer(pbi, xd); 123167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 124167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 125167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 126167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 127167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if(pbi->ec_active) 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 129167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int throw_residual; 130167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* When we have independent partitions we can apply residual even 131167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * though other partitions within the frame are corrupt. 132167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 133167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org throw_residual = (!pbi->independent_partitions && 134167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pbi->frame_corrupt_residual); 135167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org throw_residual = (throw_residual || vp8dx_bool_error(xd->current_bc)); 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 137167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if ((mb_idx >= pbi->mvs_corrupt_from_mb || throw_residual)) 138167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 139167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* MB with corrupt residuals or corrupt mode/motion vectors. 140167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * Better to use the predictor as reconstruction. 141167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 142167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pbi->frame_corrupt_residual = 1; 143167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); 144167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vp8_conceal_corrupt_mb(xd); 145167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 146167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 147167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org corruption_detected = 1; 148167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 149167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* force idct to be skipped for B_PRED and use the 150167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * prediction only for reconstruction 151167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * */ 152167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memset(xd->eobs, 0, 25); 153167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 155167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* do prediction */ 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_intra_predictors_mbuv_s(xd, 1615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1], 1625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2], 1635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[1], 1645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[2], 1655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[1], 1665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.u_buffer, xd->dst.v_buffer, 1675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.uv_stride); 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mode != B_PRED) 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_intra_predictors_mby_s(xd, 1725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0], 1735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[0], 1745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[0], 1755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer, 1765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_stride); 177167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 178167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 179167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 180167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org short *DQC = xd->dequant_y1; 1815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int dst_stride = xd->dst.y_stride; 182167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 183167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* clear out residual eob info */ 184167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if(xd->mode_info_context->mbmi.mb_skip_coeff) 185167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memset(xd->eobs, 0, 25); 186167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org intra_prediction_down_copy(xd, xd->recon_above[0] + 16); 188167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 189167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (i = 0; i < 16; i++) 190167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 191167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org BLOCKD *b = &xd->block[i]; 192ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *dst = xd->dst.y_buffer + b->offset; 193ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org B_PREDICTION_MODE b_mode = 194ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->mode_info_context->bmi[i].as_mode; 195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *Above = dst - dst_stride; 196ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *yleft = dst - 1; 197ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int left_stride = dst_stride; 198ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char top_left = Above[-1]; 199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 200ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_intra4x4_predict(Above, yleft, left_stride, b_mode, 201ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst, dst_stride, top_left); 202167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 203167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (xd->eobs[i]) 204167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 205167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (xd->eobs[i] > 1) 206167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 207ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_dequant_idct_add(b->qcoeff, DQC, dst, dst_stride); 208167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 209167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 210167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 2115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_dc_only_idct_add 212167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (b->qcoeff[0] * DQC[0], 213ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst, dst_stride, 214ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst, dst_stride); 215085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vpx_memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); 216167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 217167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 218167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_build_inter_predictors_mb(xd); 224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 228167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (corruption_detected) 229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return; 231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 234167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if(!xd->mode_info_context->mbmi.mb_skip_coeff) 235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 236167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* dequantization and idct */ 237167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (mode != B_PRED) 238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 239167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org short *DQC = xd->dequant_y1; 240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 241167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (mode != SPLITMV) 242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 243167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org BLOCKD *b = &xd->block[24]; 244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 245167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* do 2nd order transform on the dc block */ 246167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (xd->eobs[24] > 1) 247167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 2485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_dequantize_b(b, xd->dequant_y2); 249167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 2505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_short_inv_walsh4x4(&b->dqcoeff[0], 251167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->qcoeff); 252085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vpx_memset(b->qcoeff, 0, 16 * sizeof(b->qcoeff[0])); 253167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 254167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 255167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 256167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org b->dqcoeff[0] = b->qcoeff[0] * xd->dequant_y2[0]; 2575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_short_inv_walsh4x4_1(&b->dqcoeff[0], 258167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->qcoeff); 259085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vpx_memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); 260167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 262167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* override the dc dequant constant in order to preserve the 263167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * dc components 264167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 265167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org DQC = xd->dequant_y1_dc; 266167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_dequant_idct_add_y_block 269167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (xd->qcoeff, DQC, 270167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dst.y_buffer, 271167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dst.y_stride, xd->eobs); 272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_dequant_idct_add_uv_block 275167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org (xd->qcoeff+16*16, xd->dequant_uv, 276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dst.u_buffer, xd->dst.v_buffer, 277167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dst.uv_stride, xd->eobs+16); 278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int get_delta_q(vp8_reader *bc, int prev, int *q_update) 282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int ret_val = 0; 284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) 286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ret_val = vp8_read_literal(bc, 4); 288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) 290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ret_val = -ret_val; 291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Trigger a quantizer update if the delta-q value has changed */ 294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (ret_val != prev) 295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *q_update = 1; 296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return ret_val; 298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef PACKET_TESTING 301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdio.h> 302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgFILE *vpxlog = 0; 303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 305ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic void yv12_extend_frame_top_c(YV12_BUFFER_CONFIG *ybf) 306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 307ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int i; 308ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *src_ptr1; 309ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *dest_ptr1; 310ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 311ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int Border; 312ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int plane_stride; 313ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 314ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 315ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Y Plane */ 316ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 317ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Border = ybf->border; 318ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_stride = ybf->y_stride; 319ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = ybf->y_buffer - Border; 320ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 = src_ptr1 - (Border * plane_stride); 321ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 322ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < (int)Border; i++) 323ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 324ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memcpy(dest_ptr1, src_ptr1, plane_stride); 325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 += plane_stride; 326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 327ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 328ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 329ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 330ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* U Plane */ 331ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_stride = ybf->uv_stride; 333ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Border /= 2; 334ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = ybf->u_buffer - Border; 335ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 = src_ptr1 - (Border * plane_stride); 336ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 337ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < (int)(Border); i++) 338ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 339ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memcpy(dest_ptr1, src_ptr1, plane_stride); 340ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 += plane_stride; 341ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 342ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 343ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 344ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* V Plane */ 345ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 346ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 347ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = ybf->v_buffer - Border; 348ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 = src_ptr1 - (Border * plane_stride); 349ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 350ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < (int)(Border); i++) 351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 352ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memcpy(dest_ptr1, src_ptr1, plane_stride); 353ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 += plane_stride; 354ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 355ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 356ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 357ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic void yv12_extend_frame_bottom_c(YV12_BUFFER_CONFIG *ybf) 358ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 359ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int i; 360ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *src_ptr1, *src_ptr2; 361ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *dest_ptr2; 362ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 363ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int Border; 364ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int plane_stride; 365ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int plane_height; 366ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 367ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 368ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Y Plane */ 369ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 370ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Border = ybf->border; 371ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_stride = ybf->y_stride; 372ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_height = ybf->y_height; 373ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 374ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = ybf->y_buffer - Border; 375ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 376ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 = src_ptr2 + plane_stride; 377ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 378ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < (int)Border; i++) 379ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 380ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memcpy(dest_ptr2, src_ptr2, plane_stride); 381ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 += plane_stride; 382ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 383ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 384ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 385ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 386ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* U Plane */ 387ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 388ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_stride = ybf->uv_stride; 389ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_height = ybf->uv_height; 390ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Border /= 2; 391ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 392ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = ybf->u_buffer - Border; 393ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 394ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 = src_ptr2 + plane_stride; 395ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 396ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < (int)(Border); i++) 397ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 398ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memcpy(dest_ptr2, src_ptr2, plane_stride); 399ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 += plane_stride; 400ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 401ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 402ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 403ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* V Plane */ 404ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 405ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 406ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = ybf->v_buffer - Border; 407ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 408ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 = src_ptr2 + plane_stride; 409ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 410ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < (int)(Border); i++) 411ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 412ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memcpy(dest_ptr2, src_ptr2, plane_stride); 413ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 += plane_stride; 414ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic void yv12_extend_frame_left_right_c(YV12_BUFFER_CONFIG *ybf, 418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *y_src, 419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *u_src, 420ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *v_src) 421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 422ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int i; 423ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *src_ptr1, *src_ptr2; 424ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *dest_ptr1, *dest_ptr2; 425ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 426ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int Border; 427ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int plane_stride; 428ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int plane_height; 429ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int plane_width; 430ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 431ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 432ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Y Plane */ 433ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 434ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Border = ybf->border; 435ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_stride = ybf->y_stride; 436ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_height = 16; 437ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_width = ybf->y_width; 438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 439ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* copy the left and right most columns out */ 440ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = y_src; 441ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 = src_ptr1 + plane_width - 1; 442ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 = src_ptr1 - Border; 443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 = src_ptr2 + 1; 444ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < plane_height; i++) 446ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 447ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(dest_ptr1, src_ptr1[0], Border); 448ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(dest_ptr2, src_ptr2[0], Border); 449ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 += plane_stride; 450ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 += plane_stride; 451ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 += plane_stride; 452ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 += plane_stride; 453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 454ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 455ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 456ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* U Plane */ 457ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 458ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_stride = ybf->uv_stride; 459ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_height = 8; 460ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org plane_width = ybf->uv_width; 461ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Border /= 2; 462ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 463ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* copy the left and right most columns out */ 464ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = u_src; 465ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 = src_ptr1 + plane_width - 1; 466ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 = src_ptr1 - Border; 467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 = src_ptr2 + 1; 468ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 469ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < plane_height; i++) 470ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 471ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(dest_ptr1, src_ptr1[0], Border); 472ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(dest_ptr2, src_ptr2[0], Border); 473ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 += plane_stride; 474ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 += plane_stride; 475ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 += plane_stride; 476ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 += plane_stride; 477ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 478ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 479ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 480ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* V Plane */ 481ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /***********/ 482ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 483ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* copy the left and right most columns out */ 484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 = v_src; 485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 = src_ptr1 + plane_width - 1; 486ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 = src_ptr1 - Border; 487ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 = src_ptr2 + 1; 488ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 489ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < plane_height; i++) 490ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 491ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(dest_ptr1, src_ptr1[0], Border); 492ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(dest_ptr2, src_ptr2[0], Border); 493ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr1 += plane_stride; 494ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org src_ptr2 += plane_stride; 495ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr1 += plane_stride; 496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dest_ptr2 += plane_stride; 497ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 498ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 499ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 5005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void decode_mb_rows(VP8D_COMP *pbi) 5015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{ 5025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org VP8_COMMON *const pc = & pbi->common; 5035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MACROBLOCKD *const xd = & pbi->mb; 504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org MODE_INFO *lf_mic = xd->mode_info_context; 506ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 5075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int ibc = 0; 5085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int num_part = 1 << pc->multi_token_partition; 509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int recon_yoffset, recon_uvoffset; 5115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int mb_row, mb_col; 5125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int mb_idx = 0; 513ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 514ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; 515ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 516ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int recon_y_stride = yv12_fb_new->y_stride; 517ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int recon_uv_stride = yv12_fb_new->uv_stride; 518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *ref_buffer[MAX_REF_FRAMES][3]; 5205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *dst_buffer[3]; 521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *lf_dst[3]; 522ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *eb_dst[3]; 5235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int i; 5245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int ref_fb_corrupted[MAX_REF_FRAMES]; 525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ref_fb_corrupted[INTRA_FRAME] = 0; 527474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for(i = 1; i < MAX_REF_FRAMES; i++) 529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 530ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org YV12_BUFFER_CONFIG *this_fb = pbi->dec_fb_ref[i]; 531ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 532ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_buffer[i][0] = this_fb->y_buffer; 533ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_buffer[i][1] = this_fb->u_buffer; 534ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_buffer[i][2] = this_fb->v_buffer; 535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 536ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_fb_corrupted[i] = this_fb->corrupted; 5375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 539ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Set up the buffer pointers */ 540ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[0] = lf_dst[0] = dst_buffer[0] = yv12_fb_new->y_buffer; 541ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[1] = lf_dst[1] = dst_buffer[1] = yv12_fb_new->u_buffer; 542ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[2] = lf_dst[2] = dst_buffer[2] = yv12_fb_new->v_buffer; 5435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->up_available = 0; 5455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 546ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* Initialize the loop filter for this frame. */ 547ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(pc->filter_level) 548ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_frame_init(pc, xd, pc->filter_level); 549ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 550ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_setup_intra_recon_top_line(yv12_fb_new); 551ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 5525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* Decode the individual macro block */ 5535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_row = 0; mb_row < pc->mb_rows; mb_row++) 5545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (num_part > 1) 556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 5575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->current_bc = & pbi->mbc[ibc]; 5585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ibc++; 5595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (ibc == num_part) 5615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ibc = 0; 562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org recon_yoffset = mb_row * recon_y_stride * 16; 5655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org recon_uvoffset = mb_row * recon_uv_stride * 8; 566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* reset contexts */ 5685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->above_context = pc->above_context; 5695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); 570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->left_available = 0; 5725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 573085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org xd->mb_to_top_edge = -((mb_row * 16) << 3); 5745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0] = dst_buffer[0] + recon_yoffset; 5775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1] = dst_buffer[1] + recon_uvoffset; 5785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2] = dst_buffer[2] + recon_uvoffset; 579474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 5805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[0] = xd->recon_above[0] - 1; 5815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[1] = xd->recon_above[1] - 1; 5825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[2] = xd->recon_above[2] - 1; 5835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0] -= xd->dst.y_stride; 5855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1] -= xd->dst.uv_stride; 5865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2] -= xd->dst.uv_stride; 5875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 588ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* TODO: move to outside row loop */ 5895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[0] = xd->dst.y_stride; 5905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[1] = xd->dst.uv_stride; 5915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 592ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org setup_intra_recon_left(xd->recon_left[0], xd->recon_left[1], 593ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->recon_left[2], xd->dst.y_stride, 594ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->dst.uv_stride); 595ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 5965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_col = 0; mb_col < pc->mb_cols; mb_col++) 597474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 5985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* Distance of Mb to the various image edges. 5995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * These are specified to 8th pel as they are always compared to values 6005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * that are in 1/8th pel units 6015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org */ 6025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mb_to_left_edge = -((mb_col * 16) << 3); 6035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 6045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 6055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 6065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 6075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int corrupt_residual = (!pbi->independent_partitions && 6085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->frame_corrupt_residual) || 6095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8dx_bool_error(xd->current_bc); 6105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (pbi->ec_active && 6115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME && 6125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org corrupt_residual) 6135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 6145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* We have an intra block with corrupt coefficients, better to 6155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * conceal with an inter block. Interpolate MVs from neighboring 6165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * MBs. 6175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * 6185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * Note that for the first mb with corrupt residual in a frame, 6195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * we might not discover that before decoding the residual. That 6205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * happens after this check, and therefore no inter concealment 6215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * will be done. 6225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org */ 6235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_interpolate_motion(xd, 6245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mb_row, mb_col, 6255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pc->mb_rows, pc->mb_cols, 6265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pc->mode_info_stride); 6275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 6285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 6295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 6305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 6315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer = dst_buffer[0] + recon_yoffset; 6325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.u_buffer = dst_buffer[1] + recon_uvoffset; 6335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.v_buffer = dst_buffer[2] + recon_uvoffset; 6345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 635693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com if (xd->mode_info_context->mbmi.ref_frame >= LAST_FRAME) { 636693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com MV_REFERENCE_FRAME ref = xd->mode_info_context->mbmi.ref_frame; 637693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com xd->pre.y_buffer = ref_buffer[ref][0] + recon_yoffset; 638693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com xd->pre.u_buffer = ref_buffer[ref][1] + recon_uvoffset; 639693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com xd->pre.v_buffer = ref_buffer[ref][2] + recon_uvoffset; 640693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com } else { 641693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com // ref_frame is INTRA_FRAME, pre buffer should not be used. 642693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com xd->pre.y_buffer = 0; 643693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com xd->pre.u_buffer = 0; 644693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com xd->pre.v_buffer = 0; 645693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com } 6465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* propagate errors from reference frames */ 6485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->corrupted |= ref_fb_corrupted[xd->mode_info_context->mbmi.ref_frame]; 649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org decode_macroblock(pbi, xd, mb_idx); 651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mb_idx++; 6535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->left_available = 1; 654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* check if the boolean decoder has suffered an error */ 6565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->corrupted |= vp8dx_bool_error(xd->current_bc); 657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0] += 16; 6595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1] += 8; 6605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2] += 8; 6615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[0] += 16; 6625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[1] += 8; 6635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[2] += 8; 664474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org recon_yoffset += 16; 6665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org recon_uvoffset += 8; 667474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ++xd->mode_info_context; /* next mb */ 669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->above_context++; 6715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 6725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 6735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* adjust to the next row of mbs */ 674ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_extend_mb_row(yv12_fb_new, xd->dst.y_buffer + 16, 675ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); 676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ++xd->mode_info_context; /* skip prediction column */ 6785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->up_available = 1; 6795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 680ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(pc->filter_level) 681ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 682ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(mb_row > 0) 683ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 684ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (pc->filter_type == NORMAL_LOOPFILTER) 685ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_row_normal(pc, lf_mic, mb_row-1, 686ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org recon_y_stride, recon_uv_stride, 687ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_dst[0], lf_dst[1], lf_dst[2]); 688ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else 689ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_row_simple(pc, lf_mic, mb_row-1, 690ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org recon_y_stride, recon_uv_stride, 691ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_dst[0], lf_dst[1], lf_dst[2]); 692ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(mb_row > 1) 693ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 694ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yv12_extend_frame_left_right_c(yv12_fb_new, 695ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[0], 696ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[1], 697ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[2]); 698ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 699ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[0] += recon_y_stride * 16; 700ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[1] += recon_uv_stride * 8; 701ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[2] += recon_uv_stride * 8; 702ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 703ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 704ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_dst[0] += recon_y_stride * 16; 705ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_dst[1] += recon_uv_stride * 8; 706ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_dst[2] += recon_uv_stride * 8; 707ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_mic += pc->mb_cols; 708ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_mic++; /* Skip border mb */ 709ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 710ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 711ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else 712ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 713ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(mb_row > 0) 714ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 715ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /**/ 716ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yv12_extend_frame_left_right_c(yv12_fb_new, 717ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[0], 718ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[1], 719ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[2]); 720ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[0] += recon_y_stride * 16; 721ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[1] += recon_uv_stride * 8; 722ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[2] += recon_uv_stride * 8; 723ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 724ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 725ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 726ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 727ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if(pc->filter_level) 728ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 729ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (pc->filter_type == NORMAL_LOOPFILTER) 730ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_row_normal(pc, lf_mic, mb_row-1, recon_y_stride, 731ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org recon_uv_stride, lf_dst[0], lf_dst[1], 732ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_dst[2]); 733ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else 734ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_row_simple(pc, lf_mic, mb_row-1, recon_y_stride, 735ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org recon_uv_stride, lf_dst[0], lf_dst[1], 736ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lf_dst[2]); 737ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 738ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yv12_extend_frame_left_right_c(yv12_fb_new, 739ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[0], 740ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[1], 741ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[2]); 742ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[0] += recon_y_stride * 16; 743ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[1] += recon_uv_stride * 8; 744ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[2] += recon_uv_stride * 8; 7455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 746ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yv12_extend_frame_left_right_c(yv12_fb_new, 747ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[0], 748ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[1], 749ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org eb_dst[2]); 750d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org yv12_extend_frame_top_c(yv12_fb_new); 751ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yv12_extend_frame_bottom_c(yv12_fb_new); 752ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 7535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org} 754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 7556ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.comstatic unsigned int read_partition_size(VP8D_COMP *pbi, 7566ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com const unsigned char *cx_size) 757474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 7586ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com unsigned char temp[3]; 7596ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (pbi->decrypt_cb) 7606ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com { 7616ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pbi->decrypt_cb(pbi->decrypt_state, cx_size, temp, 3); 7626ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com cx_size = temp; 7636ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com } 7646ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com return cx_size[0] + (cx_size[1] << 8) + (cx_size[2] << 16); 765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 767167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic int read_is_valid(const unsigned char *start, 768167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org size_t len, 769167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned char *end) 770474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 771167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org return (start + len > start && start + len <= end); 772167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 774167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgstatic unsigned int read_available_partition_size( 775167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org VP8D_COMP *pbi, 776167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned char *token_part_sizes, 777167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned char *fragment_start, 778167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned char *first_fragment_end, 779167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned char *fragment_end, 780167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int i, 781167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int num_part) 782167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org{ 783167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org VP8_COMMON* pc = &pbi->common; 784167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned char *partition_size_ptr = token_part_sizes + i * 3; 7855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned int partition_size = 0; 786167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ptrdiff_t bytes_left = fragment_end - fragment_start; 787167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Calculate the length of this partition. The last partition 788167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * size is implicit. If the partition size can't be read, then 789167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * either use the remaining data in the buffer (for EC mode) 790167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * or throw an error. 791167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 792167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (i < num_part - 1) 793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 794167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (read_is_valid(partition_size_ptr, 3, first_fragment_end)) 7956ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com partition_size = read_partition_size(pbi, partition_size_ptr); 796167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else if (pbi->ec_active) 797ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org partition_size = (unsigned int)bytes_left; 798167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 799167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 800167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org "Truncated partition size data"); 801474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 802167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 803ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org partition_size = (unsigned int)bytes_left; 804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 805167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Validate the calculated partition length. If the buffer 806167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * described by the partition can't be fully read, then restrict 807167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * it to the portion that can be (for EC mode) or throw an error. 808167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org */ 809167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (!read_is_valid(fragment_start, partition_size, fragment_end)) 810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 811167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (pbi->ec_active) 812ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org partition_size = (unsigned int)bytes_left; 813167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 814167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 815167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org "Truncated packet or corrupt partition " 816167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org "%d length", i + 1); 817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 818167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org return partition_size; 819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 821474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 822474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void setup_token_decoder(VP8D_COMP *pbi, 823167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org const unsigned char* token_part_sizes) 824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 825ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_reader *bool_decoder = &pbi->mbc[0]; 826167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org unsigned int partition_idx; 8270f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com unsigned int fragment_idx; 8280f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com unsigned int num_token_partitions; 829c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org const unsigned char *first_fragment_end = pbi->fragments.ptrs[0] + 830c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.sizes[0]; 831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 832167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org TOKEN_PARTITION multi_token_partition = 833ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (TOKEN_PARTITION)vp8_read_literal(&pbi->mbc[8], 2); 834ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (!vp8dx_bool_error(&pbi->mbc[8])) 835167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pbi->common.multi_token_partition = multi_token_partition; 836167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org num_token_partitions = 1 << pbi->common.multi_token_partition; 837474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 838167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Check for partitions within the fragments and unpack the fragments 839167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * so that each fragment pointer points to its corresponding partition. */ 840c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org for (fragment_idx = 0; fragment_idx < pbi->fragments.count; ++fragment_idx) 841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 842c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org unsigned int fragment_size = pbi->fragments.sizes[fragment_idx]; 843c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org const unsigned char *fragment_end = pbi->fragments.ptrs[fragment_idx] + 844167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org fragment_size; 845167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Special case for handling the first partition since we have already 846167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * read its size. */ 847167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (fragment_idx == 0) 848474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 849167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Size of first partition + token partition sizes element */ 850167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ptrdiff_t ext_first_part_size = token_part_sizes - 851c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.ptrs[0] + 3 * (num_token_partitions - 1); 852ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org fragment_size -= (unsigned int)ext_first_part_size; 853167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (fragment_size > 0) 854167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 855c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.sizes[0] = (unsigned int)ext_first_part_size; 856167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* The fragment contains an additional partition. Move to 857167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * next. */ 858167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org fragment_idx++; 859c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.ptrs[fragment_idx] = pbi->fragments.ptrs[0] + 860c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.sizes[0]; 861167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 863167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Split the chunk into partitions read from the bitstream */ 864167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org while (fragment_size > 0) 865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 866167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ptrdiff_t partition_size = read_available_partition_size( 867167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pbi, 868167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org token_part_sizes, 869c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.ptrs[fragment_idx], 870167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org first_fragment_end, 871167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org fragment_end, 872167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org fragment_idx - 1, 873167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org num_token_partitions); 874c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.sizes[fragment_idx] = (unsigned int)partition_size; 875ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org fragment_size -= (unsigned int)partition_size; 876167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org assert(fragment_idx <= num_token_partitions); 877167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (fragment_size > 0) 878167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 879167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* The fragment contains an additional partition. 880167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * Move to next. */ 881167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org fragment_idx++; 882c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.ptrs[fragment_idx] = 883c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.ptrs[fragment_idx - 1] + partition_size; 884167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 885474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 886167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 887474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 888c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.count = num_token_partitions + 1; 889167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 890c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org for (partition_idx = 1; partition_idx < pbi->fragments.count; ++partition_idx) 891167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 892167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (vp8dx_start_decode(bool_decoder, 893c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org pbi->fragments.ptrs[partition_idx], 894ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org pbi->fragments.sizes[partition_idx], 8956ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pbi->decrypt_cb, pbi->decrypt_state)) 896167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR, 897167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org "Failed to allocate bool decoder %d", 898167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org partition_idx); 899474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 900474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bool_decoder++; 901474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 903474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD 904474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Clamp number of decoder threads */ 905167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (pbi->decoding_thread_count > num_token_partitions - 1) 906167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pbi->decoding_thread_count = num_token_partitions - 1; 907474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 908474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 909474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 911474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void init_frame(VP8D_COMP *pbi) 912474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 913474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *const pc = & pbi->common; 914474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *const xd = & pbi->mb; 915474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 916474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type == KEY_FRAME) 917474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 918474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Various keyframe initializations */ 919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(pc->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context)); 920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 921474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_init_mbmode_probs(pc); 922474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 923474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_default_coef_probs(pc); 924474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 925474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* reset the segment feature data to 0 with delta coding (Default state). */ 926474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(xd->segment_feature_data, 0, sizeof(xd->segment_feature_data)); 927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mb_segement_abs_delta = SEGMENT_DELTADATA; 928474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 929474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* reset the mode ref deltasa for loop filter */ 930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(xd->ref_lf_deltas, 0, sizeof(xd->ref_lf_deltas)); 931474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(xd->mode_lf_deltas, 0, sizeof(xd->mode_lf_deltas)); 932474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 933474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* All buffers are implicitly updated on key frames. */ 934474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_golden_frame = 1; 935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_alt_ref_frame = 1; 936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->copy_buffer_to_gf = 0; 937474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->copy_buffer_to_arf = 0; 938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 939474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Note that Golden and Altref modes cannot be used on a key frame so 940474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * ref_frame_sign_bias[] is undefined and meaningless 941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 942474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->ref_frame_sign_bias[GOLDEN_FRAME] = 0; 943474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->ref_frame_sign_bias[ALTREF_FRAME] = 0; 944474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 945474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 946474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 947c1e5cf4c65bbfa134110b17fba3246ad3d7323b0hclam@chromium.org /* To enable choice of different interploation filters */ 948ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (!pc->use_bilinear_mc_filter) 949474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 9505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->subpixel_predict = vp8_sixtap_predict4x4; 9515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->subpixel_predict8x4 = vp8_sixtap_predict8x4; 9525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->subpixel_predict8x8 = vp8_sixtap_predict8x8; 9535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->subpixel_predict16x16 = vp8_sixtap_predict16x16; 954474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 955474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 956474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 9575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->subpixel_predict = vp8_bilinear_predict4x4; 9585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->subpixel_predict8x4 = vp8_bilinear_predict8x4; 9595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->subpixel_predict8x8 = vp8_bilinear_predict8x8; 9605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->subpixel_predict16x16 = vp8_bilinear_predict16x16; 961474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 962474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 963474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->decoded_key_frame && pbi->ec_enabled && !pbi->ec_active) 964474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->ec_active = 1; 965474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 966474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 967474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->left_context = &pc->left_context; 968474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mode_info_context = pc->mi; 969474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->frame_type = pc->frame_type; 970474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mode_info_context->mbmi.mode = DC_PRED; 971474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mode_info_stride = pc->mode_info_stride; 972474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->corrupted = 0; /* init without corruption */ 973167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 974167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->fullpixel_mask = 0xffffffff; 975167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if(pc->full_pixel) 976167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->fullpixel_mask = 0xfffffff8; 977167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 978474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 979474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 980474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_decode_frame(VP8D_COMP *pbi) 981474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 982ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org vp8_reader *const bc = &pbi->mbc[8]; 983ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org VP8_COMMON *const pc = &pbi->common; 984ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org MACROBLOCKD *const xd = &pbi->mb; 985c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org const unsigned char *data = pbi->fragments.ptrs[0]; 986c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org const unsigned char *data_end = data + pbi->fragments.sizes[0]; 987474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ptrdiff_t first_partition_length_in_bytes; 988474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 989474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i, j, k, l; 990474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int *const mb_feature_data_bits = vp8_mb_feature_data_bits; 991474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int corrupt_tokens = 0; 992474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int prev_independent_partitions = pbi->independent_partitions; 993474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 994ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; 995ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 996474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* start with no corruption of current frame */ 997474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->corrupted = 0; 998ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yv12_fb_new->corrupted = 0; 999474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1000474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (data_end - data < 3) 1001474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1002167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (!pbi->ec_active) 1003474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1004474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 1005474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org "Truncated packet"); 1006474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1007167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1008167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Declare the missing frame as an inter frame since it will 1009167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org be handled as an inter frame when we have estimated its 1010167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org motion vectors. */ 1011167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->frame_type = INTER_FRAME; 1012167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->version = 0; 1013167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->show_frame = 1; 1014167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org first_partition_length_in_bytes = 0; 1015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1017474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 10186ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com unsigned char clear_buffer[10]; 10196ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com const unsigned char *clear = data; 10206ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (pbi->decrypt_cb) 10216ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com { 1022693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com int n = (int)MIN(sizeof(clear_buffer), data_end - data); 10236ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pbi->decrypt_cb(pbi->decrypt_state, data, clear_buffer, n); 10246ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com clear = clear_buffer; 10256ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com } 10266ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com 10276ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pc->frame_type = (FRAME_TYPE)(clear[0] & 1); 10286ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pc->version = (clear[0] >> 1) & 7; 10296ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pc->show_frame = (clear[0] >> 4) & 1; 1030474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org first_partition_length_in_bytes = 10316ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com (clear[0] | (clear[1] << 8) | (clear[2] << 16)) >> 5; 1032474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1033ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org if (!pbi->ec_active && 1034ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org (data + first_partition_length_in_bytes > data_end 1035474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org || data + first_partition_length_in_bytes < data)) 1036474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 1037474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org "Truncated packet or corrupt partition 0 length"); 1038167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1039167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org data += 3; 10406ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com clear += 3; 1041167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1042474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_setup_version(pc); 1043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1044ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 1045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type == KEY_FRAME) 1046474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1047474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* vet via sync code */ 1048474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* When error concealment is enabled we should only check the sync 1049474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * code if we have enough bits available 1050474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 1051474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!pbi->ec_active || data + 3 < data_end) 1052474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 10536ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (clear[0] != 0x9d || clear[1] != 0x01 || clear[2] != 0x2a) 1054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_UNSUP_BITSTREAM, 1055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org "Invalid frame sync code"); 1056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1057474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1058474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* If error concealment is enabled we should only parse the new size 1059474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * if we have enough data. Otherwise we will end up with the wrong 1060474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * size. 1061474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 1062474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!pbi->ec_active || data + 6 < data_end) 1063474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 10646ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pc->Width = (clear[3] | (clear[4] << 8)) & 0x3fff; 10656ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pc->horiz_scale = clear[4] >> 6; 10666ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pc->Height = (clear[5] | (clear[6] << 8)) & 0x3fff; 10676ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pc->vert_scale = clear[6] >> 6; 1068474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1069474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org data += 7; 10706ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com clear += 7; 1071ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 1072ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else 1073ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 1074ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memcpy(&xd->pre, yv12_fb_new, sizeof(YV12_BUFFER_CONFIG)); 1075ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memcpy(&xd->dst, yv12_fb_new, sizeof(YV12_BUFFER_CONFIG)); 1076474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1077474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1078ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if ((!pbi->decoded_key_frame && pc->frame_type != KEY_FRAME)) 1079474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return -1; 1081474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1082474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1083474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org init_frame(pbi); 1084474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 10856ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com if (vp8dx_start_decode(bc, data, (unsigned int)(data_end - data), 10866ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com pbi->decrypt_cb, pbi->decrypt_state)) 1087474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 1088474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org "Failed to allocate bool decoder 0"); 1089474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type == KEY_FRAME) { 109047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org (void)vp8_read_bit(bc); // colorspace 1091474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->clamp_type = (CLAMP_TYPE)vp8_read_bit(bc); 1092474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1093474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1094474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Is segmentation enabled */ 1095474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->segmentation_enabled = (unsigned char)vp8_read_bit(bc); 1096474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1097474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->segmentation_enabled) 1098474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1099474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Signal whether or not the segmentation map is being explicitly updated this frame. */ 1100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->update_mb_segmentation_map = (unsigned char)vp8_read_bit(bc); 1101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->update_mb_segmentation_data = (unsigned char)vp8_read_bit(bc); 1102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->update_mb_segmentation_data) 1104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mb_segement_abs_delta = (unsigned char)vp8_read_bit(bc); 1106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(xd->segment_feature_data, 0, sizeof(xd->segment_feature_data)); 1108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* For each segmentation feature (Quant and loop filter level) */ 1110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < MB_LVL_MAX; i++) 1111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < MAX_MB_SEGMENTS; j++) 1113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Frame level data */ 1115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) 1116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->segment_feature_data[i][j] = (signed char)vp8_read_literal(bc, mb_feature_data_bits[i]); 1118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) 1120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->segment_feature_data[i][j] = -xd->segment_feature_data[i][j]; 1121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->segment_feature_data[i][j] = 0; 1124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->update_mb_segmentation_map) 1129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Which macro block level features are enabled */ 1131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs)); 1132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Read the probs used to decode the segment id for each macro block. */ 1134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) 1135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* If not explicitly set value is defaulted to 255 by memset above */ 1137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) 1138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mb_segment_tree_probs[i] = (vp8_prob)vp8_read_literal(bc, 8); 1139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 11425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 11435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 11445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* No segmentation updates on this frame */ 11455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->update_mb_segmentation_map = 0; 11465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->update_mb_segmentation_data = 0; 11475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 1148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Read the loop filter level and type */ 1150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->filter_type = (LOOPFILTERTYPE) vp8_read_bit(bc); 1151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->filter_level = vp8_read_literal(bc, 6); 1152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->sharpness_level = vp8_read_literal(bc, 3); 1153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Read in loop filter deltas applied at the MB level based on mode or ref frame. */ 1155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mode_ref_lf_delta_update = 0; 1156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mode_ref_lf_delta_enabled = (unsigned char)vp8_read_bit(bc); 1157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_ref_lf_delta_enabled) 1159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Do the deltas need to be updated */ 1161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mode_ref_lf_delta_update = (unsigned char)vp8_read_bit(bc); 1162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_ref_lf_delta_update) 1164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Send update */ 1166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < MAX_REF_LF_DELTAS; i++) 1167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) 1169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /*sign = vp8_read_bit( bc );*/ 1171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->ref_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6); 1172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) /* Apply sign */ 1174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->ref_lf_deltas[i] = xd->ref_lf_deltas[i] * -1; 1175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Send update */ 1179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < MAX_MODE_LF_DELTAS; i++) 1180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) 1182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /*sign = vp8_read_bit( bc );*/ 1184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mode_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6); 1185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read_bit(bc)) /* Apply sign */ 1187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->mode_lf_deltas[i] = xd->mode_lf_deltas[i] * -1; 1188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1193167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org setup_token_decoder(pbi, data + first_partition_length_in_bytes); 1194167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->current_bc = &pbi->mbc[0]; 1196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Read the default quantizers. */ 1198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int Q, q_update; 1200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org Q = vp8_read_literal(bc, 7); /* AC 1st order Q = default */ 1202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->base_qindex = Q; 1203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org q_update = 0; 1204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->y1dc_delta_q = get_delta_q(bc, pc->y1dc_delta_q, &q_update); 1205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->y2dc_delta_q = get_delta_q(bc, pc->y2dc_delta_q, &q_update); 1206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->y2ac_delta_q = get_delta_q(bc, pc->y2ac_delta_q, &q_update); 1207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->uvdc_delta_q = get_delta_q(bc, pc->uvdc_delta_q, &q_update); 1208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->uvac_delta_q = get_delta_q(bc, pc->uvac_delta_q, &q_update); 1209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (q_update) 1211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8cx_init_de_quantizer(pbi); 1212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* MB level dequantizer setup */ 12145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_mb_init_dequantizer(pbi, &pbi->mb); 1215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Determine if the golden frame or ARF buffer should be updated and how. 1218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * For all non key frames the GF and ARF refresh flags and sign bias 1219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * flags must be set explicitly. 1220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 1221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type != KEY_FRAME) 1222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Should the GF or ARF be updated from the current frame */ 1224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_golden_frame = vp8_read_bit(bc); 1225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 1226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Assume we shouldn't refresh golden if the bit is missing */ 1227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->corrupted |= vp8dx_bool_error(bc); 1228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->ec_active && xd->corrupted) 1229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_golden_frame = 0; 1230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_alt_ref_frame = vp8_read_bit(bc); 1233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 1234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Assume we shouldn't refresh altref if the bit is missing */ 1235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->corrupted |= vp8dx_bool_error(bc); 1236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->ec_active && xd->corrupted) 1237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_alt_ref_frame = 0; 1238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Buffer to buffer copy flags. */ 1241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->copy_buffer_to_gf = 0; 1242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!pc->refresh_golden_frame) 1244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->copy_buffer_to_gf = vp8_read_literal(bc, 2); 1245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1246167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 1247167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Assume we shouldn't copy to the golden if the bit is missing */ 1248167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->corrupted |= vp8dx_bool_error(bc); 1249167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (pbi->ec_active && xd->corrupted) 1250167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->copy_buffer_to_gf = 0; 1251167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 1252167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->copy_buffer_to_arf = 0; 1254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!pc->refresh_alt_ref_frame) 1256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->copy_buffer_to_arf = vp8_read_literal(bc, 2); 1257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1258167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 1259167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Assume we shouldn't copy to the alt-ref if the bit is missing */ 1260167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->corrupted |= vp8dx_bool_error(bc); 1261167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (pbi->ec_active && xd->corrupted) 1262167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->copy_buffer_to_arf = 0; 1263167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 1264167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1265167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->ref_frame_sign_bias[GOLDEN_FRAME] = vp8_read_bit(bc); 1267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->ref_frame_sign_bias[ALTREF_FRAME] = vp8_read_bit(bc); 1268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_entropy_probs = vp8_read_bit(bc); 1271167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 1272167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Assume we shouldn't refresh the probabilities if the bit is 1273167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org * missing */ 1274167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->corrupted |= vp8dx_bool_error(bc); 1275167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (pbi->ec_active && xd->corrupted) 1276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pc->refresh_entropy_probs = 0; 1277167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#endif 1278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->refresh_entropy_probs == 0) 1279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(&pc->lfc, &pc->fc, sizeof(pc->fc)); 1281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_last_frame = pc->frame_type == KEY_FRAME || vp8_read_bit(bc); 1284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 1286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Assume we should refresh the last frame if the bit is missing */ 1287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org xd->corrupted |= vp8dx_bool_error(bc); 1288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->ec_active && xd->corrupted) 1289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_last_frame = 1; 1290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (0) 1293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org FILE *z = fopen("decodestats.stt", "a"); 1295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fprintf(z, "%6d F:%d,G:%d,A:%d,L:%d,Q:%d\n", 1296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->current_video_frame, 1297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->frame_type, 1298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_golden_frame, 1299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_alt_ref_frame, 1300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->refresh_last_frame, 1301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pc->base_qindex); 1302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fclose(z); 1303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->independent_partitions = 1; 1307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* read coef probability tree */ 1309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < BLOCK_TYPES; i++) 1310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (j = 0; j < COEF_BANDS; j++) 1311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (k = 0; k < PREV_COEF_CONTEXTS; k++) 1312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (l = 0; l < ENTROPY_NODES; l++) 1313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_prob *const p = pc->fc.coef_probs [i][j][k] + l; 1316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (vp8_read(bc, vp8_coef_update_probs [i][j][k][l])) 1318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *p = (vp8_prob)vp8_read_literal(bc, 8); 1320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (k > 0 && *p != pc->fc.coef_probs[i][j][k-1][l]) 1323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->independent_partitions = 0; 1324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* clear out the coeff buffer */ 1329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); 1330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_decode_mode_mvs(pbi); 1332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 1334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->ec_active && 1335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mvs_corrupt_from_mb < (unsigned int)pc->mb_cols * pc->mb_rows) 1336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Motion vectors are missing in this frame. We will try to estimate 1338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * them and then continue decoding the frame as usual */ 1339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_estimate_missing_mvs(pbi); 1340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols); 13445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->frame_corrupt_residual = 0; 1345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD 1347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION) 1348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 13491929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org unsigned int thread; 1350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8mt_decode_mb_rows(pbi, xd); 1351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_yv12_extend_frame_borders(yv12_fb_new); 13521929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org for (thread = 0; thread < pbi->decoding_thread_count; ++thread) 13531929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org corrupt_tokens |= pbi->mb_row_di[thread].mbd.corrupted; 1354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 13585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org decode_mb_rows(pbi); 1359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org corrupt_tokens |= xd->corrupted; 1360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Collect information about decoder corruption. */ 1363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* 1. Check first boolean decoder for errors. */ 1364ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yv12_fb_new->corrupted = vp8dx_bool_error(bc); 1365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* 2. Check the macroblock information */ 1366ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yv12_fb_new->corrupted |= corrupt_tokens; 1367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!pbi->decoded_key_frame) 1369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->frame_type == KEY_FRAME && 1371ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org !yv12_fb_new->corrupted) 1372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->decoded_key_frame = 1; 1373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 1374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_internal_error(&pbi->common.error, VPX_CODEC_CORRUPT_FRAME, 1375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org "A stream must start with a complete key frame"); 1376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes \n",bc->pos+pbi->bc2.pos); */ 1379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pc->refresh_entropy_probs == 0) 1381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(&pc->fc, &pc->lfc, sizeof(pc->fc)); 1383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->independent_partitions = prev_independent_partitions; 1384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef PACKET_TESTING 1387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org FILE *f = fopen("decompressor.VP8", "ab"); 1389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned int size = pbi->bc2.pos + pbi->bc.pos + 8; 1390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fwrite((void *) &size, 4, 1, f); 1391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fwrite((void *) pbi->Source, size, 1, f); 1392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org fclose(f); 1393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 1395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return 0; 1397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 1398