vp9_decodframe.c 65.8 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

47
48
49
50
51
52
53
54
55
56
57
58
59
60
static int read_le16(const uint8_t *p) {
  return (p[1] << 8) | p[0];
}

static int read_le32(const uint8_t *p) {
  return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
}

// len == 0 is not allowed
static int read_is_valid(const unsigned char *start, size_t len,
                         const unsigned char *end) {
  return start + len > start && start + len <= end;
}

61
62
63
64
65
66
67
static TXFM_MODE read_txfm_mode(vp9_reader *r) {
  TXFM_MODE mode = vp9_read_literal(r, 2);
  if (mode == ALLOW_32X32)
    mode += vp9_read_bit(r);
  return mode;
}

John Koleszar's avatar
John Koleszar committed
68
69
70
71
72
73
74
75
76
77
78
79
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;
80
81
}

John Koleszar's avatar
John Koleszar committed
82
83
84
static int inv_remap_prob(int v, int m) {
  const int n = 256;
  const int modulus = MODULUS_PARAM;
85

John Koleszar's avatar
John Koleszar committed
86
87
  v = merge_index(v, n - 1, modulus);
  if ((m << 1) <= n) {
88
    return vp9_inv_recenter_nonneg(v + 1, m);
John Koleszar's avatar
John Koleszar committed
89
  } else {
90
    return n - 1 - vp9_inv_recenter_nonneg(v + 1, n - 1 - m);
John Koleszar's avatar
John Koleszar committed
91
  }
92
}
93

94
static vp9_prob read_prob_diff_update(vp9_reader *const bc, int oldp) {
95
  int delp = vp9_decode_term_subexp(bc, SUBEXP_PARAM, 255);
96
  return (vp9_prob)inv_remap_prob(delp, oldp);
97
}
98

99
void vp9_init_de_quantizer(VP9D_COMP *pbi) {
John Koleszar's avatar
John Koleszar committed
100
  int i;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
101
  int q;
102
  VP9_COMMON *const pc = &pbi->common;
John Koleszar's avatar
John Koleszar committed
103

Dmitry Kovalev's avatar
Dmitry Kovalev committed
104
105
106
  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
107
108
109

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

Dmitry Kovalev's avatar
Dmitry Kovalev committed
112
113
      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
114
    }
John Koleszar's avatar
John Koleszar committed
115
  }
John Koleszar's avatar
John Koleszar committed
116
117
}

Dmitry Kovalev's avatar
Dmitry Kovalev committed
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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
132
133
  int i;

Dmitry Kovalev's avatar
Dmitry Kovalev committed
134
  VP9_COMMON *const pc = &pbi->common;
135
136
  const int segment_id = mb->mode_info_context->mbmi.segment_id;
  const int qindex = get_qindex(mb, segment_id, pc->base_qindex);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
137
  mb->q_index = qindex;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
138

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

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

Dmitry Kovalev's avatar
Dmitry Kovalev committed
145
  if (mb->lossless) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
146
    assert(qindex == 0);
Yaowu Xu's avatar
Yaowu Xu committed
147
148
    mb->inv_txm4x4_1      = vp9_short_iwalsh4x4_1;
    mb->inv_txm4x4        = vp9_short_iwalsh4x4;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
149
150
151
152
    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 {
Yaowu Xu's avatar
Yaowu Xu committed
153
154
    mb->inv_txm4x4_1      = vp9_short_idct4x4_1;
    mb->inv_txm4x4        = vp9_short_idct4x4;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
155
156
157
    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
158
  }
John Koleszar's avatar
John Koleszar committed
159
160
}

161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#if CONFIG_CODE_NONZEROCOUNT
static void propagate_nzcs(VP9_COMMON *cm, MACROBLOCKD *xd) {
  MODE_INFO *m = xd->mode_info_context;
  BLOCK_SIZE_TYPE sb_type = m->mbmi.sb_type;
  const int mis = cm->mode_info_stride;
  int n;
  if (sb_type == BLOCK_SIZE_SB64X64) {
    for (n = 0; n < 16; ++n) {
      int i = n >> 2;
      int j = n & 3;
      if (i == 0 && j == 0) continue;
      vpx_memcpy((m + j + mis * i)->mbmi.nzcs, m->mbmi.nzcs,
                 384 * sizeof(m->mbmi.nzcs[0]));
    }
  } else if (sb_type == BLOCK_SIZE_SB32X32) {
    for (n = 0; n < 4; ++n) {
      int i = n >> 1;
      int j = n & 1;
      if (i == 0 && j == 0) continue;
      vpx_memcpy((m + j + mis * i)->mbmi.nzcs, m->mbmi.nzcs,
                 384 * sizeof(m->mbmi.nzcs[0]));
    }
  }
}
#endif

