Merge "Preparation to new frame size encoding." into experimental
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h
index 4b06a61..52b736b 100644
--- a/vp9/common/vp9_blockd.h
+++ b/vp9/common/vp9_blockd.h
@@ -327,7 +327,7 @@
vp9_prob mb_segment_tree_probs[MB_SEG_TREE_PROBS];
// Segment features
- signed char segment_feature_data[MAX_MB_SEGMENTS][SEG_LVL_MAX];
+ int16_t segment_feature_data[MAX_MB_SEGMENTS][SEG_LVL_MAX];
unsigned int segment_feature_mask[MAX_MB_SEGMENTS];
/* mode_based Loop filter adjustment */
diff --git a/vp9/common/vp9_mvref_common.c b/vp9/common/vp9_mvref_common.c
index 0a829d2..4878cbe 100644
--- a/vp9/common/vp9_mvref_common.c
+++ b/vp9/common/vp9_mvref_common.c
@@ -161,42 +161,10 @@
vpx_memset(mv_ref_list, 0, sizeof(int_mv) * MAX_MV_REF_CANDIDATES);
vpx_memset(candidate_scores, 0, sizeof(candidate_scores));
- if (xd->mb_to_right_edge < 0 || xd->mb_to_bottom_edge < 0) {
- int pixels_wide = 4 * b_width_log2(mbmi->sb_type);
- int pixels_high = 4 * b_height_log2(mbmi->sb_type);
- int pixels_square = 0;
-
- if (xd->mb_to_right_edge < 0)
- pixels_wide += (xd->mb_to_right_edge >> 3);
-
- if (xd->mb_to_bottom_edge < 0)
- pixels_high += (xd->mb_to_bottom_edge >> 3);
-
- if ( pixels_wide < pixels_high )
- pixels_square = pixels_wide;
- else
- pixels_square = pixels_high;
-
- if (pixels_square == 64) {
- mv_ref_search = mv_ref_blocks[BLOCK_SIZE_SB64X64];
- } else if (pixels_square == 32) {
- mv_ref_search = mv_ref_blocks[BLOCK_SIZE_SB32X32];
- } else if (pixels_square == 16) {
- mv_ref_search = mv_ref_blocks[BLOCK_SIZE_MB16X16];
- } else {
- mv_ref_search = mv_ref_blocks[BLOCK_SIZE_SB8X8];
- if (mbmi->sb_type < BLOCK_SIZE_SB8X8) {
- x_idx = block_idx & 1;
- y_idx = block_idx >> 1;
- }
- }
- }
- else {
mv_ref_search = mv_ref_blocks[mbmi->sb_type];
- if (mbmi->sb_type < BLOCK_SIZE_SB8X8) {
- x_idx = block_idx & 1;
- y_idx = block_idx >> 1;
- }
+ if (mbmi->sb_type < BLOCK_SIZE_SB8X8) {
+ x_idx = block_idx & 1;
+ y_idx = block_idx >> 1;
}
// We first scan for candidate vectors that match the current reference frame
@@ -205,7 +173,8 @@
const int mi_search_col = mi_col + mv_ref_search[i][0];
if ((mi_search_col >= cm->cur_tile_mi_col_start) &&
(mi_search_col < cm->cur_tile_mi_col_end) &&
- ((mv_ref_search[i][1] << 6) >= xd->mb_to_top_edge)) {
+ ((mv_ref_search[i][1] << 6) >= xd->mb_to_top_edge) &&
+ ((-mv_ref_search[i][1] << 6) <= xd->mb_to_bottom_edge)) {
int b;
candidate_mi = here + mv_ref_search[i][0] +
@@ -240,7 +209,8 @@
if ((mi_search_col >= cm->cur_tile_mi_col_start) &&
(mi_search_col < cm->cur_tile_mi_col_end) &&
- ((mv_ref_search[i][1] << 6) >= xd->mb_to_top_edge)) {
+ ((mv_ref_search[i][1] << 6) >= xd->mb_to_top_edge) &&
+ ((-mv_ref_search[i][1] << 6) <= xd->mb_to_bottom_edge)) {
candidate_mi = here + mv_ref_search[i][0] +
(mv_ref_search[i][1] * xd->mode_info_stride);
@@ -270,7 +240,8 @@
if ((mi_search_col >= cm->cur_tile_mi_col_start) &&
(mi_search_col < cm->cur_tile_mi_col_end) &&
- ((mv_ref_search[i][1] << 6) >= xd->mb_to_top_edge)) {
+ ((mv_ref_search[i][1] << 6) >= xd->mb_to_top_edge) &&
+ ((-mv_ref_search[i][1] << 6) <= xd->mb_to_bottom_edge)) {
candidate_mi = here + mv_ref_search[i][0] +
(mv_ref_search[i][1] * xd->mode_info_stride);
diff --git a/vp9/common/vp9_seg_common.c b/vp9/common/vp9_seg_common.c
index 890dcce..df7747c 100644
--- a/vp9/common/vp9_seg_common.c
+++ b/vp9/common/vp9_seg_common.c
@@ -13,7 +13,7 @@
#include "vp9/common/vp9_seg_common.h"
static const int seg_feature_data_signed[SEG_LVL_MAX] = { 1, 1, 0, 0 };
-static const int seg_feature_data_max[SEG_LVL_MAX] = { MAXQ, 63, 15, 0 };
+static const int seg_feature_data_max[SEG_LVL_MAX] = { MAXQ, 63, 3, 0 };
// These functions provide access to new segment level features.
// Eventually these function may be "optimized out" but for the moment,
@@ -70,21 +70,6 @@
return xd->segment_feature_data[segment_id][feature_id];
}
-void vp9_clear_segref(MACROBLOCKD *xd, int segment_id) {
- xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME] = 0;
-}
-
-void vp9_set_segref(MACROBLOCKD *xd, int segment_id,
- MV_REFERENCE_FRAME ref_frame) {
- xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME] |= 1 << ref_frame;
-}
-
-int vp9_check_segref(const MACROBLOCKD *xd, int segment_id,
- MV_REFERENCE_FRAME ref_frame) {
- return (xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME] &
- (1 << ref_frame)) ? 1 : 0;
-}
-
const vp9_tree_index vp9_segment_tree[14] = {
2, 4, 6, 8, 10, 12,
diff --git a/vp9/common/vp9_seg_common.h b/vp9/common/vp9_seg_common.h
index c424a57..74ba03c 100644
--- a/vp9/common/vp9_seg_common.h
+++ b/vp9/common/vp9_seg_common.h
@@ -45,16 +45,6 @@
int segment_id,
SEG_LVL_FEATURES feature_id);
-void vp9_clear_segref(MACROBLOCKD *xd, int segment_id);
-
-void vp9_set_segref(MACROBLOCKD *xd,
- int segment_id,
- MV_REFERENCE_FRAME ref_frame);
-
-int vp9_check_segref(const MACROBLOCKD *xd,
- int segment_id,
- MV_REFERENCE_FRAME ref_frame);
-
extern const vp9_tree_index vp9_segment_tree[14];
#endif // VP9_COMMON_VP9_SEG_COMMON_H_
diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c
index cb16ccd..82ea7dc 100644
--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -241,22 +241,11 @@
int segment_id, MV_REFERENCE_FRAME ref_frame[2]) {
VP9_COMMON *const cm = &pbi->common;
MACROBLOCKD *const xd = &pbi->mb;
- int seg_ref_count = 0;
const int seg_ref_active = vp9_segfeature_active(xd, segment_id,
SEG_LVL_REF_FRAME);
- const int intra = vp9_check_segref(xd, segment_id, INTRA_FRAME);
- const int last = vp9_check_segref(xd, segment_id, LAST_FRAME);
- const int golden = vp9_check_segref(xd, segment_id, GOLDEN_FRAME);
- const int altref = vp9_check_segref(xd, segment_id, ALTREF_FRAME);
- // If segment coding enabled does the segment allow for more than one
- // possible reference frame
- if (seg_ref_active)
- seg_ref_count = intra + last + golden + altref;
-
- // Segment reference frame features not available or allows for
- // multiple reference frame options
- if (!seg_ref_active || seg_ref_count > 1) {
+ // Segment reference frame features not available.
+ if (!seg_ref_active) {
int is_comp;
int comp_ctx = vp9_get_pred_context(cm, xd, PRED_COMP_INTER_INTER);
@@ -291,7 +280,7 @@
}
}
} else {
- ref_frame[0] = last ? LAST_FRAME : golden ? GOLDEN_FRAME : ALTREF_FRAME;
+ ref_frame[0] = vp9_get_segdata(xd, segment_id, SEG_LVL_REF_FRAME);
ref_frame[1] = NONE;
}
}
@@ -536,9 +525,15 @@
mbmi->mb_skip_coeff = vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_MBSKIP));
// Read the reference 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]++;
+ 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;
+ }
if (cm->txfm_mode == TX_MODE_SELECT &&
(mbmi->mb_skip_coeff == 0 || mbmi->ref_frame[0] == INTRA_FRAME) &&
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c
index 3ab55fb..8d5dc28 100644
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -483,18 +483,9 @@
const int segment_id = mi->segment_id;
int seg_ref_active = vp9_segfeature_active(xd, segment_id,
SEG_LVL_REF_FRAME);
- int seg_ref_count = 0;
-
- if (seg_ref_active) {
- seg_ref_count = vp9_check_segref(xd, segment_id, INTRA_FRAME) +
- vp9_check_segref(xd, segment_id, LAST_FRAME) +
- vp9_check_segref(xd, segment_id, GOLDEN_FRAME) +
- vp9_check_segref(xd, segment_id, ALTREF_FRAME);
- }
-
// If segment level coding of this signal is disabled...
// or the segment allows multiple reference frame options
- if (!seg_ref_active || (seg_ref_count > 1)) {
+ if (!seg_ref_active) {
// does the feature use compound prediction or not
// (if not specified at the frame/segment level)
if (pc->comp_pred_mode == HYBRID_PREDICTION) {
@@ -517,7 +508,8 @@
}
} else {
assert(mi->ref_frame[1] <= INTRA_FRAME);
- assert(vp9_check_segref(xd, segment_id, mi->ref_frame[0]));
+ assert(vp9_get_segdata(xd, segment_id, SEG_LVL_REF_FRAME) ==
+ mi->ref_frame[0]);
}
// if using the prediction mdoel we have nothing further to do because
@@ -569,7 +561,9 @@
vp9_get_pred_prob(pc, xd, PRED_MBSKIP));
}
- vp9_write(bc, rf != INTRA_FRAME, vp9_get_pred_prob(pc, xd, PRED_INTRA_INTER));
+ if (!vp9_segfeature_active(xd, segment_id, SEG_LVL_REF_FRAME))
+ vp9_write(bc, rf != INTRA_FRAME,
+ vp9_get_pred_prob(pc, xd, PRED_INTRA_INTER));
if (mi->sb_type >= BLOCK_SIZE_SB8X8 && pc->txfm_mode == TX_MODE_SELECT &&
!(rf != INTRA_FRAME &&
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index 8980306..d7810dd 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -575,11 +575,7 @@
if (xd->segmentation_enabled && cpi->seg0_cnt > 0 &&
!vp9_segfeature_active(xd, 0, SEG_LVL_REF_FRAME) &&
- vp9_segfeature_active(xd, 1, SEG_LVL_REF_FRAME) &&
- vp9_check_segref(xd, 1, INTRA_FRAME) +
- vp9_check_segref(xd, 1, LAST_FRAME) +
- vp9_check_segref(xd, 1, GOLDEN_FRAME) +
- vp9_check_segref(xd, 1, ALTREF_FRAME) == 1) {
+ vp9_segfeature_active(xd, 1, SEG_LVL_REF_FRAME)) {
cpi->seg0_progress = (cpi->seg0_idx << 16) / cpi->seg0_cnt;
} else {
const int y = mb_row & ~3;
@@ -635,23 +631,18 @@
if (cm->frame_type != KEY_FRAME) {
int segment_id, seg_ref_active;
- cpi->intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)]
- [mbmi->ref_frame[0] > INTRA_FRAME]++;
-
- // If we have just a single reference frame coded for a segment then
- // exclude from the reference frame counts used to work out
- // probabilities. NOTE: At the moment we dont support custom trees
- // for the reference frame coding for each segment but this is a
- // possible future action.
segment_id = mbmi->segment_id;
seg_ref_active = vp9_segfeature_active(xd, segment_id,
SEG_LVL_REF_FRAME);
- if (mbmi->ref_frame[0] > INTRA_FRAME &&
- (!seg_ref_active ||
- ((vp9_check_segref(xd, segment_id, INTRA_FRAME) +
- vp9_check_segref(xd, segment_id, LAST_FRAME) +
- vp9_check_segref(xd, segment_id, GOLDEN_FRAME) +
- vp9_check_segref(xd, segment_id, ALTREF_FRAME)) > 1))) {
+
+ if (!seg_ref_active)
+ cpi->intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)]
+ [mbmi->ref_frame[0] > INTRA_FRAME]++;
+
+ // If the segment reference feature is enabled we have only a single
+ // reference frame allowed for the segment so exclude it from
+ // the reference frame counts used to work out probabilities.
+ if ((mbmi->ref_frame[0] > INTRA_FRAME) && !seg_ref_active) {
if (cm->comp_pred_mode == HYBRID_PREDICTION)
cpi->comp_inter_count[vp9_get_pred_context(cm, xd,
PRED_COMP_INTER_INTER)]
@@ -1616,15 +1607,6 @@
int ref_flags = cpi->ref_frame_flags;
if (vp9_segfeature_active(xd, 1, SEG_LVL_REF_FRAME)) {
- if ((ref_flags & (VP9_LAST_FLAG | VP9_GOLD_FLAG)) == (VP9_LAST_FLAG | VP9_GOLD_FLAG) &&
- vp9_check_segref(xd, 1, LAST_FRAME))
- return 1;
- if ((ref_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) == (VP9_GOLD_FLAG | VP9_ALT_FLAG) &&
- vp9_check_segref(xd, 1, GOLDEN_FRAME))
- return 1;
- if ((ref_flags & (VP9_ALT_FLAG | VP9_LAST_FLAG)) == (VP9_ALT_FLAG | VP9_LAST_FLAG) &&
- vp9_check_segref(xd, 1, ALTREF_FRAME))
- return 1;
return 0;
} else {
return (!!(ref_flags & VP9_GOLD_FLAG) +
diff --git a/vp9/encoder/vp9_mbgraph.c b/vp9/encoder/vp9_mbgraph.c
index 7d4906c..80614f5 100644
--- a/vp9/encoder/vp9_mbgraph.c
+++ b/vp9/encoder/vp9_mbgraph.c
@@ -265,6 +265,9 @@
xd->plane[0].pre[0].stride = buf->y_stride;
xd->plane[1].dst.stride = buf->uv_stride;
xd->mode_info_context = &mi_local;
+ mi_local.mbmi.sb_type = BLOCK_SIZE_MB16X16;
+ mi_local.mbmi.ref_frame[0] = LAST_FRAME;
+ mi_local.mbmi.ref_frame[1] = NONE;
for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) {
int_mv arf_left_mv, gld_left_mv;
diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c
index 73220dc..65efb54 100644
--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -405,7 +405,6 @@
qi_delta = compute_qdelta(cpi, cpi->avg_q,
(cpi->avg_q * 1.125));
vp9_set_segdata(xd, 1, SEG_LVL_ALT_Q, (qi_delta + 2));
- vp9_set_segdata(xd, 1, SEG_LVL_ALT_Q, 0);
vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_Q);
vp9_set_segdata(xd, 1, SEG_LVL_ALT_LF, -2);
@@ -413,7 +412,7 @@
// Segment coding disabled for compred testing
if (high_q || (cpi->static_mb_pct == 100)) {
- vp9_set_segref(xd, 1, ALTREF_FRAME);
+ vp9_set_segdata(xd, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
vp9_enable_segfeature(xd, 1, SEG_LVL_REF_FRAME);
vp9_enable_segfeature(xd, 1, SEG_LVL_SKIP);
}
@@ -440,10 +439,10 @@
vp9_enable_segfeature(xd, 1, SEG_LVL_REF_FRAME);
// All mbs should use ALTREF_FRAME
- vp9_clear_segref(xd, 0);
- vp9_set_segref(xd, 0, ALTREF_FRAME);
- vp9_clear_segref(xd, 1);
- vp9_set_segref(xd, 1, ALTREF_FRAME);
+ vp9_clear_segdata(xd, 0, SEG_LVL_REF_FRAME);
+ vp9_set_segdata(xd, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
+ vp9_clear_segdata(xd, 1, SEG_LVL_REF_FRAME);
+ vp9_set_segdata(xd, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
// Skip all MBs if high Q (0,0 mv and skip coeffs)
if (high_q) {
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index 0fea2b9..cb081a3 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -1635,16 +1635,7 @@
MACROBLOCKD *const xd = &cpi->mb.e_mbd;
int seg_ref_active = vp9_segfeature_active(xd, segment_id,
SEG_LVL_REF_FRAME);
- int seg_ref_count = 0;
-
if (seg_ref_active) {
- seg_ref_count = vp9_check_segref(xd, segment_id, INTRA_FRAME) +
- vp9_check_segref(xd, segment_id, LAST_FRAME) +
- vp9_check_segref(xd, segment_id, GOLDEN_FRAME) +
- vp9_check_segref(xd, segment_id, ALTREF_FRAME);
- }
-
- if (seg_ref_active && seg_ref_count == 1) {
vpx_memset(ref_costs_single, 0, MAX_REF_FRAMES * sizeof(*ref_costs_single));
vpx_memset(ref_costs_comp, 0, MAX_REF_FRAMES * sizeof(*ref_costs_comp));
*comp_mode_p = 128;
@@ -2685,7 +2676,7 @@
// If the segment reference frame feature is enabled....
// then do nothing if the current ref frame is not allowed..
if (vp9_segfeature_active(xd, segment_id, SEG_LVL_REF_FRAME) &&
- !vp9_check_segref(xd, segment_id, ref_frame)) {
+ vp9_get_segdata(xd, segment_id, SEG_LVL_REF_FRAME) != (int)ref_frame) {
continue;
// If the segment skip feature is enabled....
// then do nothing if the current mode is not allowed..