vp9_decodframe.c 66.5 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5 6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9 10 11
 */


12
#include "vp9/decoder/vp9_onyxd_int.h"
Ronald S. Bultje's avatar
Ronald S. Bultje committed
13
#include "vp9/common/vp9_common.h"
14 15 16
#include "vp9/common/vp9_header.h"
#include "vp9/common/vp9_reconintra.h"
#include "vp9/common/vp9_reconinter.h"
Yaowu Xu's avatar
Yaowu Xu committed
17
#include "vp9/common/vp9_entropy.h"
18
#include "vp9/decoder/vp9_decodframe.h"
19
#include "vp9/decoder/vp9_detokenize.h"
20 21 22 23
#include "vp9/common/vp9_invtrans.h"
#include "vp9/common/vp9_alloccommon.h"
#include "vp9/common/vp9_entropymode.h"
#include "vp9/common/vp9_quant_common.h"
Johann's avatar
Johann committed
24
#include "vpx_scale/vpx_scale.h"
25
#include "vp9/common/vp9_setupintrarecon.h"
Scott LaVarnway's avatar
Scott LaVarnway committed
26

27
#include "vp9/decoder/vp9_decodemv.h"
28 29
#include "vp9/common/vp9_extend.h"
#include "vp9/common/vp9_modecont.h"
John Koleszar's avatar
John Koleszar committed
30
#include "vpx_mem/vpx_mem.h"
31
#include "vp9/decoder/vp9_dboolhuff.h"
John Koleszar's avatar
John Koleszar committed
32

33
#include "vp9/common/vp9_seg_common.h"
34
#include "vp9/common/vp9_tile_common.h"
35
#include "vp9_rtcd.h"
36

John Koleszar's avatar
John Koleszar committed
37 38 39
#include <assert.h>
#include <stdio.h>

40 41
#define COEFCOUNT_TESTING

42
// #define DEC_DEBUG
43 44 45 46
#ifdef DEC_DEBUG
int dec_debug = 0;
#endif

John Koleszar's avatar
John Koleszar committed
47 48 49 50 51 52 53 54 55 56 57 58
static int merge_index(int v, int n, int modulus) {
  int max1 = (n - 1 - modulus / 2) / modulus + 1;
  if (v < max1) v = v * modulus + modulus / 2;
  else {
    int w;
    v -= max1;
    w = v;
    v += (v + modulus - modulus / 2) / modulus;
    while (v % modulus == modulus / 2 ||
           w != v - (v + modulus - modulus / 2) / modulus) v++;
  }
  return v;
59 60
}

John Koleszar's avatar
John Koleszar committed
61 62 63
static int inv_remap_prob(int v, int m) {
  const int n = 256;
  const int modulus = MODULUS_PARAM;
64
  int i;
John Koleszar's avatar
John Koleszar committed
65 66
  v = merge_index(v, n - 1, modulus);
  if ((m << 1) <= n) {
67
    i = vp9_inv_recenter_nonneg(v + 1, m);
John Koleszar's avatar
John Koleszar committed
68
  } else {
69
    i = n - 1 - vp9_inv_recenter_nonneg(v + 1, n - 1 - m);
John Koleszar's avatar
John Koleszar committed
70 71
  }
  return i;
72
}
73

74
static vp9_prob read_prob_diff_update(vp9_reader *const bc, int oldp) {
75
  int delp = vp9_decode_term_subexp(bc, SUBEXP_PARAM, 255);
76
  return (vp9_prob)inv_remap_prob(delp, oldp);
77
}
78

79
void vp9_init_de_quantizer(VP9D_COMP *pbi) {
John Koleszar's avatar
John Koleszar committed
80
  int i;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
81
  int q;
82
  VP9_COMMON *const pc = &pbi->common;
John Koleszar's avatar
John Koleszar committed
83

Dmitry Kovalev's avatar
Dmitry Kovalev committed
84 85 86
  for (q = 0; q < QINDEX_RANGE; q++) {
    pc->Y1dequant[q][0] = (int16_t)vp9_dc_quant(q, pc->y1dc_delta_q);
    pc->UVdequant[q][0] = (int16_t)vp9_dc_uv_quant(q, pc->uvdc_delta_q);
John Koleszar's avatar
John Koleszar committed
87 88 89

    /* all the ac values =; */
    for (i = 1; i < 16; i++) {
90
      int rc = vp9_default_zig_zag1d_4x4[i];
John Koleszar's avatar
John Koleszar committed
91

Dmitry Kovalev's avatar
Dmitry Kovalev committed
92 93
      pc->Y1dequant[q][rc] = (int16_t)vp9_ac_yquant(q);
      pc->UVdequant[q][rc] = (int16_t)vp9_ac_uv_quant(q, pc->uvac_delta_q);
John Koleszar's avatar
John Koleszar committed
94
    }
John Koleszar's avatar
John Koleszar committed
95
  }
John Koleszar's avatar
John Koleszar committed
96 97
}

Dmitry Kovalev's avatar
Dmitry Kovalev committed
98 99 100 101 102 103 104 105 106 107 108 109 110 111
static int get_qindex(MACROBLOCKD *mb, int segment_id, int base_qindex) {
  // Set the Q baseline allowing for any segment level adjustment
  if (vp9_segfeature_active(mb, segment_id, SEG_LVL_ALT_Q)) {
    if (mb->mb_segment_abs_delta == SEGMENT_ABSDATA)
      return vp9_get_segdata(mb, segment_id, SEG_LVL_ALT_Q);  // Abs Value
    else
      return clamp(base_qindex + vp9_get_segdata(mb, segment_id, SEG_LVL_ALT_Q),
                   0, MAXQ);  // Delta Value
  } else {
    return base_qindex;
  }
}

