decodframe.c 44.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 "onyxd_int.h"
13 14 15 16
#include "vp9/common/header.h"
#include "vp9/common/reconintra.h"
#include "vp9/common/reconintra4x4.h"
#include "vp9/common/reconinter.h"
17
#include "vp9/decoder/decodframe.h"
John Koleszar's avatar
John Koleszar committed
18
#include "detokenize.h"
19 20 21 22
#include "vp9/common/invtrans.h"
#include "vp9/common/alloccommon.h"
#include "vp9/common/entropymode.h"
#include "vp9/common/quant_common.h"
23
#include "vpx_scale/vpxscale.h"
24
#include "vp9/common/setupintrarecon.h"
Scott LaVarnway's avatar
Scott LaVarnway committed
25

John Koleszar's avatar
John Koleszar committed
26
#include "decodemv.h"
27 28
#include "vp9/common/extend.h"
#include "vp9/common/modecont.h"
John Koleszar's avatar
John Koleszar committed
29
#include "vpx_mem/vpx_mem.h"
30
#include "vp9/common/idct.h"
John Koleszar's avatar
John Koleszar committed
31 32
#include "dboolhuff.h"

33 34
#include "vp9/common/seg_common.h"
#include "vp9/common/entropy.h"
35
#include "vpx_rtcd.h"
36

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

40

41 42
#define COEFCOUNT_TESTING

John Koleszar's avatar
John Koleszar committed
43 44 45 46 47 48 49 50 51 52 53 54
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;
55 56
}

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

70
static vp9_prob read_prob_diff_update(vp9_reader *const bc, int oldp) {
71
  int delp = vp9_decode_term_subexp(bc, SUBEXP_PARAM, 255);
72
  return (vp9_prob)inv_remap_prob(delp, oldp);
73
}
74

75
void vp9_init_de_quantizer(VP9D_COMP *pbi) {
John Koleszar's avatar
John Koleszar committed
76 77
  int i;
  int Q;
78
  VP9_COMMON *const pc = &pbi->common;
John Koleszar's avatar
John Koleszar committed
79 80

  for (Q = 0; Q < QINDEX_RANGE; Q++) {
81 82 83
    pc->Y1dequant[Q][0] = (short)vp9_dc_quant(Q, pc->y1dc_delta_q);
    pc->Y2dequant[Q][0] = (short)vp9_dc2quant(Q, pc->y2dc_delta_q);
    pc->UVdequant[Q][0] = (short)vp9_dc_uv_quant(Q, pc->uvdc_delta_q);
John Koleszar's avatar
John Koleszar committed
84 85 86

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

89 90 91
      pc->Y1dequant[Q][rc] = (short)vp9_ac_yquant(Q);
      pc->Y2dequant[Q][rc] = (short)vp9_ac2quant(Q, pc->y2ac_delta_q);
      pc->UVdequant[Q][rc] = (short)vp9_ac_uv_quant(Q, pc->uvac_delta_q);
John Koleszar's avatar
John Koleszar committed
92
    }
John Koleszar's avatar
John Koleszar committed
93
  }
John Koleszar's avatar
John Koleszar committed
94 95
}

96
static void mb_init_dequantizer(VP9D_COMP *pbi, MACROBLOCKD *xd) {
John Koleszar's avatar
John Koleszar committed
97 98
  int i;
  int QIndex;
99
  VP9_COMMON *const pc = &pbi->common;
John Koleszar's avatar
John Koleszar committed
100 101 102
  int segment_id = xd->mode_info_context->mbmi.segment_id;

  // Set the Q baseline allowing for any segment level adjustment
103
  if (vp9_segfeature_active(xd, segment_id, SEG_LVL_ALT_Q)) {
John Koleszar's avatar
John Koleszar committed
104 105
    /* Abs Value */
    if (xd->mb_segment_abs_delta == SEGMENT_ABSDATA)
106
      QIndex = vp9_get_segdata(xd, segment_id, SEG_LVL_ALT_Q);
John Koleszar's avatar
John Koleszar committed
107 108 109 110

    /* Delta Value */
    else {
      QIndex = pc->base_qindex +
111
               vp9_get_segdata(xd, segment_id, SEG_LVL_ALT_Q);
John Koleszar's avatar
John Koleszar committed
112
      QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;    /* Clamp to valid range */
John Koleszar's avatar
John Koleszar committed
113
    }
John Koleszar's avatar
John Koleszar committed
114 115
  } else
    QIndex = pc->base_qindex;
Deb Mukherjee's avatar
Deb Mukherjee committed
116
  xd->q_index = QIndex;
John Koleszar's avatar
John Koleszar committed
117

John Koleszar's avatar
John Koleszar committed
118 119 120 121
  /* Set up the block level dequant pointers */
  for (i = 0; i < 16; i++) {
    xd->block[i].dequant = pc->Y1dequant[QIndex];
  }
John Koleszar's avatar
John Koleszar committed
122

Hui Su's avatar
Hui Su committed
123
#if CONFIG_LOSSLESS
John Koleszar's avatar
John Koleszar committed
124
  if (!QIndex) {
125 126 127 128 129
    pbi->common.rtcd.idct.idct1        = vp9_short_inv_walsh4x4_1_x8_c;
    pbi->common.rtcd.idct.idct16       = vp9_short_inv_walsh4x4_x8_c;
    pbi->common.rtcd.idct.idct1_scalar_add  = vp9_dc_only_inv_walsh_add_c;
    pbi->common.rtcd.idct.iwalsh1      = vp9_short_inv_walsh4x4_1_lossless_c;
    pbi->common.rtcd.idct.iwalsh16     = vp9_short_inv_walsh4x4_lossless_c;
130 131 132 133 134
    pbi->idct_add            = vp9_dequant_idct_add_lossless_c;
    pbi->dc_idct_add         = vp9_dequant_dc_idct_add_lossless_c;
    pbi->dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block_lossless_c;
    pbi->idct_add_y_block    = vp9_dequant_idct_add_y_block_lossless_c;
    pbi->idct_add_uv_block   = vp9_dequant_idct_add_uv_block_lossless_c;
John Koleszar's avatar
John Koleszar committed
135
  } else {
136 137 138 139 140
    pbi->common.rtcd.idct.idct1        = vp9_short_idct4x4llm_1_c;
    pbi->common.rtcd.idct.idct16       = vp9_short_idct4x4llm_c;
    pbi->common.rtcd.idct.idct1_scalar_add  = vp9_dc_only_idct_add_c;
    pbi->common.rtcd.idct.iwalsh1      = vp9_short_inv_walsh4x4_1_c;
    pbi->common.rtcd.idct.iwalsh16     = vp9_short_inv_walsh4x4_c;
141 142 143 144 145
    pbi->idct_add            = vp9_dequant_idct_add;
    pbi->dc_idct_add         = vp9_dequant_dc_idct_add;
    pbi->dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block;
    pbi->idct_add_y_block    = vp9_dequant_idct_add_y_block;
    pbi->idct_add_uv_block   = vp9_dequant_idct_add_uv_block;
John Koleszar's avatar
John Koleszar committed
146
  }
Scott LaVarnway's avatar
Scott LaVarnway committed
147
#else
148 149 150 151 152
  pbi->idct_add            = vp9_dequant_idct_add;
  pbi->dc_idct_add         = vp9_dequant_dc_idct_add;
  pbi->dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block;
  pbi->idct_add_y_block    = vp9_dequant_idct_add_y_block;
  pbi->idct_add_uv_block   = vp9_dequant_idct_add_uv_block;
Hui Su's avatar
Hui Su committed
153 154
#endif

John Koleszar's avatar
John Koleszar committed
155 156 157
  for (i = 16; i < 24; i++) {
    xd->block[i].dequant = pc->UVdequant[QIndex];
  }
John Koleszar's avatar
John Koleszar committed
158

John Koleszar's avatar
John Koleszar committed
159
  xd->block[24].dequant = pc->Y2dequant[QIndex];
John Koleszar's avatar
John Koleszar committed
160 161 162 163 164 165 166 167 168

}