187
188
189
/* 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.
 */
190
191
static void skip_recon_mb(VP9D_COMP *pbi, MACROBLOCKD *xd,
                          int mb_row, int mb_col) {
192
193
  MODE_INFO *m = xd->mode_info_context;
  BLOCK_SIZE_TYPE sb_type = m->mbmi.sb_type;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
194

John Koleszar's avatar
John Koleszar committed
195
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
196
    if (sb_type == BLOCK_SIZE_SB64X64) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
197
198
      vp9_build_intra_predictors_sb64uv_s(xd);
      vp9_build_intra_predictors_sb64y_s(xd);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
199
    } else if (sb_type == BLOCK_SIZE_SB32X32) {
200
201
      vp9_build_intra_predictors_sbuv_s(xd);
      vp9_build_intra_predictors_sby_s(xd);
202
    } else {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
203
204
      vp9_build_intra_predictors_mbuv_s(xd);
      vp9_build_intra_predictors_mby_s(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
205
    }
John Koleszar's avatar
John Koleszar committed
206
  } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
207
    if (sb_type == BLOCK_SIZE_SB64X64) {
208
      vp9_build_inter64x64_predictors_sb(xd, mb_row, mb_col);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
209
    } else if (sb_type == BLOCK_SIZE_SB32X32) {
210
      vp9_build_inter32x32_predictors_sb(xd, mb_row, mb_col);
211
    } else {
212
213
214
215
216
      vp9_build_inter16x16_predictors_mb(xd,
                                         xd->dst.y_buffer,
                                         xd->dst.u_buffer,
                                         xd->dst.v_buffer,
                                         xd->dst.y_stride,
217
218
                                         xd->dst.uv_stride,
                                         mb_row, mb_col);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
219
    }
John Koleszar's avatar
John Koleszar committed
220
  }
221
222
223
224
#if CONFIG_CODE_NONZEROCOUNT
  vpx_memset(m->mbmi.nzcs, 0, 384 * sizeof(m->mbmi.nzcs[0]));
  propagate_nzcs(&pbi->common, xd);
#endif
John Koleszar's avatar
John Koleszar committed
225
226
}

227
228
static void decode_16x16(VP9D_COMP *pbi, MACROBLOCKD *xd,
                         BOOL_DECODER* const bc) {
229
  const TX_TYPE tx_type = get_tx_type_16x16(xd, 0);
230
#if 0  // def DEC_DEBUG
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
  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) {
248
    vp9_ht_dequant_idct_add_16x16_c(tx_type, xd->plane[0].qcoeff,
249
                                    xd->block[0].dequant, xd->predictor,
Scott LaVarnway's avatar
Scott LaVarnway committed
250
                                    xd->dst.y_buffer, 16, xd->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
251
                                    xd->plane[0].eobs[0]);
252
  } else {
253
    vp9_dequant_idct_add_16x16(xd->plane[0].qcoeff, xd->block[0].dequant,
254
                               xd->predictor, xd->dst.y_buffer,
John Koleszar's avatar
John Koleszar committed
255
                               16, xd->dst.y_stride, xd->plane[0].eobs[0]);
256
  }
257
258
259

  vp9_dequant_idct_add_8x8(xd->plane[1].qcoeff, xd->block[16].dequant,
                           xd->predictor + 16 * 16, xd->dst.u_buffer, 8,
John Koleszar's avatar
John Koleszar committed
260
                           xd->dst.uv_stride, xd->plane[1].eobs[0]);
261
262
263

  vp9_dequant_idct_add_8x8(xd->plane[2].qcoeff, xd->block[16].dequant,
                           xd->predictor + 16 * 16 + 64, xd->dst.v_buffer, 8,
John Koleszar's avatar
John Koleszar committed
264
                           xd->dst.uv_stride, xd->plane[2].eobs[0]);
265
266
267
268
269
270
}

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
271
  TX_TYPE tx_type = get_tx_type_8x8(xd, 0);