static void mb_init_dequantizer(VP9D_COMP *pbi, MACROBLOCKD *mb) {
John Koleszar's avatar
John Koleszar committed
112 113
  int i;

Dmitry Kovalev's avatar
Dmitry Kovalev committed
114 115 116 117
  VP9_COMMON *const pc = &pbi->common;
  int segment_id = mb->mode_info_context->mbmi.segment_id;
  int qindex = get_qindex(mb, segment_id, pc->base_qindex);
  mb->q_index = qindex;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
118

Dmitry Kovalev's avatar
Dmitry Kovalev committed
119 120
  for (i = 0; i < 16; i++)
    mb->block[i].dequant = pc->Y1dequant[qindex];
John Koleszar's avatar
John Koleszar committed
121

Dmitry Kovalev's avatar
Dmitry Kovalev committed
122 123
  for (i = 16; i < 24; i++)
    mb->block[i].dequant = pc->UVdequant[qindex];
John Koleszar's avatar
John Koleszar committed
124

Dmitry Kovalev's avatar
Dmitry Kovalev committed
125
  if (mb->lossless) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
126
    assert(qindex == 0);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
127 128 129 130 131 132 133 134 135 136 137
    mb->inv_txm4x4_1      = vp9_short_inv_walsh4x4_1_x8;
    mb->inv_txm4x4        = vp9_short_inv_walsh4x4_x8;
    mb->itxm_add          = vp9_dequant_idct_add_lossless_c;
    mb->itxm_add_y_block  = vp9_dequant_idct_add_y_block_lossless_c;
    mb->itxm_add_uv_block = vp9_dequant_idct_add_uv_block_lossless_c;
  } else {
    mb->inv_txm4x4_1      = vp9_short_idct4x4llm_1;
    mb->inv_txm4x4        = vp9_short_idct4x4llm;
    mb->itxm_add          = vp9_dequant_idct_add;
    mb->itxm_add_y_block  = vp9_dequant_idct_add_y_block;
    mb->itxm_add_uv_block = vp9_dequant_idct_add_uv_block;
John Koleszar's avatar
John Koleszar committed
138
  }
John Koleszar's avatar
John Koleszar committed
139 140
}

141 142 143
/* skip_recon_mb() is Modified: Instead of writing the result to predictor buffer and then copying it
 *  to dst buffer, we can write the result directly to dst buffer. This eliminates unnecessary copy.
 */
144 145
static void skip_recon_mb(VP9D_COMP *pbi, MACROBLOCKD *xd,
                          int mb_row, int mb_col) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
146 147
  BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;

John Koleszar's avatar
John Koleszar committed
148
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
149
    if (sb_type == BLOCK_SIZE_SB64X64) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
150 151
      vp9_build_intra_predictors_sb64uv_s(xd);
      vp9_build_intra_predictors_sb64y_s(xd);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
152
    } else if (sb_type == BLOCK_SIZE_SB32X32) {
153 154
      vp9_build_intra_predictors_sbuv_s(xd);
      vp9_build_intra_predictors_sby_s(xd);
155
    } else {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
156 157
      vp9_build_intra_predictors_mbuv_s(xd);
      vp9_build_intra_predictors_mby_s(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
158
    }
John Koleszar's avatar
John Koleszar committed
159
  } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
160
    if (sb_type == BLOCK_SIZE_SB64X64) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
161 162 163 164 165
      vp9_build_inter64x64_predictors_sb(xd,
                                         xd->dst.y_buffer,
                                         xd->dst.u_buffer,
                                         xd->dst.v_buffer,
                                         xd->dst.y_stride,
166 167
                                         xd->dst.uv_stride,
                                         mb_row, mb_col);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
168
    } else if (sb_type == BLOCK_SIZE_SB32X32) {
169 170 171 172 173
      vp9_build_inter32x32_predictors_sb(xd,
                                         xd->dst.y_buffer,
                                         xd->dst.u_buffer,
                                         xd->dst.v_buffer,
                                         xd->dst.y_stride,
174 175
                                         xd->dst.uv_stride,
                                         mb_row, mb_col);
176
    } else {
177 178 179 180 181
      vp9_build_inter16x16_predictors_mb(xd,
                                         xd->dst.y_buffer,
                                         xd->dst.u_buffer,
                                         xd->dst.v_buffer,
                                         xd->dst.y_stride,
182 183
                                         xd->dst.uv_stride,
                                         mb_row, mb_col);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
184
#if CONFIG_COMP_INTERINTRA_PRED
185
      if (xd->mode_info_context->mbmi.second_ref_frame == INTRA_FRAME) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
186 187 188 189 190 191 192
        vp9_build_interintra_16x16_predictors_mb(xd,
                                                 xd->dst.y_buffer,
                                                 xd->dst.u_buffer,
                                                 xd->dst.v_buffer,
                                                 xd->dst.y_stride,
                                                 xd->dst.uv_stride);
      }
193
#endif
Ronald S. Bultje's avatar
Ronald S. Bultje committed
194
    }
John Koleszar's avatar
John Koleszar committed
195
  }
John Koleszar's avatar
John Koleszar committed
196 197
}

198 199
static void decode_16x16(VP9D_COMP *pbi, MACROBLOCKD *xd,
                         BOOL_DECODER* const bc) {
200
  TX_TYPE tx_type = get_tx_type_16x16(xd, 0);
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
#ifdef DEC_DEBUG
  if (dec_debug) {
    int i;
    printf("\n");
    printf("qcoeff 16x16\n");
    for (i = 0; i < 400; i++) {
      printf("%3d ", xd->qcoeff[i]);
      if (i % 16 == 15) printf("\n");
    }
    printf("\n");
    printf("predictor\n");
    for (i = 0; i < 400; i++) {
      printf("%3d ", xd->predictor[i]);
      if (i % 16 == 15) printf("\n");
    }
  }
#endif
  if (tx_type != DCT_DCT) {
    vp9_ht_dequant_idct_add_16x16_c(tx_type, xd->qcoeff,
                                    xd->block[0].dequant, xd->predictor,
Scott LaVarnway's avatar
Scott LaVarnway committed
221
                                    xd->dst.y_buffer, 16, xd->dst.y_stride,
222
                                    xd->eobs[0]);
223 224 225
  } else {
    vp9_dequant_idct_add_16x16(xd->qcoeff, xd->block[0].dequant,
                               xd->predictor, xd->dst.y_buffer,
226
                               16, xd->dst.y_stride, xd->eobs[0]);
227 228 229 230
  }
  vp9_dequant_idct_add_uv_block_8x8(
      xd->qcoeff + 16 * 16, xd->block[16].dequant,
      xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer,
231
      xd->dst.uv_stride, xd);
232 233 234 235 236 237
}

static void decode_8x8(VP9D_COMP *pbi, MACROBLOCKD *xd,
                       BOOL_DECODER* const bc) {
  // First do Y
  // if the first one is DCT_DCT assume all the rest are as well
238
  TX_TYPE tx_type = get_tx_type_8x8(xd, 0);
239 240 241 242 243
#ifdef DEC_DEBUG
  if (dec_debug) {
    int i;
    printf("\n");
    printf("qcoeff 8x8\n");
244
    for (i = 0; i < 384; i++) {
245 246 247 248 249 250 251 252 253 254
      printf("%3d ", xd->qcoeff[i]);
      if (i % 16 == 15) printf("\n");
    }
  }
#endif
  if (tx_type != DCT_DCT || xd->mode_info_context->mbmi.mode == I8X8_PRED) {
    int i;
    for (i = 0; i < 4; i++) {
      int ib = vp9_i8x8_block[i];
      int idx = (ib & 0x02) ? (ib + 2) : ib;
255 256 257 258
      int16_t *q  = xd->block[idx].qcoeff;
      int16_t *dq = xd->block[0].dequant;
      uint8_t *pre = xd->block[ib].predictor;
      uint8_t *dst = *(xd->block[ib].base_dst) + xd->block[ib].dst;
259 260 261 262
      int stride = xd->dst.y_stride;
      BLOCKD *b = &xd->block[ib];
      if (xd->mode_info_context->mbmi.mode == I8X8_PRED) {
        int i8x8mode = b->bmi.as_mode.first;
263
        vp9_intra8x8_predict(xd, b, i8x8mode, b->predictor);
264
      }
265
      tx_type = get_tx_type_8x8(xd, ib);
266
      if (tx_type != DCT_DCT) {
Scott LaVarnway's avatar
Scott LaVarnway committed
267
        vp9_ht_dequant_idct_add_8x8_c(tx_type, q, dq, pre, dst, 16, stride,
268
                                      xd->eobs[idx]);
269 270
      } else {
        vp9_dequant_idct_add_8x8_c(q, dq, pre, dst, 16, stride,
271
                                   xd->eobs[idx]);
272 273
      }
    }
274
  } else {
275 276 277 278 279
    vp9_dequant_idct_add_y_block_8x8(xd->qcoeff,
                                     xd->block[0].dequant,
                                     xd->predictor,
                                     xd->dst.y_buffer,
                                     xd->dst.y_stride,
280
                                     xd);
281 282 283 284 285 286 287 288 289 290
  }

  // Now do UV
  if (xd->mode_info_context->mbmi.mode == I8X8_PRED) {
    int i;
    for (i = 0; i < 4; i++) {
      int ib = vp9_i8x8_block[i];
      BLOCKD *b = &xd->block[ib];
      int i8x8mode = b->bmi.as_mode.first;
      b = &xd->block[16 + i];
291
      vp9_intra_uv4x4_predict(xd, &xd->block[16 + i], i8x8mode, b->predictor);
Yaowu Xu's avatar
Yaowu Xu committed
292
      xd->itxm_add(b->qcoeff, b->dequant, b->predictor,
293
                   *(b->base_dst) + b->dst, 8, b->dst_stride, xd->eobs[16 + i]);
294
      b = &xd->block[20 + i];
295
      vp9_intra_uv4x4_predict(xd, &xd->block[20 + i], i8x8mode, b->predictor);
Yaowu Xu's avatar
Yaowu Xu committed
296
      xd->itxm_add(b->qcoeff, b->dequant, b->predictor,
297
                   *(b->base_dst) + b->dst, 8, b->dst_stride, xd->eobs[20 + i]);
298 299
    }
  } else if (xd->mode_info_context->mbmi.mode == SPLITMV) {
Yaowu Xu's avatar
Yaowu Xu committed
300
    xd->itxm_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant,
301
         xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer,
302
         xd->dst.uv_stride, xd);
303 304 305 306
  } else {
    vp9_dequant_idct_add_uv_block_8x8
        (xd->qcoeff + 16 * 16, xd->block[16].dequant,
         xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer,
307
         xd->dst.uv_stride, xd);
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
  }
