ref: ac2ab02dcfc52a3cf97dde620c65a698b5fd376b
parent: 5883246d0105e0a616a80c4c841487563b2ab6bc
author: Paul Wilkins <paulwilkins@google.com>
date: Thu Nov 3 13:45:27 EDT 2011
Segmentation feature logic fix. Bug fix to logic in vp8_pick_inter_mode() and vp8_rd_pick_inter_mode(). The block on the use of segment features for the cm->refresh_alt_ref_frame case was just for testing and is not correct. The special case code for alt ref can be re-enabled as an else clause. Change-Id: Ic9b57cdb5f04ea7737032b8fb953d84d7717b3ce
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -428,6 +428,8 @@
int bestsme;
//int all_rds[MAX_MODES]; // Experimental debug code.
int best_mode_index = 0;
+ unsigned char segment_id = xd->mode_info_context->mbmi.segment_id;
+
unsigned int sse = INT_MAX, best_sse = INT_MAX;
int_mv mvp;
@@ -521,39 +523,40 @@
this_mode = vp8_mode_order[mode_index];
//#if CONFIG_SEGFEATURES
- // Experimental use of Segment features.
- if ( xd->segmentation_enabled && !cm->refresh_alt_ref_frame )
+ // If the segment reference frame feature is enabled....
+ // then do nothing if the current ref frame is not allowed..
+ if ( segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) &&
+ !check_segref( xd, segment_id,
+ xd->mode_info_context->mbmi.ref_frame ) )
{
- unsigned char segment_id = xd->mode_info_context->mbmi.segment_id;
-
- // If the segment reference frame feature is enabled....
- // then do nothing if the current ref frame is not allowed..
- if ( segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) &&
- !check_segref( xd, segment_id,
- xd->mode_info_context->mbmi.ref_frame ) )
- {
- continue;
- }
- if ( segfeature_active( xd, segment_id, SEG_LVL_MODE ) &&
- ( this_mode !=
- get_segdata( xd, segment_id, SEG_LVL_MODE ) ) )
- {
- continue;
- }
+ continue;
}
-
+ // If the segment mode feature is enabled....
+ // then do nothing if the current mode is not allowed..
+ else if ( segfeature_active( xd, segment_id, SEG_LVL_MODE ) &&
+ ( this_mode !=
+ get_segdata( xd, segment_id, SEG_LVL_MODE ) ) )
+ {
+ continue;
+ }
//#if !CONFIG_SEGFEATURES
- /* TBD PGW
- // Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
- // unless ARNR filtering is enabled in which case we want
- // an unfiltered alternative
- if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
+ // Disable this drop out case if either the mode or ref frame
+ // segment level feature is enabled for this segment. This is to
+ // prevent the possibility that the we end up unable to pick any mode.
+ else if ( !segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) &&
+ !segfeature_active( xd, segment_id, SEG_LVL_MODE ) )
{
- if (this_mode != ZEROMV ||
- x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME)
- continue;
+ // Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
+ // unless ARNR filtering is enabled in which case we want
+ // an unfiltered alternative
+ if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
+ {
+ if (this_mode != ZEROMV ||
+ x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME)
+ continue;
+ }
}
-*/
+
// We have now reached the point where we are going to test the current mode so increment the counter for the number of times it has been tested
cpi->mode_test_hit_counts[mode_index] ++;
@@ -875,7 +878,14 @@
cpi->error_bins[this_rdbin] ++;
}
- if (cpi->is_src_frame_alt_ref &&
+ // This code force Altref,0,0 and skip for the frame that overlays a
+ // an alrtef unless Altref is filtered. However, this is unsafe if
+ // segment level coding of ref frame or mode is enabled for this
+ // segment.
+ if (!segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) &&
+ !segfeature_active( xd, segment_id, SEG_LVL_MODE ) &&
+ cpi->is_src_frame_alt_ref &&
+ (cpi->oxcf.arnr_max_frames == 0) &&
(best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME))
{
x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -2010,6 +2010,7 @@
MB_PREDICTION_MODE this_mode;
int num00;
int best_mode_index = 0;
+ unsigned char segment_id = xd->mode_info_context->mbmi.segment_id;
int i;
int mode_index;
@@ -2129,38 +2130,39 @@
x->e_mbd.mode_info_context->mbmi.ref_frame = vp8_ref_frame_order[mode_index];
//#if CONFIG_SEGFEATURES
- // Experimental use of Segment features.
- if ( xd->segmentation_enabled && !cm->refresh_alt_ref_frame )
+ // If the segment reference frame feature is enabled....
+ // then do nothing if the current ref frame is not allowed..
+ if ( segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) &&
+ !check_segref( xd, segment_id,
+ xd->mode_info_context->mbmi.ref_frame ) )
{
- unsigned char segment_id = xd->mode_info_context->mbmi.segment_id;
-
- // If the segment reference frame feature is enabled....
- // then do nothing if the current ref frame is not allowed..
- if ( segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) &&
- !check_segref( xd, segment_id,
- xd->mode_info_context->mbmi.ref_frame ) )
- {
- continue;
- }
- if ( segfeature_active( xd, segment_id, SEG_LVL_MODE ) &&
- ( this_mode !=
- get_segdata( xd, segment_id, SEG_LVL_MODE ) ) )
- {
- continue;
- }
+ continue;
}
+ // If the segment mode feature is enabled....
+ // then do nothing if the current mode is not allowed..
+ else if ( segfeature_active( xd, segment_id, SEG_LVL_MODE ) &&
+ ( this_mode !=
+ get_segdata( xd, segment_id, SEG_LVL_MODE ) ) )
+ {
+ continue;
+ }
//#if !CONFIG_SEGFEATURES
- // TBD PGW
- /*
- // Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
- // unless ARNR filtering is enabled in which case we want
- // an unfiltered alternative
- if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
+ // Disable this drop out case if either the mode or ref frame
+ // segment level feature is enabled for this segment. This is to
+ // prevent the possibility that the we end up unable to pick any mode.
+ else if ( !segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) &&
+ !segfeature_active( xd, segment_id, SEG_LVL_MODE ) )
{
- if (this_mode != ZEROMV ||
- x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME)
- continue;
- }*/
+ // Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
+ // unless ARNR filtering is enabled in which case we want
+ // an unfiltered alternative
+ if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
+ {
+ if (this_mode != ZEROMV ||
+ x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME)
+ continue;
+ }
+ }
/* everything but intra */
if (x->e_mbd.mode_info_context->mbmi.ref_frame)
@@ -2650,8 +2652,14 @@
// Note how often each mode chosen as best
cpi->mode_chosen_counts[best_mode_index] ++;
-
- if (cpi->is_src_frame_alt_ref &&
+ // This code force Altref,0,0 and skip for the frame that overlays a
+ // an alrtef unless Altref is filtered. However, this is unsafe if
+ // segment level coding of ref frame or mode is enabled for this
+ // segment.
+ if (!segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) &&
+ !segfeature_active( xd, segment_id, SEG_LVL_MODE ) &&
+ cpi->is_src_frame_alt_ref &&
+ (cpi->oxcf.arnr_max_frames == 0) &&
(best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME))
{
x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;