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" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if !defined(WIN32) && CONFIG_OS_SUPPORT == 1 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org# include <unistd.h> 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "onyxd_int.h" 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h" 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/threading.h" 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/loopfilter.h" 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/extend.h" 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_ports/vpx_timer.h" 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "detokenize.h" 255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vp8/common/reconintra4x4.h" 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/reconinter.h" 27ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vp8/common/setupintrarecon.h" 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "error_concealment.h" 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 32d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#define CALLOC_ARRAY(p, n) CHECK_MEM_ERROR((p), vpx_calloc(sizeof(*(p)), (n))) 33d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#define CALLOC_ARRAY_ALIGNED(p, n, algn) do { \ 34d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CHECK_MEM_ERROR((p), vpx_memalign((algn), sizeof(*(p)) * (n))); \ 35d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org memset((p), 0, (n) * sizeof(*(p))); \ 36d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org} while (0) 37d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org 38d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org 394b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.orgvoid vp8_mb_init_dequantizer(VP8D_COMP *pbi, MACROBLOCKD *xd); 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void setup_decoding_thread_data(VP8D_COMP *pbi, MACROBLOCKD *xd, MB_ROW_DEC *mbrd, int count) 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *const pc = & pbi->common; 44167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int i; 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < count; i++) 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *mbd = &mbrd[i].mbd; 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->subpixel_predict = xd->subpixel_predict; 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->subpixel_predict8x4 = xd->subpixel_predict8x4; 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->subpixel_predict8x8 = xd->subpixel_predict8x8; 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->subpixel_predict16x16 = xd->subpixel_predict16x16; 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->mode_info_context = pc->mi + pc->mode_info_stride * (i + 1); 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->mode_info_stride = pc->mode_info_stride; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->frame_type = pc->frame_type; 58ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mbd->pre = xd->pre; 59ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mbd->dst = xd->dst; 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->segmentation_enabled = xd->segmentation_enabled; 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->mb_segement_abs_delta = xd->mb_segement_abs_delta; 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(mbd->segment_feature_data, xd->segment_feature_data, sizeof(xd->segment_feature_data)); 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /*signed char ref_lf_deltas[MAX_REF_LF_DELTAS];*/ 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(mbd->ref_lf_deltas, xd->ref_lf_deltas, sizeof(xd->ref_lf_deltas)); 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /*signed char mode_lf_deltas[MAX_MODE_LF_DELTAS];*/ 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memcpy(mbd->mode_lf_deltas, xd->mode_lf_deltas, sizeof(xd->mode_lf_deltas)); 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /*unsigned char mode_ref_lf_delta_enabled; 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char mode_ref_lf_delta_update;*/ 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->mode_ref_lf_delta_enabled = xd->mode_ref_lf_delta_enabled; 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mbd->mode_ref_lf_delta_update = xd->mode_ref_lf_delta_update; 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 74ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mbd->current_bc = &pbi->mbc[0]; 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 76167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memcpy(mbd->dequant_y1_dc, xd->dequant_y1_dc, sizeof(xd->dequant_y1_dc)); 77167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memcpy(mbd->dequant_y1, xd->dequant_y1, sizeof(xd->dequant_y1)); 78167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memcpy(mbd->dequant_y2, xd->dequant_y2, sizeof(xd->dequant_y2)); 79167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_memcpy(mbd->dequant_uv, xd->dequant_uv, sizeof(xd->dequant_uv)); 80167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 81167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mbd->fullpixel_mask = 0xffffffff; 82ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 83ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (pc->full_pixel) 84167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mbd->fullpixel_mask = 0xfffffff8; 85167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 88ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (i = 0; i < pc->mb_rows; i++) 89ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org pbi->mt_current_mb_col[i] = -1; 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 92ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic void mt_decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, 93ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned int mb_idx) 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MB_PREDICTION_MODE mode; 96167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int i; 975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int corruption_detected = 0; 995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_info_context->mbmi.mb_skip_coeff) 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_reset_mb_tokens_context(xd); 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 105167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else if (!vp8dx_bool_error(xd->current_bc)) 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int eobtotal; 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org eobtotal = vp8_decode_mb_tokens(pbi, xd); 1095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* Special case: Force the loopfilter to skip when eobtotal is zero */ 1115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context->mbmi.mb_skip_coeff = (eobtotal==0); 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode = xd->mode_info_context->mbmi.mode; 1155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (xd->segmentation_enabled) 1175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_mb_init_dequantizer(pbi, xd); 1185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 1215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if(pbi->ec_active) 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int throw_residual; 1255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* When we have independent partitions we can apply residual even 1265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * though other partitions within the frame are corrupt. 1275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org */ 1285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org throw_residual = (!pbi->independent_partitions && 1295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->frame_corrupt_residual); 1305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org throw_residual = (throw_residual || vp8dx_bool_error(xd->current_bc)); 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if ((mb_idx >= pbi->mvs_corrupt_from_mb || throw_residual)) 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* MB with corrupt residuals or corrupt mode/motion vectors. 1355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * Better to use the predictor as reconstruction. 1365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org */ 1375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->frame_corrupt_residual = 1; 1385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); 1395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_conceal_corrupt_mb(xd); 1405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org corruption_detected = 1; 1435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* force idct to be skipped for B_PRED and use the 1455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * prediction only for reconstruction 1465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * */ 1475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memset(xd->eobs, 0, 25); 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* do prediction */ 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_intra_predictors_mbuv_s(xd, 1565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1], 1575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2], 1585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[1], 1595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[2], 1605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[1], 1615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.u_buffer, xd->dst.v_buffer, 1625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.uv_stride); 1635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (mode != B_PRED) 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 1665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_intra_predictors_mby_s(xd, 1675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0], 1685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[0], 1695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[0], 1705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer, 1715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_stride); 1725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 1735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 1745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 1755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org short *DQC = xd->dequant_y1; 1765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int dst_stride = xd->dst.y_stride; 1775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* clear out residual eob info */ 1795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if(xd->mode_info_context->mbmi.mb_skip_coeff) 1805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memset(xd->eobs, 0, 25); 1815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org intra_prediction_down_copy(xd, xd->recon_above[0] + 16); 1835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (i = 0; i < 16; i++) 1855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 1865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org BLOCKD *b = &xd->block[i]; 187ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *dst = xd->dst.y_buffer + b->offset; 188ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org B_PREDICTION_MODE b_mode = 189ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->mode_info_context->bmi[i].as_mode; 190ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *Above; 1915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *yleft; 1925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int left_stride; 1935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char top_left; 1945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 1955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /*Caution: For some b_mode, it needs 8 pixels (4 above + 4 above-right).*/ 1965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (i < 4 && pbi->common.filter_level) 197ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Above = xd->recon_above[0] + b->offset; 1985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org Above = dst - dst_stride; 2005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (i%4==0 && pbi->common.filter_level) 2025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 2035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org yleft = xd->recon_left[0] + i; 2045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org left_stride = 1; 2055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 2065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 2075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org yleft = dst - 1; 2095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org left_stride = dst_stride; 2105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 2115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if ((i==4 || i==8 || i==12) && pbi->common.filter_level) 2135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org top_left = *(xd->recon_left[0] + i - 1); 2145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 215ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org top_left = Above[-1]; 2165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 217ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_intra4x4_predict(Above, yleft, left_stride, 218ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org b_mode, dst, dst_stride, top_left); 2195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (xd->eobs[i] ) 2215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 2225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (xd->eobs[i] > 1) 2235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_dequant_idct_add(b->qcoeff, DQC, dst, dst_stride); 2255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 2265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 2275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_dc_only_idct_add(b->qcoeff[0] * DQC[0], 229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst, dst_stride, dst, dst_stride); 230085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vpx_memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); 2315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 2325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 2335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_build_inter_predictors_mb(xd); 239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT 2435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (corruption_detected) 244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return; 246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if(!xd->mode_info_context->mbmi.mb_skip_coeff) 250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 2515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* dequantization and idct */ 2525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (mode != B_PRED) 253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 2545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org short *DQC = xd->dequant_y1; 255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (mode != SPLITMV) 257167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 2585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org BLOCKD *b = &xd->block[24]; 2595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* do 2nd order transform on the dc block */ 2615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (xd->eobs[24] > 1) 262167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 2635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_dequantize_b(b, xd->dequant_y2); 2645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_short_inv_walsh4x4(&b->dqcoeff[0], 2665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->qcoeff); 267085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vpx_memset(b->qcoeff, 0, 16 * sizeof(b->qcoeff[0])); 268167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 269167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 270167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 2715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org b->dqcoeff[0] = b->qcoeff[0] * xd->dequant_y2[0]; 2725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_short_inv_walsh4x4_1(&b->dqcoeff[0], 2735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->qcoeff); 274085cab8fbb48aa8b9f7e3e6d5a2694afd0ffe2e0johannkoenig@chromium.org vpx_memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); 275167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 2765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* override the dc dequant constant in order to preserve the 2785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * dc components 2795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org */ 2805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org DQC = xd->dequant_y1_dc; 281167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 2825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_dequant_idct_add_y_block 2845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->qcoeff, DQC, 2855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer, 2865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_stride, xd->eobs); 287167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 2885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 2895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_dequant_idct_add_uv_block 2905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->qcoeff+16*16, xd->dequant_uv, 2915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.u_buffer, xd->dst.v_buffer, 2925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.uv_stride, xd->eobs+16); 293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 2945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org} 2955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgstatic void mt_decode_mb_rows(VP8D_COMP *pbi, MACROBLOCKD *xd, int start_mb_row) 2975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org{ 298ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org volatile const int *last_row_current_mb_col; 299ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org volatile int *current_mb_col; 3005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int mb_row; 3015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org VP8_COMMON *pc = &pbi->common; 302ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int nsync = pbi->sync_range; 303ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int first_row_no_sync_above = pc->mb_cols + nsync; 3045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int num_part = 1 << pbi->common.multi_token_partition; 305ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int last_mb_row = start_mb_row; 306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 307ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; 308ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org YV12_BUFFER_CONFIG *yv12_fb_lst = pbi->dec_fb_ref[LAST_FRAME]; 309ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 310ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int recon_y_stride = yv12_fb_new->y_stride; 311ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int recon_uv_stride = yv12_fb_new->uv_stride; 3125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *ref_buffer[MAX_REF_FRAMES][3]; 3145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org unsigned char *dst_buffer[3]; 3155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int i; 3165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int ref_fb_corrupted[MAX_REF_FRAMES]; 3175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ref_fb_corrupted[INTRA_FRAME] = 0; 3195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for(i = 1; i < MAX_REF_FRAMES; i++) 321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 322ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org YV12_BUFFER_CONFIG *this_fb = pbi->dec_fb_ref[i]; 323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 324ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_buffer[i][0] = this_fb->y_buffer; 325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_buffer[i][1] = this_fb->u_buffer; 326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_buffer[i][2] = this_fb->v_buffer; 327ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 328ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org ref_fb_corrupted[i] = this_fb->corrupted; 3295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 331ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst_buffer[0] = yv12_fb_new->y_buffer; 332ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst_buffer[1] = yv12_fb_new->u_buffer; 333ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org dst_buffer[2] = yv12_fb_new->v_buffer; 334167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 3355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->up_available = (start_mb_row != 0); 336167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 3375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_row = start_mb_row; mb_row < pc->mb_rows; mb_row += (pbi->decoding_thread_count + 1)) 3385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int recon_yoffset, recon_uvoffset; 3405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int mb_col; 3415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int filter_level; 3425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org loop_filter_info_n *lfi_n = &pc->lf_info; 3435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 344ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* save last row processed by this thread */ 345ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org last_mb_row = mb_row; 346ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* select bool coder for current partition */ 347ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->current_bc = &pbi->mbc[mb_row%num_part]; 3485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (mb_row > 0) 3505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org last_row_current_mb_col = &pbi->mt_current_mb_col[mb_row -1]; 351ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else 352ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org last_row_current_mb_col = &first_row_no_sync_above; 353ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 354ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org current_mb_col = &pbi->mt_current_mb_col[mb_row]; 3555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org recon_yoffset = mb_row * recon_y_stride * 16; 3575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org recon_uvoffset = mb_row * recon_uv_stride * 8; 3585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* reset contexts */ 3605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->above_context = pc->above_context; 3615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); 3625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->left_available = 0; 3645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mb_to_top_edge = -((mb_row * 16)) << 3; 3665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 3675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (pbi->common.filter_level) 3695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0] = pbi->mt_yabove_row[mb_row] + 0*16 +32; 3715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1] = pbi->mt_uabove_row[mb_row] + 0*8 +16; 3725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2] = pbi->mt_vabove_row[mb_row] + 0*8 +16; 3735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[0] = pbi->mt_yleft_col[mb_row]; 3755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[1] = pbi->mt_uleft_col[mb_row]; 3765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[2] = pbi->mt_vleft_col[mb_row]; 3775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 378ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* TODO: move to outside row loop */ 3795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[0] = 1; 3805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[1] = 1; 3815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 3825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 3835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0] = dst_buffer[0] + recon_yoffset; 3855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1] = dst_buffer[1] + recon_uvoffset; 3865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2] = dst_buffer[2] + recon_uvoffset; 3875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[0] = xd->recon_above[0] - 1; 3895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[1] = xd->recon_above[1] - 1; 3905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[2] = xd->recon_above[2] - 1; 3915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0] -= xd->dst.y_stride; 3935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1] -= xd->dst.uv_stride; 3945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2] -= xd->dst.uv_stride; 3955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 396ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* TODO: move to outside row loop */ 3975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[0] = xd->dst.y_stride; 3985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left_stride[1] = xd->dst.uv_stride; 399ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 400ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org setup_intra_recon_left(xd->recon_left[0], xd->recon_left[1], 401ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->recon_left[2], xd->dst.y_stride, 402ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->dst.uv_stride); 4035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 4045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_col = 0; mb_col < pc->mb_cols; mb_col++) 4065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 407ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *current_mb_col = mb_col - 1; 408ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 409ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if ((mb_col & (nsync - 1)) == 0) 4105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 411ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org while (mb_col > (*last_row_current_mb_col - nsync)) 4125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 4135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x86_pause_hint(); 4145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org thread_sleep(0); 4155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 4165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 4175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* Distance of MB to the various image edges. 4195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * These are specified to 8th pel as they are always 4205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * compared to values that are in 1/8th pel units. 4215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org */ 4225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mb_to_left_edge = -((mb_col * 16) << 3); 4235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 4245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org #if CONFIG_ERROR_CONCEALMENT 4265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 4275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int corrupt_residual = 4285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (!pbi->independent_partitions && 4295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->frame_corrupt_residual) || 4305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8dx_bool_error(xd->current_bc); 4315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (pbi->ec_active && 4325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->mode_info_context->mbmi.ref_frame == 4335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org INTRA_FRAME) && 4345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org corrupt_residual) 4355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 4365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* We have an intra block with corrupt 4375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * coefficients, better to conceal with an inter 4385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * block. 4395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * Interpolate MVs from neighboring MBs 4405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * 4415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * Note that for the first mb with corrupt 4425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * residual in a frame, we might not discover 4435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * that before decoding the residual. That 4445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * happens after this check, and therefore no 4455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org * inter concealment will be done. 4465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org */ 4475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_interpolate_motion(xd, 4485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mb_row, mb_col, 4495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pc->mb_rows, pc->mb_cols, 4505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pc->mode_info_stride); 4515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 4525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 4535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org #endif 4545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer = dst_buffer[0] + recon_yoffset; 4575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.u_buffer = dst_buffer[1] + recon_uvoffset; 4585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.v_buffer = dst_buffer[2] + recon_uvoffset; 4595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->pre.y_buffer = ref_buffer[xd->mode_info_context->mbmi.ref_frame][0] + recon_yoffset; 4615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->pre.u_buffer = ref_buffer[xd->mode_info_context->mbmi.ref_frame][1] + recon_uvoffset; 4625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->pre.v_buffer = ref_buffer[xd->mode_info_context->mbmi.ref_frame][2] + recon_uvoffset; 4635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* propagate errors from reference frames */ 4655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->corrupted |= ref_fb_corrupted[xd->mode_info_context->mbmi.ref_frame]; 4665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mt_decode_macroblock(pbi, xd, 0); 4685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->left_available = 1; 4705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* check if the boolean decoder has suffered an error */ 4725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->corrupted |= vp8dx_bool_error(xd->current_bc); 4735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[0] += 16; 4755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[1] += 8; 4765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_above[2] += 8; 4775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (!pbi->common.filter_level) 4795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 4805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[0] += 16; 4815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[1] += 8; 4825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->recon_left[2] += 8; 4835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 4845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (pbi->common.filter_level) 4865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 4875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int skip_lf = (xd->mode_info_context->mbmi.mode != B_PRED && 4885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context->mbmi.mode != SPLITMV && 4895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context->mbmi.mb_skip_coeff); 4905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int mode_index = lfi_n->mode_lf_lut[xd->mode_info_context->mbmi.mode]; 4925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int seg = xd->mode_info_context->mbmi.segment_id; 4935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int ref_frame = xd->mode_info_context->mbmi.ref_frame; 4945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 4965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if( mb_row != pc->mb_rows-1 ) 4985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 4995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* Save decoded MB last row data for next-row decoding */ 5005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memcpy((pbi->mt_yabove_row[mb_row + 1] + 32 + mb_col*16), (xd->dst.y_buffer + 15 * recon_y_stride), 16); 5015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memcpy((pbi->mt_uabove_row[mb_row + 1] + 16 + mb_col*8), (xd->dst.u_buffer + 7 * recon_uv_stride), 8); 5025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vpx_memcpy((pbi->mt_vabove_row[mb_row + 1] + 16 + mb_col*8), (xd->dst.v_buffer + 7 * recon_uv_stride), 8); 5035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* save left_col for next MB decoding */ 5065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if(mb_col != pc->mb_cols-1) 5075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MODE_INFO *next = xd->mode_info_context +1; 5095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (next->mbmi.ref_frame == INTRA_FRAME) 5115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (i = 0; i < 16; i++) 5135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->mt_yleft_col[mb_row][i] = xd->dst.y_buffer [i* recon_y_stride + 15]; 5145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (i = 0; i < 8; i++) 5155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->mt_uleft_col[mb_row][i] = xd->dst.u_buffer [i* recon_uv_stride + 7]; 5175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->mt_vleft_col[mb_row][i] = xd->dst.v_buffer [i* recon_uv_stride + 7]; 5185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* loopfilter on this macroblock. */ 5235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (filter_level) 5245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if(pc->filter_type == NORMAL_LOOPFILTER) 5265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org loop_filter_info lfi; 5285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org FRAME_TYPE frame_type = pc->frame_type; 5295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 5305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org lfi.mblim = lfi_n->mblim[filter_level]; 5315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org lfi.blim = lfi_n->blim[filter_level]; 5325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org lfi.lim = lfi_n->lim[filter_level]; 5335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org lfi.hev_thr = lfi_n->hev_thr[hev_index]; 5345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (mb_col > 0) 5365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_mbv 5375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi); 5385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (!skip_lf) 5405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_bv 5415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi); 5425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* don't apply across umv border */ 5445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (mb_row > 0) 5455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_mbh 5465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi); 5475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (!skip_lf) 5495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_bh 5505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi); 5515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else 5535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (mb_col > 0) 5555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_mbv 5565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->dst.y_buffer, recon_y_stride, lfi_n->mblim[filter_level]); 5575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5585c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (!skip_lf) 5595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_bv 5605c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->dst.y_buffer, recon_y_stride, lfi_n->blim[filter_level]); 5615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* don't apply across umv border */ 5635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (mb_row > 0) 5645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_mbh 5655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->dst.y_buffer, recon_y_stride, lfi_n->mblim[filter_level]); 5665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (!skip_lf) 5685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_bh 5695c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (xd->dst.y_buffer, recon_y_stride, lfi_n->blim[filter_level]); 5705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org recon_yoffset += 16; 5765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org recon_uvoffset += 8; 5775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ++xd->mode_info_context; /* next mb */ 5795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->above_context++; 5815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* adjust to the next row of mbs */ 5845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (pbi->common.filter_level) 5855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if(mb_row != pc->mb_rows-1) 5875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 588ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int lasty = yv12_fb_lst->y_width + VP8BORDERINPIXELS; 589ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int lastuv = (yv12_fb_lst->y_width>>1) + (VP8BORDERINPIXELS>>1); 5905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 5915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (i = 0; i < 4; i++) 5925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 5935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->mt_yabove_row[mb_row +1][lasty + i] = pbi->mt_yabove_row[mb_row +1][lasty -1]; 5945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->mt_uabove_row[mb_row +1][lastuv + i] = pbi->mt_uabove_row[mb_row +1][lastuv -1]; 5955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org pbi->mt_vabove_row[mb_row +1][lastuv + i] = pbi->mt_vabove_row[mb_row +1][lastuv -1]; 5965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 5975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 598ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 599ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else 600ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_extend_mb_row(yv12_fb_new, xd->dst.y_buffer + 16, 601ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); 602ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 603ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* last MB of row is ready just after extension is done */ 604ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *current_mb_col = mb_col + nsync; 6055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 6065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org ++xd->mode_info_context; /* skip prediction column */ 6075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->up_available = 1; 6085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 6095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org /* since we have multithread */ 6105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->mode_info_context += xd->mode_info_stride * pbi->decoding_thread_count; 611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 612ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 613ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* signal end of frame decoding if this thread processed the last mb_row */ 614ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (last_mb_row == (pc->mb_rows - 1)) 615ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org sem_post(&pbi->h_event_end_decoding); 616ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic THREAD_FUNCTION thread_decoding_proc(void *p_data) 621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int ithread = ((DECODETHREAD_DATA *)p_data)->ithread; 623474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8D_COMP *pbi = (VP8D_COMP *)(((DECODETHREAD_DATA *)p_data)->ptr1); 624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MB_ROW_DEC *mbrd = (MB_ROW_DEC *)(((DECODETHREAD_DATA *)p_data)->ptr2); 625474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ENTROPY_CONTEXT_PLANES mb_row_left_context; 626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org while (1) 628474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->b_multithreaded_rd == 0) 630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 632474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (sem_wait(&pbi->h_event_start_decoding[ithread]) == 0) 633474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 634474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->b_multithreaded_rd == 0) 635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org break; 636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *xd = &mbrd->mbd; 6395c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->left_context = &mb_row_left_context; 640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 641ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mt_decode_mb_rows(pbi, xd, ithread+1); 642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return 0 ; 647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 649474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_decoder_create_threads(VP8D_COMP *pbi) 651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int core_count = 0; 6530f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com unsigned int ithread; 654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->b_multithreaded_rd = 0; 656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->allocated_decoding_thread_count = 0; 657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* limit decoding threads to the max number of token partitions */ 659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org core_count = (pbi->max_threads > 8) ? 8 : pbi->max_threads; 660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* limit decoding threads to the available cores */ 662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (core_count > pbi->common.processor_core_count) 663474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org core_count = pbi->common.processor_core_count; 664474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 665474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (core_count > 1) 666474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 667474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->b_multithreaded_rd = 1; 668474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->decoding_thread_count = core_count - 1; 669474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 670d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->h_decoding_thread, pbi->decoding_thread_count); 671d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->h_event_start_decoding, pbi->decoding_thread_count); 672d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY_ALIGNED(pbi->mb_row_di, pbi->decoding_thread_count, 32); 673d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->de_thread_data, pbi->decoding_thread_count); 674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (ithread = 0; ithread < pbi->decoding_thread_count; ithread++) 676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sem_init(&pbi->h_event_start_decoding[ithread], 0, 0); 678474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 679ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_setup_block_dptrs(&pbi->mb_row_di[ithread].mbd); 680ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 681474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->de_thread_data[ithread].ithread = ithread; 682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->de_thread_data[ithread].ptr1 = (void *)pbi; 683474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->de_thread_data[ithread].ptr2 = (void *) &pbi->mb_row_di[ithread]; 684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pthread_create(&pbi->h_decoding_thread[ithread], 0, thread_decoding_proc, (&pbi->de_thread_data[ithread])); 686474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 687474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sem_init(&pbi->h_event_end_decoding, 0, 0); 689474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->allocated_decoding_thread_count = pbi->decoding_thread_count; 691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 692474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 695474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8mt_de_alloc_temp_buffers(VP8D_COMP *pbi, int mb_rows) 696474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 697474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->b_multithreaded_rd) 700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_current_mb_col); 702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_current_mb_col = NULL ; 703474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 704474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Free above_row buffers. */ 705474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->mt_yabove_row) 706474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i=0; i< mb_rows; i++) 708474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_yabove_row[i]); 710474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_yabove_row[i] = NULL ; 711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_yabove_row); 713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_yabove_row = NULL ; 714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->mt_uabove_row) 717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 718474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i=0; i< mb_rows; i++) 719474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 720474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_uabove_row[i]); 721474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_uabove_row[i] = NULL ; 722474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 723474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_uabove_row); 724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_uabove_row = NULL ; 725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->mt_vabove_row) 728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i=0; i< mb_rows; i++) 730474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_vabove_row[i]); 732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_vabove_row[i] = NULL ; 733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_vabove_row); 735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_vabove_row = NULL ; 736474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 737474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 738474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Free left_col buffers. */ 739474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->mt_yleft_col) 740474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 741474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i=0; i< mb_rows; i++) 742474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 743474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_yleft_col[i]); 744474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_yleft_col[i] = NULL ; 745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_yleft_col); 747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_yleft_col = NULL ; 748474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 750474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->mt_uleft_col) 751474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 752474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i=0; i< mb_rows; i++) 753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_uleft_col[i]); 755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_uleft_col[i] = NULL ; 756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 757474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_uleft_col); 758474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_uleft_col = NULL ; 759474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 761474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->mt_vleft_col) 762474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 763474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i=0; i< mb_rows; i++) 764474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_vleft_col[i]); 766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_vleft_col[i] = NULL ; 767474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 768474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mt_vleft_col); 769474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mt_vleft_col = NULL ; 770474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 771474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 772474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 774474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 775474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8mt_alloc_temp_buffers(VP8D_COMP *pbi, int width, int prev_mb_rows) 776474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *const pc = & pbi->common; 778474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 779474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int uv_width; 780474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 781474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->b_multithreaded_rd) 782474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 783474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8mt_de_alloc_temp_buffers(pbi, prev_mb_rows); 784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* our internal buffers are always multiples of 16 */ 786474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if ((width & 0xf) != 0) 787474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org width += 16 - (width & 0xf); 788474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 789474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (width < 640) pbi->sync_range = 1; 790474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else if (width <= 1280) pbi->sync_range = 8; 791474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else if (width <= 2560) pbi->sync_range =16; 792474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else pbi->sync_range = 32; 793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org uv_width = width >>1; 795474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Allocate an int for each mb row. */ 797d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->mt_current_mb_col, pc->mb_rows); 798474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 799474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Allocate memory for above_row buffers. */ 800d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->mt_yabove_row, pc->mb_rows); 801d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org for (i = 0; i < pc->mb_rows; i++) 8025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org CHECK_MEM_ERROR(pbi->mt_yabove_row[i], vpx_memalign(16,sizeof(unsigned char) * (width + (VP8BORDERINPIXELS<<1)))); 803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 804d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->mt_uabove_row, pc->mb_rows); 805d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org for (i = 0; i < pc->mb_rows; i++) 8065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org CHECK_MEM_ERROR(pbi->mt_uabove_row[i], vpx_memalign(16,sizeof(unsigned char) * (uv_width + VP8BORDERINPIXELS))); 807474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 808d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->mt_vabove_row, pc->mb_rows); 809d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org for (i = 0; i < pc->mb_rows; i++) 8105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org CHECK_MEM_ERROR(pbi->mt_vabove_row[i], vpx_memalign(16,sizeof(unsigned char) * (uv_width + VP8BORDERINPIXELS))); 811474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 812474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Allocate memory for left_col buffers. */ 813d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->mt_yleft_col, pc->mb_rows); 814d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org for (i = 0; i < pc->mb_rows; i++) 815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org CHECK_MEM_ERROR(pbi->mt_yleft_col[i], vpx_calloc(sizeof(unsigned char) * 16, 1)); 816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 817d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->mt_uleft_col, pc->mb_rows); 818d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org for (i = 0; i < pc->mb_rows; i++) 819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org CHECK_MEM_ERROR(pbi->mt_uleft_col[i], vpx_calloc(sizeof(unsigned char) * 8, 1)); 820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 821d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org CALLOC_ARRAY(pbi->mt_vleft_col, pc->mb_rows); 822d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org for (i = 0; i < pc->mb_rows; i++) 823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org CHECK_MEM_ERROR(pbi->mt_vleft_col[i], vpx_calloc(sizeof(unsigned char) * 8, 1)); 824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 826474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 828474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_decoder_remove_threads(VP8D_COMP *pbi) 829474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* shutdown MB Decoding thread; */ 831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (pbi->b_multithreaded_rd) 832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->b_multithreaded_rd = 0; 836474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 837474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* allow all threads to exit */ 838474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < pbi->allocated_decoding_thread_count; i++) 839474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 840474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sem_post(&pbi->h_event_start_decoding[i]); 841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pthread_join(pbi->h_decoding_thread[i], NULL); 842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < pbi->allocated_decoding_thread_count; i++) 845474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 846474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sem_destroy(&pbi->h_event_start_decoding[i]); 847474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 848474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 849474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sem_destroy(&pbi->h_event_end_decoding); 850474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 851474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->h_decoding_thread); 852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->h_decoding_thread = NULL; 853474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 854474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->h_event_start_decoding); 855474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->h_event_start_decoding = NULL; 856474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->mb_row_di); 858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->mb_row_di = NULL ; 859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 860474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_free(pbi->de_thread_data); 861474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org pbi->de_thread_data = NULL; 862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 863474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 864474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd) 866474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *pc = &pbi->common; 8680f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com unsigned int i; 8690f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com int j; 870474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 871474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int filter_level = pc->filter_level; 872ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; 873474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 874474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (filter_level) 875474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 876474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Set above_row buffer to 127 for decoding first MB row */ 877ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(pbi->mt_yabove_row[0] + VP8BORDERINPIXELS-1, 127, yv12_fb_new->y_width + 5); 878ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(pbi->mt_uabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (yv12_fb_new->y_width>>1) +5); 879ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vpx_memset(pbi->mt_vabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (yv12_fb_new->y_width>>1) +5); 880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 8810f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com for (j=1; j<pc->mb_rows; j++) 882474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 8830f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com vpx_memset(pbi->mt_yabove_row[j] + VP8BORDERINPIXELS-1, (unsigned char)129, 1); 8840f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com vpx_memset(pbi->mt_uabove_row[j] + (VP8BORDERINPIXELS>>1)-1, (unsigned char)129, 1); 8850f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com vpx_memset(pbi->mt_vabove_row[j] + (VP8BORDERINPIXELS>>1)-1, (unsigned char)129, 1); 886474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 887474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Set left_col to 129 initially */ 8890f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com for (j=0; j<pc->mb_rows; j++) 890474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 8910f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com vpx_memset(pbi->mt_yleft_col[j], (unsigned char)129, 16); 8920f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com vpx_memset(pbi->mt_uleft_col[j], (unsigned char)129, 8); 8930f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com vpx_memset(pbi->mt_vleft_col[j], (unsigned char)129, 8); 894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 896474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Initialize the loop filter for this frame. */ 897474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_frame_init(pc, &pbi->mb, filter_level); 898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 899ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org else 900ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_setup_intra_recon_top_line(yv12_fb_new); 901474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org setup_decoding_thread_data(pbi, xd, pbi->mb_row_di, pbi->decoding_thread_count); 903474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 904474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < pbi->decoding_thread_count; i++) 905474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sem_post(&pbi->h_event_start_decoding[i]); 906474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 907ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mt_decode_mb_rows(pbi, xd, 0); 908474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 909474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sem_wait(&pbi->h_event_end_decoding); /* add back for each frame */ 910474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 911