#ifdef DEC_DEBUG
  if (dec_debug) {
    int i;
    printf("\n");
    printf("predictor\n");
    for (i = 0; i < 384; i++) {
      printf("%3d ", xd->predictor[i]);
      if (i % 16 == 15) printf("\n");
    }
  }
#endif
}

static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd,
                       BOOL_DECODER* const bc) {
  TX_TYPE tx_type;
  int i, eobtotal = 0;
  MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
  if (mode == I8X8_PRED) {
    for (i = 0; i < 4; i++) {
      int ib = vp9_i8x8_block[i];
      const int iblock[4] = {0, 1, 4, 5};
      int j;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
332 333
      BLOCKD *b = &xd->block[ib];
      int i8x8mode = b->bmi.as_mode.first;
334
      vp9_intra8x8_predict(xd, b, i8x8mode, b->predictor);
335 336
      for (j = 0; j < 4; j++) {
        b = &xd->block[ib + iblock[j]];
337
        tx_type = get_tx_type_4x4(xd, ib + iblock[j]);
338 339 340 341
        if (tx_type != DCT_DCT) {
          vp9_ht_dequant_idct_add_c(tx_type, b->qcoeff,
                                    b->dequant, b->predictor,
                                    *(b->base_dst) + b->dst, 16,
342
                                    b->dst_stride, xd->eobs[ib + iblock[j]]);
343
        } else {
Yaowu Xu's avatar
Yaowu Xu committed
344
          xd->itxm_add(b->qcoeff, b->dequant, b->predictor,
345 346
                       *(b->base_dst) + b->dst, 16, b->dst_stride,
                       xd->eobs[ib + iblock[j]]);
347 348 349
        }
      }
      b = &xd->block[16 + i];
350
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, b->predictor);
Yaowu Xu's avatar
Yaowu Xu committed
351
      xd->itxm_add(b->qcoeff, b->dequant, b->predictor,
352
                   *(b->base_dst) + b->dst, 8, b->dst_stride, xd->eobs[16 + i]);
353
      b = &xd->block[20 + i];
354
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, b->predictor);
Yaowu Xu's avatar
Yaowu Xu committed
355
      xd->itxm_add(b->qcoeff, b->dequant, b->predictor,
356
                   *(b->base_dst) + b->dst, 8, b->dst_stride, xd->eobs[20 + i]);
357 358 359 360
    }
  } else if (mode == B_PRED) {
    for (i = 0; i < 16; i++) {
      BLOCKD *b = &xd->block[i];
Dmitry Kovalev's avatar
Dmitry Kovalev committed
361
      int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
362 363 364 365 366 367 368
#if CONFIG_NEWBINTRAMODES
      xd->mode_info_context->bmi[i].as_mode.context = b->bmi.as_mode.context =
          vp9_find_bpred_context(b);
#endif
      if (!xd->mode_info_context->mbmi.mb_skip_coeff)
        eobtotal += vp9_decode_coefs_4x4(pbi, xd, bc, PLANE_TYPE_Y_WITH_DC, i);

369
      vp9_intra4x4_predict(xd, b, b_mode, b->predictor);
370
      tx_type = get_tx_type_4x4(xd, i);
371 372 373
      if (tx_type != DCT_DCT) {
        vp9_ht_dequant_idct_add_c(tx_type, b->qcoeff,
                                  b->dequant, b->predictor,
Scott LaVarnway's avatar
Scott LaVarnway committed
374
                                  *(b->base_dst) + b->dst, 16, b->dst_stride,
375
                                  xd->eobs[i]);
376
      } else {
Yaowu Xu's avatar
Yaowu Xu committed
377
        xd->itxm_add(b->qcoeff, b->dequant, b->predictor,
378
                      *(b->base_dst) + b->dst, 16, b->dst_stride, xd->eobs[i]);
379 380 381 382 383 384
      }
    }
    if (!xd->mode_info_context->mbmi.mb_skip_coeff) {
      vp9_decode_mb_tokens_4x4_uv(pbi, xd, bc);
    }
    vp9_build_intra_predictors_mbuv(xd);
Yaowu Xu's avatar
Yaowu Xu committed
385
    xd->itxm_add_uv_block(xd->qcoeff + 16 * 16,
386 387 388 389 390
                           xd->block[16].dequant,
                           xd->predictor + 16 * 16,
                           xd->dst.u_buffer,
                           xd->dst.v_buffer,
                           xd->dst.uv_stride,
391
                           xd);
392
  } else if (mode == SPLITMV || get_tx_type_4x4(xd, 0) == DCT_DCT) {
Yaowu Xu's avatar
Yaowu Xu committed
393
    xd->itxm_add_y_block(xd->qcoeff,
394 395 396 397
                          xd->block[0].dequant,
                          xd->predictor,
                          xd->dst.y_buffer,
                          xd->dst.y_stride,
398
                          xd);
Yaowu Xu's avatar
Yaowu Xu committed
399
    xd->itxm_add_uv_block(xd->qcoeff + 16 * 16,
400 401 402 403 404
                           xd->block[16].dequant,
                           xd->predictor + 16 * 16,
                           xd->dst.u_buffer,
                           xd->dst.v_buffer,
                           xd->dst.uv_stride,
405
                           xd);
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
  } else {
#ifdef DEC_DEBUG
    if (dec_debug) {
      int i;
      printf("\n");
      printf("qcoeff 4x4\n");
      for (i = 0; i < 400; i++) {
        printf("%3d ", xd->qcoeff[i]);
        if (i % 16 == 15) printf("\n");
      }
      printf("\n");
      printf("predictor\n");
      for (i = 0; i < 400; i++) {
        printf("%3d ", xd->predictor[i]);
        if (i % 16 == 15) printf("\n");
      }
    }
#endif
424 425
    for (i = 0; i < 16; i++) {
      BLOCKD *b = &xd->block[i];
426
      tx_type = get_tx_type_4x4(xd, i);
427 428 429 430
      if (tx_type != DCT_DCT) {
        vp9_ht_dequant_idct_add_c(tx_type, b->qcoeff,
                                  b->dequant, b->predictor,
                                  *(b->base_dst) + b->dst, 16,
431
                                  b->dst_stride, xd->eobs[i]);
432
      } else {
433
        xd->itxm_add(b->qcoeff, b->dequant, b->predictor,
434
                      *(b->base_dst) + b->dst, 16, b->dst_stride, xd->eobs[i]);
435 436
      }
    }
Yaowu Xu's avatar
Yaowu Xu committed
437
    xd->itxm_add_uv_block(xd->qcoeff + 16 * 16,
438 439 440 441 442
                           xd->block[16].dequant,
                           xd->predictor + 16 * 16,
                           xd->dst.u_buffer,
                           xd->dst.v_buffer,
                           xd->dst.uv_stride,
443
                           xd);
444 445 446
  }
}

