190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1279f15823c34ae1e423108295e416213200bb280fAndreas Huber#if !defined(WIN32) && CONFIG_OS_SUPPORT == 1 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# include <unistd.h> 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyxd_int.h" 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h" 1779f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/threading.h" 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1979f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/loopfilter.h" 2079f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/extend.h" 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_ports/vpx_timer.h" 22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "detokenize.h" 2379f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/reconinter.h" 24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "reconintra_mt.h" 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberextern void mb_init_dequantizer(VP8D_COMP *pbi, MACROBLOCKD *xd); 27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberextern void clamp_mvs(MACROBLOCKD *xd); 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_build_uvmvs(MACROBLOCKD *x, int fullpixel); 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if CONFIG_RUNTIME_CPU_DETECT 31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define RTCD_VTABLE(x) (&(pbi)->common.rtcd.x) 32538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#else 33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define RTCD_VTABLE(x) NULL 34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif 35f71323e297a928af368937089d3ed71239786f86Andreas Huber 3679f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void setup_decoding_thread_data(VP8D_COMP *pbi, MACROBLOCKD *xd, MB_ROW_DEC *mbrd, int count) 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8_COMMON *const pc = & pbi->common; 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i, j; 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < count; i++) 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber MACROBLOCKD *mbd = &mbrd[i].mbd; 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_RUNTIME_CPU_DETECT 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->rtcd = xd->rtcd; 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->subpixel_predict = xd->subpixel_predict; 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->subpixel_predict8x4 = xd->subpixel_predict8x4; 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->subpixel_predict8x8 = xd->subpixel_predict8x8; 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->subpixel_predict16x16 = xd->subpixel_predict16x16; 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->mode_info_context = pc->mi + pc->mode_info_stride * (i + 1); 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->mode_info_stride = pc->mode_info_stride; 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->frame_type = pc->frame_type; 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->frames_since_golden = pc->frames_since_golden; 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->frames_till_alt_ref_frame = pc->frames_till_alt_ref_frame; 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59f71323e297a928af368937089d3ed71239786f86Andreas Huber mbd->pre = pc->yv12_fb[pc->lst_fb_idx]; 60f71323e297a928af368937089d3ed71239786f86Andreas Huber mbd->dst = pc->yv12_fb[pc->new_fb_idx]; 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_setup_block_dptrs(mbd); 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_block_doffsets(mbd); 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->segmentation_enabled = xd->segmentation_enabled; 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->mb_segement_abs_delta = xd->mb_segement_abs_delta; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_memcpy(mbd->segment_feature_data, xd->segment_feature_data, sizeof(xd->segment_feature_data)); 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*signed char ref_lf_deltas[MAX_REF_LF_DELTAS];*/ 69538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memcpy(mbd->ref_lf_deltas, xd->ref_lf_deltas, sizeof(xd->ref_lf_deltas)); 70538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*signed char mode_lf_deltas[MAX_MODE_LF_DELTAS];*/ 71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memcpy(mbd->mode_lf_deltas, xd->mode_lf_deltas, sizeof(xd->mode_lf_deltas)); 72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*unsigned char mode_ref_lf_delta_enabled; 73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned char mode_ref_lf_delta_update;*/ 74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber mbd->mode_ref_lf_delta_enabled = xd->mode_ref_lf_delta_enabled; 75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber mbd->mode_ref_lf_delta_update = xd->mode_ref_lf_delta_update; 76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->current_bc = &pbi->bc2; 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (j = 0; j < 25; j++) 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mbd->block[j].dequant = xd->block[j].dequant; 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 85f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i=0; i< pc->mb_rows; i++) 86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_current_mb_col[i]=-1; 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 9079f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int mb_col) 91f71323e297a928af368937089d3ed71239786f86Andreas Huber{ 92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int eobtotal = 0; 93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int i, do_clamp = xd->mode_info_context->mbmi.need_to_clamp_mvs; 94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber VP8_COMMON *pc = &pbi->common; 95f71323e297a928af368937089d3ed71239786f86Andreas Huber 96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->mode_info_context->mbmi.mb_skip_coeff) 97f71323e297a928af368937089d3ed71239786f86Andreas Huber { 98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_reset_mb_tokens_context(xd); 99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 101538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber eobtotal = vp8_decode_mb_tokens(pbi, xd); 103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 104f71323e297a928af368937089d3ed71239786f86Andreas Huber 105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Perform temporary clamping of the MV to be used for prediction */ 106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (do_clamp) 107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber clamp_mvs(xd); 109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 110f71323e297a928af368937089d3ed71239786f86Andreas Huber 111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->mode_info_context->mbmi.dc_diff = 1; 112f71323e297a928af368937089d3ed71239786f86Andreas Huber 113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbmi.mode != SPLITMV && eobtotal == 0) 114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->mode_info_context->mbmi.dc_diff = 0; 116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*mt_skip_recon_mb(pbi, xd, mb_row, mb_col);*/ 118538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) 119538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 120538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8mt_build_intra_predictors_mbuv_s(pbi, xd, mb_row, mb_col); 121538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8mt_build_intra_predictors_mby_s(pbi, xd, mb_row, mb_col); 122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 124538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 125538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_build_inter_predictors_mb_s(xd); 126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 127538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber return; 128538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 129f71323e297a928af368937089d3ed71239786f86Andreas Huber 130538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->segmentation_enabled) 131538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber mb_init_dequantizer(pbi, xd); 132f71323e297a928af368937089d3ed71239786f86Andreas Huber 133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* do prediction */ 134538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) 135538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 136538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8mt_build_intra_predictors_mbuv(pbi, xd, mb_row, mb_col); 137f71323e297a928af368937089d3ed71239786f86Andreas Huber 138538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->mode_info_context->mbmi.mode != B_PRED) 139538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 140538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8mt_build_intra_predictors_mby(pbi, xd, mb_row, mb_col); 141538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } else { 142538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8mt_intra_prediction_down_copy(pbi, xd, mb_row, mb_col); 143538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 144538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 145538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 146538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 147538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_build_inter_predictors_mb(xd); 148538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 149f71323e297a928af368937089d3ed71239786f86Andreas Huber 150538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* dequantization and idct */ 151538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbmi.mode != SPLITMV) 152538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 153538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber BLOCKD *b = &xd->block[24]; 154538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber DEQUANT_INVOKE(&pbi->dequant, block)(b); 155538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 156538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* do 2nd order transform on the dc block */ 157538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->eobs[24] > 1) 158538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 159538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh16)(&b->dqcoeff[0], b->diff); 160538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[0] = 0; 161538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[1] = 0; 162538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[2] = 0; 163538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[3] = 0; 164538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[4] = 0; 165538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[5] = 0; 166538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[6] = 0; 167538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[7] = 0; 168538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 169538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 170538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 171538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh1)(&b->dqcoeff[0], b->diff); 172538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[0] = 0; 173538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 174f71323e297a928af368937089d3ed71239786f86Andreas Huber 175538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber DEQUANT_INVOKE (&pbi->dequant, dc_idct_add_y_block) 176538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber (xd->qcoeff, xd->block[0].dequant, 177538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->predictor, xd->dst.y_buffer, 178538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->dst.y_stride, xd->eobs, xd->block[24].diff); 179f71323e297a928af368937089d3ed71239786f86Andreas Huber } 180538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else if ((xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) && xd->mode_info_context->mbmi.mode == B_PRED) 181538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 182538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < 16; i++) 183538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 184538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber BLOCKD *b = &xd->block[i]; 185538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8mt_predict_intra4x4(pbi, xd, b->bmi.mode, b->predictor, mb_row, mb_col, i); 186f71323e297a928af368937089d3ed71239786f86Andreas Huber 187538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->eobs[i] > 1) 188538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 189538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber DEQUANT_INVOKE(&pbi->dequant, idct_add) 190538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber (b->qcoeff, b->dequant, b->predictor, 191538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *(b->base_dst) + b->dst, 16, b->dst_stride); 192538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 193538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 194538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 195538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber IDCT_INVOKE(RTCD_VTABLE(idct), idct1_scalar_add) 196538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber (b->qcoeff[0] * b->dequant[0], b->predictor, 197538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *(b->base_dst) + b->dst, 16, b->dst_stride); 198538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ((int *)b->qcoeff)[0] = 0; 199538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 200538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 201538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 202538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 203538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 204538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber DEQUANT_INVOKE (&pbi->dequant, idct_add_y_block) 205538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber (xd->qcoeff, xd->block[0].dequant, 206538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->predictor, xd->dst.y_buffer, 207538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->dst.y_stride, xd->eobs); 208538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 209538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 210538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber DEQUANT_INVOKE (&pbi->dequant, idct_add_uv_block) 211538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber (xd->qcoeff+16*16, xd->block[16].dequant, 212538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->predictor+16*16, xd->dst.u_buffer, xd->dst.v_buffer, 213538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->dst.uv_stride, xd->eobs+16); 214f71323e297a928af368937089d3ed71239786f86Andreas Huber} 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 216538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 21779f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic THREAD_FUNCTION thread_decoding_proc(void *p_data) 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ithread = ((DECODETHREAD_DATA *)p_data)->ithread; 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8D_COMP *pbi = (VP8D_COMP *)(((DECODETHREAD_DATA *)p_data)->ptr1); 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber MB_ROW_DEC *mbrd = (MB_ROW_DEC *)(((DECODETHREAD_DATA *)p_data)->ptr2); 222f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT_PLANES mb_row_left_context; 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber while (1) 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (pbi->b_multithreaded_rd == 0) 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 229538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*if(WaitForSingleObject(pbi->h_event_start_decoding[ithread], INFINITE) == WAIT_OBJECT_0)*/ 230f71323e297a928af368937089d3ed71239786f86Andreas Huber if (sem_wait(&pbi->h_event_start_decoding[ithread]) == 0) 23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (pbi->b_multithreaded_rd == 0) 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8_COMMON *pc = &pbi->common; 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber MACROBLOCKD *xd = &mbrd->mbd; 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 239f71323e297a928af368937089d3ed71239786f86Andreas Huber int mb_row; 240f71323e297a928af368937089d3ed71239786f86Andreas Huber int num_part = 1 << pbi->common.multi_token_partition; 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber volatile int *last_row_current_mb_col; 242538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int nsync = pbi->sync_range; 24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 244f71323e297a928af368937089d3ed71239786f86Andreas Huber for (mb_row = ithread+1; mb_row < pc->mb_rows; mb_row += (pbi->decoding_thread_count + 1)) 245f71323e297a928af368937089d3ed71239786f86Andreas Huber { 246f71323e297a928af368937089d3ed71239786f86Andreas Huber int i; 247f71323e297a928af368937089d3ed71239786f86Andreas Huber int recon_yoffset, recon_uvoffset; 248f71323e297a928af368937089d3ed71239786f86Andreas Huber int mb_col; 249f71323e297a928af368937089d3ed71239786f86Andreas Huber int ref_fb_idx = pc->lst_fb_idx; 250f71323e297a928af368937089d3ed71239786f86Andreas Huber int dst_fb_idx = pc->new_fb_idx; 251f71323e297a928af368937089d3ed71239786f86Andreas Huber int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; 252f71323e297a928af368937089d3ed71239786f86Andreas Huber int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 254538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int filter_level; 255538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber loop_filter_info *lfi = pc->lf_info; 256538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int alt_flt_enabled = xd->segmentation_enabled; 257538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int Segment; 258538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 259f71323e297a928af368937089d3ed71239786f86Andreas Huber pbi->mb_row_di[ithread].mb_row = mb_row; 260f71323e297a928af368937089d3ed71239786f86Andreas Huber pbi->mb_row_di[ithread].mbd.current_bc = &pbi->mbc[mb_row%num_part]; 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 262538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber last_row_current_mb_col = &pbi->mt_current_mb_col[mb_row -1]; 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 264f71323e297a928af368937089d3ed71239786f86Andreas Huber recon_yoffset = mb_row * recon_y_stride * 16; 265f71323e297a928af368937089d3ed71239786f86Andreas Huber recon_uvoffset = mb_row * recon_uv_stride * 8; 266538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* reset above block coeffs */ 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 268f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->above_context = pc->above_context; 269f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->left_context = &mb_row_left_context; 270f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memset(&mb_row_left_context, 0, sizeof(mb_row_left_context)); 271f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->up_available = (mb_row != 0); 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 273f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mb_to_top_edge = -((mb_row * 16)) << 3; 274f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 276f71323e297a928af368937089d3ed71239786f86Andreas Huber for (mb_col = 0; mb_col < pc->mb_cols; mb_col++) 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 278538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if ((mb_col & (nsync-1)) == 0) 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 280538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber while (mb_col > (*last_row_current_mb_col - nsync) && *last_row_current_mb_col != pc->mb_cols - 1) 281f71323e297a928af368937089d3ed71239786f86Andreas Huber { 282f71323e297a928af368937089d3ed71239786f86Andreas Huber x86_pause_hint(); 283f71323e297a928af368937089d3ed71239786f86Andreas Huber thread_sleep(0); 284f71323e297a928af368937089d3ed71239786f86Andreas Huber } 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 287f71323e297a928af368937089d3ed71239786f86Andreas Huber if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info_context->mbmi.mode == B_PRED) 288f71323e297a928af368937089d3ed71239786f86Andreas Huber { 289f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = 0; i < 16; i++) 290f71323e297a928af368937089d3ed71239786f86Andreas Huber { 291f71323e297a928af368937089d3ed71239786f86Andreas Huber BLOCKD *d = &xd->block[i]; 292f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[i], sizeof(B_MODE_INFO)); 293f71323e297a928af368937089d3ed71239786f86Andreas Huber } 294f71323e297a928af368937089d3ed71239786f86Andreas Huber } 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 296538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Distance of Mb to the various image edges. 297538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units 298538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 299f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mb_to_left_edge = -((mb_col * 16) << 3); 300f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 302f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; 303f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; 304f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset; 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 306f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->left_available = (mb_col != 0); 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 308538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Select the appropriate reference frame for this MB */ 309f71323e297a928af368937089d3ed71239786f86Andreas Huber if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) 310f71323e297a928af368937089d3ed71239786f86Andreas Huber ref_fb_idx = pc->lst_fb_idx; 311f71323e297a928af368937089d3ed71239786f86Andreas Huber else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) 312f71323e297a928af368937089d3ed71239786f86Andreas Huber ref_fb_idx = pc->gld_fb_idx; 313f71323e297a928af368937089d3ed71239786f86Andreas Huber else 314f71323e297a928af368937089d3ed71239786f86Andreas Huber ref_fb_idx = pc->alt_fb_idx; 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 316f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->pre.y_buffer = pc->yv12_fb[ref_fb_idx].y_buffer + recon_yoffset; 317f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset; 318f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset; 31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 320f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_build_uvmvs(xd, pc->full_pixel); 32179f15823c34ae1e423108295e416213200bb280fAndreas Huber decode_macroblock(pbi, xd, mb_row, mb_col); 32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 323538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->common.filter_level) 324538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 325538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if( mb_row != pc->mb_rows-1 ) 326538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 327538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Save decoded MB last row data for next-row decoding */ 328538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memcpy((pbi->mt_yabove_row[mb_row + 1] + 32 + mb_col*16), (xd->dst.y_buffer + 15 * recon_y_stride), 16); 329538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memcpy((pbi->mt_uabove_row[mb_row + 1] + 16 + mb_col*8), (xd->dst.u_buffer + 7 * recon_uv_stride), 8); 330538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memcpy((pbi->mt_vabove_row[mb_row + 1] + 16 + mb_col*8), (xd->dst.v_buffer + 7 * recon_uv_stride), 8); 331538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 332538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 333538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* save left_col for next MB decoding */ 334538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if(mb_col != pc->mb_cols-1) 335538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 336538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber MODE_INFO *next = xd->mode_info_context +1; 337538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 338538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->frame_type == KEY_FRAME || next->mbmi.ref_frame == INTRA_FRAME) 339538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 340538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < 16; i++) 341538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_yleft_col[mb_row][i] = xd->dst.y_buffer [i* recon_y_stride + 15]; 342538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < 8; i++) 343538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 344538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_uleft_col[mb_row][i] = xd->dst.u_buffer [i* recon_uv_stride + 7]; 345538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_vleft_col[mb_row][i] = xd->dst.v_buffer [i* recon_uv_stride + 7]; 346538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 347538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 348538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 349538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 35079f15823c34ae1e423108295e416213200bb280fAndreas Huber /* update loopfilter info */ 35179f15823c34ae1e423108295e416213200bb280fAndreas Huber Segment = (alt_flt_enabled) ? xd->mode_info_context->mbmi.segment_id : 0; 35279f15823c34ae1e423108295e416213200bb280fAndreas Huber filter_level = pbi->mt_baseline_filter_level[Segment]; 35379f15823c34ae1e423108295e416213200bb280fAndreas Huber /* Distance of Mb to the various image edges. 35479f15823c34ae1e423108295e416213200bb280fAndreas Huber * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units 35579f15823c34ae1e423108295e416213200bb280fAndreas Huber * Apply any context driven MB level adjustment 35679f15823c34ae1e423108295e416213200bb280fAndreas Huber */ 35779f15823c34ae1e423108295e416213200bb280fAndreas Huber filter_level = vp8_adjust_mb_lf_value(xd, filter_level); 35879f15823c34ae1e423108295e416213200bb280fAndreas Huber 35979f15823c34ae1e423108295e416213200bb280fAndreas Huber /* loopfilter on this macroblock. */ 360538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (filter_level) 361538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 362538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (mb_col > 0) 363538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pc->lf_mbv(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); 364538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 365538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->mode_info_context->mbmi.dc_diff > 0) 366538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pc->lf_bv(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); 367538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 368538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* don't apply across umv border */ 369538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (mb_row > 0) 370538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pc->lf_mbh(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); 371538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 372538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->mode_info_context->mbmi.dc_diff > 0) 373538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pc->lf_bh(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); 374538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 375538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 377f71323e297a928af368937089d3ed71239786f86Andreas Huber recon_yoffset += 16; 378f71323e297a928af368937089d3ed71239786f86Andreas Huber recon_uvoffset += 8; 37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 380f71323e297a928af368937089d3ed71239786f86Andreas Huber ++xd->mode_info_context; /* next mb */ 38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 382f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->above_context++; 38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 384538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*pbi->mb_row_di[ithread].current_mb_col = mb_col;*/ 385538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_current_mb_col[mb_row] = mb_col; 386f71323e297a928af368937089d3ed71239786f86Andreas Huber } 38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 388538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* adjust to the next row of mbs */ 389538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->common.filter_level) 390538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 391538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if(mb_row != pc->mb_rows-1) 392538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 393538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int lasty = pc->yv12_fb[ref_fb_idx].y_width + VP8BORDERINPIXELS; 394538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int lastuv = (pc->yv12_fb[ref_fb_idx].y_width>>1) + (VP8BORDERINPIXELS>>1); 395538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 396538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < 4; i++) 397538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 398538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_yabove_row[mb_row +1][lasty + i] = pbi->mt_yabove_row[mb_row +1][lasty -1]; 399538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_uabove_row[mb_row +1][lastuv + i] = pbi->mt_uabove_row[mb_row +1][lastuv -1]; 400538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_vabove_row[mb_row +1][lastuv + i] = pbi->mt_vabove_row[mb_row +1][lastuv -1]; 401538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 402538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 403538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } else 404538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_extend_mb_row(&pc->yv12_fb[dst_fb_idx], xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); 40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 406f71323e297a928af368937089d3ed71239786f86Andreas Huber ++xd->mode_info_context; /* skip prediction column */ 40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 408538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* since we have multithread */ 409f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mode_info_context += xd->mode_info_stride * pbi->decoding_thread_count; 41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 413538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* add this to each frame */ 414f71323e297a928af368937089d3ed71239786f86Andreas Huber if ((mbrd->mb_row == pbi->common.mb_rows-1) || ((mbrd->mb_row == pbi->common.mb_rows-2) && (pbi->common.mb_rows % (pbi->decoding_thread_count+1))==1)) 415f71323e297a928af368937089d3ed71239786f86Andreas Huber { 416538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*SetEvent(pbi->h_event_end_decoding);*/ 417f71323e297a928af368937089d3ed71239786f86Andreas Huber sem_post(&pbi->h_event_end_decoding); 418f71323e297a928af368937089d3ed71239786f86Andreas Huber } 419f71323e297a928af368937089d3ed71239786f86Andreas Huber } 42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return 0 ; 42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 424f71323e297a928af368937089d3ed71239786f86Andreas Huber 425538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8_decoder_create_threads(VP8D_COMP *pbi) 42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 427538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int core_count = 0; 428538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int ithread; 42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 430538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->b_multithreaded_rd = 0; 431538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->allocated_decoding_thread_count = 0; 432538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber core_count = (pbi->max_threads > 16) ? 16 : pbi->max_threads; 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 434538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (core_count > 1) 435538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 436538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->b_multithreaded_rd = 1; 437538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->decoding_thread_count = core_count -1; 43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 439538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->h_decoding_thread, vpx_malloc(sizeof(pthread_t) * pbi->decoding_thread_count)); 440538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->h_event_start_decoding, vpx_malloc(sizeof(sem_t) * pbi->decoding_thread_count)); 441538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mb_row_di, vpx_memalign(32, sizeof(MB_ROW_DEC) * pbi->decoding_thread_count)); 442538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mb_row_di, 0, sizeof(MB_ROW_DEC) * pbi->decoding_thread_count); 443538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->de_thread_data, vpx_malloc(sizeof(DECODETHREAD_DATA) * pbi->decoding_thread_count)); 44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 445538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (ithread = 0; ithread < pbi->decoding_thread_count; ithread++) 446538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 447538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber sem_init(&pbi->h_event_start_decoding[ithread], 0, 0); 44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 449538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->de_thread_data[ithread].ithread = ithread; 450538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->de_thread_data[ithread].ptr1 = (void *)pbi; 451538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->de_thread_data[ithread].ptr2 = (void *) &pbi->mb_row_di[ithread]; 45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45379f15823c34ae1e423108295e416213200bb280fAndreas Huber pthread_create(&pbi->h_decoding_thread[ithread], 0, thread_decoding_proc, (&pbi->de_thread_data[ithread])); 454538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 455f71323e297a928af368937089d3ed71239786f86Andreas Huber 456538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber sem_init(&pbi->h_event_end_decoding, 0, 0); 45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 458538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->allocated_decoding_thread_count = pbi->decoding_thread_count; 459538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 460538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 463538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8mt_de_alloc_temp_buffers(VP8D_COMP *pbi, int mb_rows) 464538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 465538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber VP8_COMMON *const pc = & pbi->common; 466538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int i; 46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 468538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->b_multithreaded_rd) 469538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 470538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_current_mb_col); 471538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_current_mb_col = NULL ; 47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 473538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Free above_row buffers. */ 474538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->mt_yabove_row) 475538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 476538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< mb_rows; i++) 477538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 478538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_yabove_row[i]); 479538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_yabove_row[i] = NULL ; 480538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 481538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_yabove_row); 482538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_yabove_row = NULL ; 483538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 485538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->mt_uabove_row) 486538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 487538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< mb_rows; i++) 488538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 489538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_uabove_row[i]); 490538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_uabove_row[i] = NULL ; 491538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 492538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_uabove_row); 493538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_uabove_row = NULL ; 494538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 496538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->mt_vabove_row) 497538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 498538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< mb_rows; i++) 499538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 500538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_vabove_row[i]); 501538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_vabove_row[i] = NULL ; 502538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 503538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_vabove_row); 504538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_vabove_row = NULL ; 505538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 507538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Free left_col buffers. */ 508538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->mt_yleft_col) 509538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 510538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< mb_rows; i++) 511538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 512538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_yleft_col[i]); 513538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_yleft_col[i] = NULL ; 514538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 515538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_yleft_col); 516538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_yleft_col = NULL ; 517538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 519538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->mt_uleft_col) 520538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 521538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< mb_rows; i++) 522538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 523538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_uleft_col[i]); 524538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_uleft_col[i] = NULL ; 525f71323e297a928af368937089d3ed71239786f86Andreas Huber } 526538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_uleft_col); 527538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_uleft_col = NULL ; 52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 530538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->mt_vleft_col) 531f71323e297a928af368937089d3ed71239786f86Andreas Huber { 532538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< mb_rows; i++) 533538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 534538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_vleft_col[i]); 535538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_vleft_col[i] = NULL ; 536538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 537538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_free(pbi->mt_vleft_col); 538538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_vleft_col = NULL ; 539f71323e297a928af368937089d3ed71239786f86Andreas Huber } 540538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 543538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 54479f15823c34ae1e423108295e416213200bb280fAndreas Hubervoid vp8mt_alloc_temp_buffers(VP8D_COMP *pbi, int width, int prev_mb_rows) 54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 546538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber VP8_COMMON *const pc = & pbi->common; 547538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int i; 548538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int uv_width; 54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 550538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->b_multithreaded_rd) 55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 552538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8mt_de_alloc_temp_buffers(pbi, prev_mb_rows); 55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 554538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* our internal buffers are always multiples of 16 */ 555538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if ((width & 0xf) != 0) 556538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber width += 16 - (width & 0xf); 55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 558538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (width < 640) pbi->sync_range = 1; 559538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else if (width <= 1280) pbi->sync_range = 8; 560538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else if (width <= 2560) pbi->sync_range =16; 561538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else pbi->sync_range = 32; 562f71323e297a928af368937089d3ed71239786f86Andreas Huber 563538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber uv_width = width >>1; 56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 565538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Allocate an int for each mb row. */ 566538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_current_mb_col, vpx_malloc(sizeof(int) * pc->mb_rows)); 56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 568538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Allocate memory for above_row buffers. */ 569538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_yabove_row, vpx_malloc(sizeof(unsigned char *) * pc->mb_rows)); 570538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< pc->mb_rows; i++) 571538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_yabove_row[i], vpx_calloc(sizeof(unsigned char) * (width + (VP8BORDERINPIXELS<<1)), 1)); 57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 573538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_uabove_row, vpx_malloc(sizeof(unsigned char *) * pc->mb_rows)); 574538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< pc->mb_rows; i++) 575538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_uabove_row[i], vpx_calloc(sizeof(unsigned char) * (uv_width + VP8BORDERINPIXELS), 1)); 576f71323e297a928af368937089d3ed71239786f86Andreas Huber 577538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_vabove_row, vpx_malloc(sizeof(unsigned char *) * pc->mb_rows)); 578538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< pc->mb_rows; i++) 579538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_vabove_row[i], vpx_calloc(sizeof(unsigned char) * (uv_width + VP8BORDERINPIXELS), 1)); 580538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 581538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Allocate memory for left_col buffers. */ 582538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_yleft_col, vpx_malloc(sizeof(unsigned char *) * pc->mb_rows)); 583538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< pc->mb_rows; i++) 584538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_yleft_col[i], vpx_calloc(sizeof(unsigned char) * 16, 1)); 58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 586538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_uleft_col, vpx_malloc(sizeof(unsigned char *) * pc->mb_rows)); 587538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< pc->mb_rows; i++) 588538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_uleft_col[i], vpx_calloc(sizeof(unsigned char) * 8, 1)); 589538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 590538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_vleft_col, vpx_malloc(sizeof(unsigned char *) * pc->mb_rows)); 591538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i< pc->mb_rows; i++) 592538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber CHECK_MEM_ERROR(pbi->mt_vleft_col[i], vpx_calloc(sizeof(unsigned char) * 8, 1)); 593538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 596538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_decoder_remove_threads(VP8D_COMP *pbi) 59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 599538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* shutdown MB Decoding thread; */ 60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (pbi->b_multithreaded_rd) 60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 602f71323e297a928af368937089d3ed71239786f86Andreas Huber int i; 603f71323e297a928af368937089d3ed71239786f86Andreas Huber 60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pbi->b_multithreaded_rd = 0; 605f71323e297a928af368937089d3ed71239786f86Andreas Huber 606538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* allow all threads to exit */ 607f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = 0; i < pbi->allocated_decoding_thread_count; i++) 60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 609f71323e297a928af368937089d3ed71239786f86Andreas Huber sem_post(&pbi->h_event_start_decoding[i]); 610f71323e297a928af368937089d3ed71239786f86Andreas Huber pthread_join(pbi->h_decoding_thread[i], NULL); 61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 613f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = 0; i < pbi->allocated_decoding_thread_count; i++) 614f71323e297a928af368937089d3ed71239786f86Andreas Huber { 615f71323e297a928af368937089d3ed71239786f86Andreas Huber sem_destroy(&pbi->h_event_start_decoding[i]); 61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 618f71323e297a928af368937089d3ed71239786f86Andreas Huber sem_destroy(&pbi->h_event_end_decoding); 61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_free(pbi->h_decoding_thread); 62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pbi->h_decoding_thread = NULL; 62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 623f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_free(pbi->h_event_start_decoding); 624f71323e297a928af368937089d3ed71239786f86Andreas Huber pbi->h_event_start_decoding = NULL; 625f71323e297a928af368937089d3ed71239786f86Andreas Huber 62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_free(pbi->mb_row_di); 62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pbi->mb_row_di = NULL ; 62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_free(pbi->de_thread_data); 63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pbi->de_thread_data = NULL; 631f71323e297a928af368937089d3ed71239786f86Andreas Huber } 63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63579f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void lpf_init( VP8D_COMP *pbi, int default_filt_lvl) 63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 637538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber VP8_COMMON *cm = &pbi->common; 638538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber MACROBLOCKD *mbd = &pbi->mb; 639538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*YV12_BUFFER_CONFIG *post = &cm->new_frame;*/ /*frame_to_show;*/ 640538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber loop_filter_info *lfi = cm->lf_info; 641538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber FRAME_TYPE frame_type = cm->frame_type; 64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 643538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*int mb_row; 644538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int mb_col; 645538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int baseline_filter_level[MAX_MB_SEGMENTS];*/ 646538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int alt_flt_enabled = mbd->segmentation_enabled; 64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 648538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int i; 649538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*unsigned char *y_ptr, *u_ptr, *v_ptr;*/ 65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 651538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Note the baseline filter values for each segment */ 652538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (alt_flt_enabled) 653538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 654538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < MAX_MB_SEGMENTS; i++) 655538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 656538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Abs value */ 657538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA) 658538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_baseline_filter_level[i] = mbd->segment_feature_data[MB_LVL_ALT_LF][i]; 659538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Delta Value */ 660538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 661538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 662538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_baseline_filter_level[i] = default_filt_lvl + mbd->segment_feature_data[MB_LVL_ALT_LF][i]; 663538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_baseline_filter_level[i] = (pbi->mt_baseline_filter_level[i] >= 0) ? ((pbi->mt_baseline_filter_level[i] <= MAX_LOOP_FILTER) ? pbi->mt_baseline_filter_level[i] : MAX_LOOP_FILTER) : 0; /* Clamp to valid range */ 664538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 665538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 666538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 667538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else 668538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 669538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < MAX_MB_SEGMENTS; i++) 670538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_baseline_filter_level[i] = default_filt_lvl; 671538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 673538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Initialize the loop filter for this frame. */ 674538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if ((cm->last_filter_type != cm->filter_type) || (cm->last_sharpness_level != cm->sharpness_level)) 675538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_init_loop_filter(cm); 676538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber else if (frame_type != cm->last_frame_type) 677538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_frame_init_loop_filter(lfi, frame_type); 67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 681538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd) 68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int mb_row; 68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8_COMMON *pc = &pbi->common; 68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ibc = 0; 68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int num_part = 1 << pbi->common.multi_token_partition; 68879f15823c34ae1e423108295e416213200bb280fAndreas Huber int i; 689f71323e297a928af368937089d3ed71239786f86Andreas Huber volatile int *last_row_current_mb_col = NULL; 690538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int nsync = pbi->sync_range; 691538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 692538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int filter_level; 693538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber loop_filter_info *lfi = pc->lf_info; 694538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int alt_flt_enabled = xd->segmentation_enabled; 695538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int Segment; 696538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 697538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if(pbi->common.filter_level) 698538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 699538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Set above_row buffer to 127 for decoding first MB row */ 700538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_yabove_row[0] + VP8BORDERINPIXELS-1, 127, pc->yv12_fb[pc->lst_fb_idx].y_width + 5); 701538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_uabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (pc->yv12_fb[pc->lst_fb_idx].y_width>>1) +5); 702538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_vabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (pc->yv12_fb[pc->lst_fb_idx].y_width>>1) +5); 703538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 704538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=1; i<pc->mb_rows; i++) 705538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 706538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_yabove_row[i] + VP8BORDERINPIXELS-1, (unsigned char)129, 1); 707538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_uabove_row[i] + (VP8BORDERINPIXELS>>1)-1, (unsigned char)129, 1); 708538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_vabove_row[i] + (VP8BORDERINPIXELS>>1)-1, (unsigned char)129, 1); 709538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 710538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 711538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Set left_col to 129 initially */ 712538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i=0; i<pc->mb_rows; i++) 713538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 714538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_yleft_col[i], (unsigned char)129, 16); 715538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_uleft_col[i], (unsigned char)129, 8); 716538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memset(pbi->mt_vleft_col[i], (unsigned char)129, 8); 717538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 71879f15823c34ae1e423108295e416213200bb280fAndreas Huber lpf_init(pbi, pc->filter_level); 719538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 72179f15823c34ae1e423108295e416213200bb280fAndreas Huber setup_decoding_thread_data(pbi, xd, pbi->mb_row_di, pbi->decoding_thread_count); 72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 723f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = 0; i < pbi->decoding_thread_count; i++) 724f71323e297a928af368937089d3ed71239786f86Andreas Huber sem_post(&pbi->h_event_start_decoding[i]); 725f71323e297a928af368937089d3ed71239786f86Andreas Huber 72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (mb_row = 0; mb_row < pc->mb_rows; mb_row += (pbi->decoding_thread_count + 1)) 72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 729f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->current_bc = &pbi->mbc[mb_row%num_part]; 73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 731538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* vp8_decode_mb_row(pbi, pc, mb_row, xd); */ 73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 733f71323e297a928af368937089d3ed71239786f86Andreas Huber int i; 734f71323e297a928af368937089d3ed71239786f86Andreas Huber int recon_yoffset, recon_uvoffset; 735f71323e297a928af368937089d3ed71239786f86Andreas Huber int mb_col; 736f71323e297a928af368937089d3ed71239786f86Andreas Huber int ref_fb_idx = pc->lst_fb_idx; 737f71323e297a928af368937089d3ed71239786f86Andreas Huber int dst_fb_idx = pc->new_fb_idx; 738f71323e297a928af368937089d3ed71239786f86Andreas Huber int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; 739f71323e297a928af368937089d3ed71239786f86Andreas Huber int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; 74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 741538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* volatile int *last_row_current_mb_col = NULL; */ 742f71323e297a928af368937089d3ed71239786f86Andreas Huber if (mb_row > 0) 743538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber last_row_current_mb_col = &pbi->mt_current_mb_col[mb_row -1]; 74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 745f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memset(&pc->left_context, 0, sizeof(pc->left_context)); 746f71323e297a928af368937089d3ed71239786f86Andreas Huber recon_yoffset = mb_row * recon_y_stride * 16; 747f71323e297a928af368937089d3ed71239786f86Andreas Huber recon_uvoffset = mb_row * recon_uv_stride * 8; 748538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* reset above block coeffs */ 74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 750f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->above_context = pc->above_context; 751f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->up_available = (mb_row != 0); 752f71323e297a928af368937089d3ed71239786f86Andreas Huber 753f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mb_to_top_edge = -((mb_row * 16)) << 3; 754f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 755f71323e297a928af368937089d3ed71239786f86Andreas Huber 756f71323e297a928af368937089d3ed71239786f86Andreas Huber for (mb_col = 0; mb_col < pc->mb_cols; mb_col++) 757f71323e297a928af368937089d3ed71239786f86Andreas Huber { 758538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if ( mb_row > 0 && (mb_col & (nsync-1)) == 0){ 759538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber while (mb_col > (*last_row_current_mb_col - nsync) && *last_row_current_mb_col != pc->mb_cols - 1) 760f71323e297a928af368937089d3ed71239786f86Andreas Huber { 761f71323e297a928af368937089d3ed71239786f86Andreas Huber x86_pause_hint(); 762f71323e297a928af368937089d3ed71239786f86Andreas Huber thread_sleep(0); 763f71323e297a928af368937089d3ed71239786f86Andreas Huber } 764f71323e297a928af368937089d3ed71239786f86Andreas Huber } 765f71323e297a928af368937089d3ed71239786f86Andreas Huber 766f71323e297a928af368937089d3ed71239786f86Andreas Huber if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info_context->mbmi.mode == B_PRED) 767f71323e297a928af368937089d3ed71239786f86Andreas Huber { 768f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = 0; i < 16; i++) 769f71323e297a928af368937089d3ed71239786f86Andreas Huber { 770f71323e297a928af368937089d3ed71239786f86Andreas Huber BLOCKD *d = &xd->block[i]; 771f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[i], sizeof(B_MODE_INFO)); 772f71323e297a928af368937089d3ed71239786f86Andreas Huber } 773f71323e297a928af368937089d3ed71239786f86Andreas Huber } 774f71323e297a928af368937089d3ed71239786f86Andreas Huber 775538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Distance of Mb to the various image edges. 776538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units 777538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 778f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mb_to_left_edge = -((mb_col * 16) << 3); 779f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 780f71323e297a928af368937089d3ed71239786f86Andreas Huber 781f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; 782f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; 783f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset; 784f71323e297a928af368937089d3ed71239786f86Andreas Huber 785f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->left_available = (mb_col != 0); 786f71323e297a928af368937089d3ed71239786f86Andreas Huber 787538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Select the appropriate reference frame for this MB */ 788f71323e297a928af368937089d3ed71239786f86Andreas Huber if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) 789f71323e297a928af368937089d3ed71239786f86Andreas Huber ref_fb_idx = pc->lst_fb_idx; 790f71323e297a928af368937089d3ed71239786f86Andreas Huber else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) 791f71323e297a928af368937089d3ed71239786f86Andreas Huber ref_fb_idx = pc->gld_fb_idx; 792f71323e297a928af368937089d3ed71239786f86Andreas Huber else 793f71323e297a928af368937089d3ed71239786f86Andreas Huber ref_fb_idx = pc->alt_fb_idx; 794f71323e297a928af368937089d3ed71239786f86Andreas Huber 795f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->pre.y_buffer = pc->yv12_fb[ref_fb_idx].y_buffer + recon_yoffset; 796f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset; 797f71323e297a928af368937089d3ed71239786f86Andreas Huber xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset; 798f71323e297a928af368937089d3ed71239786f86Andreas Huber 79979f15823c34ae1e423108295e416213200bb280fAndreas Huber if (xd->mode_info_context->mbmi.ref_frame != INTRA_FRAME) 80079f15823c34ae1e423108295e416213200bb280fAndreas Huber { 80179f15823c34ae1e423108295e416213200bb280fAndreas Huber /* propagate errors from reference frames */ 80279f15823c34ae1e423108295e416213200bb280fAndreas Huber xd->corrupted |= pc->yv12_fb[ref_fb_idx].corrupted; 80379f15823c34ae1e423108295e416213200bb280fAndreas Huber } 80479f15823c34ae1e423108295e416213200bb280fAndreas Huber 805f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_build_uvmvs(xd, pc->full_pixel); 80679f15823c34ae1e423108295e416213200bb280fAndreas Huber decode_macroblock(pbi, xd, mb_row, mb_col); 80779f15823c34ae1e423108295e416213200bb280fAndreas Huber 80879f15823c34ae1e423108295e416213200bb280fAndreas Huber /* check if the boolean decoder has suffered an error */ 80979f15823c34ae1e423108295e416213200bb280fAndreas Huber xd->corrupted |= vp8dx_bool_error(xd->current_bc); 810f71323e297a928af368937089d3ed71239786f86Andreas Huber 811538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->common.filter_level) 812538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 813538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Save decoded MB last row data for next-row decoding */ 814538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if(mb_row != pc->mb_rows-1) 815538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 816538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memcpy((pbi->mt_yabove_row[mb_row +1] + 32 + mb_col*16), (xd->dst.y_buffer + 15 * recon_y_stride), 16); 817538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memcpy((pbi->mt_uabove_row[mb_row +1] + 16 + mb_col*8), (xd->dst.u_buffer + 7 * recon_uv_stride), 8); 818538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vpx_memcpy((pbi->mt_vabove_row[mb_row +1] + 16 + mb_col*8), (xd->dst.v_buffer + 7 * recon_uv_stride), 8); 819538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 820f71323e297a928af368937089d3ed71239786f86Andreas Huber 821538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* save left_col for next MB decoding */ 822538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if(mb_col != pc->mb_cols-1) 823538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 824538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber MODE_INFO *next = xd->mode_info_context +1; 825f71323e297a928af368937089d3ed71239786f86Andreas Huber 826538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->frame_type == KEY_FRAME || next->mbmi.ref_frame == INTRA_FRAME) 827538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 828538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < 16; i++) 829538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_yleft_col[mb_row][i] = xd->dst.y_buffer [i* recon_y_stride + 15]; 830538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < 8; i++) 831538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 832538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_uleft_col[mb_row][i] = xd->dst.u_buffer [i* recon_uv_stride + 7]; 833538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_vleft_col[mb_row][i] = xd->dst.v_buffer [i* recon_uv_stride + 7]; 834538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 835538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 836538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 837f71323e297a928af368937089d3ed71239786f86Andreas Huber 83879f15823c34ae1e423108295e416213200bb280fAndreas Huber /* update loopfilter info */ 83979f15823c34ae1e423108295e416213200bb280fAndreas Huber Segment = (alt_flt_enabled) ? xd->mode_info_context->mbmi.segment_id : 0; 84079f15823c34ae1e423108295e416213200bb280fAndreas Huber filter_level = pbi->mt_baseline_filter_level[Segment]; 84179f15823c34ae1e423108295e416213200bb280fAndreas Huber /* Distance of Mb to the various image edges. 84279f15823c34ae1e423108295e416213200bb280fAndreas Huber * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units 84379f15823c34ae1e423108295e416213200bb280fAndreas Huber * Apply any context driven MB level adjustment 84479f15823c34ae1e423108295e416213200bb280fAndreas Huber */ 84579f15823c34ae1e423108295e416213200bb280fAndreas Huber filter_level = vp8_adjust_mb_lf_value(xd, filter_level); 84679f15823c34ae1e423108295e416213200bb280fAndreas Huber 847538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* loopfilter on this macroblock. */ 848538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (filter_level) 849538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 850538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (mb_col > 0) 851538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pc->lf_mbv(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); 852f71323e297a928af368937089d3ed71239786f86Andreas Huber 853538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->mode_info_context->mbmi.dc_diff > 0) 854538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pc->lf_bv(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); 855f71323e297a928af368937089d3ed71239786f86Andreas Huber 856538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* don't apply across umv border */ 857538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (mb_row > 0) 858538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pc->lf_mbh(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); 859f71323e297a928af368937089d3ed71239786f86Andreas Huber 860538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (xd->mode_info_context->mbmi.dc_diff > 0) 861538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pc->lf_bh(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); 862538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 863538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 864f71323e297a928af368937089d3ed71239786f86Andreas Huber 865538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber recon_yoffset += 16; 866538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber recon_uvoffset += 8; 867f71323e297a928af368937089d3ed71239786f86Andreas Huber 868538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ++xd->mode_info_context; /* next mb */ 869f71323e297a928af368937089d3ed71239786f86Andreas Huber 870538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->above_context++; 871f71323e297a928af368937089d3ed71239786f86Andreas Huber 872538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_current_mb_col[mb_row] = mb_col; 873f71323e297a928af368937089d3ed71239786f86Andreas Huber } 874f71323e297a928af368937089d3ed71239786f86Andreas Huber 875538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* adjust to the next row of mbs */ 876538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (pbi->common.filter_level) 877f71323e297a928af368937089d3ed71239786f86Andreas Huber { 878538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if(mb_row != pc->mb_rows-1) 879538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 880538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int lasty = pc->yv12_fb[ref_fb_idx].y_width + VP8BORDERINPIXELS; 881538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int lastuv = (pc->yv12_fb[ref_fb_idx].y_width>>1) + (VP8BORDERINPIXELS>>1); 882f71323e297a928af368937089d3ed71239786f86Andreas Huber 883538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber for (i = 0; i < 4; i++) 884538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 885538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_yabove_row[mb_row +1][lasty + i] = pbi->mt_yabove_row[mb_row +1][lasty -1]; 886538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_uabove_row[mb_row +1][lastuv + i] = pbi->mt_uabove_row[mb_row +1][lastuv -1]; 887538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber pbi->mt_vabove_row[mb_row +1][lastuv + i] = pbi->mt_vabove_row[mb_row +1][lastuv -1]; 888538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 889538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 890538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber }else 891538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_extend_mb_row(&pc->yv12_fb[dst_fb_idx], xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); 892f71323e297a928af368937089d3ed71239786f86Andreas Huber 893538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ++xd->mode_info_context; /* skip prediction column */ 89490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 895538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber xd->mode_info_context += xd->mode_info_stride * pbi->decoding_thread_count; 89690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 89790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 898538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber sem_wait(&pbi->h_event_end_decoding); /* add back for each frame */ 89990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 900