#if CONFIG_RUNTIME_CPU_DETECT
#define RTCD_VTABLE(x) (&(pbi)->common.rtcd.x)
#else
#define RTCD_VTABLE(x) NULL
#endif

169 170 171
/* 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.
 */
172
static void skip_recon_mb(VP9D_COMP *pbi, MACROBLOCKD *xd) {
John Koleszar's avatar
John Koleszar committed
173
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
174 175
#if CONFIG_SUPERBLOCKS
    if (xd->mode_info_context->mbmi.encoded_as_sb) {
176 177
      vp9_build_intra_predictors_sbuv_s(xd);
      vp9_build_intra_predictors_sby_s(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
178 179
    } else {
#endif
180 181
    vp9_build_intra_predictors_mbuv_s(xd);
    vp9_build_intra_predictors_mby_s(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
182 183 184
#if CONFIG_SUPERBLOCKS
    }
#endif
John Koleszar's avatar
John Koleszar committed
185
  } else {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
186 187
#if CONFIG_SUPERBLOCKS
    if (xd->mode_info_context->mbmi.encoded_as_sb) {
188
      vp9_build_inter32x32_predictors_sb(xd, xd->dst.y_buffer,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
189 190 191 192
                                         xd->dst.u_buffer, xd->dst.v_buffer,
                                         xd->dst.y_stride, xd->dst.uv_stride);
    } else {
#endif
193
    vp9_build_1st_inter16x16_predictors_mb(xd, xd->dst.y_buffer,
194 195
                                           xd->dst.u_buffer, xd->dst.v_buffer,
                                           xd->dst.y_stride, xd->dst.uv_stride);
John Koleszar's avatar
John Koleszar committed
196 197

    if (xd->mode_info_context->mbmi.second_ref_frame) {
198
      vp9_build_2nd_inter16x16_predictors_mb(xd, xd->dst.y_buffer,
John Koleszar's avatar
John Koleszar committed
199 200
                                             xd->dst.u_buffer, xd->dst.v_buffer,
                                             xd->dst.y_stride, xd->dst.uv_stride);
201
    }
Ronald S. Bultje's avatar
Ronald S. Bultje committed
202 203 204
#if CONFIG_SUPERBLOCKS
    }
#endif
John Koleszar's avatar
John Koleszar committed
205
  }
John Koleszar's avatar
John Koleszar committed
206 207
}

208
static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
209
                              int mb_row, unsigned int mb_col,
John Koleszar's avatar
John Koleszar committed
210
                              BOOL_DECODER* const bc) {
John Koleszar's avatar
John Koleszar committed
211 212 213
  int eobtotal = 0;
  MB_PREDICTION_MODE mode;
  int i;
Deb Mukherjee's avatar
Deb Mukherjee committed
214 215
  int tx_size;
  TX_TYPE tx_type;
216
  VP9_COMMON *pc = &pbi->common;
217
#if CONFIG_SUPERBLOCKS
Ronald S. Bultje's avatar
Ronald S. Bultje committed
218 219
  int orig_skip_flag = xd->mode_info_context->mbmi.mb_skip_coeff;
#endif
John Koleszar's avatar
John Koleszar committed
220

Jingning Han's avatar
Jingning Han committed
221 222 223 224
  // re-initialize macroblock dequantizer before detokenization
  if (xd->segmentation_enabled)
    mb_init_dequantizer(pbi, xd);

Deb Mukherjee's avatar
Deb Mukherjee committed
225
  tx_size = xd->mode_info_context->mbmi.txfm_size;
Deb Mukherjee's avatar
Deb Mukherjee committed
226 227
  mode = xd->mode_info_context->mbmi.mode;

John Koleszar's avatar
John Koleszar committed
228
  if (xd->mode_info_context->mbmi.mb_skip_coeff) {
229
    vp9_reset_mb_tokens_context(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
230
#if CONFIG_SUPERBLOCKS
Ronald S. Bultje's avatar
Ronald S. Bultje committed
231 232 233 234 235 236
    if (xd->mode_info_context->mbmi.encoded_as_sb &&
        (mb_col < pc->mb_cols - 1 || mb_row < pc->mb_rows - 1)) {
      if (mb_col < pc->mb_cols - 1)
        xd->above_context++;
      if (mb_row < pc->mb_rows - 1)
        xd->left_context++;
237
      vp9_reset_mb_tokens_context(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
238 239 240 241
      if (mb_col < pc->mb_cols - 1)
        xd->above_context--;
      if (mb_row < pc->mb_rows - 1)
        xd->left_context--;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
242 243
    }
#endif
244
  } else if (!bool_error(bc)) {
John Koleszar's avatar
John Koleszar committed
245 246 247
    for (i = 0; i < 25; i++) {
      xd->block[i].eob = 0;
      xd->eobs[i] = 0;
248
    }
Deb Mukherjee's avatar
Deb Mukherjee committed
249
    if (tx_size == TX_16X16) {
250
      eobtotal = vp9_decode_mb_tokens_16x16(pbi, xd, bc);
Deb Mukherjee's avatar
Deb Mukherjee committed
251
    } else if (tx_size == TX_8X8) {
252
      eobtotal = vp9_decode_mb_tokens_8x8(pbi, xd, bc);
Deb Mukherjee's avatar
Deb Mukherjee committed
253
    } else {
254
      eobtotal = vp9_decode_mb_tokens(pbi, xd, bc);
Deb Mukherjee's avatar
Deb Mukherjee committed
255
    }
John Koleszar's avatar
John Koleszar committed
256
  }
257

Deb Mukherjee's avatar
Deb Mukherjee committed
258
  //mode = xd->mode_info_context->mbmi.mode;
259
  if (pbi->common.frame_type != KEY_FRAME)
260
    vp9_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter,
261
                             &pbi->common);
Gaute Strokkenes's avatar
Gaute Strokkenes committed
262

John Koleszar's avatar
John Koleszar committed
263 264
  if (eobtotal == 0 && mode != B_PRED && mode != SPLITMV
      && mode != I8X8_PRED
265
      && !bool_error(bc)) {
John Koleszar's avatar
John Koleszar committed
266 267 268 269
    /* Special case:  Force the loopfilter to skip when eobtotal and
     * mb_skip_coeff are zero.
     * */
    xd->mode_info_context->mbmi.mb_skip_coeff = 1;
Scott LaVarnway's avatar
Scott LaVarnway committed
270

Ronald S. Bultje's avatar
Ronald S. Bultje committed
271 272 273 274 275 276 277
#if CONFIG_SUPERBLOCKS
    if (!xd->mode_info_context->mbmi.encoded_as_sb || orig_skip_flag)
#endif
    {
      skip_recon_mb(pbi, xd);
      return;
    }
John Koleszar's avatar
John Koleszar committed
278
  }
Yaowu Xu's avatar
Yaowu Xu committed
279

Jingning Han's avatar
Jingning Han committed
280 281 282
  // moved to be performed before detokenization
//  if (xd->segmentation_enabled)
//    mb_init_dequantizer(pbi, xd);
283

John Koleszar's avatar
John Koleszar committed
284 285
  /* do prediction */
  if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
286 287
#if CONFIG_SUPERBLOCKS
    if (xd->mode_info_context->mbmi.encoded_as_sb) {
288 289
      vp9_build_intra_predictors_sby_s(xd);
      vp9_build_intra_predictors_sbuv_s(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
290 291
    } else
#endif
John Koleszar's avatar
John Koleszar committed
292
    if (mode != I8X8_PRED) {
293
      vp9_build_intra_predictors_mbuv(xd);
John Koleszar's avatar
John Koleszar committed
294
      if (mode != B_PRED) {
295
        vp9_build_intra_predictors_mby(xd);
John Koleszar's avatar
John Koleszar committed
296
      }
John Koleszar's avatar
John Koleszar committed
297
    }
John Koleszar's avatar
John Koleszar committed
298
  } else {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
299 300
#if CONFIG_SUPERBLOCKS
    if (xd->mode_info_context->mbmi.encoded_as_sb) {
301
      vp9_build_inter32x32_predictors_sb(xd, xd->dst.y_buffer,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
302 303 304 305
                                         xd->dst.u_buffer, xd->dst.v_buffer,
                                         xd->dst.y_stride, xd->dst.uv_stride);
    } else
#endif
306
    vp9_build_inter_predictors_mb(xd);
John Koleszar's avatar
John Koleszar committed
307 308 309 310 311
  }

  /* dequantization and idct */
  if (mode == I8X8_PRED) {
    for (i = 0; i < 4; i++) {
312
      int ib = vp9_i8x8_block[i];
John Koleszar's avatar
John Koleszar committed
313 314 315 316 317
      const int iblock[4] = {0, 1, 4, 5};
      int j;
      int i8x8mode;
      BLOCKD *b;

318 319 320 321 322 323 324 325
      int idx = (ib & 0x02) ? (ib + 2) : ib;

      short *q  = xd->block[idx].qcoeff;
      short *dq = xd->block[0].dequant;
      unsigned char *pre = xd->block[ib].predictor;
      unsigned char *dst = *(xd->block[ib].base_dst) + xd->block[ib].dst;
      int stride = xd->dst.y_stride;

John Koleszar's avatar
John Koleszar committed
326 327
      b = &xd->block[ib];
      i8x8mode = b->bmi.as_mode.first;
328
      vp9_intra8x8_predict(b, i8x8mode, b->predictor);
John Koleszar's avatar
John Koleszar committed
329

330
      if (xd->mode_info_context->mbmi.txfm_size == TX_8X8) {
Deb Mukherjee's avatar
Deb Mukherjee committed
331 332
        tx_type = get_tx_type(xd, &xd->block[idx]);
        if (tx_type != DCT_DCT) {
333
          vp9_ht_dequant_idct_add_8x8_c(tx_type,
Deb Mukherjee's avatar
Deb Mukherjee committed
334 335
                                        q, dq, pre, dst, 16, stride);
        } else {
336
          vp9_dequant_idct_add_8x8_c(q, dq, pre, dst, 16, stride);
Deb Mukherjee's avatar
Deb Mukherjee committed
337 338
        }
        q += 64;
339 340 341
      } else {
        for (j = 0; j < 4; j++) {
          b = &xd->block[ib + iblock[j]];
342
          vp9_dequant_idct_add(b->qcoeff, b->dequant, b->predictor,
343 344 345
                                 *(b->base_dst) + b->dst, 16, b->dst_stride);
        }
      }
John Koleszar's avatar
John Koleszar committed
346
      b = &xd->block[16 + i];
347
      vp9_intra_uv4x4_predict(b, i8x8mode, b->predictor);
Scott LaVarnway's avatar
Scott LaVarnway committed
348 349
      pbi->idct_add(b->qcoeff, b->dequant, b->predictor,
                    *(b->base_dst) + b->dst, 8, b->dst_stride);
John Koleszar's avatar
John Koleszar committed
350
      b = &xd->block[20 + i];
351
      vp9_intra_uv4x4_predict(b, i8x8mode, b->predictor);
Scott LaVarnway's avatar
Scott LaVarnway committed
352 353
      pbi->idct_add(b->qcoeff, b->dequant, b->predictor,
                    *(b->base_dst) + b->dst, 8, b->dst_stride);
Yaowu Xu's avatar
Yaowu Xu committed
354
    }
John Koleszar's avatar
John Koleszar committed
355 356 357 358
  } else if (mode == B_PRED) {
    for (i = 0; i < 16; i++) {
      BLOCKD *b = &xd->block[i];
      int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
359
#if CONFIG_COMP_INTRA_PRED
John Koleszar's avatar
John Koleszar committed
360
      int b_mode2 = xd->mode_info_context->bmi[i].as_mode.second;
361

John Koleszar's avatar
John Koleszar committed
362
      if (b_mode2 == (B_PREDICTION_MODE)(B_DC_PRED - 1)) {
363
#endif
364
        vp9_intra4x4_predict(b, b_mode, b->predictor);
365
#if CONFIG_COMP_INTRA_PRED
John Koleszar's avatar
John Koleszar committed
366
      } else {
367
        vp9_comp_intra4x4_predict(b, b_mode, b_mode2, b->predictor);
John Koleszar's avatar
John Koleszar committed
368
      }
369
#endif
John Koleszar's avatar
John Koleszar committed
370

Deb Mukherjee's avatar
Deb Mukherjee committed
371 372
      tx_type = get_tx_type(xd, b);
      if (tx_type != DCT_DCT) {
373
        vp9_ht_dequant_idct_add_c(tx_type, b->qcoeff,
Deb Mukherjee's avatar
Deb Mukherjee committed
374 375 376
                                  b->dequant, b->predictor,
                                  *(b->base_dst) + b->dst, 16, b->dst_stride);
      } else {
377
        vp9_dequant_idct_add(b->qcoeff, b->dequant, b->predictor,
Jingning Han's avatar
Jingning Han committed
378
                               *(b->base_dst) + b->dst, 16, b->dst_stride);
Deb Mukherjee's avatar
Deb Mukherjee committed
379
      }
John Koleszar's avatar
John Koleszar committed
380
    }
John Koleszar's avatar
John Koleszar committed
381
  } else if (mode == SPLITMV) {
382
    if (tx_size == TX_8X8) {
383
      vp9_dequant_idct_add_y_block_8x8(xd->qcoeff, xd->block[0].dequant,
384 385 386
                                         xd->predictor, xd->dst.y_buffer,
                                         xd->dst.y_stride, xd->eobs, xd);
    } else {
Scott LaVarnway's avatar
Scott LaVarnway committed
387
      pbi->idct_add_y_block(xd->qcoeff, xd->block[0].dequant,
388 389 390
                                       xd->predictor, xd->dst.y_buffer,
                                       xd->dst.y_stride, xd->eobs);
    }
John Koleszar's avatar
John Koleszar committed
391 392
  } else {
    BLOCKD *b = &xd->block[24];
Daniel Kang's avatar
Daniel Kang committed
393

Deb Mukherjee's avatar
Deb Mukherjee committed
394 395 396 397
    if (tx_size == TX_16X16) {
      BLOCKD *bd = &xd->block[0];
      tx_type = get_tx_type(xd, bd);
      if (tx_type != DCT_DCT) {
398
        vp9_ht_dequant_idct_add_16x16_c(tx_type, xd->qcoeff,
399 400 401
                                        xd->block[0].dequant, xd->predictor,
                                        xd->dst.y_buffer, 16, xd->dst.y_stride);
      } else {
402
        vp9_dequant_idct_add_16x16(xd->qcoeff, xd->block[0].dequant,
403 404 405
                                     xd->predictor, xd->dst.y_buffer,
                                     16, xd->dst.y_stride);
      }
Deb Mukherjee's avatar
Deb Mukherjee committed
406
    } else if (tx_size == TX_8X8) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
407 408 409 410
#if CONFIG_SUPERBLOCKS
      void *orig = xd->mode_info_context;
      int n, num = xd->mode_info_context->mbmi.encoded_as_sb ? 4 : 1;
      for (n = 0; n < num; n++) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
411 412 413 414 415
        int x_idx = n & 1, y_idx = n >> 1;
        if (num == 4 && (mb_col + x_idx >= pc->mb_cols ||
                         mb_row + y_idx >= pc->mb_rows))
          continue;

Ronald S. Bultje's avatar
Ronald S. Bultje committed
416 417 418 419 420 421 422 423 424 425 426
        if (n != 0) {
          for (i = 0; i < 25; i++) {
            xd->block[i].eob = 0;
            xd->eobs[i] = 0;
          }
          xd->above_context = pc->above_context + mb_col + (n & 1);
          xd->left_context = pc->left_context + (n >> 1);
          xd->mode_info_context = orig;
          xd->mode_info_context += (n & 1);
          xd->mode_info_context += (n >> 1) * pc->mode_info_stride;
          if (!orig_skip_flag) {
427
            eobtotal = vp9_decode_mb_tokens_8x8(pbi, xd, bc);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
428 429 430
            if (eobtotal == 0) // skip loopfilter
              xd->mode_info_context->mbmi.mb_skip_coeff = 1;
          } else {
431
            vp9_reset_mb_tokens_context(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
432 433 434 435 436 437
          }
        }

        if (xd->mode_info_context->mbmi.mb_skip_coeff)
          continue; // only happens for SBs, which are already in dest buffer
#endif
438
      vp9_dequantize_b_2x2(b);
John Koleszar's avatar
John Koleszar committed
439 440 441 442 443 444 445 446 447
      IDCT_INVOKE(RTCD_VTABLE(idct), ihaar2)(&b->dqcoeff[0], b->diff, 8);
      ((int *)b->qcoeff)[0] = 0;// 2nd order block are set to 0 after inverse transform
      ((int *)b->qcoeff)[1] = 0;
      ((int *)b->qcoeff)[2] = 0;
      ((int *)b->qcoeff)[3] = 0;
      ((int *)b->qcoeff)[4] = 0;
      ((int *)b->qcoeff)[5] = 0;
      ((int *)b->qcoeff)[6] = 0;
      ((int *)b->qcoeff)[7] = 0;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
448 449
#if CONFIG_SUPERBLOCKS
      if (xd->mode_info_context->mbmi.encoded_as_sb) {
450
        vp9_dequant_dc_idct_add_y_block_8x8_inplace_c(xd->qcoeff,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
451 452 453 454
          xd->block[0].dequant,
          xd->dst.y_buffer + (n >> 1) * 16 * xd->dst.y_stride + (n & 1) * 16,
          xd->dst.y_stride, xd->eobs, xd->block[24].diff, xd);
        // do UV inline also
455
        vp9_dequant_idct_add_uv_block_8x8_inplace_c(xd->qcoeff + 16 * 16,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
456 457 458 459 460 461
          xd->block[16].dequant,
          xd->dst.u_buffer + (n >> 1) * 8 * xd->dst.uv_stride + (n & 1) * 8,
          xd->dst.v_buffer + (n >> 1) * 8 * xd->dst.uv_stride + (n & 1) * 8,
          xd->dst.uv_stride, xd->eobs + 16, xd);
      } else
#endif
462
        vp9_dequant_dc_idct_add_y_block_8x8(xd->qcoeff,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
463 464 465 466 467 468
          xd->block[0].dequant, xd->predictor, xd->dst.y_buffer,
          xd->dst.y_stride, xd->eobs, xd->block[24].diff, xd);
#if CONFIG_SUPERBLOCKS
      }
      xd->mode_info_context = orig;
#endif
John Koleszar's avatar
John Koleszar committed
469
    } else {
470
      vp9_dequantize_b(b);
John Koleszar's avatar
John Koleszar committed
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
      if (xd->eobs[24] > 1) {
        IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh16)(&b->dqcoeff[0], b->diff);
        ((int *)b->qcoeff)[0] = 0;
        ((int *)b->qcoeff)[1] = 0;
        ((int *)b->qcoeff)[2] = 0;
        ((int *)b->qcoeff)[3] = 0;
        ((int *)b->qcoeff)[4] = 0;
        ((int *)b->qcoeff)[5] = 0;
        ((int *)b->qcoeff)[6] = 0;
        ((int *)b->qcoeff)[7] = 0;
      } else {
        IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh1)(&b->dqcoeff[0], b->diff);
        ((int *)b->qcoeff)[0] = 0;
      }

Scott LaVarnway's avatar
Scott LaVarnway committed
486 487 488
      pbi->dc_idct_add_y_block(xd->qcoeff, xd->block[0].dequant, xd->predictor,
                               xd->dst.y_buffer, xd->dst.y_stride, xd->eobs,
                               xd->block[24].diff);
489
    }
