vp9_decodframe.c 54.9 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 <assert.h>
#include <stdio.h>
John Koleszar's avatar
John Koleszar committed
13

14
#include "vp9/decoder/vp9_onyxd_int.h"
Ronald S. Bultje's avatar
Ronald S. Bultje committed
15
#include "vp9/common/vp9_common.h"
16 17 18
#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
19
#include "vp9/common/vp9_entropy.h"
20
#include "vp9/decoder/vp9_decodframe.h"
21
#include "vp9/decoder/vp9_detokenize.h"
22 23 24 25
#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
26
#include "vpx_scale/vpx_scale.h"
27
#include "vp9/common/vp9_setupintrarecon.h"
Scott LaVarnway's avatar
Scott LaVarnway committed
28

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

35
#include "vp9/common/vp9_seg_common.h"
36
#include "vp9/common/vp9_tile_common.h"
37
#include "vp9_rtcd.h"
38

39
// #define DEC_DEBUG
40 41 42 43
#ifdef DEC_DEBUG
int dec_debug = 0;
#endif

44 45 46 47 48 49 50 51 52
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
53 54
static int read_is_valid(const uint8_t *start, size_t len,
                         const uint8_t *end) {
55 56 57
  return start + len > start && start + len <= end;
}

58 59 60 61 62 63 64 65 66 67 68 69 70 71
static void setup_txfm_mode(VP9_COMMON *pc, int lossless, vp9_reader *r) {
  if (lossless) {
    pc->txfm_mode = ONLY_4X4;
  } else {
    pc->txfm_mode = vp9_read_literal(r, 2);
    if (pc->txfm_mode == ALLOW_32X32)
      pc->txfm_mode += vp9_read_bit(r);

    if (pc->txfm_mode == TX_MODE_SELECT) {
      pc->prob_tx[0] = vp9_read_prob(r);
      pc->prob_tx[1] = vp9_read_prob(r);
      pc->prob_tx[2] = vp9_read_prob(r);
    }
  }
72 73
}

74 75 76 77 78 79 80 81 82 83 84 85 86
static int get_unsigned_bits(unsigned int num_values) {
  int cat = 0;
  if (num_values <= 1)
    return 0;
  num_values--;
  while (num_values > 0) {
    cat++;
    num_values >>= 1;
  }
  return cat;
}

static int inv_recenter_nonneg(int v, int m) {
87
  if (v > 2 * m)
88
    return v;
89 90

  return v % 2 ? m - (v + 1) / 2 : m + v / 2;
91 92
}

93
static int decode_uniform(vp9_reader *r, int n) {
94 95 96 97 98 99
  int v;
  const int l = get_unsigned_bits(n);
  const int m = (1 << l) - n;
  if (!l)
    return 0;

100 101
  v = vp9_read_literal(r, l - 1);
  return v < m ?  v : (v << 1) - m + vp9_read_bit(r);
102 103
}

104
static int decode_term_subexp(vp9_reader *r, int k, int num_syms) {
105 106 107 108 109
  int i = 0, mk = 0, word;
  while (1) {
    const int b = i ? k + i - 1 : k;
    const int a = 1 << b;
    if (num_syms <= mk + 3 * a) {
110
      word = decode_uniform(r, num_syms - mk) + mk;
111 112
      break;
    } else {
113
      if (vp9_read_bit(r)) {
114 115 116
        i++;
        mk += a;
      } else {
117
        word = vp9_read_literal(r, b) + mk;
118 119 120 121 122 123 124
        break;
      }
    }
  }
  return word;
}

125
static int decode_unsigned_max(vp9_reader *r, int max) {
126 127 128
  int data = 0, bit = 0, lmax = max;

  while (lmax) {
129
    data |= vp9_read_bit(r) << bit++;
130 131 132 133 134
    lmax >>= 1;
  }
  return data > max ? max : data;
}

