vp9_decodframe.c 59.7 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
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
56
57
static int read_is_valid(const uint8_t *start, size_t len,
                         const uint8_t *end) {
58
59
60
  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
  for (q = 0; q < QINDEX_RANGE; q++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
105
106
    pc->y_dequant[q][0] = (int16_t)vp9_dc_quant(q, pc->y1dc_delta_q);
    pc->uv_dequant[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->y_dequant[q][rc] = (int16_t)vp9_ac_yquant(q);
      pc->uv_dequant[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
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)) {
121
122
123
124
    const int data = vp9_get_segdata(mb, segment_id, SEG_LVL_ALT_Q);
    return mb->mb_segment_abs_delta == SEGMENT_ABSDATA ?
               data :  // Abs value
               clamp(base_qindex + data, 0, MAXQ);  // Delta value
Dmitry Kovalev's avatar
Dmitry Kovalev committed
125
126
127
128
129
130
  } else {
    return base_qindex;
  }
}

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

Dmitry Kovalev's avatar
Dmitry Kovalev committed
133
  VP9_COMMON *const pc = &pbi->common;
134
135
  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
136
  mb->q_index = qindex;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
137

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

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

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

186
187
188
static void skip_recon_sb(VP9D_COMP *pbi, MACROBLOCKD *xd,
                          int mb_row, int mb_col,
                          BLOCK_SIZE_TYPE bsize) {
189
  MODE_INFO *m = xd->mode_info_context;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
190

191
  if (m->mbmi.ref_frame == INTRA_FRAME) {
192
193
    vp9_build_intra_predictors_sbuv_s(xd, bsize);
    vp9_build_intra_predictors_sby_s(xd, bsize);
John Koleszar's avatar
John Koleszar committed
194
  } else {
195
    vp9_build_inter_predictors_sb(xd, mb_row, mb_col, bsize);
John Koleszar's avatar
John Koleszar committed
196
  }
197
198
199
200
#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
201
202
}

203
204
static void decode_16x16(VP9D_COMP *pbi, MACROBLOCKD *xd,
                         BOOL_DECODER* const bc) {
205
  const TX_TYPE tx_type = get_tx_type_16x16(xd, 0);
206

207
  if (tx_type != DCT_DCT) {
208
    vp9_dequant_iht_add_16x16_c(tx_type, xd->plane[0].qcoeff,
209
210
                                xd->block[0].dequant, xd->dst.y_buffer,
                                xd->dst.y_stride, xd->plane[0].eobs[0]);
211
  } else {
212
    vp9_dequant_idct_add_16x16(xd->plane[0].qcoeff, xd->block[0].dequant,
213
                               xd->dst.y_buffer, xd->dst.y_stride,
214
                               xd->plane[0].eobs[0]);
215
  }
216
217

  vp9_dequant_idct_add_8x8(xd->plane[1].qcoeff, xd->block[16].dequant,
218
                           xd->dst.u_buffer, xd->dst.uv_stride,
219
                           xd->plane[1].eobs[0]);
220

Dmitry Kovalev's avatar
Dmitry Kovalev committed
221
  vp9_dequant_idct_add_8x8(xd->plane[2].qcoeff, xd->block[20].dequant,
222
                           xd->dst.v_buffer, xd->dst.uv_stride,
223
                           xd->plane[2].eobs[0]);
224
225
226
227
}

static void decode_8x8(VP9D_COMP *pbi, MACROBLOCKD *xd,
                       BOOL_DECODER* const bc) {
228
229
  const MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
  // luma
230
  // if the first one is DCT_DCT assume all the rest are as well
231
  TX_TYPE tx_type = get_tx_type_8x8(xd, 0);
232
  if (tx_type != DCT_DCT || mode == I8X8_PRED) {
233
234
235
236
    int i;
    for (i = 0; i < 4; i++) {
      int ib = vp9_i8x8_block[i];
      int idx = (ib & 0x02) ? (ib + 2) : ib;
237
      int16_t *q  = BLOCK_OFFSET(xd->plane[0].qcoeff, idx, 16);
238
239
      int16_t *dq = xd->block[0].dequant;
      uint8_t *dst = *(xd->block[ib].base_dst) + xd->block[ib].dst;
240
      int stride = xd->dst.y_stride;
241
      if (mode == I8X8_PRED) {
242
        BLOCKD *b = &xd->block[ib];
243
        int i8x8mode = b->bmi.as_mode.first;
244
        vp9_intra8x8_predict(xd, b, i8x8mode, dst, stride);
245
      }
246
      tx_type = get_tx_type_8x8(xd, ib);
247
      if (tx_type != DCT_DCT) {
248
        vp9_dequant_iht_add_8x8_c(tx_type, q, dq, dst, stride,
249
                                  xd->plane[0].eobs[idx]);
250
      } else {
251
        vp9_dequant_idct_add_8x8(q, dq, dst, stride, xd->plane[0].eobs[idx]);
252
253
      }
    }
254
  } else {
255
    vp9_dequant_idct_add_y_block_8x8(xd->plane[0].qcoeff,
256
257
                                     xd->block[0].dequant, xd->dst.y_buffer,
                                     xd->dst.y_stride, xd);
258
259
  }

260
261
  // chroma
  if (mode == I8X8_PRED) {
262
263
264
265
266
    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;
267

268
      b = &xd->block[16 + i];
269
270
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, *(b->base_dst) + b->dst,
                              b->dst_stride);
271
      xd->itxm_add(BLOCK_OFFSET(xd->plane[1].qcoeff, i, 16),
272
                   b->dequant, *(b->base_dst) + b->dst, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
273
                   xd->plane[1].eobs[i]);
274

275
      b = &xd->block[20 + i];
276
277
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, *(b->base_dst) + b->dst,
                              b->dst_stride);
278
      xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, i, 16),
279
                   b->dequant, *(b->base_dst) + b->dst, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
280
                   xd->plane[2].eobs[i]);
281
    }
282
  } else if (mode == SPLITMV) {
283
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
284
         xd->dst.u_buffer, xd->dst.uv_stride, xd->plane[1].eobs);
285
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->block[16].dequant,
286
         xd->dst.v_buffer, xd->dst.uv_stride, xd->plane[2].eobs);
287
  } else {
288
    vp9_dequant_idct_add_8x8(xd->plane[1].qcoeff, xd->block[16].dequant,
289
                             xd->dst.u_buffer, xd->dst.uv_stride,
290
                             xd->plane[1].eobs[0]);
291
292

    vp9_dequant_idct_add_8x8(xd->plane[2].qcoeff, xd->block[16].dequant,
293
                             xd->dst.v_buffer, xd->dst.uv_stride,
294
                             xd->plane[2].eobs[0]);
295
296
297
298
299
300
  }
}

static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd,
                       BOOL_DECODER* const bc) {
  TX_TYPE tx_type;
301
  int i = 0;
302
  const MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
303
304
305
306
307
  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
308
309
      BLOCKD *b = &xd->block[ib];
      int i8x8mode = b->bmi.as_mode.first;
310
311
      vp9_intra8x8_predict(xd, b, i8x8mode, *(b->base_dst) + b->dst,
                           b->dst_stride);
312
313
      for (j = 0; j < 4; j++) {
        b = &xd->block[ib + iblock[j]];
314
        tx_type = get_tx_type_4x4(xd, ib + iblock[j]);
315
        if (tx_type != DCT_DCT) {
316
          vp9_dequant_iht_add_c(tx_type,
317
              BLOCK_OFFSET(xd->plane[0].qcoeff, ib + iblock[j], 16),
318
                                    b->dequant, *(b->base_dst) + b->dst,
John Koleszar's avatar
John Koleszar committed
319
320
                                    b->dst_stride,
                                    xd->plane[0].eobs[ib + iblock[j]]);
321
        } else {
322
          xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, ib + iblock[j], 16),
323
                       b->dequant, *(b->base_dst) + b->dst, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
324
                       xd->plane[0].eobs[ib + iblock[j]]);
325
326
327
        }
      }
      b = &xd->block[16 + i];
328
329
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, *(b->base_dst) + b->dst,
                              b->dst_stride);
330
      xd->itxm_add(BLOCK_OFFSET(xd->plane[1].qcoeff, i, 16),
331
                   b->dequant, *(b->base_dst) + b->dst, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
332
                   xd->plane[1].eobs[i]);
333
      b = &xd->block[20 + i];
334
335
      vp9_intra_uv4x4_predict(xd, b, i8x8mode, *(b->base_dst) + b->dst,
                              b->dst_stride);
336
      xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, i, 16),
337
                   b->dequant, *(b->base_dst) + b->dst, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
338
                   xd->plane[2].eobs[i]);
339
    }
Yaowu Xu's avatar
Yaowu Xu committed
340
  } else if (mode == I4X4_PRED) {
341
342
    for (i = 0; i < 16; i++) {
      BLOCKD *b = &xd->block[i];
Dmitry Kovalev's avatar
Dmitry Kovalev committed
343
      int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
344
345
#if CONFIG_NEWBINTRAMODES
      xd->mode_info_context->bmi[i].as_mode.context = b->bmi.as_mode.context =
346
          vp9_find_bpred_context(xd, b);
347
348
      if (!xd->mode_info_context->mbmi.mb_skip_coeff)
        vp9_decode_coefs_4x4(pbi, xd, bc, PLANE_TYPE_Y_WITH_DC, i);
349
#endif
350
351
      vp9_intra4x4_predict(xd, b, b_mode, *(b->base_dst) + b->dst,
                           b->dst_stride);
352
      tx_type = get_tx_type_4x4(xd, i);
353
      if (tx_type != DCT_DCT) {
354
355
        vp9_dequant_iht_add_c(tx_type,
                              BLOCK_OFFSET(xd->plane[0].qcoeff, i, 16),
356
357
                              b->dequant, *(b->base_dst) + b->dst,
                              b->dst_stride, xd->plane[0].eobs[i]);
358
      } else {
359
        xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, i, 16),
360
                     b->dequant, *(b->base_dst) + b->dst, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
361
                     xd->plane[0].eobs[i]);
362
363
      }
    }
364
365
366
367
#if CONFIG_NEWBINTRAMODES
    if (!xd->mode_info_context->mbmi.mb_skip_coeff)
      vp9_decode_mb_tokens_4x4_uv(pbi, xd, bc);
#endif
368
    vp9_build_intra_predictors_sbuv_s(xd, BLOCK_SIZE_MB16X16);
369
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
370
         xd->dst.u_buffer, xd->dst.uv_stride, xd->plane[1].eobs);
371
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->block[16].dequant,
372
         xd->dst.v_buffer, xd->dst.uv_stride, xd->plane[2].eobs);
373
  } else if (mode == SPLITMV || get_tx_type_4x4(xd, 0) == DCT_DCT) {
374
    xd->itxm_add_y_block(xd->plane[0].qcoeff,
375
                          xd->block[0].dequant,
376
                          xd->dst.y_buffer, xd->dst.y_stride, xd);
377
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
378
         xd->dst.u_buffer, xd->dst.uv_stride, xd->plane[1].eobs);
379
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->block[16].dequant,
380
         xd->dst.v_buffer, xd->dst.uv_stride, xd->plane[2].eobs);
381
  } else {
382
383
    for (i = 0; i < 16; i++) {
      BLOCKD *b = &xd->block[i];
384
      tx_type = get_tx_type_4x4(xd, i);
385
      if (tx_type != DCT_DCT) {
386
387
        vp9_dequant_iht_add_c(tx_type,
                              BLOCK_OFFSET(xd->plane[0].qcoeff, i, 16),
388
                              b->dequant, *(b->base_dst) + b->dst,
389
                              b->dst_stride, xd->plane[0].eobs[i]);
390
      } else {
391
        xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, i, 16),
392
                     b->dequant, *(b->base_dst) + b->dst, b->dst_stride,
John Koleszar's avatar
John Koleszar committed
393
                     xd->plane[0].eobs[i]);
394
395
      }
    }
396
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
397
398
                          xd->dst.u_buffer, xd->dst.uv_stride,
                          xd->plane[1].eobs);
399
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->block[16].dequant,
400
401
                          xd->dst.v_buffer, xd->dst.uv_stride,
                          xd->plane[2].eobs);
402
403
404
  }
}

405
406
407
408
static INLINE void decode_sby_32x32(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize) - 1, bw = 1 << bwl;
  const int bhl = mb_height_log2(bsize) - 1, bh = 1 << bhl;
  const int y_count = bw * bh;
409
410
411
  int n;

  for (n = 0; n < y_count; n++) {
412
413
414
415
416
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> bwl;
    const int y_offset = (y_idx * 32) * mb->dst.y_stride + (x_idx * 32);
    vp9_dequant_idct_add_32x32(BLOCK_OFFSET(mb->plane[0].qcoeff, n, 1024),
                               mb->block[0].dequant ,
417
                               mb->dst.y_buffer + y_offset, mb->dst.y_stride,
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
                               mb->plane[0].eobs[n * 64]);
  }
}

static INLINE void decode_sbuv_32x32(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize) - 1, bw = (1 << bwl) / 2;
  const int bhl = mb_height_log2(bsize) - 1, bh = (1 << bhl) / 2;
  const int uv_count = bw * bh;
  int n;
  for (n = 0; n < uv_count; n++) {
     const int x_idx = n & (bw - 1);
     const int y_idx = n >> (bwl - 1);
     const int uv_offset = (y_idx * 32) * mb->dst.uv_stride + (x_idx * 32);
     vp9_dequant_idct_add_32x32(BLOCK_OFFSET(mb->plane[1].qcoeff, n, 1024),
                                mb->block[16].dequant,
                                mb->dst.u_buffer + uv_offset,
434
                                mb->dst.uv_stride, mb->plane[1].eobs[n * 64]);
435
436
437
     vp9_dequant_idct_add_32x32(BLOCK_OFFSET(mb->plane[2].qcoeff, n, 1024),
                                mb->block[20].dequant,
                                mb->dst.v_buffer + uv_offset,
438
                                mb->dst.uv_stride, mb->plane[2].eobs[n * 64]);
439
440
441
442
443
444
445
446
447
448
449
450
  }
}

static INLINE void decode_sby_16x16(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize), bw = 1 << bwl;
  const int bhl = mb_height_log2(bsize), bh = 1 << bhl;
  const int y_count = bw * bh;
  int n;

  for (n = 0; n < y_count; n++) {
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> bwl;
451
    const int y_offset = (y_idx * 16) * mb->dst.y_stride + (x_idx * 16);
452
    const TX_TYPE tx_type = get_tx_type_16x16(mb,
453
                                (y_idx * (4 * bw) + x_idx) * 4);
454
    if (tx_type == DCT_DCT) {
455
      vp9_dequant_idct_add_16x16(BLOCK_OFFSET(mb->plane[0].qcoeff, n, 256),
456
                                 mb->block[0].dequant ,
457
                                 mb->dst.y_buffer + y_offset, mb->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
458
                                 mb->plane[0].eobs[n * 16]);
459
    } else {
460
461
462
463
      vp9_dequant_iht_add_16x16_c(tx_type,
                                  BLOCK_OFFSET(mb->plane[0].qcoeff, n, 256),
                                  mb->block[0].dequant,
                                  mb->dst.y_buffer + y_offset,
464
                                  mb->dst.y_stride,
465
                                  mb->plane[0].eobs[n * 16]);
466
467
    }
  }
468
469
470
471
472
473
474
475
476
}

static INLINE void decode_sbuv_16x16(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize), bw = (1 << bwl) / 2;
  const int bhl = mb_height_log2(bsize), bh = (1 << bhl) / 2;
  const int uv_count = bw * bh;
  int n;

  assert(bsize >= BLOCK_SIZE_SB32X32);
477
478

  for (n = 0; n < uv_count; n++) {
479
480
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> (bwl - 1);
481
    const int uv_offset = (y_idx * 16) * mb->dst.uv_stride + (x_idx * 16);
482
    vp9_dequant_idct_add_16x16(BLOCK_OFFSET(mb->plane[1].qcoeff, n, 256),
483
                               mb->block[16].dequant,
484
                               mb->dst.u_buffer + uv_offset, mb->dst.uv_stride,
John Koleszar's avatar
John Koleszar committed
485
                               mb->plane[1].eobs[n * 16]);
486
    vp9_dequant_idct_add_16x16(BLOCK_OFFSET(mb->plane[2].qcoeff, n, 256),
487
                               mb->block[20].dequant,
488
                               mb->dst.v_buffer + uv_offset, mb->dst.uv_stride,
John Koleszar's avatar
John Koleszar committed
489
                               mb->plane[2].eobs[n * 16]);
490
491
492
  }
}

493
494
495
496
static INLINE void decode_sby_8x8(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize)  + 1, bw = 1 << bwl;
  const int bhl = mb_height_log2(bsize) + 1, bh = 1 << bhl;
  const int y_count = bw * bh;
497
498
499
500
  int n;

  // luma
  for (n = 0; n < y_count; n++) {
501
502
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> bwl;
503
504
    const int y_offset = (y_idx * 8) * xd->dst.y_stride + (x_idx * 8);
    const TX_TYPE tx_type = get_tx_type_8x8(xd,
505
                                            (y_idx * (2 * bw) + x_idx) * 2);
506
    if (tx_type == DCT_DCT) {
507
508
509
510
      vp9_dequant_idct_add_8x8(BLOCK_OFFSET(xd->plane[0].qcoeff, n, 64),
                               xd->block[0].dequant,
                               xd->dst.y_buffer + y_offset,
                               xd->dst.y_stride, xd->plane[0].eobs[n * 4]);
511
    } else {
512
513
514
      vp9_dequant_iht_add_8x8_c(tx_type,
                                BLOCK_OFFSET(xd->plane[0].qcoeff, n, 64),
                                xd->block[0].dequant,
515
                                xd->dst.y_buffer + y_offset, xd->dst.y_stride,
516
                                xd->plane[0].eobs[n * 4]);
517
518
    }
  }
519
520
521
522
523
524
525
}

static INLINE void decode_sbuv_8x8(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize)  + 1, bw = 1 << (bwl - 1);
  const int bhl = mb_height_log2(bsize) + 1, bh = 1 << (bhl - 1);
  const int uv_count = bw * bh;
  int n;
526
527
528

  // chroma
  for (n = 0; n < uv_count; n++) {
529
530
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> (bwl - 1);
531
    const int uv_offset = (y_idx * 8) * xd->dst.uv_stride + (x_idx * 8);
532
533
534
535
536
537
538
539
    vp9_dequant_idct_add_8x8(BLOCK_OFFSET(xd->plane[1].qcoeff, n, 64),
                             xd->block[16].dequant,
                             xd->dst.u_buffer + uv_offset, xd->dst.uv_stride,
                             xd->plane[1].eobs[n * 4]);
    vp9_dequant_idct_add_8x8(BLOCK_OFFSET(xd->plane[2].qcoeff, n, 64),
                             xd->block[20].dequant,
                             xd->dst.v_buffer + uv_offset, xd->dst.uv_stride,
                             xd->plane[2].eobs[n * 4]);
540
541
542
  }
}

543
544
545
546
static INLINE void decode_sby_4x4(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize)  + 2, bw = 1 << bwl;
  const int bhl = mb_height_log2(bsize) + 2, bh = 1 << bhl;
  const int y_count = bw * bh;
547
548
549
  int n;

  for (n = 0; n < y_count; n++) {
550
551
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> bwl;
552
    const int y_offset = (y_idx * 4) * xd->dst.y_stride + (x_idx * 4);
553
    const TX_TYPE tx_type = get_tx_type_4x4(xd, n);
554
    if (tx_type == DCT_DCT) {
555
556
      xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, n, 16),
                   xd->block[0].dequant,
557
                   xd->dst.y_buffer + y_offset, xd->dst.y_stride,
John Koleszar's avatar
John Koleszar committed
558
                   xd->plane[0].eobs[n]);
559
    } else {
560
561
      vp9_dequant_iht_add_c(tx_type,
                            BLOCK_OFFSET(xd->plane[0].qcoeff, n, 16),
562
563
                            xd->block[0].dequant, xd->dst.y_buffer + y_offset,
                            xd->dst.y_stride, xd->plane[0].eobs[n]);
564
565
    }
  }
566
567
568
569
570
571
572
}

static INLINE void decode_sbuv_4x4(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize)  + 2, bw = 1 << (bwl - 1);
  const int bhl = mb_height_log2(bsize) + 2, bh = 1 << (bhl - 1);
  const int uv_count = bw * bh;
  int n;
573
574

  for (n = 0; n < uv_count; n++) {
575
576
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> (bwl - 1);
577
578
579
    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,
580
        xd->dst.u_buffer + uv_offset, xd->dst.uv_stride, xd->plane[1].eobs[n]);
581
582
    xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, n, 16),
        xd->block[20].dequant,
583
        xd->dst.v_buffer + uv_offset, xd->dst.uv_stride, xd->plane[2].eobs[n]);
584
585
586
  }
}

587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
// TODO(jingning): combine luma and chroma dequantization and inverse
// transform into a single function looping over planes.
static void decode_sb_32x32(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
  decode_sby_32x32(mb, bsize);
  if (bsize == BLOCK_SIZE_SB64X64)
    decode_sbuv_32x32(mb, bsize);
  else
    decode_sbuv_16x16(mb, bsize);
}

static void decode_sb_16x16(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
  decode_sby_16x16(mb, bsize);
  if (bsize >= BLOCK_SIZE_SB32X32)
    decode_sbuv_16x16(mb, bsize);
  else
    decode_sbuv_8x8(mb, bsize);
}

static void decode_sb(VP9D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int mb_col,
                      BOOL_DECODER* const bc, BLOCK_SIZE_TYPE bsize) {
  const int bwl = mb_width_log2(bsize), bhl = mb_height_log2(bsize);
  const int bw = 1 << bwl, bh = 1 << bhl;
609
  int n, eobtotal;
610
  VP9_COMMON *const pc = &pbi->common;
611
  MODE_INFO *mi = xd->mode_info_context;
612
  const int mis = pc->mode_info_stride;
613

614
  assert(mi->mbmi.sb_type == bsize);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
615
616

  if (pbi->common.frame_type != KEY_FRAME)
617
    vp9_setup_interp_filters(xd, mi->mbmi.interp_filter, pc);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
618
619
620
621
622

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

623
  if (mi->mbmi.mb_skip_coeff) {
624
    vp9_reset_sb_tokens_context(xd, bsize);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
625

626
627
    // Special case:  Force the loopfilter to skip when eobtotal and
    // mb_skip_coeff are zero.
628
    skip_recon_sb(pbi, xd, mb_row, mb_col, bsize);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
629
630
631
    return;
  }

632
  // generate prediction
633
634
635
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
    vp9_build_intra_predictors_sby_s(xd, bsize);
    vp9_build_intra_predictors_sbuv_s(xd, bsize);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
636
  } else {
637
    vp9_build_inter_predictors_sb(xd, mb_row, mb_col, bsize);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
638
639
  }

640
  // dequantization and idct
641
  eobtotal = vp9_decode_tokens(pbi, xd, bc, bsize);
642
  if (eobtotal == 0) {  // skip loopfilter
643
644
    for (n = 0; n < bw * bh; n++) {
      const int x_idx = n & (bw - 1), y_idx = n >> bwl;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
645

646
647
648
649
650
651
      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:
652
        decode_sb_32x32(xd, bsize);
653
        break;
654
      case TX_16X16:
655
        decode_sb_16x16(xd, bsize);
656
        break;
657
      case TX_8X8:
658
659
        decode_sby_8x8(xd, bsize);
        decode_sbuv_8x8(xd, bsize);
660
        break;
661
      case TX_4X4:
662
663
        decode_sby_4x4(xd, bsize);
        decode_sbuv_4x4(xd, bsize);
664
665
        break;
      default: assert(0);
666
    }
667
  }
668
669
670
#if CONFIG_CODE_NONZEROCOUNT
  propagate_nzcs(&pbi->common, xd);
#endif
671
672
}

673
674
// TODO(jingning): Need to merge SB and MB decoding. The MB decoding currently
// couples special handles on I8x8, B_PRED, and splitmv modes.
675
676
677
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
678
  int eobtotal = 0;
679
680
  const MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
  const int tx_size = xd->mode_info_context->mbmi.txfm_size;
681

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

Jingning Han's avatar
Jingning Han committed
684
685
686
687
  // re-initialize macroblock dequantizer before detokenization
  if (xd->segmentation_enabled)
    mb_init_dequantizer(pbi, xd);

John Koleszar's avatar
John Koleszar committed
688
  if (xd->mode_info_context->mbmi.mb_skip_coeff) {
689
    vp9_reset_sb_tokens_context(xd, BLOCK_SIZE_MB16X16);
690
  } else if (!bool_error(bc)) {
691
#if CONFIG_NEWBINTRAMODES
Yaowu Xu's avatar
Yaowu Xu committed
692
    if (mode != I4X4_PRED)
693
#endif
694
      eobtotal = vp9_decode_tokens(pbi, xd, bc, BLOCK_SIZE_MB16X16);
John Koleszar's avatar
John Koleszar committed
695
  }
696

Deb Mukherjee's avatar
Deb Mukherjee committed
697
  //mode = xd->mode_info_context->mbmi.mode;
698
  if (pbi->common.frame_type != KEY_FRAME)
699
    vp9_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter,
700
                             &pbi->common);
Gaute Strokkenes's avatar
Gaute Strokkenes committed
701

Dmitry Kovalev's avatar
Dmitry Kovalev committed
702
  if (eobtotal == 0 &&
Yaowu Xu's avatar
Yaowu Xu committed
703
      mode != I4X4_PRED &&
Dmitry Kovalev's avatar
Dmitry Kovalev committed
704
705
706
      mode != SPLITMV &&
      mode != I8X8_PRED &&
      !bool_error(bc)) {
707
708
    // Special case:  Force the loopfilter to skip when eobtotal and
    // mb_skip_coeff are zero.
John Koleszar's avatar
John Koleszar committed
709
    xd->mode_info_context->mbmi.mb_skip_coeff = 1;
710
    skip_recon_sb(pbi, xd, mb_row, mb_col, BLOCK_SIZE_MB16X16);
711
    return;
John Koleszar's avatar
John Koleszar committed
712
  }
713
#if 0  // def DEC_DEBUG
714
715
716
  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
717

Jingning Han's avatar
Jingning Han committed
718
  // moved to be performed before detokenization
719
720
  //  if (xd->segmentation_enabled)
  //    mb_init_dequantizer(pbi, xd);
721

722
  // do prediction
John Koleszar's avatar
John Koleszar committed
723
724
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
    if (mode != I8X8_PRED) {
725
      vp9_build_intra_predictors_sbuv_s(xd, BLOCK_SIZE_MB16X16);
Yaowu Xu's avatar
Yaowu Xu committed
726
      if (mode != I4X4_PRED)
727
        vp9_build_intra_predictors_sby_s(xd, BLOCK_SIZE_MB16X16);
John Koleszar's avatar
John Koleszar committed
728
    }
John Koleszar's avatar
John Koleszar committed
729
  } else {
730
#if 0  // def DEC_DEBUG
731
732
733
734
735
  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
736
    vp9_build_inter_predictors_mb_s(xd, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
737
738
  }

739
740
741
742
743
744
745
746
747
748
749
  if (tx_size == TX_16X16) {
    decode_16x16(pbi, xd, bc);
  } else if (tx_size == TX_8X8) {
    decode_8x8(pbi, xd, bc);
  } else {
    decode_4x4(pbi, xd, bc);
  }
#ifdef DEC_DEBUG
  if (dec_debug) {
    int i, j;
    printf("\n");
750
751
752
753
754
755
756
    printf("predictor y\n");
    for (i = 0; i < 16; i++) {
      for (j = 0; j < 16; j++)
        printf("%3d ", xd->predictor[i * 16 + j]);
      printf("\n");
    }
    printf("\n");
757
    printf("final y\n");
John Koleszar's avatar
John Koleszar committed
758
    for (i = 0; i < 16; i++) {
759
760
761
      for (j = 0; j < 16; j++)
        printf("%3d ", xd->dst.y_buffer[i * xd->dst.y_stride + j]);
      printf("\n");
John Koleszar's avatar
John Koleszar committed
762
    }
763
764
765
766
767
768
    printf("\n");
    printf("final u\n");
    for (i = 0; i < 8; i++) {
      for (j = 0; j < 8; j++)
        printf("%3d ", xd->dst.u_buffer[i * xd->dst.uv_stride + j]);
      printf("\n");
769
    }
770
771
772
773
774
775
    printf("\n");
    printf("final v\n");
    for (i = 0; i < 8; i++) {
      for (j = 0; j < 8; j++)
        printf("%3d ", xd->dst.v_buffer[i * xd->dst.uv_stride + j]);
      printf("\n");
776
    }
777
    fflush(stdout);
John Koleszar's avatar
John Koleszar committed
778
  }
779
#endif
Yaowu Xu's avatar
Yaowu Xu committed
780
}
John Koleszar's avatar
John Koleszar committed
781

782
783
784
785
static int get_delta_q(vp9_reader *r, int *dq) {
  const int old_value = *dq;

  if (vp9_read_bit(r)) {  // Update bit
786
787
    const int value = vp9_read_literal(r, 4);
    *dq = vp9_read_and_apply_sign(r, value);
John Koleszar's avatar
John Koleszar committed
788
  }
John Koleszar's avatar
John Koleszar committed
789

790
  // Trigger a quantizer update if the delta-q value has changed
791
  return old_value != *dq;
John Koleszar's avatar
John Koleszar committed
792
793
794
795
796
797
798
}

#ifdef PACKET_TESTING
#include <stdio.h>
FILE *vpxlog = 0;
#endif

799
static void set_offsets(VP9D_COMP *pbi, BLOCK_SIZE_TYPE bsize,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
800
                        int mb_row, int mb_col) {