summaryrefslogtreecommitdiff
path: root/vp8/encoder/encodeframe.c
diff options
context:
space:
mode:
authorPaul Wilkins <paulwilkins@google.com>2011-11-02 13:30:10 +0000
committerPaul Wilkins <paulwilkins@google.com>2011-11-02 13:31:54 +0000
commit87ff8620b27a70c8411bf0941eb846e358e03ca1 (patch)
treec80b77f7b2fbbb691ba2b182e8601402301453d7 /vp8/encoder/encodeframe.c
parent2b450a460fa847c7460f51ab38ecb9ab10f18218 (diff)
downloadlibvpx-87ff8620b27a70c8411bf0941eb846e358e03ca1.tar
libvpx-87ff8620b27a70c8411bf0941eb846e358e03ca1.tar.gz
libvpx-87ff8620b27a70c8411bf0941eb846e358e03ca1.tar.bz2
libvpx-87ff8620b27a70c8411bf0941eb846e358e03ca1.zip
Segmentation: Reference frames
Modify reference frame segmentation so that ONE or MORE reference frames may be marked as a available for a given segment. Fixed bugs relating to segment coding of INTRA and some INTER modes at the segment level. Modified Q boost for static areas based on ambient average Q. Strong results now on clips with significant static areas. (some data points in derf set as high as 9% and some static & slide show type content in YT set > 20%) Change-Id: Ia79f912efa84b977f35a23683ae3643251e24f0c
Diffstat (limited to 'vp8/encoder/encodeframe.c')
-rw-r--r--vp8/encoder/encodeframe.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c
index ec679846e..7192ae539 100644
--- a/vp8/encoder/encodeframe.c
+++ b/vp8/encoder/encodeframe.c
@@ -1584,11 +1584,12 @@ int vp8cx_encode_inter_macroblock
int intra_error = 0;
int rate;
int distortion;
+ int segment_id = xd->mode_info_context->mbmi.segment_id;
x->skip = 0;
if (xd->segmentation_enabled)
- x->encode_breakout = cpi->segment_encode_breakout[xd->mode_info_context->mbmi.segment_id];
+ x->encode_breakout = cpi->segment_encode_breakout[segment_id];
else
x->encode_breakout = cpi->oxcf.encode_breakout;
@@ -1650,7 +1651,7 @@ int vp8cx_encode_inter_macroblock
if (cpi->cyclic_refresh_mode_enabled)
{
// Clear segment_id back to 0 if not coded (last frame 0,0)
- if ( (xd->mode_info_context->mbmi.segment_id == 1) &&
+ if ( (segment_id == 1) &&
( (xd->mode_info_context->mbmi.ref_frame != LAST_FRAME) ||
(xd->mode_info_context->mbmi.mode != ZEROMV) ) )
{
@@ -1711,10 +1712,20 @@ int vp8cx_encode_inter_macroblock
}
#if CONFIG_SEGFEATURES
- // Dont increment usage count if ref frame coded at segment level
- if ( !segfeature_active( xd, xd->mode_info_context->mbmi.segment_id,
- SEG_LVL_REF_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.
+ if ( !segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) ||
+ ( ( 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 ) )
+ {
cpi->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame]++;
+ }
#else
cpi->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame] ++;
#endif