272
#if 0  // def DEC_DEBUG
273
274
275
276
  if (dec_debug) {
    int i;
    printf("\n");
    printf("qcoeff 8x8\n");
277
    for (i = 0; i < 384; i++) {
278
279
280
281
282
283
284
285
286
287
      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;
288
      int16_t *q  = BLOCK_OFFSET(xd->plane[0].qcoeff, idx, 16);
289
290
291
      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;
292
293
294
295
      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;
296
        vp9_intra8x8_predict(xd, b, i8x8mode, b->predictor);
297
      }
298
      tx_type = get_tx_type_8x8(xd, ib);
299
      if (tx_type != DCT_DCT) {
Scott LaVarnway's avatar
Scott LaVarnway committed
300
        vp9_ht_dequant_idct_add_8x8_c(tx_type, q, dq, pre, dst, 16, stride,
John Koleszar's avatar
John Koleszar committed
301
                                      xd->plane[0].eobs[idx]);
302
303
      } else {
        vp9_dequant_idct_add_8x8_c(q, dq, pre, dst, 16, stride,
John Koleszar's avatar
John Koleszar committed
304
                                   xd->plane[0].eobs[idx]);
305
306
      }
    }
307
  } else {
308
    vp9_dequant_idct_add_y_block_8x8(xd->plane[0].qcoeff,
309
310
311
312
                                     xd->block[0].dequant,
                                     xd->predictor,
                                     xd->dst.y_buffer,
                                     xd->dst.y_stride,
313
                                     xd);
314
315
316
317
318
319
320
321
322
  }

  // 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;
323

324
      b = &xd->block[16 + i];
325
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, b->predictor);
326
327
      xd->itxm_add(BLOCK_OFFSET(xd->plane[1].qcoeff, i, 16),
                   b->dequant, b->predictor,
John Koleszar's avatar
John Koleszar committed
328
329
                   *(b->base_dst) + b->dst, 8, b->dst_stride,
                   xd->plane[1].eobs[i]);
330

331
      b = &xd->block[20 + i];
332
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, b->predictor);
333
334
      xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, i, 16),
                   b->dequant, b->predictor,
John Koleszar's avatar
John Koleszar committed
335
336
                   *(b->base_dst) + b->dst, 8, b->dst_stride,
                   xd->plane[2].eobs[i]);
337
338
    }
  } else if (xd->mode_info_context->mbmi.mode == SPLITMV) {
339
340
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
         xd->predictor + 16 * 16, xd->dst.u_buffer,
John Koleszar's avatar
John Koleszar committed
341
         xd->dst.uv_stride, xd->plane[1].eobs);
342
343
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->block[16].dequant,
         xd->predictor + 16 * 16 + 64, xd->dst.v_buffer,
John Koleszar's avatar
John Koleszar committed
344
         xd->dst.uv_stride, xd->plane[2].eobs);
345
  } else {
346
347
    vp9_dequant_idct_add_8x8(xd->plane[1].qcoeff, xd->block[16].dequant,
                             xd->predictor + 16 * 16, xd->dst.u_buffer, 8,
John Koleszar's avatar
John Koleszar committed
348
                             xd->dst.uv_stride, xd->plane[1].eobs[0]);
349
350
351

    vp9_dequant_idct_add_8x8(xd->plane[2].qcoeff, xd->block[16].dequant,
                             xd->predictor + 16 * 16 + 64, xd->dst.v_buffer, 8,
John Koleszar's avatar
John Koleszar committed
352
                             xd->dst.uv_stride, xd->plane[2].eobs[0]);
353
  }
354
#if 0  // def DEC_DEBUG
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
  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;
370
  int i = 0;
371
  MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
372
373
374
375
376
377
378
379
380
381
382
#if 0  // def 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
383
384
385
386
387
  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
388
389
      BLOCKD *b = &xd->block[ib];
      int i8x8mode = b->bmi.as_mode.first;
390
      vp9_intra8x8_predict(xd, b, i8x8mode, b->predictor);
391
392
      for (j = 0; j < 4; j++) {
        b = &xd->block[ib + iblock[j]];
393
        tx_type = get_tx_type_4x4(xd, ib + iblock[j]);
394
        if (tx_type != DCT_DCT) {
395
396
          vp9_ht_dequant_idct_add_c(tx_type,
              BLOCK_OFFSET(xd->plane[0].qcoeff, ib + iblock[j], 16),
397
398
                                    b->dequant, b->predictor,
                                    *(b->base_dst) + b->dst, 16,
John Koleszar's avatar
John Koleszar committed
399
400
                                    b->dst_stride,
                                    xd->plane[0].eobs[ib + iblock[j]]);
401
        } else {
402
403
          xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, ib + iblock[j], 16),
                       b->dequant, b->predictor,
404
                       *(b->base_dst) + b->dst, 16, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
405
                       xd->plane[0].eobs[ib + iblock[j]]);
406
407
408
        }
      }
      b = &xd->block[16 + i];
409
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, b->predictor);
410
411
      xd->itxm_add(BLOCK_OFFSET(xd->plane[1].qcoeff, i, 16),
                   b->dequant, b->predictor,
John Koleszar's avatar
John Koleszar committed
412
413
                   *(b->base_dst) + b->dst, 8, b->dst_stride,
                   xd->plane[1].eobs[i]);