Ronald S. Bultje's avatar
Ronald S. Bultje committed
447
static void decode_superblock64(VP9D_COMP *pbi, MACROBLOCKD *xd,
Frank Galligan's avatar
Frank Galligan committed
448
                                int mb_row, int mb_col,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
449
                                BOOL_DECODER* const bc) {
450
  int n, eobtotal;
451
  VP9_COMMON *const pc = &pbi->common;
452
  MODE_INFO *mi = xd->mode_info_context;
453
  const int mis = pc->mode_info_stride;
454

Ronald S. Bultje's avatar
Ronald S. Bultje committed
455 456 457 458 459 460 461 462 463 464
  assert(xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB64X64);

  if (pbi->common.frame_type != KEY_FRAME)
    vp9_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter, pc);

  // re-initialize macroblock dequantizer before detokenization
  if (xd->segmentation_enabled)
    mb_init_dequantizer(pbi, xd);

  if (xd->mode_info_context->mbmi.mb_skip_coeff) {
465
    vp9_reset_sb64_tokens_context(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
466 467 468 469

    /* Special case:  Force the loopfilter to skip when eobtotal and
     * mb_skip_coeff are zero.
     */
470
    skip_recon_mb(pbi, xd, mb_row, mb_col);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
471 472 473 474 475 476 477 478 479 480
    return;
  }

  /* do prediction */
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
    vp9_build_intra_predictors_sb64y_s(xd);
    vp9_build_intra_predictors_sb64uv_s(xd);
  } else {
    vp9_build_inter64x64_predictors_sb(xd, xd->dst.y_buffer,
                                       xd->dst.u_buffer, xd->dst.v_buffer,
481 482
                                       xd->dst.y_stride, xd->dst.uv_stride,
                                       mb_row, mb_col);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
483 484 485
  }

  /* dequantization and idct */
486 487
  eobtotal = vp9_decode_sb64_tokens(pbi, xd, bc);
  if (eobtotal == 0) {  // skip loopfilter
Ronald S. Bultje's avatar
Ronald S. Bultje committed
488
    for (n = 0; n < 16; n++) {
489
      const int x_idx = n & 3, y_idx = n >> 2;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
490

491 492 493 494 495 496 497 498
      if (mb_col + x_idx < pc->mb_cols && mb_row + y_idx < pc->mb_rows)
        mi[y_idx * mis + x_idx].mbmi.mb_skip_coeff = mi->mbmi.mb_skip_coeff;
    }
  } else {
    switch (xd->mode_info_context->mbmi.txfm_size) {
      case TX_32X32:
        for (n = 0; n < 4; n++) {
          const int x_idx = n & 1, y_idx = n >> 1;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
499
          const int y_offset = x_idx * 32 + y_idx * xd->dst.y_stride * 32;
500 501
          vp9_dequant_idct_add_32x32(xd->qcoeff + n * 1024,
              xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
502 503
              xd->dst.y_buffer + y_offset,
              xd->dst.y_buffer + y_offset,
504 505 506 507 508 509 510 511 512
              xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 64]);
        }
        vp9_dequant_idct_add_32x32(xd->qcoeff + 4096,
            xd->block[16].dequant, xd->dst.u_buffer, xd->dst.u_buffer,
            xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[256]);
        vp9_dequant_idct_add_32x32(xd->qcoeff + 4096 + 1024,
            xd->block[20].dequant, xd->dst.v_buffer, xd->dst.v_buffer,
            xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[320]);
        break;
513
      case TX_16X16:
514 515
        for (n = 0; n < 16; n++) {
          const int x_idx = n & 3, y_idx = n >> 2;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
516
          const int y_offset = y_idx * 16 * xd->dst.y_stride + x_idx * 16;
517 518
          const TX_TYPE tx_type = get_tx_type_16x16(xd,
                                                    (y_idx * 16 + x_idx) * 4);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
519

520 521 522
          if (tx_type == DCT_DCT) {
            vp9_dequant_idct_add_16x16(xd->qcoeff + n * 256,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
523 524
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
525 526 527 528
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 16]);
          } else {
            vp9_ht_dequant_idct_add_16x16_c(tx_type, xd->qcoeff + n * 256,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
529 530
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
531 532
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 16]);
          }
