Fix bug in reference frame counting.

vp8_encode_inter_macroblock() is called in both pick_mb_modes() as
well as encode_sb(), thus the number of macroblocks in the counter
were twice as big as actual numbers. This doesn't affect output.

Change-Id: I6de8a996ee44d2f7f2080d8d2177dd7bc6207c93
This commit is contained in:
Ronald S. Bultje 2012-07-16 17:49:37 -07:00
Родитель da8159a479
Коммит cb1e60fb28
1 изменённых файлов: 29 добавлений и 24 удалений

Просмотреть файл

@ -873,6 +873,9 @@ static void encode_sb ( VP8_COMP *cpi,
} }
else else
{ {
unsigned char *segment_id;
int seg_ref_active;
vp8cx_encode_inter_macroblock(cpi, x, tp, vp8cx_encode_inter_macroblock(cpi, x, tp,
recon_yoffset, recon_uvoffset, 1); recon_yoffset, recon_uvoffset, 1);
//Note the encoder may have changed the segment_id //Note the encoder may have changed the segment_id
@ -892,6 +895,32 @@ static void encode_sb ( VP8_COMP *cpi,
#endif #endif
// 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 = &xd->mode_info_context->mbmi.segment_id;
seg_ref_active = segfeature_active( xd, *segment_id, SEG_LVL_REF_FRAME );
if ( !seg_ref_active ||
( ( check_segref( xd, *segment_id, INTRA_FRAME ) +
check_segref( xd, *segment_id, LAST_FRAME ) +
check_segref( xd, *segment_id, GOLDEN_FRAME ) +
check_segref( xd, *segment_id, ALTREF_FRAME ) ) > 1 ) )
{
// TODO this may not be a good idea as it makes sample size small and means
// the predictor functions cannot use data about most likely value only most
// likely unpredicted value.
//#if CONFIG_COMPRED
// // Only update count for incorrectly predicted cases
// if ( !ref_pred_flag )
//#endif
{
cpi->count_mb_ref_frame_usage
[xd->mode_info_context->mbmi.ref_frame]++;
}
}
// Count of last ref frame 0,0 usage // Count of last ref frame 0,0 usage
if ((xd->mode_info_context->mbmi.mode == ZEROMV) && if ((xd->mode_info_context->mbmi.mode == ZEROMV) &&
(xd->mode_info_context->mbmi.ref_frame == LAST_FRAME)) (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME))
@ -1706,30 +1735,6 @@ void vp8cx_encode_inter_macroblock
cpi->t4x4_count++; cpi->t4x4_count++;
} }
// 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.
if ( !seg_ref_active ||
( ( check_segref( xd, *segment_id, INTRA_FRAME ) +
check_segref( xd, *segment_id, LAST_FRAME ) +
check_segref( xd, *segment_id, GOLDEN_FRAME ) +
check_segref( xd, *segment_id, ALTREF_FRAME ) ) > 1 ) )
{
// TODO this may not be a good idea as it makes sample size small and means
// the predictor functions cannot use data about most likely value only most
// likely unpredicted value.
//#if CONFIG_COMPRED
// // Only update count for incorrectly predicted cases
// if ( !ref_pred_flag )
//#endif
{
cpi->count_mb_ref_frame_usage
[xd->mode_info_context->mbmi.ref_frame]++;
}
}
if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME)
{ {
if (xd->mode_info_context->mbmi.mode == B_PRED) if (xd->mode_info_context->mbmi.mode == B_PRED)