diff options
author | John Koleszar <jkoleszar@google.com> | 2011-05-12 15:04:06 -0400 |
---|---|---|
committer | John Koleszar <jkoleszar@google.com> | 2011-05-12 15:07:50 -0400 |
commit | 5ed116e22044e501b87a9466da36d7f943f63563 (patch) | |
tree | b8f1ecd19cd63046f0cb96f507df207a5ef65b2f /vp8 | |
parent | 71a7501bcf6ada5068d102c03ae597023e986538 (diff) | |
download | libvpx-5ed116e22044e501b87a9466da36d7f943f63563.tar libvpx-5ed116e22044e501b87a9466da36d7f943f63563.tar.gz libvpx-5ed116e22044e501b87a9466da36d7f943f63563.tar.bz2 libvpx-5ed116e22044e501b87a9466da36d7f943f63563.zip |
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
Diffstat (limited to 'vp8')
-rw-r--r-- | vp8/encoder/onyx_if.c | 43 |
1 files changed, 34 insertions, 9 deletions
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; |