From 5ed116e22044e501b87a9466da36d7f943f63563 Mon Sep 17 00:00:00 2001 From: John Koleszar Date: Thu, 12 May 2011 15:04:06 -0400 Subject: Improve framerate adaptation This patch improves the accuracy of frame rate estimation by using a larger, 1 second window. It also more quickly adapts to step changes in the input frame rate (ie 30fps to 15fps) Change-Id: I39e48a8f5ac880b4c4b2ebd81049259b81a0218e --- vp8/encoder/onyx_if.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) (limited to 'vp8/encoder/onyx_if.c') diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 273a739e9..965a7949f 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -4699,23 +4699,48 @@ int vp8_get_compressed_data(VP8_PTR ptr, unsigned int *frame_flags, unsigned lon // adjust frame rates based on timestamps given if (!cm->refresh_alt_ref_frame) { + long long this_duration; + int step = 0; + if (cpi->source->ts_start == cpi->first_time_stamp_ever) { - double this_fps = 10000000.000 / (cpi->source->ts_end - cpi->source->ts_start); - - vp8_new_frame_rate(cpi, this_fps); + this_duration = cpi->source->ts_end - cpi->source->ts_start; + step = 1; } else { - long long nanosecs = cpi->source->ts_end - - cpi->last_end_time_stamp_seen; + long long last_duration; + + this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen; + last_duration = cpi->last_end_time_stamp_seen + - cpi->last_time_stamp_seen; + // do a step update if the duration changes by 10% + if (last_duration) + step = ((this_duration - last_duration) * 10 / last_duration); + } - if (nanosecs > 0) + if (this_duration) + { + if (step) + vp8_new_frame_rate(cpi, 10000000.0 / this_duration); + else { - double this_fps = 10000000.000 / nanosecs; - vp8_new_frame_rate(cpi, (7 * cpi->oxcf.frame_rate + this_fps) / 8); - } + double avg_duration, interval; + + /* Average this frame's rate into the last second's average + * frame rate. If we haven't seen 1 second yet, then average + * over the whole interval seen. + */ + interval = cpi->source->ts_end - cpi->first_time_stamp_ever; + if(interval > 10000000.0) + interval = 10000000; + avg_duration = 10000000.0 / cpi->oxcf.frame_rate; + avg_duration *= (interval - avg_duration + this_duration); + avg_duration /= interval; + + vp8_new_frame_rate(cpi, 10000000.0 / avg_duration); + } } cpi->last_time_stamp_seen = cpi->source->ts_start; -- cgit v1.2.3 From ff52bf369146ebd99c70c880d92d94a876432883 Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Thu, 12 May 2011 17:01:55 +0100 Subject: Restructure of activity masking code. This commit restructures the mb activity masking code to better facilitate experimentation using different metrics etc. and also allows for adjustment of the zero bin either for encode only or both the encode and mode selection stages It also uses information from the current frame rather than the previous frame and the default strength has been reduced. Change-Id: Id39b19eace37574dc429f25aae810c203709629b --- vp8/encoder/onyx_if.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'vp8/encoder/onyx_if.c') diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index adbb04ba8..32ae5c6cb 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -298,6 +298,12 @@ static void dealloc_compressor_data(VP8_COMP *cpi) vpx_free(cpi->gf_active_flags); cpi->gf_active_flags = 0; + // Activity mask based per mb zbin adjustments + vpx_free(cpi->mb_activity_map); + cpi->mb_activity_map = 0; + vpx_free(cpi->mb_norm_activity_map); + cpi->mb_norm_activity_map = 0; + vpx_free(cpi->mb.pip); cpi->mb.pip = 0; @@ -1324,11 +1330,20 @@ void vp8_alloc_compressor_data(VP8_COMP *cpi) // Structures used to minitor GF usage - vpx_free(cpi->gf_active_flags); + vpx_free(cpi->gf_active_flags); + CHECK_MEM_ERROR(cpi->gf_active_flags, + vpx_calloc(1, cm->mb_rows * cm->mb_cols)); + cpi->gf_active_count = cm->mb_rows * cm->mb_cols; - CHECK_MEM_ERROR(cpi->gf_active_flags, vpx_calloc(1, cm->mb_rows * cm->mb_cols)); + vpx_free(cpi->mb_activity_map); + CHECK_MEM_ERROR(cpi->mb_activity_map, + vpx_calloc(sizeof(unsigned int), + cm->mb_rows * cm->mb_cols)); - cpi->gf_active_count = cm->mb_rows * cm->mb_cols; + vpx_free(cpi->mb_norm_activity_map); + CHECK_MEM_ERROR(cpi->mb_norm_activity_map, + vpx_calloc(sizeof(unsigned int), + cm->mb_rows * cm->mb_cols)); #if !(CONFIG_REALTIME_ONLY) vpx_free(cpi->total_stats); -- cgit v1.2.3