533 534 535
        }
        for (n = 0; n < 4; n++) {
          const int x_idx = n & 1, y_idx = n >> 1;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
536
          const int uv_offset = y_idx * 16 * xd->dst.uv_stride + x_idx * 16;
537 538
          vp9_dequant_idct_add_16x16(xd->qcoeff + 4096 + n * 256,
              xd->block[16].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
539 540
              xd->dst.u_buffer + uv_offset,
              xd->dst.u_buffer + uv_offset,
541 542 543
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[256 + n * 16]);
          vp9_dequant_idct_add_16x16(xd->qcoeff + 4096 + 1024 + n * 256,
              xd->block[20].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
544 545
              xd->dst.v_buffer + uv_offset,
              xd->dst.v_buffer + uv_offset,
546 547 548
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[320 + n * 16]);
        }
        break;
549
      case TX_8X8:
550 551
        for (n = 0; n < 64; n++) {
          const int x_idx = n & 7, y_idx = n >> 3;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
552
          const int y_offset = y_idx * 8 * xd->dst.y_stride + x_idx * 8;
553 554 555 556
          const TX_TYPE tx_type = get_tx_type_8x8(xd, (y_idx * 16 + x_idx) * 2);
          if (tx_type == DCT_DCT) {
            vp9_dequant_idct_add_8x8_c(xd->qcoeff + n * 64,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
557 558
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
559 560 561 562
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 4]);
          } else {
            vp9_ht_dequant_idct_add_8x8_c(tx_type, xd->qcoeff + n * 64,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
563 564
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
565 566
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 4]);
          }
567 568 569
        }
        for (n = 0; n < 16; n++) {
          const int x_idx = n & 3, y_idx = n >> 2;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
570
          const int uv_offset = y_idx * 8 * xd->dst.uv_stride + x_idx * 8;
571 572
          vp9_dequant_idct_add_8x8_c(xd->qcoeff + n * 64 + 4096,
              xd->block[16].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
573 574
              xd->dst.u_buffer + uv_offset,
              xd->dst.u_buffer + uv_offset,
575 576 577
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[256 + n * 4]);
          vp9_dequant_idct_add_8x8_c(xd->qcoeff + n * 64 + 4096 + 1024,
              xd->block[20].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
578 579
              xd->dst.v_buffer + uv_offset,
              xd->dst.v_buffer + uv_offset,
580 581 582
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[320 + n * 4]);
        }
        break;
583
      case TX_4X4:
584 585
        for (n = 0; n < 256; n++) {
          const int x_idx = n & 15, y_idx = n >> 4;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
586
          const int y_offset = y_idx * 4 * xd->dst.y_stride + x_idx * 4;
587 588 589
          const TX_TYPE tx_type = get_tx_type_4x4(xd, y_idx * 16 + x_idx);
          if (tx_type == DCT_DCT) {
            xd->itxm_add(xd->qcoeff + n * 16, xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
590 591
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
592 593 594 595
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n]);
          } else {
            vp9_ht_dequant_idct_add_c(tx_type, xd->qcoeff + n * 16,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
596 597
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
598 599
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n]);
          }
600 601 602
        }
        for (n = 0; n < 64; n++) {
          const int x_idx = n & 7, y_idx = n >> 3;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
603
          const int uv_offset = y_idx * 4 * xd->dst.uv_stride + x_idx * 4;
604 605
          xd->itxm_add(xd->qcoeff + 4096 + n * 16,
              xd->block[16].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
606 607
              xd->dst.u_buffer + uv_offset,
              xd->dst.u_buffer + uv_offset,
608 609 610
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[256 + n]);
          xd->itxm_add(xd->qcoeff + 4096 + 1024 + n * 16,
              xd->block[20].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
611 612
              xd->dst.v_buffer + uv_offset,
              xd->dst.v_buffer + uv_offset,
613 614 615 616
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[320 + n]);
        }
        break;
      default: assert(0);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
617 618 619 620 621
    }
  }
}

static void decode_superblock32(VP9D_COMP *pbi, MACROBLOCKD *xd,
Frank Galligan's avatar
Frank Galligan committed
622
                                int mb_row, int mb_col,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
623
                                BOOL_DECODER* const bc) {
624
  int n, eobtotal;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
625 626 627 628
  VP9_COMMON *const pc = &pbi->common;
  const int mis = pc->mode_info_stride;

  assert(xd->mode_info_context->mbmi.sb_type == BLOCK_SIZE_SB32X32);
629

630 631 632
  if (pbi->common.frame_type != KEY_FRAME)
    vp9_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter, pc);

633 634 635 636 637
  // re-initialize macroblock dequantizer before detokenization
  if (xd->segmentation_enabled)
    mb_init_dequantizer(pbi, xd);

  if (xd->mode_info_context->mbmi.mb_skip_coeff) {
638
    vp9_reset_sb_tokens_context(xd);
639 640 641 642

    /* Special case:  Force the loopfilter to skip when eobtotal and
     * mb_skip_coeff are zero.
     */
643
    skip_recon_mb(pbi, xd, mb_row, mb_col);
644 645 646 647 648 649 650 651 652 653
    return;
  }

  /* do prediction */
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
    vp9_build_intra_predictors_sby_s(xd);
    vp9_build_intra_predictors_sbuv_s(xd);
  } else {
    vp9_build_inter32x32_predictors_sb(xd, xd->dst.y_buffer,
                                       xd->dst.u_buffer, xd->dst.v_buffer,
654 655
                                       xd->dst.y_stride, xd->dst.uv_stride,
                                       mb_row, mb_col);
656 657 658
  }

  /* dequantization and idct */
659 660 661 662 663 664 665
  eobtotal = vp9_decode_sb_tokens(pbi, xd, bc);
  if (eobtotal == 0) {  // skip loopfilter
    xd->mode_info_context->mbmi.mb_skip_coeff = 1;
    if (mb_col + 1 < pc->mb_cols)
      xd->mode_info_context[1].mbmi.mb_skip_coeff = 1;
    if (mb_row + 1 < pc->mb_rows) {
      xd->mode_info_context[mis].mbmi.mb_skip_coeff = 1;
666
      if (mb_col + 1 < pc->mb_cols)
667
        xd->mode_info_context[mis + 1].mbmi.mb_skip_coeff = 1;
668
    }
Ronald S. Bultje's avatar
Ronald S. Bultje committed
669
  } else {
670 671 672 673 674 675 676 677 678 679 680 681
    switch (xd->mode_info_context->mbmi.txfm_size) {
      case TX_32X32:
        vp9_dequant_idct_add_32x32(xd->qcoeff, xd->block[0].dequant,
                                   xd->dst.y_buffer, xd->dst.y_buffer,
                                   xd->dst.y_stride, xd->dst.y_stride,
                                   xd->eobs[0]);
        vp9_dequant_idct_add_uv_block_16x16_c(xd->qcoeff + 1024,
                                              xd->block[16].dequant,
                                              xd->dst.u_buffer,
                                              xd->dst.v_buffer,
                                              xd->dst.uv_stride, xd);
        break;
682
      case TX_16X16:
683 684
        for (n = 0; n < 4; n++) {
          const int x_idx = n & 1, y_idx = n >> 1;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
685
          const int y_offset = y_idx * 16 * xd->dst.y_stride + x_idx * 16;
686 687 688 689 690
          const TX_TYPE tx_type = get_tx_type_16x16(xd,
                                                    (y_idx * 8 + x_idx) * 4);
          if (tx_type == DCT_DCT) {
            vp9_dequant_idct_add_16x16(
                xd->qcoeff + n * 256, xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
691 692
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
693 694 695 696
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 16]);
          } else {
            vp9_ht_dequant_idct_add_16x16_c(tx_type, xd->qcoeff + n * 256,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
697 698
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
699 700
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 16]);
          }
701 702 703 704 705 706 707
        }
        vp9_dequant_idct_add_uv_block_16x16_c(xd->qcoeff + 1024,
                                              xd->block[16].dequant,
                                              xd->dst.u_buffer,
                                              xd->dst.v_buffer,
                                              xd->dst.uv_stride, xd);
        break;
708
      case TX_8X8:
709 710
        for (n = 0; n < 16; n++) {
          const int x_idx = n & 3, y_idx = n >> 2;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
711
          const int y_offset = y_idx * 8 * xd->dst.y_stride + x_idx * 8;
712 713 714 715
          const TX_TYPE tx_type = get_tx_type_8x8(xd, (y_idx * 8 + x_idx) * 2);
          if (tx_type == DCT_DCT) {
            vp9_dequant_idct_add_8x8_c(xd->qcoeff + n * 64,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
716 717
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
718 719 720 721
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 4]);
          } else {
            vp9_ht_dequant_idct_add_8x8_c(tx_type, xd->qcoeff + n * 64,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
722 723
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
724 725
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n * 4]);
          }
726 727 728
        }
        for (n = 0; n < 4; n++) {
          const int x_idx = n & 1, y_idx = n >> 1;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
729
          const int uv_offset = y_idx * 8 * xd->dst.uv_stride + x_idx * 8;
730 731
          vp9_dequant_idct_add_8x8_c(xd->qcoeff + n * 64 + 1024,
              xd->block[16].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
732 733
              xd->dst.u_buffer + uv_offset,
              xd->dst.u_buffer + uv_offset,
734 735 736
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[64 + n * 4]);
          vp9_dequant_idct_add_8x8_c(xd->qcoeff + n * 64 + 1280,
              xd->block[20].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
737 738
              xd->dst.v_buffer + uv_offset,
              xd->dst.v_buffer + uv_offset,
739 740 741
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[80 + n * 4]);
        }
        break;
742
      case TX_4X4:
743 744
        for (n = 0; n < 64; n++) {
          const int x_idx = n & 7, y_idx = n >> 3;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
745 746
          const int y_offset = y_idx * 4 * xd->dst.y_stride + x_idx * 4;

747 748 749
          const TX_TYPE tx_type = get_tx_type_4x4(xd, y_idx * 8 + x_idx);
          if (tx_type == DCT_DCT) {
            xd->itxm_add(xd->qcoeff + n * 16, xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
750 751
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
752 753 754 755
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n]);
          } else {
            vp9_ht_dequant_idct_add_c(tx_type, xd->qcoeff + n * 16,
                xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
756 757
                xd->dst.y_buffer + y_offset,
                xd->dst.y_buffer + y_offset,
758 759
                xd->dst.y_stride, xd->dst.y_stride, xd->eobs[n]);
          }
