From 492563c6e7376ed3c674ce32558458162e687ca7 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 5 Nov 2023 00:32:14 +0100 Subject: [PATCH] Make audio rate control a bit more aggressive. --- video/ffmpeg_decode.cpp | 43 +++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/video/ffmpeg_decode.cpp b/video/ffmpeg_decode.cpp index 2b55ea1d..186df966 100644 --- a/video/ffmpeg_decode.cpp +++ b/video/ffmpeg_decode.cpp @@ -535,6 +535,7 @@ struct VideoDecoder::Impl double get_estimated_audio_playback_timestamp(double elapsed_time); double latch_estimated_video_playback_timestamp(double elapsed_time, double target_latency); void latch_estimated_audio_playback_timestamp(double pts); + void set_audio_delta_rate_factor(float delta); double get_audio_buffering_duration(); double get_last_video_buffering_pts(); unsigned get_num_ready_video_frames(); @@ -2197,20 +2198,14 @@ double VideoDecoder::Impl::get_audio_buffering_duration() #endif } -void VideoDecoder::Impl::latch_estimated_audio_playback_timestamp(double pts) +void VideoDecoder::Impl::set_audio_delta_rate_factor(float delta) { -#ifdef HAVE_GRANITE_AUDIO - if (!stream) - return; - - auto delta = float(pts - get_estimated_audio_playback_timestamp_raw()); - - if (delta > 0.25f) + if (delta > 0.10f) { // Speed up, audio buffer is too large. stream->set_rate_factor(1.005f); } - else if (delta < -0.25f) + else if (delta < -0.10f) { // Slow down. stream->set_rate_factor(0.995f); @@ -2219,8 +2214,18 @@ void VideoDecoder::Impl::latch_estimated_audio_playback_timestamp(double pts) { // This is inaudible in practice. Practical distortion will be much lower than outer limits. // And should be less than 1 cent on average. - stream->set_rate_factor(1.0f + delta * 0.02f); + stream->set_rate_factor(1.0f + delta * 0.05f); } +} + +void VideoDecoder::Impl::latch_estimated_audio_playback_timestamp(double pts) +{ +#ifdef HAVE_GRANITE_AUDIO + if (!stream) + return; + + auto delta = float(pts - get_estimated_audio_playback_timestamp_raw()); + set_audio_delta_rate_factor(delta); #else (void)pts; #endif @@ -2234,23 +2239,7 @@ void VideoDecoder::Impl::latch_audio_buffering_target(double target_buffer_time) double current_time = get_audio_buffering_duration(); auto delta = float(current_time - target_buffer_time); - - if (delta > 0.25f) - { - // Speed up, audio buffer is too large. - stream->set_rate_factor(1.005f); - } - else if (delta < -0.25f) - { - // Slow down. - stream->set_rate_factor(0.995f); - } - else - { - // This is inaudible in practice. Practical distortion will be much lower than outer limits. - // And should be less than 1 cent on average. - stream->set_rate_factor(1.0f + delta * 0.02f); - } + set_audio_delta_rate_factor(delta); #else (void)target_buffer_time; #endif