vp9_decodemv.c revision 9b35249446b07f40ac5fcc3205f2c048616efacc
1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1191037db265ecdd914a26e056cf69207b4f50924ehkuang#include <assert.h>
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1391037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_common.h"
1491037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_entropy.h"
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_entropymode.h"
1691037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_entropymv.h"
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_findnearmv.h"
1891037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_mvref_common.h"
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_pred_common.h"
2091037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_reconinter.h"
2191037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_seg_common.h"
2291037db265ecdd914a26e056cf69207b4f50924ehkuang
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/decoder/vp9_decodemv.h"
24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/decoder/vp9_decodframe.h"
2591037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/decoder/vp9_onyxd_int.h"
2691037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/decoder/vp9_treereader.h"
2791037db265ecdd914a26e056cf69207b4f50924ehkuang
2891037db265ecdd914a26e056cf69207b4f50924ehkuangstatic MB_PREDICTION_MODE read_intra_mode(vp9_reader *r, const vp9_prob *p) {
2991037db265ecdd914a26e056cf69207b4f50924ehkuang  return (MB_PREDICTION_MODE)treed_read(r, vp9_intra_mode_tree, p);
3091037db265ecdd914a26e056cf69207b4f50924ehkuang}
31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic MB_PREDICTION_MODE read_intra_mode_y(VP9_COMMON *cm, vp9_reader *r,
335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            int size_group) {
345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const MB_PREDICTION_MODE y_mode = read_intra_mode(r,
355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                        cm->fc.y_mode_prob[size_group]);
365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!cm->frame_parallel_decoding_mode)
375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ++cm->counts.y_mode[size_group][y_mode];
385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return y_mode;
395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic MB_PREDICTION_MODE read_intra_mode_uv(VP9_COMMON *cm, vp9_reader *r,
425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             MB_PREDICTION_MODE y_mode) {
435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const MB_PREDICTION_MODE uv_mode = read_intra_mode(r,
445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         cm->fc.uv_mode_prob[y_mode]);
455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!cm->frame_parallel_decoding_mode)
465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ++cm->counts.uv_mode[y_mode][uv_mode];
475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return uv_mode;
485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuangstatic MB_PREDICTION_MODE read_inter_mode(VP9_COMMON *cm, vp9_reader *r,
519b35249446b07f40ac5fcc3205f2c048616efacchkuang                                          int ctx) {
529b35249446b07f40ac5fcc3205f2c048616efacchkuang  const int mode = treed_read(r, vp9_inter_mode_tree,
539b35249446b07f40ac5fcc3205f2c048616efacchkuang                              cm->fc.inter_mode_probs[ctx]);
545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!cm->frame_parallel_decoding_mode)
559b35249446b07f40ac5fcc3205f2c048616efacchkuang    ++cm->counts.inter_mode[ctx][mode];
569b35249446b07f40ac5fcc3205f2c048616efacchkuang
579b35249446b07f40ac5fcc3205f2c048616efacchkuang  return NEARESTMV + mode;
5891037db265ecdd914a26e056cf69207b4f50924ehkuang}
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
6091037db265ecdd914a26e056cf69207b4f50924ehkuangstatic int read_segment_id(vp9_reader *r, const struct segmentation *seg) {
6191037db265ecdd914a26e056cf69207b4f50924ehkuang  return treed_read(r, vp9_segment_tree, seg->tree_probs);
6291037db265ecdd914a26e056cf69207b4f50924ehkuang}
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
6491037db265ecdd914a26e056cf69207b4f50924ehkuangstatic TX_SIZE read_selected_tx_size(VP9_COMMON *cm, MACROBLOCKD *xd,
659b35249446b07f40ac5fcc3205f2c048616efacchkuang                                     TX_SIZE max_tx_size, vp9_reader *r) {
669b35249446b07f40ac5fcc3205f2c048616efacchkuang  const int ctx = vp9_get_pred_context_tx_size(xd);
679b35249446b07f40ac5fcc3205f2c048616efacchkuang  const vp9_prob *tx_probs = get_tx_probs(max_tx_size, ctx, &cm->fc.tx_probs);
6891037db265ecdd914a26e056cf69207b4f50924ehkuang  TX_SIZE tx_size = vp9_read(r, tx_probs[0]);
699b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (tx_size != TX_4X4 && max_tx_size >= TX_16X16) {
7091037db265ecdd914a26e056cf69207b4f50924ehkuang    tx_size += vp9_read(r, tx_probs[1]);
719b35249446b07f40ac5fcc3205f2c048616efacchkuang    if (tx_size != TX_8X8 && max_tx_size >= TX_32X32)
7291037db265ecdd914a26e056cf69207b4f50924ehkuang      tx_size += vp9_read(r, tx_probs[2]);
7391037db265ecdd914a26e056cf69207b4f50924ehkuang  }
7491037db265ecdd914a26e056cf69207b4f50924ehkuang
755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!cm->frame_parallel_decoding_mode)
769b35249446b07f40ac5fcc3205f2c048616efacchkuang    ++get_tx_counts(max_tx_size, ctx, &cm->counts.tx)[tx_size];
7791037db265ecdd914a26e056cf69207b4f50924ehkuang  return tx_size;
78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
809b35249446b07f40ac5fcc3205f2c048616efacchkuangstatic TX_SIZE read_tx_size(VP9_COMMON *cm, MACROBLOCKD *xd, TX_MODE tx_mode,
819b35249446b07f40ac5fcc3205f2c048616efacchkuang                            BLOCK_SIZE bsize, int allow_select, vp9_reader *r) {
829b35249446b07f40ac5fcc3205f2c048616efacchkuang  const TX_SIZE max_tx_size = max_txsize_lookup[bsize];
839b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (allow_select && tx_mode == TX_MODE_SELECT && bsize >= BLOCK_8X8)
849b35249446b07f40ac5fcc3205f2c048616efacchkuang    return read_selected_tx_size(cm, xd, max_tx_size, r);
859b35249446b07f40ac5fcc3205f2c048616efacchkuang  else
869b35249446b07f40ac5fcc3205f2c048616efacchkuang    return MIN(max_tx_size, tx_mode_to_biggest_tx_size[tx_mode]);
87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
891184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic void set_segment_id(VP9_COMMON *cm, BLOCK_SIZE bsize,
90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                           int mi_row, int mi_col, int segment_id) {
9191037db265ecdd914a26e056cf69207b4f50924ehkuang  const int mi_offset = mi_row * cm->mi_cols + mi_col;
925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int bw = num_8x8_blocks_wide_lookup[bsize];
935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int bh = num_8x8_blocks_high_lookup[bsize];
94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int xmis = MIN(cm->mi_cols - mi_col, bw);
9591037db265ecdd914a26e056cf69207b4f50924ehkuang  const int ymis = MIN(cm->mi_rows - mi_row, bh);
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int x, y;
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
9891037db265ecdd914a26e056cf69207b4f50924ehkuang  assert(segment_id >= 0 && segment_id < MAX_SEGMENTS);
99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
10091037db265ecdd914a26e056cf69207b4f50924ehkuang  for (y = 0; y < ymis; y++)
10191037db265ecdd914a26e056cf69207b4f50924ehkuang    for (x = 0; x < xmis; x++)
10291037db265ecdd914a26e056cf69207b4f50924ehkuang      cm->last_frame_seg_map[mi_offset + y * cm->mi_cols + x] = segment_id;
103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic int read_intra_segment_id(VP9_COMMON *const cm, MACROBLOCKD *const xd,
1065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                 int mi_row, int mi_col,
10791037db265ecdd914a26e056cf69207b4f50924ehkuang                                 vp9_reader *r) {
1085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct segmentation *const seg = &cm->seg;
1095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const BLOCK_SIZE bsize = xd->mi_8x8[0]->mbmi.sb_type;
11091037db265ecdd914a26e056cf69207b4f50924ehkuang  int segment_id;
11191037db265ecdd914a26e056cf69207b4f50924ehkuang
11291037db265ecdd914a26e056cf69207b4f50924ehkuang  if (!seg->enabled)
11391037db265ecdd914a26e056cf69207b4f50924ehkuang    return 0;  // Default for disabled segmentation
11491037db265ecdd914a26e056cf69207b4f50924ehkuang
11591037db265ecdd914a26e056cf69207b4f50924ehkuang  if (!seg->update_map)
11691037db265ecdd914a26e056cf69207b4f50924ehkuang    return 0;
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11891037db265ecdd914a26e056cf69207b4f50924ehkuang  segment_id = read_segment_id(r, seg);
1195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_segment_id(cm, bsize, mi_row, mi_col, segment_id);
12091037db265ecdd914a26e056cf69207b4f50924ehkuang  return segment_id;
12191037db265ecdd914a26e056cf69207b4f50924ehkuang}
12291037db265ecdd914a26e056cf69207b4f50924ehkuang
1235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic int read_inter_segment_id(VP9_COMMON *const cm, MACROBLOCKD *const xd,
1245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                 int mi_row, int mi_col, vp9_reader *r) {
1251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  struct segmentation *const seg = &cm->seg;
1265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const BLOCK_SIZE bsize = xd->mi_8x8[0]->mbmi.sb_type;
12791037db265ecdd914a26e056cf69207b4f50924ehkuang  int pred_segment_id, segment_id;
128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
12991037db265ecdd914a26e056cf69207b4f50924ehkuang  if (!seg->enabled)
13091037db265ecdd914a26e056cf69207b4f50924ehkuang    return 0;  // Default for disabled segmentation
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13291037db265ecdd914a26e056cf69207b4f50924ehkuang  pred_segment_id = vp9_get_segment_id(cm, cm->last_frame_seg_map,
13391037db265ecdd914a26e056cf69207b4f50924ehkuang                                       bsize, mi_row, mi_col);
13491037db265ecdd914a26e056cf69207b4f50924ehkuang  if (!seg->update_map)
13591037db265ecdd914a26e056cf69207b4f50924ehkuang    return pred_segment_id;
13691037db265ecdd914a26e056cf69207b4f50924ehkuang
13791037db265ecdd914a26e056cf69207b4f50924ehkuang  if (seg->temporal_update) {
1381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    const vp9_prob pred_prob = vp9_get_pred_prob_seg_id(seg, xd);
13991037db265ecdd914a26e056cf69207b4f50924ehkuang    const int pred_flag = vp9_read(r, pred_prob);
1401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    vp9_set_pred_flag_seg_id(xd, pred_flag);
14191037db265ecdd914a26e056cf69207b4f50924ehkuang    segment_id = pred_flag ? pred_segment_id
14291037db265ecdd914a26e056cf69207b4f50924ehkuang                           : read_segment_id(r, seg);
14391037db265ecdd914a26e056cf69207b4f50924ehkuang  } else {
14491037db265ecdd914a26e056cf69207b4f50924ehkuang    segment_id = read_segment_id(r, seg);
145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
14691037db265ecdd914a26e056cf69207b4f50924ehkuang  set_segment_id(cm, bsize, mi_row, mi_col, segment_id);
14791037db265ecdd914a26e056cf69207b4f50924ehkuang  return segment_id;
14891037db265ecdd914a26e056cf69207b4f50924ehkuang}
149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic int read_skip_coeff(VP9_COMMON *cm, const MACROBLOCKD *xd,
1515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           int segment_id, vp9_reader *r) {
1525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP)) {
1535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return 1;
1545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
15591037db265ecdd914a26e056cf69207b4f50924ehkuang    const int ctx = vp9_get_pred_context_mbskip(xd);
1565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int skip = vp9_read(r, cm->fc.mbskip_probs[ctx]);
1575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!cm->frame_parallel_decoding_mode)
1585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++cm->counts.mbskip[ctx][skip];
1595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return skip;
160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
16191037db265ecdd914a26e056cf69207b4f50924ehkuang}
162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void read_intra_frame_mode_info(VP9_COMMON *const cm,
1645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       MACROBLOCKD *const xd,
1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       MODE_INFO *const m,
166f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                                       int mi_row, int mi_col, vp9_reader *r) {
16791037db265ecdd914a26e056cf69207b4f50924ehkuang  MB_MODE_INFO *const mbmi = &m->mbmi;
1681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const BLOCK_SIZE bsize = mbmi->sb_type;
1691184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const MODE_INFO *above_mi = xd->mi_8x8[-cm->mode_info_stride];
1705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const MODE_INFO *left_mi  = xd->left_available ? xd->mi_8x8[-1] : NULL;
17191037db265ecdd914a26e056cf69207b4f50924ehkuang
1725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mbmi->segment_id = read_intra_segment_id(cm, xd, mi_row, mi_col, r);
1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mbmi->skip_coeff = read_skip_coeff(cm, xd, mbmi->segment_id, r);
1745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mbmi->tx_size = read_tx_size(cm, xd, cm->tx_mode, bsize, 1, r);
17591037db265ecdd914a26e056cf69207b4f50924ehkuang  mbmi->ref_frame[0] = INTRA_FRAME;
176f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  mbmi->ref_frame[1] = NONE;
17791037db265ecdd914a26e056cf69207b4f50924ehkuang
1781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (bsize >= BLOCK_8X8) {
1791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    const MB_PREDICTION_MODE A = above_block_mode(m, above_mi, 0);
1805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const MB_PREDICTION_MODE L = left_block_mode(m, left_mi, 0);
18191037db265ecdd914a26e056cf69207b4f50924ehkuang    mbmi->mode = read_intra_mode(r, vp9_kf_y_mode_prob[A][L]);
182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
18391037db265ecdd914a26e056cf69207b4f50924ehkuang    // Only 4x4, 4x8, 8x4 blocks
184f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];  // 1 or 2
185f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];  // 1 or 2
186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int idx, idy;
187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
188f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    for (idy = 0; idy < 2; idy += num_4x4_h) {
189f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      for (idx = 0; idx < 2; idx += num_4x4_w) {
19091037db265ecdd914a26e056cf69207b4f50924ehkuang        const int ib = idy * 2 + idx;
1911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        const MB_PREDICTION_MODE A = above_block_mode(m, above_mi, ib);
1925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const MB_PREDICTION_MODE L = left_block_mode(m, left_mi, ib);
19391037db265ecdd914a26e056cf69207b4f50924ehkuang        const MB_PREDICTION_MODE b_mode = read_intra_mode(r,
19491037db265ecdd914a26e056cf69207b4f50924ehkuang                                              vp9_kf_y_mode_prob[A][L]);
19591037db265ecdd914a26e056cf69207b4f50924ehkuang        m->bmi[ib].as_mode = b_mode;
196f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        if (num_4x4_h == 2)
19791037db265ecdd914a26e056cf69207b4f50924ehkuang          m->bmi[ib + 2].as_mode = b_mode;
198f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        if (num_4x4_w == 2)
19991037db265ecdd914a26e056cf69207b4f50924ehkuang          m->bmi[ib + 1].as_mode = b_mode;
200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
20291037db265ecdd914a26e056cf69207b4f50924ehkuang
20391037db265ecdd914a26e056cf69207b4f50924ehkuang    mbmi->mode = m->bmi[3].as_mode;
204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
20691037db265ecdd914a26e056cf69207b4f50924ehkuang  mbmi->uv_mode = read_intra_mode(r, vp9_kf_uv_mode_prob[mbmi->mode]);
207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int read_mv_component(vp9_reader *r,
210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                             const nmv_component *mvcomp, int usehp) {
211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  int mag, d, fr, hp;
212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int sign = vp9_read(r, mvcomp->sign);
213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int mv_class = treed_read(r, vp9_mv_class_tree, mvcomp->classes);
21491037db265ecdd914a26e056cf69207b4f50924ehkuang  const int class0 = mv_class == MV_CLASS_0;
215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Integer part
21791037db265ecdd914a26e056cf69207b4f50924ehkuang  if (class0) {
218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    d = treed_read(r, vp9_mv_class0_tree, mvcomp->class0);
219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  } else {
220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int i;
221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    const int n = mv_class + CLASS0_BITS - 1;  // number of bits
222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    d = 0;
224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for (i = 0; i < n; ++i)
225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      d |= vp9_read(r, mvcomp->bits[i]) << i;
226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // Fractional part
229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  fr = treed_read(r, vp9_mv_fp_tree,
23091037db265ecdd914a26e056cf69207b4f50924ehkuang                  class0 ? mvcomp->class0_fp[d] : mvcomp->fp);
231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  // High precision part (if hp is not used, the default value of the hp is 1)
23491037db265ecdd914a26e056cf69207b4f50924ehkuang  hp = usehp ? vp9_read(r, class0 ? mvcomp->class0_hp : mvcomp->hp)
235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang             : 1;
236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
23791037db265ecdd914a26e056cf69207b4f50924ehkuang  // Result
238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  mag = vp9_get_mv_mag(mv_class, (d << 3) | (fr << 1) | hp) + 1;
239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return sign ? -mag : mag;
240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
24291037db265ecdd914a26e056cf69207b4f50924ehkuangstatic INLINE void read_mv(vp9_reader *r, MV *mv, const MV *ref,
24391037db265ecdd914a26e056cf69207b4f50924ehkuang                           const nmv_context *ctx,
244f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                           nmv_context_counts *counts, int allow_hp) {
24591037db265ecdd914a26e056cf69207b4f50924ehkuang  const MV_JOINT_TYPE j = treed_read(r, vp9_mv_joint_tree, ctx->joints);
246f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  const int use_hp = allow_hp && vp9_use_mv_hp(ref);
24791037db265ecdd914a26e056cf69207b4f50924ehkuang  MV diff = {0, 0};
24891037db265ecdd914a26e056cf69207b4f50924ehkuang
24991037db265ecdd914a26e056cf69207b4f50924ehkuang  if (mv_joint_vertical(j))
250f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    diff.row = read_mv_component(r, &ctx->comps[0], use_hp);
25191037db265ecdd914a26e056cf69207b4f50924ehkuang
25291037db265ecdd914a26e056cf69207b4f50924ehkuang  if (mv_joint_horizontal(j))
253f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    diff.col = read_mv_component(r, &ctx->comps[1], use_hp);
25491037db265ecdd914a26e056cf69207b4f50924ehkuang
25591037db265ecdd914a26e056cf69207b4f50924ehkuang  vp9_inc_mv(&diff, counts);
25691037db265ecdd914a26e056cf69207b4f50924ehkuang
25791037db265ecdd914a26e056cf69207b4f50924ehkuang  mv->row = ref->row + diff.row;
25891037db265ecdd914a26e056cf69207b4f50924ehkuang  mv->col = ref->col + diff.col;
25991037db265ecdd914a26e056cf69207b4f50924ehkuang}
26091037db265ecdd914a26e056cf69207b4f50924ehkuang
2619b35249446b07f40ac5fcc3205f2c048616efacchkuangstatic COMPPREDMODE_TYPE read_reference_mode(VP9_COMMON *cm,
2629b35249446b07f40ac5fcc3205f2c048616efacchkuang                                             const MACROBLOCKD *xd,
2639b35249446b07f40ac5fcc3205f2c048616efacchkuang                                             vp9_reader *r) {
2649b35249446b07f40ac5fcc3205f2c048616efacchkuang  const int ctx = vp9_get_pred_context_comp_inter_inter(cm, xd);
2659b35249446b07f40ac5fcc3205f2c048616efacchkuang  const int mode = vp9_read(r, cm->fc.comp_inter_prob[ctx]);
2669b35249446b07f40ac5fcc3205f2c048616efacchkuang  if (!cm->frame_parallel_decoding_mode)
2679b35249446b07f40ac5fcc3205f2c048616efacchkuang    ++cm->counts.comp_inter[ctx][mode];
2689b35249446b07f40ac5fcc3205f2c048616efacchkuang  return mode;  // SINGLE_PREDICTION_ONLY or COMP_PREDICTION_ONLY
2699b35249446b07f40ac5fcc3205f2c048616efacchkuang}
2709b35249446b07f40ac5fcc3205f2c048616efacchkuang
271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// Read the referncence frame
2725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void read_ref_frames(VP9_COMMON *const cm, MACROBLOCKD *const xd,
2735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            vp9_reader *r,
274f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                            int segment_id, MV_REFERENCE_FRAME ref_frame[2]) {
27591037db265ecdd914a26e056cf69207b4f50924ehkuang  FRAME_CONTEXT *const fc = &cm->fc;
27691037db265ecdd914a26e056cf69207b4f50924ehkuang  FRAME_COUNTS *const counts = &cm->counts;
277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME)) {
2791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    ref_frame[0] = vp9_get_segdata(&cm->seg, segment_id, SEG_LVL_REF_FRAME);
28091037db265ecdd914a26e056cf69207b4f50924ehkuang    ref_frame[1] = NONE;
28191037db265ecdd914a26e056cf69207b4f50924ehkuang  } else {
2829b35249446b07f40ac5fcc3205f2c048616efacchkuang    const COMPPREDMODE_TYPE mode = (cm->comp_pred_mode == HYBRID_PREDICTION)
2839b35249446b07f40ac5fcc3205f2c048616efacchkuang                                      ? read_reference_mode(cm, xd, r)
2849b35249446b07f40ac5fcc3205f2c048616efacchkuang                                      : cm->comp_pred_mode;
285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // FIXME(rbultje) I'm pretty sure this breaks segmentation ref frame coding
2879b35249446b07f40ac5fcc3205f2c048616efacchkuang    if (mode == COMP_PREDICTION_ONLY) {
2889b35249446b07f40ac5fcc3205f2c048616efacchkuang      const int idx = cm->ref_frame_sign_bias[cm->comp_fixed_ref];
2899b35249446b07f40ac5fcc3205f2c048616efacchkuang      const int ctx = vp9_get_pred_context_comp_ref_p(cm, xd);
2909b35249446b07f40ac5fcc3205f2c048616efacchkuang      const int bit = vp9_read(r, fc->comp_ref_prob[ctx]);
2915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!cm->frame_parallel_decoding_mode)
2929b35249446b07f40ac5fcc3205f2c048616efacchkuang        ++counts->comp_ref[ctx][bit];
2939b35249446b07f40ac5fcc3205f2c048616efacchkuang      ref_frame[idx] = cm->comp_fixed_ref;
2949b35249446b07f40ac5fcc3205f2c048616efacchkuang      ref_frame[!idx] = cm->comp_var_ref[bit];
2959b35249446b07f40ac5fcc3205f2c048616efacchkuang    } else if (mode == SINGLE_PREDICTION_ONLY) {
296f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      const int ctx0 = vp9_get_pred_context_single_ref_p1(xd);
297f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      const int bit0 = vp9_read(r, fc->single_ref_prob[ctx0][0]);
2985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!cm->frame_parallel_decoding_mode)
2995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++counts->single_ref[ctx0][0][bit0];
300f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      if (bit0) {
301f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        const int ctx1 = vp9_get_pred_context_single_ref_p2(xd);
302f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        const int bit1 = vp9_read(r, fc->single_ref_prob[ctx1][1]);
3035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (!cm->frame_parallel_decoding_mode)
3045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ++counts->single_ref[ctx1][1][bit1];
3059b35249446b07f40ac5fcc3205f2c048616efacchkuang        ref_frame[0] = bit1 ? ALTREF_FRAME : GOLDEN_FRAME;
306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      } else {
307ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ref_frame[0] = LAST_FRAME;
308ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
309f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
310f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      ref_frame[1] = NONE;
3119b35249446b07f40ac5fcc3205f2c048616efacchkuang    } else {
3129b35249446b07f40ac5fcc3205f2c048616efacchkuang      assert(!"Invalid prediction mode.");
313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic INLINE INTERPOLATION_TYPE read_switchable_filter_type(
3195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    VP9_COMMON *const cm, MACROBLOCKD *const xd, vp9_reader *r) {
32091037db265ecdd914a26e056cf69207b4f50924ehkuang  const int ctx = vp9_get_pred_context_switchable_interp(xd);
3211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const int type = treed_read(r, vp9_switchable_interp_tree,
3221184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                              cm->fc.switchable_interp_prob[ctx]);
3235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!cm->frame_parallel_decoding_mode)
3245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ++cm->counts.switchable_interp[ctx][type];
3251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  return type;
32691037db265ecdd914a26e056cf69207b4f50924ehkuang}
327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void read_intra_block_mode_info(VP9_COMMON *const cm, MODE_INFO *mi,
3295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       vp9_reader *r) {
33091037db265ecdd914a26e056cf69207b4f50924ehkuang  MB_MODE_INFO *const mbmi = &mi->mbmi;
3311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const BLOCK_SIZE bsize = mi->mbmi.sb_type;
332f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
333f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  mbmi->ref_frame[0] = INTRA_FRAME;
334f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  mbmi->ref_frame[1] = NONE;
335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (bsize >= BLOCK_8X8) {
3375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    mbmi->mode = read_intra_mode_y(cm, r, size_group_lookup[bsize]);
33891037db265ecdd914a26e056cf69207b4f50924ehkuang  } else {
33991037db265ecdd914a26e056cf69207b4f50924ehkuang     // Only 4x4, 4x8, 8x4 blocks
340f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang     const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];  // 1 or 2
341f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang     const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];  // 1 or 2
34291037db265ecdd914a26e056cf69207b4f50924ehkuang     int idx, idy;
34391037db265ecdd914a26e056cf69207b4f50924ehkuang
344f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang     for (idy = 0; idy < 2; idy += num_4x4_h) {
345f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang       for (idx = 0; idx < 2; idx += num_4x4_w) {
34691037db265ecdd914a26e056cf69207b4f50924ehkuang         const int ib = idy * 2 + idx;
3475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         const int b_mode = read_intra_mode_y(cm, r, 0);
34891037db265ecdd914a26e056cf69207b4f50924ehkuang         mi->bmi[ib].as_mode = b_mode;
349f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang         if (num_4x4_h == 2)
35091037db265ecdd914a26e056cf69207b4f50924ehkuang           mi->bmi[ib + 2].as_mode = b_mode;
351f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang         if (num_4x4_w == 2)
35291037db265ecdd914a26e056cf69207b4f50924ehkuang           mi->bmi[ib + 1].as_mode = b_mode;
35391037db265ecdd914a26e056cf69207b4f50924ehkuang      }
35491037db265ecdd914a26e056cf69207b4f50924ehkuang    }
35591037db265ecdd914a26e056cf69207b4f50924ehkuang    mbmi->mode = mi->bmi[3].as_mode;
35691037db265ecdd914a26e056cf69207b4f50924ehkuang  }
357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mbmi->uv_mode = read_intra_mode_uv(cm, r, mbmi->mode);
359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic INLINE int assign_mv(VP9_COMMON *cm, MB_PREDICTION_MODE mode,
3625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             int_mv mv[2], int_mv best_mv[2],
3635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             int_mv nearest_mv[2], int_mv near_mv[2],
3645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             int is_compound, int allow_hp, vp9_reader *r) {
3655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int i;
3665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int ret = 1;
3675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (mode) {
3695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case NEWMV: {
3705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      nmv_context_counts *const mv_counts = cm->frame_parallel_decoding_mode ?
3715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            NULL : &cm->counts.mv;
3725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      read_mv(r, &mv[0].as_mv, &best_mv[0].as_mv,
3735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              &cm->fc.nmvc, mv_counts, allow_hp);
3745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (is_compound)
3755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        read_mv(r, &mv[1].as_mv, &best_mv[1].as_mv,
3765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                &cm->fc.nmvc, mv_counts, allow_hp);
3775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (i = 0; i < 1 + is_compound; ++i) {
3785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ret = ret && mv[i].as_mv.row < MV_UPP && mv[i].as_mv.row > MV_LOW;
3795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ret = ret && mv[i].as_mv.col < MV_UPP && mv[i].as_mv.col > MV_LOW;
3805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
3815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
3825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
3835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case NEARESTMV: {
3845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      mv[0].as_int = nearest_mv[0].as_int;
3855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (is_compound) mv[1].as_int = nearest_mv[1].as_int;
3865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
3875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
3885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case NEARMV: {
3895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      mv[0].as_int = near_mv[0].as_int;
3905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (is_compound) mv[1].as_int = near_mv[1].as_int;
3915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
3925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
3935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case ZEROMV: {
3945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      mv[0].as_int = 0;
3955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (is_compound) mv[1].as_int = 0;
3965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
3975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
3985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default: {
3995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return 0;
4005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
4015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
4025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ret;
4035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
40491037db265ecdd914a26e056cf69207b4f50924ehkuang
4055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic int read_is_inter_block(VP9_COMMON *const cm, MACROBLOCKD *const xd,
4065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               int segment_id, vp9_reader *r) {
4071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME)) {
4081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    return vp9_get_segdata(&cm->seg, segment_id, SEG_LVL_REF_FRAME) !=
409f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang           INTRA_FRAME;
41091037db265ecdd914a26e056cf69207b4f50924ehkuang  } else {
411f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    const int ctx = vp9_get_pred_context_intra_inter(xd);
412f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    const int is_inter = vp9_read(r, vp9_get_pred_prob_intra_inter(cm, xd));
4135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!cm->frame_parallel_decoding_mode)
4145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++cm->counts.intra_inter[ctx][is_inter];
415f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    return is_inter;
41691037db265ecdd914a26e056cf69207b4f50924ehkuang  }
417ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void read_inter_block_mode_info(VP9_COMMON *const cm,
4205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       MACROBLOCKD *const xd,
4215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       const TileInfo *const tile,
4225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       MODE_INFO *const mi,
423f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                                       int mi_row, int mi_col, vp9_reader *r) {
42491037db265ecdd914a26e056cf69207b4f50924ehkuang  MB_MODE_INFO *const mbmi = &mi->mbmi;
4251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const BLOCK_SIZE bsize = mbmi->sb_type;
4265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int allow_hp = cm->allow_high_precision_mv;
427ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int_mv nearest[2], nearmv[2], best[2];
429f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  uint8_t inter_mode_ctx;
4301184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  MV_REFERENCE_FRAME ref0;
4311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  int is_compound;
432ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4331184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  mbmi->uv_mode = DC_PRED;
4345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  read_ref_frames(cm, xd, r, mbmi->segment_id, mbmi->ref_frame);
435f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  ref0 = mbmi->ref_frame[0];
4361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  is_compound = has_second_ref(mbmi);
437ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  vp9_find_mv_refs(cm, xd, tile, mi, xd->last_mi, ref0, mbmi->ref_mvs[ref0],
439f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                   mi_row, mi_col);
440ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  inter_mode_ctx = mbmi->mode_context[ref0];
442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
444f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    mbmi->mode = ZEROMV;
4455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (bsize < BLOCK_8X8) {
4465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM,
4475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           "Invalid usage of segement feature on small blocks");
4485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        return;
4495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
4501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  } else {
4511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (bsize >= BLOCK_8X8)
4521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang      mbmi->mode = read_inter_mode(cm, r, inter_mode_ctx);
4531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  }
454ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
455f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  // nearest, nearby
4561184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (bsize < BLOCK_8X8 || mbmi->mode != ZEROMV) {
4575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    vp9_find_best_ref_mvs(xd, allow_hp,
4585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          mbmi->ref_mvs[ref0], &nearest[0], &nearmv[0]);
4595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    best[0].as_int = nearest[0].as_int;
460f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  }
461ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4621184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (is_compound) {
4631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    const MV_REFERENCE_FRAME ref1 = mbmi->ref_frame[1];
4645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    vp9_find_mv_refs(cm, xd, tile, mi, xd->last_mi,
4651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                     ref1, mbmi->ref_mvs[ref1], mi_row, mi_col);
466ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4671184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    if (bsize < BLOCK_8X8 || mbmi->mode != ZEROMV) {
4685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      vp9_find_best_ref_mvs(xd, allow_hp,
4695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            mbmi->ref_mvs[ref1], &nearest[1], &nearmv[1]);
4705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      best[1].as_int = nearest[1].as_int;
471ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
472f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  }
473ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mbmi->interp_filter = (cm->mcomp_filter_type == SWITCHABLE)
4755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      ? read_switchable_filter_type(cm, xd, r)
4765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      : cm->mcomp_filter_type;
4771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang
4781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  if (bsize < BLOCK_8X8) {
479f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];  // 1 or 2
480f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];  // 1 or 2
481f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    int idx, idy;
4825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int b_mode;
483f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang    for (idy = 0; idy < 2; idy += num_4x4_h) {
484f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang      for (idx = 0; idx < 2; idx += num_4x4_w) {
4855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        int_mv block[2];
486f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        const int j = idy * 2 + idx;
4875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        b_mode = read_inter_mode(cm, r, inter_mode_ctx);
48891037db265ecdd914a26e056cf69207b4f50924ehkuang
489f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        if (b_mode == NEARESTMV || b_mode == NEARMV) {
4905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          vp9_append_sub8x8_mvs_for_idx(cm, xd, tile, &nearest[0],
4915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                        &nearmv[0], j, 0,
492f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                                        mi_row, mi_col);
493ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
4941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang          if (is_compound)
4955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            vp9_append_sub8x8_mvs_for_idx(cm, xd, tile, &nearest[1],
4965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          &nearmv[1], j, 1,
4975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          mi_row, mi_col);
498ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        }
499ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (!assign_mv(cm, b_mode, block, best, nearest, nearmv,
5015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       is_compound, allow_hp, r)) {
5025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          xd->corrupted |= 1;
5035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          break;
5045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        };
5055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        mi->bmi[j].as_mv[0].as_int = block[0].as_int;
5081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang        if (is_compound)
5095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          mi->bmi[j].as_mv[1].as_int = block[1].as_int;
510f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
511f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        if (num_4x4_h == 2)
512f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang          mi->bmi[j + 2] = mi->bmi[j];
513f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang        if (num_4x4_w == 2)
514f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang          mi->bmi[j + 1] = mi->bmi[j];
515ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      }
516ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
517f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
5185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    mi->mbmi.mode = b_mode;
519f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
5205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    mbmi->mv[0].as_int = mi->bmi[3].as_mv[0].as_int;
5215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    mbmi->mv[1].as_int = mi->bmi[3].as_mv[1].as_int;
5225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
5235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    xd->corrupted |= !assign_mv(cm, mbmi->mode, mbmi->mv,
5245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                best, nearest, nearmv,
5255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                is_compound, allow_hp, r);
52691037db265ecdd914a26e056cf69207b4f50924ehkuang  }
52791037db265ecdd914a26e056cf69207b4f50924ehkuang}
52891037db265ecdd914a26e056cf69207b4f50924ehkuang
5295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void read_inter_frame_mode_info(VP9_COMMON *const cm,
5305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       MACROBLOCKD *const xd,
5315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       const TileInfo *const tile,
5325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       MODE_INFO *const mi,
533f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                                       int mi_row, int mi_col, vp9_reader *r) {
534f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  MB_MODE_INFO *const mbmi = &mi->mbmi;
535f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  int inter_block;
536f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
537f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  mbmi->mv[0].as_int = 0;
538f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  mbmi->mv[1].as_int = 0;
5395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mbmi->segment_id = read_inter_segment_id(cm, xd, mi_row, mi_col, r);
5405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mbmi->skip_coeff = read_skip_coeff(cm, xd, mbmi->segment_id, r);
5415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  inter_block = read_is_inter_block(cm, xd, mbmi->segment_id, r);
5425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mbmi->tx_size = read_tx_size(cm, xd, cm->tx_mode, mbmi->sb_type,
5431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                               !mbmi->skip_coeff || !inter_block, r);
544f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
545f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  if (inter_block)
5465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    read_inter_block_mode_info(cm, xd, tile, mi, mi_row, mi_col, r);
547f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang  else
5485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    read_intra_block_mode_info(cm, mi, r);
549f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang}
550f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang
5515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid vp9_read_mode_info(VP9_COMMON *cm, MACROBLOCKD *xd,
5525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        const TileInfo *const tile,
5535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        int mi_row, int mi_col, vp9_reader *r) {
5545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  MODE_INFO *const mi = xd->mi_8x8[0];
5551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  const BLOCK_SIZE bsize = mi->mbmi.sb_type;
5565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int bw = num_8x8_blocks_wide_lookup[bsize];
5575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int bh = num_8x8_blocks_high_lookup[bsize];
55891037db265ecdd914a26e056cf69207b4f50924ehkuang  const int y_mis = MIN(bh, cm->mi_rows - mi_row);
55991037db265ecdd914a26e056cf69207b4f50924ehkuang  const int x_mis = MIN(bw, cm->mi_cols - mi_col);
5601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang  int x, y, z;
561ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (frame_is_intra_only(cm))
5635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    read_intra_frame_mode_info(cm, xd, mi, mi_row, mi_col, r);
56491037db265ecdd914a26e056cf69207b4f50924ehkuang  else
5655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    read_inter_frame_mode_info(cm, xd, tile, mi, mi_row, mi_col, r);
566ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (y = 0, z = 0; y < y_mis; y++, z += cm->mode_info_stride) {
5681184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    for (x = !y; x < x_mis; x++) {
5695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      xd->mi_8x8[z + x] = mi;
5705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
5715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
572ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
573