414
      b = &xd->block[20 + i];
415
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, b->predictor);
416
417
      xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, i, 16),
                   b->dequant, b->predictor,
John Koleszar's avatar
John Koleszar committed
418
419
                   *(b->base_dst) + b->dst, 8, b->dst_stride,
                   xd->plane[2].eobs[i]);
420
421
422
423
    }
  } else if (mode == B_PRED) {
    for (i = 0; i < 16; i++) {
      BLOCKD *b = &xd->block[i];
Dmitry Kovalev's avatar
Dmitry Kovalev committed
424
      int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
425
426
#if CONFIG_NEWBINTRAMODES
      xd->mode_info_context->bmi[i].as_mode.context = b->bmi.as_mode.context =
427
          vp9_find_bpred_context(xd, b);
428
429
      if (!xd->mode_info_context->mbmi.mb_skip_coeff)
        vp9_decode_coefs_4x4(pbi, xd, bc, PLANE_TYPE_Y_WITH_DC, i);
430
#endif
431
      vp9_intra4x4_predict(xd, b, b_mode, b->predictor);
432
      tx_type = get_tx_type_4x4(xd, i);
433
      if (tx_type != DCT_DCT) {
434
435
        vp9_ht_dequant_idct_add_c(tx_type,
                                  BLOCK_OFFSET(xd->plane[0].qcoeff, i, 16),
436
                                  b->dequant, b->predictor,
Scott LaVarnway's avatar
Scott LaVarnway committed
437
                                  *(b->base_dst) + b->dst, 16, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
438
                                  xd->plane[0].eobs[i]);
439
      } else {
440
441
        xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, i, 16),
                     b->dequant, b->predictor,
John Koleszar's avatar
John Koleszar committed
442
443
                     *(b->base_dst) + b->dst, 16, b->dst_stride,
                     xd->plane[0].eobs[i]);
444
445
      }
    }
446
447
448
449
#if CONFIG_NEWBINTRAMODES
    if (!xd->mode_info_context->mbmi.mb_skip_coeff)
      vp9_decode_mb_tokens_4x4_uv(pbi, xd, bc);
#endif
450
    vp9_build_intra_predictors_mbuv(xd);
451
452
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
         xd->predictor + 16 * 16, xd->dst.u_buffer,
John Koleszar's avatar
John Koleszar committed
453
         xd->dst.uv_stride, xd->plane[1].eobs);
454
455
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->block[16].dequant,
         xd->predictor + 16 * 16 + 64, xd->dst.v_buffer,
John Koleszar's avatar
John Koleszar committed
456
         xd->dst.uv_stride, xd->plane[2].eobs);
457
  } else if (mode == SPLITMV || get_tx_type_4x4(xd, 0) == DCT_DCT) {
458
    xd->itxm_add_y_block(xd->plane[0].qcoeff,
459
460
461
462
                          xd->block[0].dequant,
                          xd->predictor,
                          xd->dst.y_buffer,
                          xd->dst.y_stride,
463
                          xd);
464
465
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
         xd->predictor + 16 * 16, xd->dst.u_buffer,
John Koleszar's avatar
John Koleszar committed
466
         xd->dst.uv_stride, xd->plane[1].eobs);
467
468
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->block[16].dequant,
         xd->predictor + 16 * 16 + 64, xd->dst.v_buffer,
John Koleszar's avatar
John Koleszar committed
469
         xd->dst.uv_stride, xd->plane[2].eobs);
470
  } else {
471
#if 0  // def DEC_DEBUG
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
    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
488
489
    for (i = 0; i < 16; i++) {
      BLOCKD *b = &xd->block[i];
490
      tx_type = get_tx_type_4x4(xd, i);
491
      if (tx_type != DCT_DCT) {
492
493
        vp9_ht_dequant_idct_add_c(tx_type,
                                  BLOCK_OFFSET(xd->plane[0].qcoeff, i, 16),
494
495
                                  b->dequant, b->predictor,
                                  *(b->base_dst) + b->dst, 16,
John Koleszar's avatar
John Koleszar committed
496
                                  b->dst_stride, xd->plane[0].eobs[i]);
497
      } else {
498
499
        xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, i, 16),
                     b->dequant, b->predictor,
John Koleszar's avatar
John Koleszar committed
500
501
                     *(b->base_dst) + b->dst, 16, b->dst_stride,
                     xd->plane[0].eobs[i]);
502
503
      }
    }
504
505
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
                          xd->predictor + 16 * 16, xd->dst.u_buffer,
