Commit 1b103f25 authored by Paul Wilkins's avatar Paul Wilkins

Patch to remove implicit segmentation.

This patch removes the implicit segmentation
experiment from the code base as the benefits
were still unproven as of the bitstream deadline.

Change-Id: I273b99d8d621d1853eac4182f97982cb5957247e
parent 87626a8f
......@@ -238,8 +238,6 @@ HAVE_LIST="
unistd_h
"
EXPERIMENT_LIST="
csm
implicit_segmentation
oneshotq
multiple_arf
non420
......
......@@ -316,10 +316,6 @@ typedef struct macroblockd {
/* 0 (do not update) 1 (update) the macroblock segmentation map. */
unsigned char update_mb_segmentation_map;
#if CONFIG_IMPLICIT_SEGMENTATION
unsigned char allow_implicit_segment_update;
#endif
/* 0 (do not update) 1 (update) the macroblock segmentation feature data. */
unsigned char update_mb_segmentation_data;
......
......@@ -86,85 +86,6 @@ int vp9_check_segref(const MACROBLOCKD *xd, int segment_id,
}
#if CONFIG_IMPLICIT_SEGMENTATION
// This function defines an implicit segmentation for the next frame based
// on predcition and transform decisions in the current frame.
// For test purposes at the moment it uses ref frame and prediction size
void vp9_implicit_segment_map_update(VP9_COMMON * cm) {
int row, col;
MODE_INFO *mi, *mi_ptr = cm->mi;
unsigned char * map_ptr = cm->last_frame_seg_map;
for (row = 0; row < cm->mb_rows; row++) {
mi = mi_ptr;
for (col = 0; col < cm->mb_cols; ++col, ++mi) {
// Inter prediction
if (mi->mbmi.ref_frame != INTRA_FRAME) {
// Zero motion and prediction block size >= 16
if ((mi->mbmi.sb_type >= BLOCK_SIZE_MB16X16) &&
(mi->mbmi.mv[0].as_int == 0))
map_ptr[col] = 1;
else if (mi->mbmi.sb_type >= BLOCK_SIZE_SB32X32)
map_ptr[col] = 2;
else if (mi->mbmi.sb_type >= BLOCK_SIZE_MB16X16)
map_ptr[col] = 3;
else
map_ptr[col] = 6;
// Intra prediction
} else {
if (mi->mbmi.sb_type >= BLOCK_SIZE_SB32X32)
map_ptr[col] = 4;
else if (mi->mbmi.sb_type >= BLOCK_SIZE_MB16X16)
map_ptr[col] = 5;
else
map_ptr[col] = 7;
}
}
mi_ptr += cm->mode_info_stride;
map_ptr += cm->mb_cols;
}
}
// This function defines an implicit segmentation for the next frame based
// on predcition and transform decisions in the current frame.
// For test purposes at the moment only TX size is used.
void vp9_implicit_segment_map_update_tx(VP9_COMMON * cm) {
int row, col;
MODE_INFO *mi, *mi_ptr = cm->mi;
unsigned char * map_ptr = cm->last_frame_seg_map;
for (row = 0; row < cm->mb_rows; row++) {
mi = mi_ptr;
for (col = 0; col < cm->mb_cols; ++col, ++mi) {
// Intra modes
if (mi->mbmi.ref_frame == INTRA_FRAME) {
if (mi->mbmi.txfm_size == TX_4X4)
map_ptr[col] = 7;
else if (mi->mbmi.txfm_size <= TX_16X16)
map_ptr[col] = 5;
else
map_ptr[col] = 4;
} else {
// Inter Modes
if (mi->mbmi.txfm_size == TX_4X4)
map_ptr[col] = 6;
else if (mi->mbmi.txfm_size == TX_8X8)
map_ptr[col] = 3;
else if (mi->mbmi.txfm_size == TX_16X16)
map_ptr[col] = 2;
else
map_ptr[col] = 1;
}
}
mi_ptr += cm->mode_info_stride;
map_ptr += cm->mb_cols;
}
}
#endif
const vp9_tree_index vp9_segment_tree[14] = {
2, 4, 6, 8, 10, 12,
0, -1, -2, -3, -4, -5, -6, -7
......
......@@ -55,11 +55,6 @@ int vp9_check_segref(const MACROBLOCKD *xd,
int segment_id,
MV_REFERENCE_FRAME ref_frame);
#if CONFIG_IMPLICIT_SEGMENTATION
void vp9_implicit_segment_map_update(VP9_COMMON * cm);
#endif
extern const vp9_tree_index vp9_segment_tree[14];
#endif // VP9_COMMON_VP9_SEG_COMMON_H_
......
......@@ -627,9 +627,6 @@ static void setup_segmentation(VP9_COMMON *pc, MACROBLOCKD *xd, vp9_reader *r) {
xd->update_mb_segmentation_map = 0;
xd->update_mb_segmentation_data = 0;
#if CONFIG_IMPLICIT_SEGMENTATION
xd->allow_implicit_segment_update = 0;
#endif
xd->segmentation_enabled = vp9_read_bit(r);
if (!xd->segmentation_enabled)
......@@ -637,9 +634,6 @@ static void setup_segmentation(VP9_COMMON *pc, MACROBLOCKD *xd, vp9_reader *r) {
// Segmentation map update
xd->update_mb_segmentation_map = vp9_read_bit(r);
#if CONFIG_IMPLICIT_SEGMENTATION
xd->allow_implicit_segment_update = vp9_read_bit(r);
#endif
if (xd->update_mb_segmentation_map) {
for (i = 0; i < MB_SEG_TREE_PROBS; i++)
xd->mb_segment_tree_probs[i] = vp9_read_bit(r) ? vp9_read_prob(r)
......@@ -1125,13 +1119,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
}
}
#if CONFIG_IMPLICIT_SEGMENTATION
// If signalled at the frame level apply implicit updates to the segment map.
if (!pc->error_resilient_mode && xd->allow_implicit_segment_update) {
vp9_implicit_segment_map_update(pc);
}
#endif
if (pc->refresh_frame_context)
pc->frame_contexts[pc->frame_context_idx] = pc->fc;
......
......@@ -1408,9 +1408,6 @@ static void encode_segmentation(VP9_COMP *cpi, vp9_writer *w) {
// Segmentation map
vp9_write_bit(w, xd->update_mb_segmentation_map);
#if CONFIG_IMPLICIT_SEGMENTATION
vp9_write_bit(w, xd->allow_implicit_segment_update);
#endif
if (xd->update_mb_segmentation_map) {
// Select the coding strategy (temporal or spatial)
vp9_choose_segmap_coding_method(cpi);
......
......@@ -267,9 +267,6 @@ static void setup_features(VP9_COMP *cpi) {
xd->update_mb_segmentation_map = 0;
xd->update_mb_segmentation_data = 0;
#if CONFIG_IMPLICIT_SEGMENTATION
xd->allow_implicit_segment_update = 0;
#endif
vpx_memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs));
vp9_clearall_segfeatures(xd);
......@@ -355,9 +352,6 @@ static void configure_static_seg_features(VP9_COMP *cpi) {
vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
xd->update_mb_segmentation_map = 0;
xd->update_mb_segmentation_data = 0;
#if CONFIG_IMPLICIT_SEGMENTATION
xd->allow_implicit_segment_update = 0;
#endif
cpi->static_mb_pct = 0;
// Disable segmentation
......@@ -371,9 +365,6 @@ static void configure_static_seg_features(VP9_COMP *cpi) {
vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
xd->update_mb_segmentation_map = 0;
xd->update_mb_segmentation_data = 0;
#if CONFIG_IMPLICIT_SEGMENTATION
xd->allow_implicit_segment_update = 0;
#endif
cpi->static_mb_pct = 0;
// Disable segmentation and individual segment features by default
......@@ -472,53 +463,6 @@ static void configure_static_seg_features(VP9_COMP *cpi) {
}
}
#if CONFIG_IMPLICIT_SEGMENTATION
static double implict_seg_q_modifiers[MAX_MB_SEGMENTS] =
{1.0, 0.95, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
static void configure_implicit_segmentation(VP9_COMP *cpi, int frame_qindex) {
VP9_COMMON *cm = &cpi->common;
MACROBLOCKD *xd = &cpi->mb.e_mbd;
int i;
int qi_delta;
double q_baseline = vp9_convert_qindex_to_q(frame_qindex);
// Set the flags to allow implicit segment update but disallow explicit update
xd->segmentation_enabled = 1;
xd->allow_implicit_segment_update = 1;
xd->update_mb_segmentation_map = 0;
// For key frames clear down the segment map to a default state.
if (cm->frame_type == KEY_FRAME) {
// Clear down the global segmentation map
vpx_memset(cpi->segmentation_map, 0, (cm->mb_rows * cm->mb_cols));
// Clear down the segment features.
vp9_clearall_segfeatures(xd);
xd->update_mb_segmentation_data = 0;
// Update the segment data if it is an arf or non overlay gf.
} else if (cpi->refresh_alt_ref_frame ||
(cpi->refresh_golden_frame && !cpi->is_src_frame_alt_ref)) {
xd->update_mb_segmentation_data = 1;
// Enable use of q deltas on segments 1 and up
// Segment 0 is treated as a neutral segment with no changes
for (i = 1; i < MAX_MB_SEGMENTS; ++i) {
qi_delta = compute_qdelta(cpi, q_baseline,
implict_seg_q_modifiers[i] * q_baseline);
vp9_set_segdata(xd, i, SEG_LVL_ALT_Q, qi_delta);
vp9_enable_segfeature(xd, i, SEG_LVL_ALT_Q);
}
// Where relevant assume segment data is delta data
xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
} else {
xd->update_mb_segmentation_data = 0;
}
}
#endif
#ifdef ENTROPY_STATS
void vp9_update_mode_context_stats(VP9_COMP *cpi) {
VP9_COMMON *cm = &cpi->common;
......@@ -779,12 +723,8 @@ void vp9_set_speed_features(VP9_COMP *cpi) {
#if CONFIG_MULTIPLE_ARF
// Switch segmentation off.
sf->static_segmentation = 0;
#else
#if CONFIG_IMPLICIT_SEGMENTATION
sf->static_segmentation = 0;
#else
sf->static_segmentation = 0;
#endif
#endif
sf->mb16_breakout = 0;
......@@ -797,12 +737,8 @@ void vp9_set_speed_features(VP9_COMP *cpi) {
#if CONFIG_MULTIPLE_ARF
// Switch segmentation off.
sf->static_segmentation = 0;
#else
#if CONFIG_IMPLICIT_SEGMENTATION
sf->static_segmentation = 0;
#else
sf->static_segmentation = 0;
#endif
#endif
sf->mb16_breakout = 0;
......@@ -2928,12 +2864,6 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
}
}
#if CONFIG_IMPLICIT_SEGMENTATION
if (!cm->error_resilient_mode && !cpi->sf.static_segmentation) {
configure_implicit_segmentation(cpi, q);
}
#endif
// transform / motion compensation build reconstruction frame
if (cm->frame_type == KEY_FRAME) {
vp9_default_coef_probs(cm);
......@@ -3180,15 +3110,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
cpi->dummy_packing = 0;
vp9_pack_bitstream(cpi, dest, size);
#if CONFIG_IMPLICIT_SEGMENTATION
// Should we allow implicit update of the segment map.
if (xd->allow_implicit_segment_update && !cm->error_resilient_mode) {
vp9_implicit_segment_map_update(cm);
// or has there been an explicit update
} else if (xd->update_mb_segmentation_map) {
#else
if (xd->update_mb_segmentation_map) {
#endif
update_reference_segmentation_map(cpi);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment