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