John Koleszar's avatar
John Koleszar committed
506
                          xd->dst.uv_stride, xd->plane[1].eobs);
507
508
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->block[16].dequant,
                          xd->predictor + 16 * 16 + 64, xd->dst.v_buffer,
John Koleszar's avatar
John Koleszar committed
509
                          xd->dst.uv_stride, xd->plane[2].eobs);
510
511
512
  }
}

513
static void decode_sb_16x16(MACROBLOCKD *mb, int y_size) {
514
515
516
517
518
519
520
521
522
  const int y_count = y_size * y_size;
  const int uv_size = y_size / 2;
  const int uv_count = uv_size * uv_size;
  int n;

  for (n = 0; n < y_count; n++) {
    const int x_idx = n % y_size;
    const int y_idx = n / y_size;
    const int y_offset = (y_idx * 16) * mb->dst.y_stride + (x_idx * 16);
523
524
    const TX_TYPE tx_type = get_tx_type_16x16(mb,
                                (y_idx * (4 * y_size) + x_idx) * 4);
525
    if (tx_type == DCT_DCT) {
526
      vp9_dequant_idct_add_16x16(BLOCK_OFFSET(mb->plane[0].qcoeff, n, 256),
527
528
529
530
                                 mb->block[0].dequant ,
                                 mb->dst.y_buffer + y_offset,
                                 mb->dst.y_buffer + y_offset,
                                 mb->dst.y_stride, mb->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
531
                                 mb->plane[0].eobs[n * 16]);
532
533
    } else {
      vp9_ht_dequant_idct_add_16x16_c(tx_type,
534
                                      BLOCK_OFFSET(mb->plane[0].qcoeff, n, 256),
535
536
537
538
                                      mb->block[0].dequant,
                                      mb->dst.y_buffer + y_offset,
                                      mb->dst.y_buffer + y_offset,
                                      mb->dst.y_stride, mb->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
539
                                      mb->plane[0].eobs[n * 16]);
540
541
542
543
544
545
546
    }
  }

  for (n = 0; n < uv_count; n++) {
    const int x_idx = n % uv_size;
    const int y_idx = n / uv_size;
    const int uv_offset = (y_idx * 16) * mb->dst.uv_stride + (x_idx * 16);
547
    vp9_dequant_idct_add_16x16(BLOCK_OFFSET(mb->plane[1].qcoeff, n, 256),
548
549
550
551
                               mb->block[16].dequant,
                               mb->dst.u_buffer + uv_offset,
                               mb->dst.u_buffer + uv_offset,
                               mb->dst.uv_stride, mb->dst.uv_stride,
John Koleszar's avatar
John Koleszar committed
552
                               mb->plane[1].eobs[n * 16]);
553
    vp9_dequant_idct_add_16x16(BLOCK_OFFSET(mb->plane[2].qcoeff, n, 256),
554
555
556
557
                               mb->block[20].dequant,
                               mb->dst.v_buffer + uv_offset,
                               mb->dst.v_buffer + uv_offset,
                               mb->dst.uv_stride, mb->dst.uv_stride,
John Koleszar's avatar
John Koleszar committed
558
                               mb->plane[2].eobs[n * 16]);
559
560
561
  }
}

562
static INLINE void decode_sb_8x8(MACROBLOCKD *xd, int y_size) {
563
564
565
566
567
568
569
570
571
  const int y_count = y_size * y_size;
  const int uv_size = y_size / 2;
  const int uv_count = uv_size * uv_size;
  int n;

  // luma
  for (n = 0; n < y_count; n++) {
    const int x_idx = n % y_size;
    const int y_idx = n / y_size;
572
573
    const int y_offset = (y_idx * 8) * xd->dst.y_stride + (x_idx * 8);
    const TX_TYPE tx_type = get_tx_type_8x8(xd,
574
                                            (y_idx * (2 * y_size) + x_idx) * 2);
575
    if (tx_type == DCT_DCT) {
576
577
578
579
580
      vp9_dequant_idct_add_8x8_c(BLOCK_OFFSET(xd->plane[0].qcoeff, n, 64),
                                 xd->block[0].dequant,
                                 xd->dst.y_buffer + y_offset,
                                 xd->dst.y_buffer + y_offset,
                                 xd->dst.y_stride, xd->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
581
                                 xd->plane[0].eobs[n * 4]);
582
    } else {
583
      vp9_ht_dequant_idct_add_8x8_c(tx_type,
584
585
586
587
588
                                    BLOCK_OFFSET(xd->plane[0].qcoeff, n, 64),
                                    xd->block[0].dequant,
                                    xd->dst.y_buffer + y_offset,
                                    xd->dst.y_buffer + y_offset,
                                    xd->dst.y_stride, xd->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
589
                                    xd->plane[0].eobs[n * 4]);
590
591
592
593
594
595
596
    }
  }

  // chroma
  for (n = 0; n < uv_count; n++) {
    const int x_idx = n % uv_size;
    const int y_idx = n / uv_size;
597
598
599
600
601
602
    const int uv_offset = (y_idx * 8) * xd->dst.uv_stride + (x_idx * 8);
    vp9_dequant_idct_add_8x8_c(BLOCK_OFFSET(xd->plane[1].qcoeff, n, 64),
                               xd->block[16].dequant,
                               xd->dst.u_buffer + uv_offset,
                               xd->dst.u_buffer + uv_offset,
                               xd->dst.uv_stride, xd->dst.uv_stride,
John Koleszar's avatar
John Koleszar committed
603
                               xd->plane[1].eobs[n * 4]);
604
605
606
607
608
    vp9_dequant_idct_add_8x8_c(BLOCK_OFFSET(xd->plane[2].qcoeff, n, 64),
                               xd->block[20].dequant,
                               xd->dst.v_buffer + uv_offset,
                               xd->dst.v_buffer + uv_offset,
                               xd->dst.uv_stride, xd->dst.uv_stride,
John Koleszar's avatar
John Koleszar committed
609
                               xd->plane[2].eobs[n * 4]);
610
611
612
613
  }
}


614
static void decode_sb_4x4(MACROBLOCKD *xd, int y_size) {
615
616
617
618
619
620
621
622
  const int y_count = y_size * y_size;
  const int uv_size = y_size / 2;
  const int uv_count = uv_size * uv_size;
  int n;

  for (n = 0; n < y_count; n++) {
    const int x_idx = n % y_size;
    const int y_idx = n / y_size;
623
624
    const int y_offset = (y_idx * 4) * xd->dst.y_stride + (x_idx * 4);
    const TX_TYPE tx_type = get_tx_type_4x4(xd, y_idx * y_size + x_idx);
625
    if (tx_type == DCT_DCT) {
626
627
628
629
630
      xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, n, 16),
                   xd->block[0].dequant,
                   xd->dst.y_buffer + y_offset,
                   xd->dst.y_buffer + y_offset,
                   xd->dst.y_stride, xd->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
631
                   xd->plane[0].eobs[n]);
632
    } else {
633
      vp9_ht_dequant_idct_add_c(tx_type,
634
635
636
637
638
639
                                BLOCK_OFFSET(xd->plane[0].qcoeff, n, 16),
                                xd->block[0].dequant,
                                xd->dst.y_buffer + y_offset,
                                xd->dst.y_buffer + y_offset,
                                xd->dst.y_stride,
                                xd->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
640
                                xd->plane[0].eobs[n]);
641
642
643
644
645
646
    }
  }

  for (n = 0; n < uv_count; n++) {
    const int x_idx = n % uv_size;
    const int y_idx = n / uv_size;
647
648
649
650
651
    const int uv_offset = (y_idx * 4) * xd->dst.uv_stride + (x_idx * 4);
    xd->itxm_add(BLOCK_OFFSET(xd->plane[1].qcoeff, n, 16),
        xd->block[16].dequant,
        xd->dst.u_buffer + uv_offset,
        xd->dst.u_buffer + uv_offset,
John Koleszar's avatar
John Koleszar committed
652
        xd->dst.uv_stride, xd->dst.uv_stride, xd->plane[1].eobs[n]);
653
654
655
656
    xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, n, 16),
        xd->block[20].dequant,
        xd->dst.v_buffer + uv_offset,
        xd->dst.v_buffer + uv_offset,
John Koleszar's avatar
John Koleszar committed
657
        xd->dst.uv_stride, xd->dst.uv_stride, xd->plane[2].eobs[n]);
658
659
660
  }
}