John Koleszar's avatar
John Koleszar committed
135 136
static int merge_index(int v, int n, int modulus) {
  int max1 = (n - 1 - modulus / 2) / modulus + 1;
137 138 139
  if (v < max1) {
    v = v * modulus + modulus / 2;
  } else {
John Koleszar's avatar
John Koleszar committed
140 141 142 143 144 145 146 147
    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;
148 149
}

John Koleszar's avatar
John Koleszar committed
150 151
static int inv_remap_prob(int v, int m) {
  const int n = 256;
152

153
  v = merge_index(v, n - 1, MODULUS_PARAM);
John Koleszar's avatar
John Koleszar committed
154
  if ((m << 1) <= n) {
155
    return inv_recenter_nonneg(v + 1, m);
John Koleszar's avatar
John Koleszar committed
156
  } else {
157
    return n - 1 - inv_recenter_nonneg(v + 1, n - 1 - m);
John Koleszar's avatar
John Koleszar committed
158
  }
159
}
160

161 162
static vp9_prob read_prob_diff_update(vp9_reader *r, int oldp) {
  int delp = decode_term_subexp(r, SUBEXP_PARAM, 255);
163
  return (vp9_prob)inv_remap_prob(delp, oldp);
164
}
165

166
void vp9_init_de_quantizer(VP9D_COMP *pbi) {
John Koleszar's avatar
John Koleszar committed
167
  int i;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
168
  int q;
169
  VP9_COMMON *const pc = &pbi->common;
John Koleszar's avatar
John Koleszar committed
170

Dmitry Kovalev's avatar
Dmitry Kovalev committed
171
  for (q = 0; q < QINDEX_RANGE; q++) {
172
    // DC value
173 174
    pc->y_dequant[q][0] = (int16_t)vp9_dc_quant(q, pc->y_dc_delta_q);
    pc->uv_dequant[q][0] = (int16_t)vp9_dc_uv_quant(q, pc->uv_dc_delta_q);
John Koleszar's avatar
John Koleszar committed
175

176
    // AC values
John Koleszar's avatar
John Koleszar committed
177
    for (i = 1; i < 16; i++) {
178
      const int rc = vp9_default_zig_zag1d_4x4[i];
John Koleszar's avatar
John Koleszar committed
179

Dmitry Kovalev's avatar
Dmitry Kovalev committed
180
      pc->y_dequant[q][rc] = (int16_t)vp9_ac_yquant(q);
181
      pc->uv_dequant[q][rc] = (int16_t)vp9_ac_uv_quant(q, pc->uv_ac_delta_q);
John Koleszar's avatar
John Koleszar committed
182
    }
John Koleszar's avatar
John Koleszar committed
183
  }
John Koleszar's avatar
John Koleszar committed
184 185
}

Dmitry Kovalev's avatar
Dmitry Kovalev committed
186 187 188
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)) {
189 190 191 192
    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
193 194 195 196 197
  } else {
    return base_qindex;
  }
}

198
static void mb_init_dequantizer(VP9_COMMON *pc, MACROBLOCKD *xd) {
John Koleszar's avatar
John Koleszar committed
199
  int i;
200 201
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
  xd->q_index = get_qindex(xd, segment_id, pc->base_qindex);
John Koleszar's avatar
John Koleszar committed
202

203
  xd->plane[0].dequant = pc->y_dequant[xd->q_index];
204
  for (i = 1; i < MAX_MB_PLANE; i++)
205
    xd->plane[i].dequant = pc->uv_dequant[xd->q_index];
John Koleszar's avatar
John Koleszar committed
206 207
}

208
static void decode_16x16(MACROBLOCKD *xd) {
209
  const TX_TYPE tx_type = get_tx_type_16x16(xd, 0);
210

211 212
  vp9_iht_add_16x16_c(tx_type, xd->plane[0].qcoeff, xd->plane[0].dst.buf,
                      xd->plane[0].dst.stride, xd->plane[0].eobs[0]);
213

214 215
  vp9_idct_add_8x8(xd->plane[1].qcoeff, xd->plane[1].dst.buf,
                   xd->plane[1].dst.stride, xd->plane[1].eobs[0]);
216

217 218
  vp9_idct_add_8x8(xd->plane[2].qcoeff, xd->plane[2].dst.buf,
                   xd->plane[1].dst.stride, xd->plane[2].eobs[0]);
219 220
}

221
static void decode_8x8(MACROBLOCKD *xd) {
222 223
  const MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
  // luma
224
  // if the first one is DCT_DCT assume all the rest are as well
225
  TX_TYPE tx_type = get_tx_type_8x8(xd, 0);
226
  if (tx_type != DCT_DCT || mode == I8X8_PRED) {
227 228 229 230
    int i;
    for (i = 0; i < 4; i++) {
      int ib = vp9_i8x8_block[i];
      int idx = (ib & 0x02) ? (ib + 2) : ib;
231
      int16_t *q  = BLOCK_OFFSET(xd->plane[0].qcoeff, idx, 16);
232 233 234 235
      uint8_t* const dst =
          raster_block_offset_uint8(xd, BLOCK_SIZE_MB16X16, 0, ib,
                                    xd->plane[0].dst.buf,
                                    xd->plane[0].dst.stride);
236
      int stride = xd->plane[0].dst.stride;
237
      if (mode == I8X8_PRED) {
Scott LaVarnway's avatar
Scott LaVarnway committed
238
        int i8x8mode = xd->mode_info_context->bmi[ib].as_mode.first;
239
        vp9_intra8x8_predict(xd, ib, i8x8mode, dst, stride);
240
      }
241
      tx_type = get_tx_type_8x8(xd, ib);
242
      vp9_iht_add_8x8_c(tx_type, q, dst, stride, xd->plane[0].eobs[idx]);
243
    }
244
  } else {
245 246
    vp9_idct_add_y_block_8x8(xd->plane[0].qcoeff, xd->plane[0].dst.buf,
                             xd->plane[0].dst.stride, xd);
247 248
  }

249 250
  // chroma
  if (mode == I8X8_PRED) {
251 252 253
    int i;
    for (i = 0; i < 4; i++) {
      int ib = vp9_i8x8_block[i];
Scott LaVarnway's avatar
Scott LaVarnway committed
254
      int i8x8mode = xd->mode_info_context->bmi[ib].as_mode.first;
255
      uint8_t* dst;
256

257 258 259 260 261
      dst = raster_block_offset_uint8(xd, BLOCK_SIZE_MB16X16, 1, i,
                                      xd->plane[1].dst.buf,
                                      xd->plane[1].dst.stride);
      vp9_intra_uv4x4_predict(xd, 16 + i, i8x8mode,
                              dst, xd->plane[1].dst.stride);
262
      xd->itxm_add(BLOCK_OFFSET(xd->plane[1].qcoeff, i, 16),
263
                   dst, xd->plane[1].dst.stride,
John Koleszar's avatar
John Koleszar committed
264
                   xd->plane[1].eobs[i]);
265

266 267 268 269 270
      dst = raster_block_offset_uint8(xd, BLOCK_SIZE_MB16X16, 2, i,
                                      xd->plane[2].dst.buf,
                                      xd->plane[1].dst.stride);
      vp9_intra_uv4x4_predict(xd, 20 + i, i8x8mode,
                              dst, xd->plane[1].dst.stride);
271
      xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, i, 16),
272
                   dst, xd->plane[1].dst.stride,
John Koleszar's avatar
John Koleszar committed
273
                   xd->plane[2].eobs[i]);
274
    }
275
  } else if (mode == SPLITMV) {
276 277 278 279
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->plane[1].dst.buf,
        xd->plane[1].dst.stride, xd->plane[1].eobs);
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->plane[2].dst.buf,
        xd->plane[1].dst.stride, xd->plane[2].eobs);
280
  } else {
281 282
    vp9_idct_add_8x8(xd->plane[1].qcoeff, xd->plane[1].dst.buf,
                     xd->plane[1].dst.stride, xd->plane[1].eobs[0]);
283

284 285
    vp9_idct_add_8x8(xd->plane[2].qcoeff, xd->plane[2].dst.buf,
                     xd->plane[1].dst.stride, xd->plane[2].eobs[0]);
286 287 288
  }
}

289
static INLINE void dequant_add_y(MACROBLOCKD *xd, TX_TYPE tx_type, int idx) {
290
  struct macroblockd_plane *const y = &xd->plane[0];
291 292 293
  uint8_t* const dst = raster_block_offset_uint8(xd, BLOCK_SIZE_MB16X16, 0, idx,
                                                 xd->plane[0].dst.buf,
                                                 xd->plane[0].dst.stride);
294
  if (tx_type != DCT_DCT) {
295
    vp9_iht_add_c(tx_type, BLOCK_OFFSET(y->qcoeff, idx, 16),
296
                  dst, xd->plane[0].dst.stride, y->eobs[idx]);
297
  } else {
298 299
    xd->itxm_add(BLOCK_OFFSET(y->qcoeff, idx, 16),
                 dst, xd->plane[0].dst.stride, y->eobs[idx]);
300 301 302 303
  }
}


304
static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, vp9_reader *r) {
305
  TX_TYPE tx_type;
306
  int i = 0;
307
  const MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
308 309 310 311 312
  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;
313
      uint8_t* dst;
Scott LaVarnway's avatar
Scott LaVarnway committed
314
      int i8x8mode = xd->mode_info_context->bmi[ib].as_mode.first;
315 316 317 318 319

      dst = raster_block_offset_uint8(xd, BLOCK_SIZE_MB16X16, 0, ib,
                                      xd->plane[0].dst.buf,
                                      xd->plane[0].dst.stride);
      vp9_intra8x8_predict(xd, ib, i8x8mode, dst, xd->plane[0].dst.stride);
320
      for (j = 0; j < 4; j++) {
321
        tx_type = get_tx_type_4x4(xd, ib + iblock[j]);
322
        dequant_add_y(xd, tx_type, ib + iblock[j]);
323
      }
324 325 326 327 328
      dst = raster_block_offset_uint8(xd, BLOCK_SIZE_MB16X16, 1, i,
                                      xd->plane[1].dst.buf,
                                      xd->plane[1].dst.stride);
      vp9_intra_uv4x4_predict(xd, 16 + i, i8x8mode,
                              dst, xd->plane[1].dst.stride);
329
      xd->itxm_add(BLOCK_OFFSET(xd->plane[1].qcoeff, i, 16),
330
                   dst, xd->plane[1].dst.stride,
John Koleszar's avatar
John Koleszar committed
331
                   xd->plane[1].eobs[i]);
332 333 334 335 336
      dst = raster_block_offset_uint8(xd, BLOCK_SIZE_MB16X16, 2, i,
                                      xd->plane[2].dst.buf,
                                      xd->plane[2].dst.stride);
      vp9_intra_uv4x4_predict(xd, 20 + i, i8x8mode,
                              dst, xd->plane[1].dst.stride);
337
      xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, i, 16),
338
                   dst, xd->plane[1].dst.stride,
John Koleszar's avatar
John Koleszar committed
339
                   xd->plane[2].eobs[i]);
340
    }
Yaowu Xu's avatar
Yaowu Xu committed
341
  } else if (mode == I4X4_PRED) {
342
    for (i = 0; i < 16; i++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
343
      int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
344 345 346 347
      uint8_t* dst;
      dst = raster_block_offset_uint8(xd, BLOCK_SIZE_MB16X16, 0, i,
                                      xd->plane[0].dst.buf,
                                      xd->plane[0].dst.stride);
348
#if CONFIG_NEWBINTRAMODES
Scott LaVarnway's avatar
Scott LaVarnway committed
349
      xd->mode_info_context->bmi[i].as_mode.context =
350
          vp9_find_bpred_context(xd, i, dst, xd->plane[0].dst.stride);
351
      if (!xd->mode_info_context->mbmi.mb_skip_coeff)
352
        vp9_decode_coefs_4x4(pbi, xd, r, PLANE_TYPE_Y_WITH_DC, i);
353
#endif
John Koleszar's avatar
John Koleszar committed
354
      vp9_intra4x4_predict(xd, i, b_mode, dst, xd->plane[0].dst.stride);
355
      tx_type = get_tx_type_4x4(xd, i);
356
      dequant_add_y(xd, tx_type, i);
357
    }
358 359
#if CONFIG_NEWBINTRAMODES
    if (!xd->mode_info_context->mbmi.mb_skip_coeff)
360
      vp9_decode_mb_tokens_4x4_uv(pbi, xd, r);
361
#endif
362
    vp9_build_intra_predictors_sbuv_s(xd, BLOCK_SIZE_MB16X16);
363 364 365 366
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->plane[1].dst.buf,
        xd->plane[1].dst.stride, xd->plane[1].eobs);
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->plane[2].dst.buf,
        xd->plane[1].dst.stride, xd->plane[2].eobs);
367
  } else if (mode == SPLITMV || get_tx_type_4x4(xd, 0) == DCT_DCT) {
368 369 370 371 372 373
    xd->itxm_add_y_block(xd->plane[0].qcoeff, xd->plane[0].dst.buf,
        xd->plane[0].dst.stride, xd);
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->plane[1].dst.buf,
        xd->plane[1].dst.stride, xd->plane[1].eobs);
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->plane[2].dst.buf,
        xd->plane[1].dst.stride, xd->plane[2].eobs);
374
  } else {
375
    for (i = 0; i < 16; i++) {
376
      tx_type = get_tx_type_4x4(xd, i);
377
      dequant_add_y(xd, tx_type, i);
378
    }
379 380 381 382
    xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->plane[1].dst.buf,
                          xd->plane[1].dst.stride, xd->plane[1].eobs);
    xd->itxm_add_uv_block(xd->plane[2].qcoeff, xd->plane[2].dst.buf,
                          xd->plane[1].dst.stride, xd->plane[2].eobs);
383 384 385
  }
}

386
static INLINE void decode_sby_32x32(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
387 388
  const int bwl = b_width_log2(bsize) - 3, bw = 1 << bwl;
  const int bhl = b_height_log2(bsize) - 3, bh = 1 << bhl;
389
  const int y_count = bw * bh;
390 391 392
  int n;

  for (n = 0; n < y_count; n++) {
393 394
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> bwl;
395
    const int y_offset = (y_idx * 32) * mb->plane[0].dst.stride + (x_idx * 32);
396 397 398 399
    vp9_idct_add_32x32(BLOCK_OFFSET(mb->plane[0].qcoeff, n, 1024),
                       mb->plane[0].dst.buf + y_offset,
                       mb->plane[0].dst.stride,
                       mb->plane[0].eobs[n * 64]);
400 401 402 403
  }
}

static INLINE void decode_sbuv_32x32(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
404 405
  const int bwl = b_width_log2(bsize) - 3, bw = (1 << bwl) / 2;
  const int bhl = b_height_log2(bsize) - 3, bh = (1 << bhl) / 2;
406 407 408 409 410
  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);