John Koleszar's avatar
John Koleszar committed
490 491
  }

Ronald S. Bultje's avatar
Ronald S. Bultje committed
492
#if CONFIG_SUPERBLOCKS
493
  if (!xd->mode_info_context->mbmi.encoded_as_sb) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
494
#endif
Deb Mukherjee's avatar
Deb Mukherjee committed
495
    if ((tx_size == TX_8X8 &&
496 497 498 499
         xd->mode_info_context->mbmi.mode != I8X8_PRED &&
         xd->mode_info_context->mbmi.mode != SPLITMV)
        || tx_size == TX_16X16
       )
500
      vp9_dequant_idct_add_uv_block_8x8
501 502 503 504
          (xd->qcoeff + 16 * 16, xd->block[16].dequant,
           xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer,
           xd->dst.uv_stride, xd->eobs + 16, xd); //
    else if (xd->mode_info_context->mbmi.mode != I8X8_PRED)
Scott LaVarnway's avatar
Scott LaVarnway committed
505
      pbi->idct_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant,
506 507
           xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer,
           xd->dst.uv_stride, xd->eobs + 16);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
508 509 510
#if CONFIG_SUPERBLOCKS
  }
#endif
Yaowu Xu's avatar
Yaowu Xu committed
511
}
John Koleszar's avatar
John Koleszar committed
512