661
662
static void decode_sb64(VP9D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int mb_col,
                        BOOL_DECODER* const bc) {
663
  int n, eobtotal;
664
  VP9_COMMON *const pc = &pbi->common;
665
  MODE_INFO *mi = xd->mode_info_context;
666
  const int mis = pc->mode_info_stride;
667

668
  assert(mi->mbmi.sb_type == BLOCK_SIZE_SB64X64);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
669
670

  if (pbi->common.frame_type != KEY_FRAME)
671
    vp9_setup_interp_filters(xd, mi->mbmi.interp_filter, pc);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
672
673
674
675
676

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

677
  if (mi->mbmi.mb_skip_coeff) {
678
    vp9_reset_sb64_tokens_context(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
679

680
681
    // Special case:  Force the loopfilter to skip when eobtotal and
    // mb_skip_coeff are zero.
682
    skip_recon_mb(pbi, xd, mb_row, mb_col);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
683
684
685
    return;
  }

686
  // do prediction
Ronald S. Bultje's avatar
Ronald S. Bultje committed
687
688
689
690
  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 {
691
    vp9_build_inter64x64_predictors_sb(xd, mb_row, mb_col);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
692
693
  }

694
  // dequantization and idct
695
696
  eobtotal = vp9_decode_sb64_tokens(pbi, xd, bc);
  if (eobtotal == 0) {  // skip loopfilter
Ronald S. Bultje's avatar
Ronald S. Bultje committed
697
    for (n = 0; n < 16; n++) {
698
      const int x_idx = n & 3, y_idx = n >> 2;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
699

700
701
702
703
704
705
706
707
      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
708
          const int y_offset = x_idx * 32 + y_idx * xd->dst.y_stride * 32;
709
          vp9_dequant_idct_add_32x32(BLOCK_OFFSET(xd->plane[0].qcoeff, n, 1024),
710
              xd->block[0].dequant,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
711
712
              xd->dst.y_buffer + y_offset,
              xd->dst.y_buffer + y_offset,
John Koleszar's avatar
John Koleszar committed
713
              xd->dst.y_stride, xd->dst.y_stride, xd->plane[0].eobs[n * 64]);
714
        }
715
        vp9_dequant_idct_add_32x32(xd->plane[1].qcoeff,
716
            xd->block[16].dequant, xd->dst.u_buffer, xd->dst.u_buffer,
John Koleszar's avatar
John Koleszar committed
717
            xd->dst.uv_stride, xd->dst.uv_stride, xd->plane[1].eobs[0]);
718
        vp9_dequant_idct_add_32x32(xd->plane[2].qcoeff,
719
            xd->block[20].dequant, xd->dst.v_buffer, xd->dst.v_buffer,
John Koleszar's avatar
John Koleszar committed
720
            xd->dst.uv_stride, xd->dst.uv_stride, xd->plane[2].eobs[0]);
721
        break;
722
      case TX_16X16:
723
        decode_sb_16x16(xd, 4);
724
        break;
725
      case TX_8X8:
726
        decode_sb_8x8(xd, 8);
727
        break;
728
      case TX_4X4:
729
        decode_sb_4x4(xd, 16);
730
731
        break;
      default: assert(0);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
732
733
    }
  }
734
735
736
#if CONFIG_CODE_NONZEROCOUNT
  propagate_nzcs(&pbi->common, xd);
#endif
Ronald S. Bultje's avatar
Ronald S. Bultje committed
737
738
}

739
740
static void decode_sb32(VP9D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int mb_col,
                        BOOL_DECODER* const bc) {
741
  int eobtotal;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
742
  VP9_COMMON *const pc = &pbi->common;
743
  MODE_INFO *mi = xd->mode_info_context;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
744
745
  const int mis = pc->mode_info_stride;

746
  assert(mi->mbmi.sb_type == BLOCK_SIZE_SB32X32);
747

748
  if (pbi->common.frame_type != KEY_FRAME)
749
    vp9_setup_interp_filters(xd, mi->mbmi.interp_filter, pc);
750

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

755
  if (mi->mbmi.mb_skip_coeff) {
756
    vp9_reset_sb_tokens_context(xd);
757

758
759
    // Special case:  Force the loopfilter to skip when eobtotal and
    // mb_skip_coeff are zero.
760
    skip_recon_mb(pbi, xd, mb_row, mb_col);
761
762
763
    return;
  }

764
765

  // do prediction
766
  if (mi->mbmi.ref_frame == INTRA_FRAME) {
767
768
769
    vp9_build_intra_predictors_sby_s(xd);
    vp9_build_intra_predictors_sbuv_s(xd);
  } else {
770
    vp9_build_inter32x32_predictors_sb(xd, mb_row, mb_col);
771
772
  }

773
  // dequantization and idct
774
775
  eobtotal = vp9_decode_sb_tokens(pbi, xd, bc);
  if (eobtotal == 0) {  // skip loopfilter
776
    mi->mbmi.mb_skip_coeff = 1;
777
    if (mb_col + 1 < pc->mb_cols)
778
      mi[1].mbmi.mb_skip_coeff = 1;
779
    if (mb_row + 1 < pc->mb_rows) {
780
      mi[mis].mbmi.mb_skip_coeff = 1;
781
      if (mb_col + 1 < pc->mb_cols)
782
        mi[mis + 1].mbmi.mb_skip_coeff = 1;
783
    }
Ronald S. Bultje's avatar
Ronald S. Bultje committed
784
  } else {
785
786
    switch (xd->mode_info_context->mbmi.txfm_size) {
      case TX_32X32:
787
        vp9_dequant_idct_add_32x32(xd->plane[0].qcoeff, xd->block[0].dequant,
788
789
                                   xd->dst.y_buffer, xd->dst.y_buffer,
                                   xd->dst.y_stride, xd->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
790
                                   xd->plane[0].eobs[0]);
791
792
793
        vp9_dequant_idct_add_16x16(xd->plane[1].qcoeff, xd->block[16].dequant,
                                   xd->dst.u_buffer, xd->dst.u_buffer,
                                   xd->dst.uv_stride, xd->dst.uv_stride,
John Koleszar's avatar
John Koleszar committed
794
                                   xd->plane[1].eobs[0]);
795
796
797
        vp9_dequant_idct_add_16x16(xd->plane[2].qcoeff, xd->block[16].dequant,
                                   xd->dst.v_buffer, xd->dst.v_buffer,
                                   xd->dst.uv_stride, xd->dst.uv_stride,
John Koleszar's avatar
John Koleszar committed
798
                                   xd->plane[2].eobs[0]);
799
        break;
800
      case TX_16X16:
801
        decode_sb_16x16(xd, 2);
802
        break;
803
      case TX_8X8:
804
        decode_sb_8x8(xd, 4);
805
        break;
806
      case TX_4X4:
807
        decode_sb_4x4(xd, 8);
808
809
        break;
      default: assert(0);
810
    }
811
  }
812
813
814
#if CONFIG_CODE_NONZEROCOUNT
  propagate_nzcs(&pbi->common, xd);
#endif
815
816
}