760
        }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
761

762 763
        for (n = 0; n < 16; n++) {
          const int x_idx = n & 3, y_idx = n >> 2;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
764
          const int uv_offset = y_idx * 4 * xd->dst.uv_stride + x_idx * 4;
765 766
          xd->itxm_add(xd->qcoeff + 1024 + n * 16,
              xd->block[16].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
767 768
              xd->dst.u_buffer + uv_offset,
              xd->dst.u_buffer + uv_offset,
769 770 771
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[64 + n]);
          xd->itxm_add(xd->qcoeff + 1280 + n * 16,
              xd->block[20].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
772 773
              xd->dst.v_buffer + uv_offset,
              xd->dst.v_buffer + uv_offset,
774 775 776 777
              xd->dst.uv_stride, xd->dst.uv_stride, xd->eobs[80 + n]);
        }
        break;
      default: assert(0);
778
    }
779
  }
780 781
}

782
static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
783
                              int mb_row, unsigned int mb_col,
John Koleszar's avatar
John Koleszar committed
784
                              BOOL_DECODER* const bc) {
John Koleszar's avatar
John Koleszar committed
785 786
  int eobtotal = 0;
  MB_PREDICTION_MODE mode;
Deb Mukherjee's avatar
Deb Mukherjee committed
787
  int tx_size;
788

Ronald S. Bultje's avatar
Ronald S. Bultje committed
789
  assert(!xd->mode_info_context->mbmi.sb_type);
John Koleszar's avatar
John Koleszar committed
790

Jingning Han's avatar
Jingning Han committed
791 792 793 794
  // re-initialize macroblock dequantizer before detokenization
  if (xd->segmentation_enabled)
    mb_init_dequantizer(pbi, xd);

Deb Mukherjee's avatar
Deb Mukherjee committed
795
  tx_size = xd->mode_info_context->mbmi.txfm_size;
Deb Mukherjee's avatar
Deb Mukherjee committed
796 797
  mode = xd->mode_info_context->mbmi.mode;

John Koleszar's avatar
John Koleszar committed
798
  if (xd->mode_info_context->mbmi.mb_skip_coeff) {
799
    vp9_reset_mb_tokens_context(xd);
800
  } else if (!bool_error(bc)) {
801 802
    if (mode != B_PRED) {
      eobtotal = vp9_decode_mb_tokens(pbi, xd, bc);
Deb Mukherjee's avatar
Deb Mukherjee committed
803
    }
John Koleszar's avatar
John Koleszar committed
804
  }
805

Deb Mukherjee's avatar
Deb Mukherjee committed
806
  //mode = xd->mode_info_context->mbmi.mode;
807
  if (pbi->common.frame_type != KEY_FRAME)
808
    vp9_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter,
809
                             &pbi->common);
Gaute Strokkenes's avatar
Gaute Strokkenes committed
810

Dmitry Kovalev's avatar
Dmitry Kovalev committed
811 812 813 814 815
  if (eobtotal == 0 &&
      mode != B_PRED &&
      mode != SPLITMV &&
      mode != I8X8_PRED &&
      !bool_error(bc)) {
John Koleszar's avatar
John Koleszar committed
816
    /* Special case:  Force the loopfilter to skip when eobtotal and
Dmitry Kovalev's avatar
Dmitry Kovalev committed
817
       mb_skip_coeff are zero. */
John Koleszar's avatar
John Koleszar committed
818
    xd->mode_info_context->mbmi.mb_skip_coeff = 1;
819
    skip_recon_mb(pbi, xd, mb_row, mb_col);
820
    return;
John Koleszar's avatar
John Koleszar committed
821
  }
822 823 824 825
#ifdef DEC_DEBUG
  if (dec_debug)
    printf("Decoding mb:  %d %d\n", xd->mode_info_context->mbmi.mode, tx_size);
#endif
Yaowu Xu's avatar
Yaowu Xu committed
826

Jingning Han's avatar
Jingning Han committed
827 828 829
  // moved to be performed before detokenization
//  if (xd->segmentation_enabled)
//    mb_init_dequantizer(pbi, xd);
830

John Koleszar's avatar
John Koleszar committed
831 832 833
  /* do prediction */
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
    if (mode != I8X8_PRED) {
834
      vp9_build_intra_predictors_mbuv(xd);
John Koleszar's avatar
John Koleszar committed
835
      if (mode != B_PRED) {
836
        vp9_build_intra_predictors_mby(xd);
John Koleszar's avatar
John Koleszar committed
837
      }
John Koleszar's avatar
John Koleszar committed
838
    }
John Koleszar's avatar
John Koleszar committed
839
  } else {
840 841 842 843 844 845
#ifdef DEC_DEBUG
  if (dec_debug)
    printf("Decoding mb:  %d %d interp %d\n",
           xd->mode_info_context->mbmi.mode, tx_size,
           xd->mode_info_context->mbmi.interp_filter);
#endif
846
    vp9_build_inter_predictors_mb(xd, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
847 848
  }

849 850 851 852 853 854 855 856 857 858 859 860
  if (tx_size == TX_16X16) {
    decode_16x16(pbi, xd, bc);
  } else if (tx_size == TX_8X8) {
    decode_8x8(pbi