513

514
static int get_delta_q(vp9_reader *bc, int prev, int *q_update) {
John Koleszar's avatar
John Koleszar committed
515
  int ret_val = 0;
John Koleszar's avatar
John Koleszar committed
516

517 518
  if (vp9_read_bit(bc)) {
    ret_val = vp9_read_literal(bc, 4);
John Koleszar's avatar
John Koleszar committed
519

520
    if (vp9_read_bit(bc))
John Koleszar's avatar
John Koleszar committed
521 522
      ret_val = -ret_val;
  }
John Koleszar's avatar
John Koleszar committed
523

John Koleszar's avatar
John Koleszar committed
524 525 526
  /* Trigger a quantizer update if the delta-q value has changed */
  if (ret_val != prev)
    *q_update = 1;
John Koleszar's avatar
John Koleszar committed
527

John Koleszar's avatar
John Koleszar committed
528
  return ret_val;
John Koleszar's avatar
John Koleszar committed
529 530 531 532 533 534 535
}

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

Adrian Grange's avatar
Adrian Grange committed
536
/* Decode a row of Superblocks (2x2 region of MBs) */
537
static void
538
decode_sb_row(VP9D_COMP *pbi, VP9_COMMON *pc, int mbrow, MACROBLOCKD *xd,
John Koleszar's avatar
John Koleszar committed
539
              BOOL_DECODER* const bc) {
John Koleszar's avatar
John Koleszar committed
540 541 542 543 544 545 546 547 548 549 550 551 552
  int i;
  int sb_col;
  int mb_row, mb_col;
  int recon_yoffset, recon_uvoffset;
  int ref_fb_idx = pc->lst_fb_idx;
  int dst_fb_idx = pc->new_fb_idx;
  int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride;
  int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride;
  int row_delta[4] = { 0, +1,  0, -1};
  int col_delta[4] = { +1, -1, +1, +1};
  int sb_cols = (pc->mb_cols + 1) >> 1;

  // For a SB there are 2 left contexts, each pertaining to a MB row within
Ronald S. Bultje's avatar
Ronald S. Bultje committed
553
  vpx_memset(pc->left_context, 0, sizeof(pc->left_context));
John Koleszar's avatar
John Koleszar committed
554 555 556 557 558

  mb_row = mbrow;
  mb_col = 0;

  for (sb_col = 0; sb_col < sb_cols; sb_col++) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
559 560 561
    MODE_INFO *mi = xd->mode_info_context;

#if CONFIG_SUPERBLOCKS
562
    mi->mbmi.encoded_as_sb = vp9_read(bc, pc->sb_coded);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
563 564
#endif

John Koleszar's avatar
John Koleszar committed
565 566 567 568 569 570 571
    // Process the 4 MBs within the SB in the order:
    // top-left, top-right, bottom-left, bottom-right
    for (i = 0; i < 4; i++) {
      int dy = row_delta[i];
      int dx = col_delta[i];
      int offset_extended = dy * xd->mode_info_stride + dx;

572 573
      xd->mb_index = i;

Ronald S. Bultje's avatar
Ronald S. Bultje committed
574
      mi = xd->mode_info_context;
John Koleszar's avatar
John Koleszar committed
575 576 577 578 579
      if ((mb_row >= pc->mb_rows) || (mb_col >= pc->mb_cols)) {
        // MB lies outside frame, skip on to next
        mb_row += dy;
        mb_col += dx;
        xd->mode_info_context += offset_extended;
580
        xd->prev_mode_info_context += offset_extended;
John Koleszar's avatar
John Koleszar committed
581 582
        continue;
      }
Yaowu Xu's avatar
Yaowu Xu committed
583

John Koleszar's avatar
John Koleszar committed
584 585
      // Set above context pointer
      xd->above_context = pc->above_context + mb_col;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
586
      xd->left_context = pc->left_context + (i >> 1);
John Koleszar's avatar
John Koleszar committed
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608

      /* 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
       */
      xd->mb_to_top_edge = -((mb_row * 16)) << 3;
      xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3;

      xd->mb_to_left_edge = -((mb_col * 16) << 3);
      xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3;

      xd->up_available = (mb_row != 0);
      xd->left_available = (mb_col != 0);


      recon_yoffset = (mb_row * recon_y_stride * 16) + (mb_col * 16);
      recon_uvoffset = (mb_row * recon_uv_stride * 8) + (mb_col * 8);

      xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
      xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
      xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;

Ronald S. Bultje's avatar
Ronald S. Bultje committed
609 610 611 612
#if CONFIG_SUPERBLOCKS
      if (i)
        mi->mbmi.encoded_as_sb = 0;
#endif
613
      vp9_decode_mb_mode_mv(pbi, xd, mb_row, mb_col, bc);
614 615 616

      update_blockd_bmi(xd);

John Koleszar's avatar
John Koleszar committed
617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653
      /* Select the appropriate reference frame for this MB */
      if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME)
        ref_fb_idx = pc->lst_fb_idx;
      else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME)
        ref_fb_idx = pc->gld_fb_idx;
      else
        ref_fb_idx = pc->alt_fb_idx;

      xd->pre.y_buffer = pc->yv12_fb[ref_fb_idx].y_buffer + recon_yoffset;
      xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset;
      xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset;

      if (xd->mode_info_context->mbmi.second_ref_frame) {
        int second_ref_fb_idx;

        /* Select the appropriate reference frame for this MB */
        if (xd->mode_info_context->mbmi.second_ref_frame == LAST_FRAME)
          second_ref_fb_idx = pc->lst_fb_idx;
        else if (xd->mode_info_context->mbmi.second_ref_frame ==
                 GOLDEN_FRAME)
          second_ref_fb_idx = pc->gld_fb_idx;
        else
          second_ref_fb_idx = pc->alt_fb_idx;

        xd->second_pre.y_buffer =
          pc->yv12_fb[second_ref_fb_idx].y_buffer + recon_yoffset;
        xd->second_pre.u_buffer =
          pc->yv12_fb[second_ref_fb_idx].u_buffer + recon_uvoffset;
        xd->second_pre.v_buffer =
          pc->yv12_fb[second_ref_fb_idx].v_buffer + recon_uvoffset;
      }

      if (xd->mode_info_context->mbmi.ref_frame != INTRA_FRAME) {
        /* propagate errors from reference frames */
        xd->corrupted |= pc->yv12_fb[ref_fb_idx].corrupted;
      }