817
818
819
static void decode_mb(VP9D_COMP *pbi, MACROBLOCKD *xd,
                     int mb_row, int mb_col,
                     BOOL_DECODER* const bc) {
John Koleszar's avatar
John Koleszar committed
820
  int eobtotal = 0;
821
822
  const MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
  const int tx_size = xd->mode_info_context->mbmi.txfm_size;
823

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

Jingning Han's avatar
Jingning Han committed
826
827
828
829
  // re-initialize macroblock dequantizer before detokenization
  if (xd->segmentation_enabled)
    mb_init_dequantizer(pbi, xd);

John Koleszar's avatar
John Koleszar committed
830
  if (xd->mode_info_context->mbmi.mb_skip_coeff) {
831
    vp9_reset_mb_tokens_context(xd);
832
  } else if (!bool_error(bc)) {
833
834
835
836
#if CONFIG_NEWBINTRAMODES
    if (mode != B_PRED)
#endif
      eobtotal = vp9_decode_mb_tokens(pbi, xd, bc);
John Koleszar's avatar
John Koleszar committed
837
  }
838

Deb Mukherjee's avatar
Deb Mukherjee committed
839
  //mode = xd->mode_info_context->mbmi.mode;
840
  if (pbi->common.frame_type != KEY_FRAME)
841
    vp9_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter,
842
                             &pbi->common);
Gaute Strokkenes's avatar
Gaute Strokkenes committed
843

Dmitry Kovalev's avatar
Dmitry Kovalev committed
844
845
846
847
848
  if (eobtotal == 0 &&
      mode != B_PRED &&
      mode != SPLITMV &&
      mode != I8X8_PRED &&
      !bool_error(bc)) {
849
850
    // Special case:  Force the loopfilter to skip when eobtotal and
    // mb_skip_coeff are zero.
John Koleszar's avatar
John Koleszar committed
851
    xd->mode_info_context->mbmi.mb_skip_coeff = 1;
852
    skip_recon_mb(pbi, xd, mb_row, mb_col);
853
    return;
John Koleszar's avatar
John Koleszar committed
854
  }
855
#if 0  // def DEC_DEBUG
856
857
858
  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
859

Jingning Han's avatar
Jingning Han committed
860
  // moved to be performed before detokenization
861
862
  //  if (xd->segmentation_enabled)
  //    mb_init_dequantizer(pbi, xd);
863

864
  // do prediction
John Koleszar's avatar
John Koleszar committed
865
866
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
    if (mode != I8X8_PRED) {
867
      vp9_build_intra_predictors_mbuv(xd);
868
      if (mode != B_PRED)
869
        vp9_build_intra_predictors_mby(xd);
John Koleszar's avatar
John Koleszar committed
870
    }
John Koleszar's avatar
John Koleszar committed
871
  } else {
872
#if 0  // def DEC_DEBUG
873
874
875
876
877
  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
878
    vp9_build_inter_predictors_mb(xd, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
879
880
  }