diff options
author | Marton Balint <cus@passwd.hu> | 2013-02-02 12:37:29 +0100 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2013-11-05 21:27:07 +0100 |
commit | 5ecfcc7dff04ff0e86d8b6b3a33709ae956dfef7 (patch) | |
tree | 9c0abafffada6a69f2d96b02ab48fa46ab83854f | |
parent | 61dd31977066b00ff64cb4f6c7116f65def4882b (diff) | |
download | ffmpeg-5ecfcc7dff04ff0e86d8b6b3a33709ae956dfef7.tar.gz |
ffplay: add smarter method for determining video picture duration
- consider it an invalid PTS when the next PTS value is the same as the current one
- in case of invalid or unknown PTS, return vp->duration
This fixes ffplay part of ticket #3005.
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r-- | ffplay.c | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -1293,6 +1293,18 @@ static double compute_target_delay(double delay, VideoState *is) return delay; } +static double vp_duration(VideoState *is, VideoPicture *vp, VideoPicture *nextvp) { + if (vp->serial == nextvp->serial) { + double duration = nextvp->pts - vp->pts; + if (isnan(duration) || duration <= 0 || duration > is->max_frame_duration) + return vp->duration; + else + return duration; + } else { + return 0.0; + } +} + static void pictq_next_picture(VideoState *is) { /* update queue size and signal for next picture */ if (++is->pictq_rindex == VIDEO_PICTURE_QUEUE_SIZE) @@ -1407,7 +1419,7 @@ retry: if (is->pictq_size > 1) { VideoPicture *nextvp = &is->pictq[(is->pictq_rindex + 1) % VIDEO_PICTURE_QUEUE_SIZE]; - duration = nextvp->pts - vp->pts; + duration = vp_duration(is, vp, nextvp); if(!is->step && (redisplay || framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){ if (!redisplay) is->frame_drops_late++; |