411 412
     const int uv_offset = (y_idx * 32) * mb->plane[1].dst.stride +
         (x_idx * 32);
413 414 415 416 417 418 419 420
     vp9_idct_add_32x32(BLOCK_OFFSET(mb->plane[1].qcoeff, n, 1024),
                        mb->plane[1].dst.buf + uv_offset,
                        mb->plane[1].dst.stride,
                        mb->plane[1].eobs[n * 64]);
     vp9_idct_add_32x32(BLOCK_OFFSET(mb->plane[2].qcoeff, n, 1024),
                        mb->plane[2].dst.buf + uv_offset,
                        mb->plane[1].dst.stride,
                        mb->plane[2].eobs[n * 64]);
421 422 423 424
  }
}

static INLINE void decode_sby_16x16(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
425 426
  const int bwl = b_width_log2(bsize) - 2, bw = 1 << bwl;
  const int bhl = b_height_log2(bsize) - 2, bh = 1 << bhl;
427 428 429 430 431 432
  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;
433
    const int y_offset = (y_idx * 16) * mb->plane[0].dst.stride + (x_idx * 16);
434
    const TX_TYPE tx_type = get_tx_type_16x16(mb,
435
                                (y_idx * (4 * bw) + x_idx) * 4);
436 437 438
    vp9_iht_add_16x16_c(tx_type, BLOCK_OFFSET(mb->plane[0].qcoeff, n, 256),
                        mb->plane[0].dst.buf + y_offset,
                        mb->plane[0].dst.stride, mb->plane[0].eobs[n * 16]);
439
  }
440 441 442
}

static INLINE void decode_sbuv_16x16(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
443 444
  const int bwl = b_width_log2(bsize) - 2, bw = (1 << bwl) / 2;
  const int bhl = b_height_log2(bsize) - 2, bh = (1 << bhl) / 2;
445 446 447 448
  const int uv_count = bw * bh;
  int n;

  assert(bsize >= BLOCK_SIZE_SB32X32);
449 450

  for (n = 0; n < uv_count; n++) {
451 452
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> (bwl - 1);
453
    const int uv_offset = (y_idx * 16) * mb->plane[1].dst.stride + (x_idx * 16);
454 455 456 457 458 459
    vp9_idct_add_16x16(BLOCK_OFFSET(mb->plane[1].qcoeff, n, 256),
                       mb->plane[1].dst.buf + uv_offset,
                       mb->plane[1].dst.stride, mb->plane[1].eobs[n * 16]);
    vp9_idct_add_16x16(BLOCK_OFFSET(mb->plane[2].qcoeff, n, 256),
                       mb->plane[2].dst.buf + uv_offset,
                       mb->plane[1].dst.stride, mb->plane[2].eobs[n * 16]);
460 461 462
  }
}

463
static INLINE void decode_sby_8x8(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
464 465
  const int bwl = b_width_log2(bsize)  - 1, bw = 1 << bwl;
  const int bhl = b_height_log2(bsize) - 1, bh = 1 << bhl;
466
  const int y_count = bw * bh;
467 468 469 470
  int n;

  // luma
  for (n = 0; n < y_count; n++) {
471 472
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> bwl;
473
    const int y_offset = (y_idx * 8) * xd->plane[0].dst.stride + (x_idx * 8);
474
    const TX_TYPE tx_type = get_tx_type_8x8(xd,
475
                                            (y_idx * (2 * bw) + x_idx) * 2);
476

477 478 479
    vp9_iht_add_8x8_c(tx_type, BLOCK_OFFSET(xd->plane[0].qcoeff, n, 64),
                      xd->plane[0].dst.buf + y_offset, xd->plane[0].dst.stride,
                      xd->plane[0].eobs[n * 4]);
480
  }
481 482 483
}

static INLINE void decode_sbuv_8x8(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
484 485
  const int bwl = b_width_log2(bsize)  - 1, bw = 1 << (bwl - 1);
  const int bhl = b_height_log2(bsize) - 1, bh = 1 << (bhl - 1);
486 487
  const int uv_count = bw * bh;
  int n;
488 489 490

  // chroma
  for (n = 0; n < uv_count; n++) {
491 492
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> (bwl - 1);
493
    const int uv_offset = (y_idx * 8) * xd->plane[1].dst.stride + (x_idx * 8);
494 495 496 497 498 499
    vp9_idct_add_8x8(BLOCK_OFFSET(xd->plane[1].qcoeff, n, 64),
                     xd->plane[1].dst.buf + uv_offset, xd->plane[1].dst.stride,
                     xd->plane[1].eobs[n * 4]);
    vp9_idct_add_8x8(BLOCK_OFFSET(xd->plane[2].qcoeff, n, 64),
                     xd->plane[2].dst.buf + uv_offset, xd->plane[1].dst.stride,
                     xd->plane[2].eobs[n * 4]);
500 501 502
  }
}