Ronald S. Bultje's avatar
Ronald S. Bultje committed
654 655
#if CONFIG_SUPERBLOCKS
      if (xd->mode_info_context->mbmi.encoded_as_sb) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
656 657 658 659 660 661 662
        if (mb_col < pc->mb_cols - 1)
          mi[1] = mi[0];
        if (mb_row < pc->mb_rows - 1) {
          mi[pc->mode_info_stride] = mi[0];
          if (mb_col < pc->mb_cols - 1)
            mi[pc->mode_info_stride + 1] = mi[0];
        }
Ronald S. Bultje's avatar
Ronald S. Bultje committed
663 664
      }
#endif
665
      vp9_intra_prediction_down_copy(xd);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
666
      decode_macroblock(pbi, xd, mb_row, mb_col, bc);
John Koleszar's avatar
John Koleszar committed
667 668

      /* check if the boolean decoder has suffered an error */
669
      xd->corrupted |= bool_error(bc);
John Koleszar's avatar
John Koleszar committed
670

Ronald S. Bultje's avatar
Ronald S. Bultje committed
671 672 673 674 675 676 677 678 679
#if CONFIG_SUPERBLOCKS
      if (mi->mbmi.encoded_as_sb) {
        assert(!i);
        mb_col += 2;
        xd->mode_info_context += 2;
        xd->prev_mode_info_context += 2;
        break;
      }
#endif
John Koleszar's avatar
John Koleszar committed
680 681 682

      // skip to next MB
      xd->mode_info_context += offset_extended;
683
      xd->prev_mode_info_context += offset_extended;
John Koleszar's avatar
John Koleszar committed
684 685
      mb_row += dy;
      mb_col += dx;
John Koleszar's avatar
John Koleszar committed
686
    }
John Koleszar's avatar
John Koleszar committed
687
  }
John Koleszar's avatar
John Koleszar committed
688

John Koleszar's avatar
John Koleszar committed
689 690
  /* skip prediction column */
  xd->mode_info_context += 1 - (pc->mb_cols & 0x1) + xd->mode_info_stride;
691
  xd->prev_mode_info_context += 1 - (pc->mb_cols & 0x1) + xd->mode_info_stride;
John Koleszar's avatar
John Koleszar committed
692 693
}

John Koleszar's avatar
John Koleszar committed
694 695 696 697
static unsigned int read_partition_size(const unsigned char *cx_size) {
  const unsigned int size =
    cx_size[0] + (cx_size[1] << 8) + (cx_size[2] << 16);
  return size;
John Koleszar's avatar
John Koleszar committed
698 699
}

700 701
static int read_is_valid(const unsigned char *start,
                         size_t               len,
John Koleszar's avatar
John Koleszar committed
702 703
                         const unsigned char *end) {
  return (start + len > start && start + len <= end);
704 705 706
}


707
static void setup_token_decoder(VP9D_COMP *pbi,
John Koleszar's avatar
John Koleszar committed
708 709
                                const unsigned char *cx_data,
                                BOOL_DECODER* const bool_decoder) {
710
  VP9_COMMON          *pc = &pbi->common;
John Koleszar's avatar
John Koleszar committed
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
  const unsigned char *user_data_end = pbi->Source + pbi->source_sz;
  const unsigned char *partition;

  ptrdiff_t            partition_size;
  ptrdiff_t            bytes_left;

  // Set up pointers to token partition
  partition = cx_data;
  bytes_left = user_data_end - partition;
  partition_size = bytes_left;

  /* Validate the calculated partition length. If the buffer
   * described by the partition can't be fully read, then restrict
   * it to the portion that can be (for EC mode) or throw an error.
   */
  if (!read_is_valid(partition, partition_size, user_data_end)) {
    vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
                       "Truncated packet or corrupt partition "
                       "%d length", 1);
  }

732 733
  if (vp9_start_decode(bool_decoder,
                       partition, (unsigned int)partition_size))
John Koleszar's avatar
John Koleszar committed
734 735
    vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate bool decoder %d", 1);
John Koleszar's avatar
John Koleszar committed
736 737
}

738 739
static void init_frame(VP9D_COMP *pbi) {
  VP9_COMMON *const pc = &pbi->common;
John Koleszar's avatar
John Koleszar committed
740
  MACROBLOCKD *const xd  = &pbi->mb;
John Koleszar's avatar
John Koleszar committed
741

John Koleszar's avatar
John Koleszar committed
742 743
  if (pc->frame_type == KEY_FRAME) {
    /* Various keyframe initializations */
744
    vp9_init_mv_probs(pc);
John Koleszar's avatar
John Koleszar committed
745

746 747
    vp9_init_mbmode_probs(pc);
    vp9_default_bmode_probs(pc->fc.bmode_prob);
John Koleszar's avatar
John Koleszar committed
748

749 750
    vp9_default_coef_probs(pc);
    vp9_kf_default_bmode_probs(pc->kf_bmode_prob);
John Koleszar's avatar
John Koleszar committed
751

John Koleszar's avatar
John Koleszar committed
752 753
    // Reset the segment feature data to the default stats:
    // Features disabled, 0, with delta coding (Default state).
754
    vp9_clearall_segfeatures(xd);
Paul Wilkins's avatar
Paul Wilkins committed
755

John Koleszar's avatar
John Koleszar committed
756
    xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
John Koleszar's avatar
John Koleszar committed
757

John Koleszar's avatar
John Koleszar committed
758 759 760
    /* reset the mode ref deltasa for loop filter */
    vpx_memset(xd->ref_lf_deltas, 0, sizeof(xd->ref_lf_deltas));
    vpx_memset(xd->mode_lf_deltas, 0, sizeof(xd->mode_lf_deltas));
John Koleszar's avatar
John Koleszar committed
761

John Koleszar's avatar
John Koleszar committed
762 763 764 765 766
    /* All buffers are implicitly updated on key frames. */
    pc->refresh_golden_frame = 1;
    pc->refresh_alt_ref_frame = 1;
    pc->copy_buffer_to_gf = 0;
    pc->copy_buffer_to_arf = 0;
John Koleszar's avatar
John Koleszar committed
767

John Koleszar's avatar
John Koleszar committed
768 769 770 771 772
    /* Note that Golden and Altref modes cannot be used on a key frame so
     * ref_frame_sign_bias[] is undefined and meaningless
     */
    pc->ref_frame_sign_bias[GOLDEN_FRAME] = 0;
    pc->ref_frame_sign_bias[ALTREF_FRAME] = 0;
773

774
    vp9_init_mode_contexts(&pbi->common);
John Koleszar's avatar
John Koleszar committed
775 776
    vpx_memcpy(&pc->lfc, &pc->fc, sizeof(pc->fc));
    vpx_memcpy(&pc->lfc_a, &pc->fc, sizeof(pc->fc));
Yaowu Xu's avatar
Yaowu Xu committed
777

John Koleszar's avatar
John Koleszar committed
778 779 780
    vpx_memcpy(pbi->common.fc.vp8_mode_contexts,
               pbi->common.fc.mode_context,
               sizeof(pbi->common.fc.mode_context));
781 782 783 784 785
    vpx_memset(pc->prev_mip, 0,
               (pc->mb_cols + 1) * (pc->mb_rows + 1)* sizeof(MODE_INFO));
    vpx_memset(pc->mip, 0,
               (pc->mb_cols + 1) * (pc->mb_rows + 1)* sizeof(MODE_INFO));

786 787
    vp9_update_mode_info_border(pc, pc->mip);
    vp9_update_mode_info_in_image(pc, pc->mi);
788

John Koleszar's avatar
John Koleszar committed
789
  } else {
790

John Koleszar's avatar
John Koleszar committed
791 792 793 794 795
    if (!pc->use_bilinear_mc_filter)
      pc->mcomp_filter_type = EIGHTTAP;
    else
      pc->mcomp_filter_type = BILINEAR;

796
    /* To enable choice of different interpolation filters */
797
    vp9_setup_interp_filters(xd, pc->mcomp_filter_type, pc);
John Koleszar's avatar
John Koleszar committed
798
  }
John Koleszar's avatar
John Koleszar committed
799

John Koleszar's avatar
John Koleszar committed
800
  xd->mode_info_context = pc->mi;
801
  xd->prev_mode_info_context = pc->prev_mi;
John Koleszar's avatar
John Koleszar committed
802 803 804 805
  xd->frame_type = pc->frame_type;
  xd->mode_info_context->mbmi.mode = DC_PRED;
  xd->mode_info_stride = pc->mode_info_stride;
  xd->corrupted = 0; /* init without corruption */
806

John Koleszar's avatar
John Koleszar committed
807 808 809
  xd->fullpixel_mask = 0xffffffff;
  if (pc->full_pixel)
    xd->fullpixel_mask = 0xfffffff8;
810

John Koleszar's avatar
John Koleszar committed
811 812
}

