From 94498ec98a9f0807b0d418beb5f6a0c76318d074 Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Tue, 12 Oct 2010 18:40:20 +0000 Subject: [PATCH] Extend buffer source to accept the time base for the output PTS. Originally committed as revision 25451 to svn://svn.ffmpeg.org/ffmpeg/trunk --- doc/filters.texi | 16 ++++++++++------ ffmpeg.c | 5 +++-- libavfilter/avfilter.h | 2 +- libavfilter/vsrc_buffer.c | 7 +++++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index c9a6b21a4b..49f87cff36 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -611,7 +611,7 @@ This source is mainly intended for a programmatic use, in particular through the interface defined in @file{libavfilter/vsrc_buffer.h}. It accepts the following parameters: -@var{width}:@var{height}:@var{pix_fmt_string} +@var{width}:@var{height}:@var{pix_fmt_string}:@var{timebase_num}:@var{timebase_den} All the parameters need to be explicitely defined. @@ -628,19 +628,23 @@ A string representing the pixel format of the buffered video frames. It may be a number corresponding to a pixel format, or a pixel format name. +@item timebase_num, timebase_den +Specify numerator and denomitor of the timebase assumed by the +timestamps of the buffered frames. @end table For example: @example -buffer=320:240:yuv410p +buffer=320:240:yuv410p:1:24 @end example will instruct the source to accept video frames with size 320x240 and -with format "yuv410p". Since the pixel format with name "yuv410p" -corresponds to the number 6 (check the enum PixelFormat definition in -@file{libavutil/pixfmt.h}), this example corresponds to: +with format "yuv410p" and assuming 1/24 as the timestamps timebase. +Since the pixel format with name "yuv410p" corresponds to the number 6 +(check the enum PixelFormat definition in @file{libavutil/pixfmt.h}), +this example corresponds to: @example -buffer=320:240:6 +buffer=320:240:6:1:24 @end example @section color diff --git a/ffmpeg.c b/ffmpeg.c index e0463a996e..bfb7f7e2d5 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -424,8 +424,9 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost) if ((ret = avfilter_open(&ist->output_video_filter, &output_filter, "out")) < 0) return ret; - snprintf(args, 255, "%d:%d:%d", ist->st->codec->width, - ist->st->codec->height, ist->st->codec->pix_fmt); + snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width, + ist->st->codec->height, ist->st->codec->pix_fmt, + ist->st->time_base.num, ist->st->time_base.den); if ((ret = avfilter_init_filter(ist->input_video_filter, args, NULL)) < 0) return ret; if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &codec->pix_fmt)) < 0) diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index b800116e43..f29ebe7f6c 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -26,7 +26,7 @@ #define LIBAVFILTER_VERSION_MAJOR 1 #define LIBAVFILTER_VERSION_MINOR 51 -#define LIBAVFILTER_VERSION_MICRO 0 +#define LIBAVFILTER_VERSION_MICRO 1 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ diff --git a/libavfilter/vsrc_buffer.c b/libavfilter/vsrc_buffer.c index fa9d1352ae..74d9bf6201 100644 --- a/libavfilter/vsrc_buffer.c +++ b/libavfilter/vsrc_buffer.c @@ -33,6 +33,7 @@ typedef struct { int has_frame; int h, w; enum PixelFormat pix_fmt; + AVRational time_base; ///< time_base to set in the output link AVRational pixel_aspect; } BufferSourceContext; @@ -66,8 +67,9 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) char pix_fmt_str[128]; int n = 0; - if (!args || (n = sscanf(args, "%d:%d:%127s", &c->w, &c->h, pix_fmt_str)) != 3) { - av_log(ctx, AV_LOG_ERROR, "Expected 3 arguments, but only %d found in '%s'\n", n, args ? args : ""); + if (!args || + (n = sscanf(args, "%d:%d:%127[^:]:%d:%d", &c->w, &c->h, pix_fmt_str, &c->time_base.num, &c->time_base.den)) != 5) { + av_log(ctx, AV_LOG_ERROR, "Expected 5 arguments, but only %d found in '%s'\n", n, args); return AVERROR(EINVAL); } if ((c->pix_fmt = av_get_pix_fmt(pix_fmt_str)) == PIX_FMT_NONE) { @@ -98,6 +100,7 @@ static int config_props(AVFilterLink *link) link->w = c->w; link->h = c->h; + link->time_base = c->time_base; return 0; }