503
static INLINE void decode_sby_4x4(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
504 505
  const int bwl = b_width_log2(bsize), bw = 1 << bwl;
  const int bhl = b_height_log2(bsize), bh = 1 << bhl;
506
  const int y_count = bw * bh;
507 508 509
  int n;

  for (n = 0; n < y_count; n++) {
510 511
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> bwl;
512
    const int y_offset = (y_idx * 4) * xd->plane[0].dst.stride + (x_idx * 4);
513
    const TX_TYPE tx_type = get_tx_type_4x4(xd, n);
514
    if (tx_type == DCT_DCT) {
515
      xd->itxm_add(BLOCK_OFFSET(xd->plane[0].qcoeff, n, 16),
516
                   xd->plane[0].dst.buf + y_offset, xd->plane[0].dst.stride,
John Koleszar's avatar
John Koleszar committed
517
                   xd->plane[0].eobs[n]);
518
    } else {
519 520 521
      vp9_iht_add_c(tx_type, BLOCK_OFFSET(xd->plane[0].qcoeff, n, 16),
                    xd->plane[0].dst.buf + y_offset, xd->plane[0].dst.stride,
                    xd->plane[0].eobs[n]);
522 523
    }
  }
524 525 526
}

static INLINE void decode_sbuv_4x4(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
527 528
  const int bwl = b_width_log2(bsize), bw = 1 << (bwl - 1);
  const int bhl = b_height_log2(bsize), bh = 1 << (bhl - 1);
529 530
  const int uv_count = bw * bh;
  int n;
531 532

  for (n = 0; n < uv_count; n++) {
533 534
    const int x_idx = n & (bw - 1);
    const int y_idx = n >> (bwl - 1);
535
    const int uv_offset = (y_idx * 4) * xd->plane[1].dst.stride + (x_idx * 4);
536
    xd->itxm_add(BLOCK_OFFSET(xd->plane[1].qcoeff, n, 16),
537 538
        xd->plane[1].dst.buf + uv_offset, xd->plane[1].dst.stride,
        xd->plane[1].eobs[n]);
539
    xd->itxm_add(BLOCK_OFFSET(xd->plane[2].qcoeff, n, 16),
540 541
        xd->plane[2].dst.buf + uv_offset, xd->plane[1].dst.stride,
        xd->plane[2].eobs[n]);
542 543 544
  }
}

545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
// 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);
}

563
static void decode_sb(VP9D_COMP *pbi, MACROBLOCKD *xd, int mi_row, int mi_col,
564
                      vp9_reader *r, BLOCK_SIZE_TYPE bsize) {
565
  const int bwl = mi_width_log2(bsize), bhl = mi_height_log2(bsize);
566
  const int bw = 1 << bwl, bh = 1 << bhl;
567
  int n, eobtotal;
568
  VP9_COMMON *const pc = &pbi->common;
569 570
  MODE_INFO *const mi = xd->mode_info_context;
  MB_MODE_INFO *const mbmi = &mi->mbmi;
571
  const int mis = pc->mode_info_stride;
572

573
  assert(mbmi->sb_type == bsize);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
574 575

  if (pbi->common.frame_type != KEY_FRAME)
576
    vp9_setup_interp_filters(xd, mbmi->interp_filter, pc);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
577

578
  // generate prediction
579
  if (mbmi->ref_frame == INTRA_FRAME) {
580 581
    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
582
  } else {
583
    vp9_build_inter_predictors_sb(xd, mi_row, mi_col, bsize);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
584 585
  }

586
  if (mbmi->mb_skip_coeff) {
Yunqing Wang's avatar
Yunqing Wang committed
587
    vp9_reset_sb_tokens_context(xd, bsize);
588
  } else {
Yunqing Wang's avatar
Yunqing Wang committed
589 590
    // re-initialize macroblock dequantizer before detokenization
    if (xd->segmentation_enabled)
591
      mb_init_dequantizer(pc, xd);
Yunqing Wang's avatar
Yunqing Wang committed
592 593

    // dequantization and idct
594
    eobtotal = vp9_decode_tokens(pbi, xd, r, bsize);
Yunqing Wang's avatar
Yunqing Wang committed
595 596 597 598
    if (eobtotal == 0) {  // skip loopfilter
      for (n = 0; n < bw * bh; n++) {
        const int x_idx = n & (bw - 1), y_idx = n >> bwl;

599
        if (mi_col + x_idx < pc->mi_cols && mi_row + y_idx < pc->mi_rows)
Yunqing Wang's avatar
Yunqing Wang committed
600 601 602
          mi[y_idx * mis + x_idx].mbmi.mb_skip_coeff = 1;
      }
    } else {
603
      switch (mbmi->txfm_size) {
Yunqing Wang's avatar
Yunqing Wang committed
604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619
        case TX_32X32:
          decode_sb_32x32(xd, bsize);
          break;
        case TX_16X16:
          decode_sb_16x16(xd, bsize);
          break;
        case TX_8X8:
          decode_sby_8x8(xd, bsize);
          decode_sbuv_8x8(xd, bsize);
          break;
        case TX_4X4:
          decode_sby_4x4(xd, bsize);
          decode_sbuv_4x4(xd, bsize);
          break;
        default: assert(0);
      }
620
    }
621
  }
622 623
}

