Index: source/libvpx/vp9/decoder/vp9_decodemv.c |
=================================================================== |
--- source/libvpx/vp9/decoder/vp9_decodemv.c (revision 207479) |
+++ source/libvpx/vp9/decoder/vp9_decodemv.c (working copy) |
@@ -8,20 +8,21 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
- |
-#include "vp9/decoder/vp9_treereader.h" |
+#include "vp9/common/vp9_common.h" |
+#include "vp9/common/vp9_entropy.h" |
+#include "vp9/common/vp9_entropymode.h" |
#include "vp9/common/vp9_entropymv.h" |
-#include "vp9/common/vp9_entropymode.h" |
+#include "vp9/common/vp9_findnearmv.h" |
+#include "vp9/common/vp9_mvref_common.h" |
+#include "vp9/common/vp9_pred_common.h" |
#include "vp9/common/vp9_reconinter.h" |
-#include "vp9/decoder/vp9_onyxd_int.h" |
-#include "vp9/common/vp9_findnearmv.h" |
-#include "vp9/common/vp9_common.h" |
#include "vp9/common/vp9_seg_common.h" |
-#include "vp9/common/vp9_pred_common.h" |
-#include "vp9/common/vp9_entropy.h" |
+ |
#include "vp9/decoder/vp9_decodemv.h" |
#include "vp9/decoder/vp9_decodframe.h" |
-#include "vp9/common/vp9_mvref_common.h" |
+#include "vp9/decoder/vp9_onyxd_int.h" |
+#include "vp9/decoder/vp9_treereader.h" |
+ |
#if CONFIG_DEBUG |
#include <assert.h> |
#endif |
@@ -37,14 +38,52 @@ |
#endif |
static MB_PREDICTION_MODE read_intra_mode(vp9_reader *r, const vp9_prob *p) { |
- MB_PREDICTION_MODE m = treed_read(r, vp9_intra_mode_tree, p); |
- return m; |
+ return treed_read(r, vp9_intra_mode_tree, p); |
} |
static int read_mb_segid(vp9_reader *r, MACROBLOCKD *xd) { |
return treed_read(r, vp9_segment_tree, xd->mb_segment_tree_probs); |
} |
+static TX_SIZE select_txfm_size(VP9_COMMON *cm, MACROBLOCKD *xd, |
+ vp9_reader *r, BLOCK_SIZE_TYPE bsize) { |
+ const int context = vp9_get_pred_context(cm, xd, PRED_TX_SIZE); |
+ const vp9_prob *tx_probs = vp9_get_pred_probs(cm, xd, PRED_TX_SIZE); |
+ TX_SIZE txfm_size = vp9_read(r, tx_probs[0]); |
+ if (txfm_size != TX_4X4 && bsize >= BLOCK_SIZE_MB16X16) { |
+ txfm_size += vp9_read(r, tx_probs[1]); |
+ if (txfm_size != TX_8X8 && bsize >= BLOCK_SIZE_SB32X32) |
+ txfm_size += vp9_read(r, tx_probs[2]); |
+ } |
+ |
+ if (bsize >= BLOCK_SIZE_SB32X32) |
+ cm->fc.tx_count_32x32p[context][txfm_size]++; |
+ else if (bsize >= BLOCK_SIZE_MB16X16) |
+ cm->fc.tx_count_16x16p[context][txfm_size]++; |
+ else |
+ cm->fc.tx_count_8x8p[context][txfm_size]++; |
+ |
+ return txfm_size; |
+} |
+ |
+static TX_SIZE get_txfm_size(VP9D_COMP *pbi, TXFM_MODE txfm_mode, |
+ BLOCK_SIZE_TYPE bsize, int select_cond, |
+ vp9_reader *r) { |
+ VP9_COMMON *const cm = &pbi->common; |
+ MACROBLOCKD *const xd = &pbi->mb; |
+ |
+ if (txfm_mode == TX_MODE_SELECT && bsize >= BLOCK_SIZE_SB8X8 && select_cond) |
+ return select_txfm_size(cm, xd, r, bsize); |
+ else if (txfm_mode >= ALLOW_32X32 && bsize >= BLOCK_SIZE_SB32X32) |
+ return TX_32X32; |
+ else if (txfm_mode >= ALLOW_16X16 && bsize >= BLOCK_SIZE_MB16X16) |
+ return TX_16X16; |
+ else if (txfm_mode >= ALLOW_8X8 && bsize >= BLOCK_SIZE_SB8X8) |
+ return TX_8X8; |
+ else |
+ return TX_4X4; |
+} |
+ |
static void set_segment_id(VP9_COMMON *cm, MB_MODE_INFO *mbmi, |
int mi_row, int mi_col, int segment_id) { |
const int mi_index = mi_row * cm->mi_cols + mi_col; |
@@ -63,27 +102,6 @@ |
} |
} |
-static TX_SIZE select_txfm_size(VP9_COMMON *cm, MACROBLOCKD *xd, |
- vp9_reader *r, BLOCK_SIZE_TYPE bsize) { |
- const int context = vp9_get_pred_context(cm, xd, PRED_TX_SIZE); |
- const vp9_prob *tx_probs = vp9_get_pred_probs(cm, xd, PRED_TX_SIZE); |
- TX_SIZE txfm_size = vp9_read(r, tx_probs[0]); |
- if (txfm_size != TX_4X4 && bsize >= BLOCK_SIZE_MB16X16) { |
- txfm_size += vp9_read(r, tx_probs[1]); |
- if (txfm_size != TX_8X8 && bsize >= BLOCK_SIZE_SB32X32) |
- txfm_size += vp9_read(r, tx_probs[2]); |
- } |
- if (bsize >= BLOCK_SIZE_SB32X32) { |
- cm->fc.tx_count_32x32p[context][txfm_size]++; |
- } else if (bsize >= BLOCK_SIZE_MB16X16) { |
- cm->fc.tx_count_16x16p[context][txfm_size]++; |
- } else { |
- cm->fc.tx_count_8x8p[context][txfm_size]++; |
- } |
- return txfm_size; |
-} |
- |
- |
static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, |
int mi_row, int mi_col, |
vp9_reader *r) { |
@@ -106,21 +124,8 @@ |
[m->mbmi.mb_skip_coeff]++; |
} |
- if (cm->txfm_mode == TX_MODE_SELECT && |
- m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) { |
- m->mbmi.txfm_size = select_txfm_size(cm, xd, r, m->mbmi.sb_type); |
- } else if (cm->txfm_mode >= ALLOW_32X32 && |
- m->mbmi.sb_type >= BLOCK_SIZE_SB32X32) { |
- m->mbmi.txfm_size = TX_32X32; |
- } else if (cm->txfm_mode >= ALLOW_16X16 && |
- m->mbmi.sb_type >= BLOCK_SIZE_MB16X16) { |
- m->mbmi.txfm_size = TX_16X16; |
- } else if (cm->txfm_mode >= ALLOW_8X8 && |
- m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) { |
- m->mbmi.txfm_size = TX_8X8; |
- } else { |
- m->mbmi.txfm_size = TX_4X4; |
- } |
+ m->mbmi.txfm_size = get_txfm_size(pbi, cm->txfm_mode, m->mbmi.sb_type, |
+ 1, r); |
// luma mode |
m->mbmi.ref_frame[0] = INTRA_FRAME; |
@@ -303,28 +308,22 @@ |
}; |
#endif |
-static void read_switchable_interp_probs(VP9_COMMON* const cm, vp9_reader *r) { |
+static void read_switchable_interp_probs(FRAME_CONTEXT *fc, vp9_reader *r) { |
int i, j; |
- for (j = 0; j <= VP9_SWITCHABLE_FILTERS; ++j) |
- for (i = 0; i < VP9_SWITCHABLE_FILTERS - 1; ++i) { |
- if (vp9_read(r, VP9_MODE_UPDATE_PROB)) { |
- cm->fc.switchable_interp_prob[j][i] = |
- // vp9_read_prob(r); |
- vp9_read_prob_diff_update(r, cm->fc.switchable_interp_prob[j][i]); |
- } |
- } |
+ for (j = 0; j < VP9_SWITCHABLE_FILTERS + 1; ++j) |
+ for (i = 0; i < VP9_SWITCHABLE_FILTERS - 1; ++i) |
+ if (vp9_read(r, VP9_MODE_UPDATE_PROB)) |
+ fc->switchable_interp_prob[j][i] = vp9_read_prob_diff_update(r, |
+ fc->switchable_interp_prob[j][i]); |
} |
-static void read_inter_mode_probs(VP9_COMMON *const cm, vp9_reader *r) { |
+static void read_inter_mode_probs(FRAME_CONTEXT *fc, vp9_reader *r) { |
int i, j; |
for (i = 0; i < INTER_MODE_CONTEXTS; ++i) |
- for (j = 0; j < VP9_INTER_MODES - 1; ++j) { |
- if (vp9_read(r, VP9_MODE_UPDATE_PROB)) { |
- // cm->fc.inter_mode_probs[i][j] = vp9_read_prob(r); |
- cm->fc.inter_mode_probs[i][j] = |
- vp9_read_prob_diff_update(r, cm->fc.inter_mode_probs[i][j]); |
- } |
- } |
+ for (j = 0; j < VP9_INTER_MODES - 1; ++j) |
+ if (vp9_read(r, VP9_MODE_UPDATE_PROB)) |
+ fc->inter_mode_probs[i][j] = vp9_read_prob_diff_update(r, |
+ fc->inter_mode_probs[i][j]); |
} |
static INLINE COMPPREDMODE_TYPE read_comp_pred_mode(vp9_reader *r) { |
@@ -337,21 +336,20 @@ |
static void mb_mode_mv_init(VP9D_COMP *pbi, vp9_reader *r) { |
VP9_COMMON *const cm = &pbi->common; |
- if ((cm->frame_type != KEY_FRAME) && (!cm->intra_only)) { |
+ if (cm->frame_type != KEY_FRAME && !cm->intra_only) { |
nmv_context *const nmvc = &pbi->common.fc.nmvc; |
MACROBLOCKD *const xd = &pbi->mb; |
int i, j; |
- read_inter_mode_probs(cm, r); |
+ read_inter_mode_probs(&cm->fc, r); |
if (cm->mcomp_filter_type == SWITCHABLE) |
- read_switchable_interp_probs(cm, r); |
+ read_switchable_interp_probs(&cm->fc, r); |
- for (i = 0; i < INTRA_INTER_CONTEXTS; i++) { |
+ for (i = 0; i < INTRA_INTER_CONTEXTS; i++) |
if (vp9_read(r, VP9_MODE_UPDATE_PROB)) |
cm->fc.intra_inter_prob[i] = |
vp9_read_prob_diff_update(r, cm->fc.intra_inter_prob[i]); |
- } |
if (cm->allow_comp_inter_inter) { |
cm->comp_pred_mode = read_comp_pred_mode(r); |
@@ -461,7 +459,7 @@ |
const MV_JOINT_TYPE j = treed_read(r, vp9_mv_joint_tree, ctx->joints); |
MV diff = {0, 0}; |
- usehp = usehp && vp9_use_nmv_hp(ref); |
+ usehp = usehp && vp9_use_mv_hp(ref); |
if (mv_joint_vertical(j)) |
diff.row = read_mv_component(r, &ctx->comps[0], usehp); |
@@ -476,27 +474,80 @@ |
static INLINE INTERPOLATIONFILTERTYPE read_switchable_filter_type( |
VP9D_COMP *pbi, vp9_reader *r) { |
- const int index = treed_read(r, vp9_switchable_interp_tree, |
- vp9_get_pred_probs(&pbi->common, &pbi->mb, |
- PRED_SWITCHABLE_INTERP)); |
- ++pbi->common.fc.switchable_interp_count |
- [vp9_get_pred_context( |
- &pbi->common, &pbi->mb, PRED_SWITCHABLE_INTERP)][index]; |
+ VP9_COMMON *const cm = &pbi->common; |
+ MACROBLOCKD *const xd = &pbi->mb; |
+ const vp9_prob *probs = vp9_get_pred_probs(cm, xd, PRED_SWITCHABLE_INTERP); |
+ const int index = treed_read(r, vp9_switchable_interp_tree, probs); |
+ const int ctx = vp9_get_pred_context(cm, xd, PRED_SWITCHABLE_INTERP); |
+ ++cm->fc.switchable_interp_count[ctx][index]; |
return vp9_switchable_interp[index]; |
} |
+static void read_intra_block_modes(VP9D_COMP *pbi, MODE_INFO *mi, |
+ MB_MODE_INFO *mbmi, vp9_reader *r) { |
+ VP9_COMMON *const cm = &pbi->common; |
+ MACROBLOCKD *const xd = &pbi->mb; |
+ const BLOCK_SIZE_TYPE bsize = mi->mbmi.sb_type; |
+ const int bw = 1 << b_width_log2(bsize); |
+ const int bh = 1 << b_height_log2(bsize); |
+ |
+ if (bsize >= BLOCK_SIZE_SB8X8) { |
+ const BLOCK_SIZE_TYPE bsize = xd->mode_info_context->mbmi.sb_type; |
+ const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize); |
+ const int bsl = MIN(bwl, bhl); |
+ mbmi->mode = read_intra_mode(r, cm->fc.y_mode_prob[MIN(3, bsl)]); |
+ cm->fc.y_mode_counts[MIN(3, bsl)][mbmi->mode]++; |
+ } else { |
+ int idx, idy; |
+ for (idy = 0; idy < 2; idy += bh) { |
+ for (idx = 0; idx < 2; idx += bw) { |
+ int ib = idy * 2 + idx, k; |
+ int m = read_intra_mode(r, cm->fc.y_mode_prob[0]); |
+ mi->bmi[ib].as_mode.first = m; |
+ cm->fc.y_mode_counts[0][m]++; |
+ for (k = 1; k < bh; ++k) |
+ mi->bmi[ib + k * 2].as_mode.first = m; |
+ for (k = 1; k < bw; ++k) |
+ mi->bmi[ib + k].as_mode.first = m; |
+ } |
+ } |
+ mbmi->mode = mi->bmi[3].as_mode.first; |
+ } |
+ |
+ mbmi->uv_mode = read_intra_mode(r, cm->fc.uv_mode_prob[mbmi->mode]); |
+ cm->fc.uv_mode_counts[mbmi->mode][mbmi->uv_mode]++; |
+} |
+ |
+static MV_REFERENCE_FRAME read_reference_frame(VP9D_COMP *pbi, int segment_id, |
+ vp9_reader *r) { |
+ VP9_COMMON *const cm = &pbi->common; |
+ MACROBLOCKD *const xd = &pbi->mb; |
+ |
+ MV_REFERENCE_FRAME ref; |
+ if (!vp9_segfeature_active(xd, segment_id, SEG_LVL_REF_FRAME)) { |
+ const int ctx = vp9_get_pred_context(cm, xd, PRED_INTRA_INTER); |
+ ref = (MV_REFERENCE_FRAME) |
+ vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_INTRA_INTER)); |
+ cm->fc.intra_inter_count[ctx][ref != INTRA_FRAME]++; |
+ } else { |
+ ref = (MV_REFERENCE_FRAME) |
+ vp9_get_segdata(xd, segment_id, SEG_LVL_REF_FRAME) != INTRA_FRAME; |
+ } |
+ return ref; |
+} |
+ |
static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, |
int mi_row, int mi_col, |
vp9_reader *r) { |
VP9_COMMON *const cm = &pbi->common; |
+ MACROBLOCKD *const xd = &pbi->mb; |
nmv_context *const nmvc = &cm->fc.nmvc; |
- MACROBLOCKD *const xd = &pbi->mb; |
int_mv *const mv0 = &mbmi->mv[0]; |
int_mv *const mv1 = &mbmi->mv[1]; |
- BLOCK_SIZE_TYPE bsize = mi->mbmi.sb_type; |
- int bw = 1 << b_width_log2(bsize); |
- int bh = 1 << b_height_log2(bsize); |
+ const BLOCK_SIZE_TYPE bsize = mi->mbmi.sb_type; |
+ const int bw = 1 << b_width_log2(bsize); |
+ const int bh = 1 << b_height_log2(bsize); |
int mb_to_left_edge, mb_to_right_edge, mb_to_top_edge, mb_to_bottom_edge; |
int j, idx, idy; |
@@ -529,38 +580,15 @@ |
[mbmi->mb_skip_coeff]++; |
} |
- // Read the reference frame |
- if (!vp9_segfeature_active(xd, mbmi->segment_id, SEG_LVL_REF_FRAME)) { |
- mbmi->ref_frame[0] = |
- vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_INTRA_INTER)); |
- cm->fc.intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)] |
- [mbmi->ref_frame[0] != INTRA_FRAME]++; |
- } else { |
- mbmi->ref_frame[0] = |
- vp9_get_segdata(xd, mbmi->segment_id, SEG_LVL_REF_FRAME) != INTRA_FRAME; |
- } |
+ mbmi->ref_frame[0] = read_reference_frame(pbi, mbmi->segment_id, r); |
+ mbmi->txfm_size = get_txfm_size(pbi, cm->txfm_mode, bsize, |
+ (mbmi->mb_skip_coeff == 0 || mbmi->ref_frame[0] == INTRA_FRAME), r); |
- if (cm->txfm_mode == TX_MODE_SELECT && |
- (mbmi->mb_skip_coeff == 0 || mbmi->ref_frame[0] == INTRA_FRAME) && |
- bsize >= BLOCK_SIZE_SB8X8) { |
- mbmi->txfm_size = select_txfm_size(cm, xd, r, bsize); |
- } else if (bsize >= BLOCK_SIZE_SB32X32 && |
- cm->txfm_mode >= ALLOW_32X32) { |
- mbmi->txfm_size = TX_32X32; |
- } else if (cm->txfm_mode >= ALLOW_16X16 && |
- bsize >= BLOCK_SIZE_MB16X16) { |
- mbmi->txfm_size = TX_16X16; |
- } else if (cm->txfm_mode >= ALLOW_8X8 && (bsize >= BLOCK_SIZE_SB8X8)) { |
- mbmi->txfm_size = TX_8X8; |
- } else { |
- mbmi->txfm_size = TX_4X4; |
- } |
- |
// If reference frame is an Inter frame |
if (mbmi->ref_frame[0] != INTRA_FRAME) { |
int_mv nearest, nearby, best_mv; |
int_mv nearest_second, nearby_second, best_mv_second; |
- vp9_prob mv_ref_p[VP9_INTER_MODES - 1]; |
+ vp9_prob *mv_ref_p; |
read_ref_frame(pbi, r, mbmi->segment_id, mbmi->ref_frame); |
@@ -574,7 +602,8 @@ |
mbmi->ref_frame[0], mbmi->ref_mvs[mbmi->ref_frame[0]], |
cm->ref_frame_sign_bias); |
- vp9_mv_ref_probs(cm, mv_ref_p, mbmi->mb_mode_context[mbmi->ref_frame[0]]); |
+ mv_ref_p = cm->fc.inter_mode_probs[ |
+ mbmi->mb_mode_context[mbmi->ref_frame[0]]]; |
// If the segment level skip mode enabled |
if (vp9_segfeature_active(xd, mbmi->segment_id, SEG_LVL_SKIP)) { |
@@ -744,34 +773,8 @@ |
} |
} |
} else { |
- // required for left and above block mv |
- mv0->as_int = 0; |
- |
- if (bsize >= BLOCK_SIZE_SB8X8) { |
- const BLOCK_SIZE_TYPE bsize = xd->mode_info_context->mbmi.sb_type; |
- const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize); |
- const int bsl = MIN(bwl, bhl); |
- mbmi->mode = read_intra_mode(r, cm->fc.y_mode_prob[MIN(3, bsl)]); |
- cm->fc.y_mode_counts[MIN(3, bsl)][mbmi->mode]++; |
- } else { |
- int idx, idy; |
- for (idy = 0; idy < 2; idy += bh) { |
- for (idx = 0; idx < 2; idx += bw) { |
- int ib = idy * 2 + idx, k; |
- int m = read_intra_mode(r, cm->fc.y_mode_prob[0]); |
- mi->bmi[ib].as_mode.first = m; |
- cm->fc.y_mode_counts[0][m]++; |
- for (k = 1; k < bh; ++k) |
- mi->bmi[ib + k * 2].as_mode.first = m; |
- for (k = 1; k < bw; ++k) |
- mi->bmi[ib + k].as_mode.first = m; |
- } |
- } |
- mbmi->mode = mi->bmi[3].as_mode.first; |
- } |
- |
- mbmi->uv_mode = read_intra_mode(r, cm->fc.uv_mode_prob[mbmi->mode]); |
- cm->fc.uv_mode_counts[mbmi->mode][mbmi->uv_mode]++; |
+ mv0->as_int = 0; // required for left and above block mv |
+ read_intra_block_modes(pbi, mi, mbmi, r); |
} |
} |
@@ -781,13 +784,10 @@ |
// TODO(jkoleszar): does this clear more than MBSKIP_CONTEXTS? Maybe remove. |
// vpx_memset(cm->fc.mbskip_probs, 0, sizeof(cm->fc.mbskip_probs)); |
- for (k = 0; k < MBSKIP_CONTEXTS; ++k) { |
- if (vp9_read(r, VP9_MODE_UPDATE_PROB)) { |
+ for (k = 0; k < MBSKIP_CONTEXTS; ++k) |
+ if (vp9_read(r, VP9_MODE_UPDATE_PROB)) |
cm->fc.mbskip_probs[k] = |
vp9_read_prob_diff_update(r, cm->fc.mbskip_probs[k]); |
- } |
- // cm->fc.mbskip_probs[k] = vp9_read_prob(r); |
- } |
mb_mode_mv_init(pbi, r); |
} |
@@ -801,7 +801,7 @@ |
MODE_INFO *mi = xd->mode_info_context; |
MB_MODE_INFO *const mbmi = &mi->mbmi; |
- if ((cm->frame_type == KEY_FRAME) || cm->intra_only) { |
+ if (cm->frame_type == KEY_FRAME || cm->intra_only) { |
kfread_modes(pbi, mi, mi_row, mi_col, r); |
} else { |
read_mb_modes_mv(pbi, mi, &mi->mbmi, mi_row, mi_col, r); |