813
#if 0
814
static void read_coef_probs2(VP9D_COMP *pbi) {
815
  const vp9_prob grpupd = 192;
John Koleszar's avatar
John Koleszar committed
816
  int i, j, k, l;
817
  vp9_reader *const bc = &pbi->bc;
818
  VP9_COMMON *const pc = &pbi->common;
John Koleszar's avatar
John Koleszar committed
819
  for (l = 0; l < ENTROPY_NODES; l++) {
820
    if (vp9_read(bc, grpupd)) {
John Koleszar's avatar
John Koleszar committed
821 822 823 824 825 826 827
      // printf("Decoding %d\n", l);
      for (i = 0; i < BLOCK_TYPES; i++)
        for (j = !i; j < COEF_BANDS; j++)
          for (k = 0; k < PREV_COEF_CONTEXTS; k++) {
            if (k >= 3 && ((i == 0 && j == 1) ||
                           (i > 0 && j == 0)))
              continue;
828
            {
829 830
              vp9_prob *const p = pc->fc.coef_probs [i][j][k] + l;
              int u = vp9_read(bc, COEF_UPDATE_PROB);
John Koleszar's avatar
John Koleszar committed
831 832 833 834 835 836 837
              if (u) *p = read_prob_diff_update(bc, *p);
            }
          }
    }
  }
  if (pbi->common.txfm_mode == ALLOW_8X8) {
    for (l = 0; l < ENTROPY_NODES; l++) {
838
      if (vp9_read(bc, grpupd)) {
John Koleszar's avatar
John Koleszar committed
839 840 841 842 843 844 845
        for (i = 0; i < BLOCK_TYPES_8X8; i++)
          for (j = !i; j < COEF_BANDS; j++)
            for (k = 0; k < PREV_COEF_CONTEXTS; k++) {
              if (k >= 3 && ((i == 0 && j == 1) ||
                             (i > 0 && j == 0)))
                continue;
              {
846
                vp9_prob *const p = pc->fc.coef_probs_8x8 [i][j][k] + l;
847

848
                int u = vp9_read(bc, COEF_UPDATE_PROB_8X8);
John Koleszar's avatar
John Koleszar committed
849 850
                if (u) *p = read_prob_diff_update(bc, *p);
              }
851
            }
John Koleszar's avatar
John Koleszar committed
852
      }