624 625
// TODO(jingning): Need to merge SB and MB decoding. The MB decoding currently
// couples special handles on I8x8, B_PRED, and splitmv modes.
626
static void decode_mb(VP9D_COMP *pbi, MACROBLOCKD *xd,
627
                     int mi_row, int mi_col,
628
                     vp9_reader *r) {
John Koleszar's avatar
John Koleszar committed
629
  int eobtotal = 0;
630 631 632
  MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi;
  const MB_PREDICTION_MODE mode = mbmi->mode;
  const int tx_size = mbmi->txfm_size;
633

634
  assert(mbmi->sb_type == BLOCK_SIZE_MB16X16);
John Koleszar's avatar
John Koleszar committed
635

Deb Mukherjee's avatar
Deb Mukherjee committed
636
  //mode = xd->mode_info_context->mbmi.mode;
637
  if (pbi->common.frame_type != KEY_FRAME)
638
    vp9_setup_interp_filters(xd, mbmi->interp_filter, &pbi->common);
Gaute Strokkenes's avatar
Gaute Strokkenes committed
639

640
  // do prediction
641
  if (mbmi->ref_frame == INTRA_FRAME) {
John Koleszar's avatar
John Koleszar committed
642
    if (mode != I8X8_PRED) {
643
      vp9_build_intra_predictors_sbuv_s(xd, BLOCK_SIZE_MB16X16);
Yaowu Xu's avatar
Yaowu Xu committed
644
      if (mode != I4X4_PRED)
645
        vp9_build_intra_predictors_sby_s(xd, BLOCK_SIZE_MB16X16);
John Koleszar's avatar
John Koleszar committed
646
    }
John Koleszar's avatar
John Koleszar committed
647
  } else {
648
#if 0  // def DEC_DEBUG
649 650 651 652 653
  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
654
    vp9_build_inter_predictors_sb(xd, mi_row, mi_col, BLOCK_SIZE_MB16X16);
John Koleszar's avatar
John Koleszar committed
655 656
  }

657
  if (mbmi->mb_skip_coeff) {
Yunqing Wang's avatar
Yunqing Wang committed
658
    vp9_reset_sb_tokens_context(xd, BLOCK_SIZE_MB16X16);
659
  } else {
Yunqing Wang's avatar
Yunqing Wang committed
660 661
    // re-initialize macroblock dequantizer before detokenization
    if (xd->segmentation_enabled)
662
      mb_init_dequantizer(&pbi->common, xd);
Yunqing Wang's avatar
Yunqing Wang committed
663

664
    if (!vp9_reader_has_error(r)) {
Yunqing Wang's avatar
Yunqing Wang committed
665 666 667
#if CONFIG_NEWBINTRAMODES
    if (mode != I4X4_PRED)
#endif
668
      eobtotal = vp9_decode_tokens(pbi, xd, r, BLOCK_SIZE_MB16X16);
Yunqing Wang's avatar
Yunqing Wang committed
669 670 671 672
    }
  }

  if (eobtotal == 0 &&
673
      mode != I4X4_PRED && mode != I8X8_PRED && mode != SPLITMV &&
674
      !vp9_reader_has_error(r)) {
675
    mbmi->mb_skip_coeff = 1;
Yunqing Wang's avatar
Yunqing Wang committed
676 677 678 679 680 681 682
  } else {
#if 0  // def DEC_DEBUG
  if (dec_debug)
    printf("Decoding mb:  %d %d\n", xd->mode_info_context->mbmi.mode, tx_size);
#endif

    if (tx_size == TX_16X16) {
683
      decode_16x16(xd);
Yunqing Wang's avatar
Yunqing Wang committed
684
    } else if (tx_size == TX_8X8) {
685
      decode_8x8(xd);
Yunqing Wang's avatar
Yunqing Wang committed
686
    } else {
687
      decode_4x4(pbi, xd, r);
Yunqing Wang's avatar
Yunqing Wang committed
688
    }
689
  }
Yunqing Wang's avatar
Yunqing Wang committed
690

691 692 693 694
#ifdef DEC_DEBUG
  if (dec_debug) {
    int i, j;
    printf("\n");
695 696 697 698 699 700 701
    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");
702
    printf("final y\n");
John Koleszar's avatar
John Koleszar committed
703
    for (i = 0; i < 16; i++) {
704
      for (j = 0; j < 16; j++)
705
        printf("%3d ", xd->plane[0].dst.buf[i * xd->plane[0].dst.stride + j]);
706
      printf("\n");
John Koleszar's avatar
John Koleszar committed
707
    }
708 709 710 711
    printf("\n");
    printf("final u\n");
    for (i = 0; i < 8; i++) {
      for (j = 0; j < 8; j++)
712
        printf("%3d ", xd->plane[1].dst.buf[i * xd->plane[1].dst.stride + j]);
713
      printf("\n");
714
    }
715 716 717 718
    printf("\n");
    printf("final v\n");
    for (i = 0; i < 8; i++) {
      for (j = 0; j < 8; j++)
719
        printf("%3d ", xd->plane[2].dst.buf[i * xd->plane[1].dst.stride + j]);
720
      printf("\n");
721
    }
722
    fflush(stdout);
John Koleszar's avatar
John Koleszar committed
723
  }
724
#endif
Yaowu Xu's avatar
Yaowu Xu committed
725
}
John Koleszar's avatar
John Koleszar committed
726

727 728 729 730
static int get_delta_q(vp9_reader *r, int *dq) {
  const int old_value = *dq;

  if (vp9_read_bit(r)) {  // Update bit
731 732
    const int value = vp9_read_literal(r, 4);
    *dq = vp9_read_and_apply_sign(r, value);
John Koleszar's avatar
John Koleszar committed
733
  }
John Koleszar's avatar
John Koleszar committed
734

735
  // Trigger a quantizer update if the delta-q value has changed
736
  return old_value != *dq;
John Koleszar's avatar
John Koleszar committed
737 738
}

739
static void set_offsets(VP9D_COMP *pbi, BLOCK_SIZE_TYPE bsize,
740 741 742
                        int mi_row, int mi_col) {
  const int bh = 1 << mi_height_log2(bsize);
  const int bw = 1 << mi_width_log2(bsize);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
743 744
  VP9_COMMON *const cm = &pbi->common;
  MACROBLOCKD *const xd = &pbi->mb;
745
  int i;
John Koleszar's avatar
John Koleszar committed
746

747
  const int mi_idx = mi_row * cm->mode_info_stride + mi_col;
748
  const YV12_BUFFER_CONFIG *dst_fb = &cm->yv12_fb[cm->new_fb_idx];
749 750 751 752
  const int recon_yoffset =
      (MI_SIZE * mi_row) * dst_fb->y_stride + (MI_SIZE * mi_col);
  const int recon_uvoffset =
      (MI_UV_SIZE * mi_row) * dst_fb->uv_stride + (MI_UV_SIZE * mi_col);
753

754
  xd->mode_info_context = cm->mi + mi_idx;
755
  xd->mode_info_context->mbmi.sb_type = bsize;
756 757
  xd->prev_mode_info_context = cm->prev_mi + mi_idx;

758 759 760 761 762 763
  for (i = 0; i < MAX_MB_PLANE; i++) {
    xd->plane[i].above_context = cm->above_context[i] +
        (mi_col * 4 >> (xd->plane[i].subsampling_x + CONFIG_SB8X8));
    xd->plane[i].left_context = cm->left_context[i] +
        (((mi_row * 4 >> CONFIG_SB8X8) & 15) >> xd->plane[i].subsampling_y);
  }
764 765
  xd->above_seg_context = cm->above_seg_context + (mi_col >> CONFIG_SB8X8);
  xd->left_seg_context  = cm->left_seg_context + ((mi_row >> CONFIG_SB8X8) & 3);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
766

767 768
  // Distance of Mb to the various image edges. These are specified to 8th pel
  // as they are always compared to values that are in 1/8th pel units
769
  set_mi_row_col(cm, xd, mi_row, bh, mi_col, bw);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
770

771 772 773
  xd->plane[0].dst.buf = dst_fb->y_buffer + recon_yoffset;
  xd->plane[1].dst.buf = dst_fb->u_buffer + recon_uvoffset;
  xd->plane[2].dst.buf = dst_fb->v_buffer + recon_uvoffset;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
774
}
John Koleszar's avatar
John Koleszar committed
775

776
static void set_refs(VP9D_COMP *pbi, int mi_row, int mi_col) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
777 778
  VP9_COMMON *const cm = &pbi->common;
  MACROBLOCKD *const xd = &pbi->mb;
779
  MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi;