From 61dd31977066b00ff64cb4f6c7116f65def4882b Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Sun, 27 Oct 2013 15:55:42 +0100 Subject: [PATCH] ffplay: add frame duration estimated from frame rate to VideoPicture Signed-off-by: Marton Balint --- ffplay.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ffplay.c b/ffplay.c index cd14428d7a..e4fbdd4df5 100644 --- a/ffplay.c +++ b/ffplay.c @@ -121,6 +121,7 @@ typedef struct PacketQueue { typedef struct VideoPicture { double pts; // presentation timestamp for this picture + double duration; // estimated duration based on frame rate int64_t pos; // byte position in file SDL_Overlay *bmp; int width, height; /* source height & width */ @@ -1549,7 +1550,7 @@ static void duplicate_right_border_pixels(SDL_Overlay *bmp) { } } -static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, int64_t pos, int serial) +static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, double duration, int64_t pos, int serial) { VideoPicture *vp; @@ -1646,6 +1647,7 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, int64_t SDL_UnlockYUVOverlay(vp->bmp); vp->pts = pts; + vp->duration = duration; vp->pos = pos; vp->serial = serial; @@ -1909,9 +1911,11 @@ static int video_thread(void *arg) VideoState *is = arg; AVFrame *frame = av_frame_alloc(); double pts; + double duration; int ret; int serial = 0; AVRational tb = is->video_st->time_base; + AVRational frame_rate = av_guess_frame_rate(is->ic, is->video_st, NULL); #if CONFIG_AVFILTER AVFilterGraph *graph = avfilter_graph_alloc(); @@ -1962,6 +1966,7 @@ static int video_thread(void *arg) last_h = frame->height; last_format = frame->format; last_serial = serial; + frame_rate = filt_out->inputs[0]->frame_rate; } ret = av_buffersrc_add_frame(filt_in, frame); @@ -1987,8 +1992,9 @@ static int video_thread(void *arg) is->frame_last_filter_delay = 0; tb = filt_out->inputs[0]->time_base; #endif + duration = (frame_rate.num && frame_rate.den ? av_q2d((AVRational){frame_rate.den, frame_rate.num}) : 0); pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(tb); - ret = queue_picture(is, frame, pts, av_frame_get_pkt_pos(frame), serial); + ret = queue_picture(is, frame, pts, duration, av_frame_get_pkt_pos(frame), serial); av_frame_unref(frame); #if CONFIG_AVFILTER }