From 387b4ac993528d6e25b3d6fe49d5d360b8e62e98 Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Tue, 12 Oct 2010 18:40:16 +0000 Subject: Fix timebase handling at the begin and at the end of the ffplay video filterchain. Set timebase in the ffplay input, and make get_filtered_video_frame() rescale the output frames PTSes according to their timebase. Originally committed as revision 25450 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffplay.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'ffplay.c') diff --git a/ffplay.c b/ffplay.c index 6b3df467e7..dc031a3bb5 100644 --- a/ffplay.c +++ b/ffplay.c @@ -1755,6 +1755,7 @@ static int input_config_props(AVFilterLink *link) link->w = c->width; link->h = c->height; + link->time_base = priv->is->video_st->time_base; return 0; } @@ -1791,7 +1792,7 @@ static int output_query_formats(AVFilterContext *ctx) } static int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame, - int64_t *pts, int64_t *pos) + int64_t *pts, AVRational *tb, int64_t *pos) { AVFilterBufferRef *pic; @@ -1804,6 +1805,7 @@ static int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame, frame->opaque = pic; *pts = pic->pts; *pos = pic->pos; + *tb = ctx->inputs[0]->time_base; memcpy(frame->data, pic->data, sizeof(frame->data)); memcpy(frame->linesize, pic->linesize, sizeof(frame->linesize)); @@ -1882,11 +1884,22 @@ static int video_thread(void *arg) for(;;) { #if !CONFIG_AVFILTER AVPacket pkt; +#else + AVRational tb; #endif while (is->paused && !is->videoq.abort_request) SDL_Delay(10); #if CONFIG_AVFILTER - ret = get_filtered_video_frame(filt_out, frame, &pts_int, &pos); + ret = get_filtered_video_frame(filt_out, frame, &pts_int, &tb, &pos); + + if (av_cmp_q(tb, is->video_st->time_base)) { + int64_t pts1 = pts_int; + pts_int = av_rescale_q(pts_int, tb, is->video_st->time_base); + av_log(NULL, AV_LOG_DEBUG, "video_thread(): " + "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n", + tb.num, tb.den, pts1, + is->video_st->time_base.num, is->video_st->time_base.den, pts_int); + } #else ret = get_video_frame(is, frame, &pts_int, &pkt); #endif -- cgit v1.2.3