diff options
author | Marton Balint <cus@passwd.hu> | 2013-02-17 21:03:20 +0100 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2013-06-01 12:50:45 +0200 |
commit | e341cb1102c0cf29fe8a3ec29f968e3c45e2a15e (patch) | |
tree | 3b5f34ad79815d3b9bbc4c02b6ad0ac4e0a4471e | |
parent | 5b492720ad90d6cbde2c3b5ae9dbafb8ef95f411 (diff) | |
download | ffmpeg-e341cb1102c0cf29fe8a3ec29f968e3c45e2a15e.tar.gz |
ffplay: fix compute_target_delay to better handle frames with long durations
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r-- | ffplay.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -69,8 +69,12 @@ const int program_birth_year = 2003; A/V sync as SDL does not have hardware buffer fullness info. */ #define SDL_AUDIO_BUFFER_SIZE 1024 -/* no AV sync correction is done if below the AV sync threshold */ -#define AV_SYNC_THRESHOLD 0.01 +/* no AV sync correction is done if below the minimum AV sync threshold */ +#define AV_SYNC_THRESHOLD_MIN 0.01 +/* AV sync correction is done if above the maximum AV sync threshold */ +#define AV_SYNC_THRESHOLD_MAX 0.1 +/* If a frame duration is longer than this, it will not be duplicated to compensate AV sync */ +#define AV_SYNC_FRAMEDUP_THRESHOLD 0.1 /* no AV correction is done if too big error */ #define AV_NOSYNC_THRESHOLD 10.0 @@ -1257,10 +1261,12 @@ static double compute_target_delay(double delay, VideoState *is) /* skip or repeat frame. We take into account the delay to compute the threshold. I still don't know if it is the best guess */ - sync_threshold = FFMAX(AV_SYNC_THRESHOLD, delay); - if (!isnan(diff) && fabs(diff) < AV_NOSYNC_THRESHOLD) { + sync_threshold = FFMAX(AV_SYNC_THRESHOLD_MIN, FFMIN(AV_SYNC_THRESHOLD_MAX, delay)); + if (!isnan(diff) && fabs(diff) < is->max_frame_duration) { if (diff <= -sync_threshold) - delay = 0; + delay = FFMAX(0, delay + diff); + else if (diff >= sync_threshold && delay > AV_SYNC_FRAMEDUP_THRESHOLD) + delay = delay + diff; else if (diff >= sync_threshold) delay = 2 * delay; } |