diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-01-31 20:48:35 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-01-31 21:32:06 +0100 |
commit | 7b3ea5507cd79d7e80cb435fda20e70f90e18663 (patch) | |
tree | 212f3f588acbca910e82e124b7e024727be28186 | |
parent | 14b171cd71f2b5f1cc66e4df89c2692f68ac098b (diff) | |
download | ffmpeg-7b3ea5507cd79d7e80cb435fda20e70f90e18663.tar.gz |
Add sample_aspect_ratio fields to vsrc_buffer arguments.
This fixes aspect handling in ffmpeg
This is based on a patch by baptiste
-rw-r--r-- | doc/APIchanges | 3 | ||||
-rw-r--r-- | doc/filters.texi | 11 | ||||
-rw-r--r-- | ffmpeg.c | 18 | ||||
-rw-r--r-- | libavfilter/avfilter.h | 2 | ||||
-rw-r--r-- | libavfilter/vsrc_buffer.c | 7 |
5 files changed, 33 insertions, 8 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index d6d5f85c08..7f5594b4f5 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,9 @@ libavutil: 2009-03-08 API changes, most recent first: +2011-01-31 - X - lavfi 1.76.0 - vsrc_buffer + Add sample_aspect_ratio fields to vsrc_buffer arguments + 2011-01-31 - X - lavfi 1.75.0 - AVFilterLink sample_aspect_ratio Add sample_aspect_ratio field to AVFilterLink. diff --git a/doc/filters.texi b/doc/filters.texi index 3842886521..ccddc33ff0 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1014,7 +1014,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{timebase_num}:@var{timebase_den} +@var{width}:@var{height}:@var{pix_fmt_string}:@var{timebase_num}:@var{timebase_den}:@var{sample_aspect_ratio_num}:@var{sample_aspect_ratio.den} All the parameters need to be explicitely defined. @@ -1033,15 +1033,20 @@ name. @item timebase_num, timebase_den Specify numerator and denomitor of the timebase assumed by the timestamps of the buffered frames. + +@item sample_aspect_ratio.num, sample_aspect_ratio.den +Specify numerator and denominator of the sample aspect ratio assumed +by the video frames. @end table For example: @example -buffer=320:240:yuv410p:1:24 +buffer=320:240:yuv410p:1:24:1:1 @end example will instruct the source to accept video frames with size 320x240 and -with format "yuv410p" and assuming 1/24 as the timestamps timebase. +with format "yuv410p", assuming 1/24 as the timestamps timebase and +square pixels (1:1 sample aspect ratio). 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: @@ -355,13 +355,21 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost) AVCodecContext *codec = ost->st->codec; AVCodecContext *icodec = ist->st->codec; FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt }; + AVRational sample_aspect_ratio; char args[255]; int ret; graph = avfilter_graph_alloc(); - snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width, - ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE); + if (ist->st->sample_aspect_ratio.num){ + sample_aspect_ratio = ist->st->sample_aspect_ratio; + }else + sample_aspect_ratio = ist->st->codec->sample_aspect_ratio; + + snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width, + ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE, + sample_aspect_ratio.num, sample_aspect_ratio.den); + ret = avfilter_graph_create_filter(&ist->input_video_filter, avfilter_get_by_name("buffer"), "src", args, NULL, graph); if (ret < 0) @@ -415,6 +423,8 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost) codec->width = ist->output_video_filter->inputs[0]->w; codec->height = ist->output_video_filter->inputs[0]->h; + codec->sample_aspect_ratio = ost->st->sample_aspect_ratio = + ist->output_video_filter->inputs[0]->sample_aspect_ratio; return 0; } @@ -2845,6 +2855,10 @@ static void opt_frame_aspect_ratio(const char *arg) ffmpeg_exit(1); } frame_aspect_ratio = ar; + + x = vfilters ? strlen(vfilters) : 0; + vfilters = av_realloc(vfilters, x+100); + snprintf(vfilters+x, x+100, "%csetdar=%f\n", x?',':' ', ar); } static int opt_metadata(const char *opt, const char *arg) diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index 48555fdbaa..451d0befff 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -27,7 +27,7 @@ #include "libavcore/samplefmt.h" #define LIBAVFILTER_VERSION_MAJOR 1 -#define LIBAVFILTER_VERSION_MINOR 75 +#define LIBAVFILTER_VERSION_MINOR 76 #define LIBAVFILTER_VERSION_MICRO 0 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ diff --git a/libavfilter/vsrc_buffer.c b/libavfilter/vsrc_buffer.c index 74d9bf6201..6845c74c6f 100644 --- a/libavfilter/vsrc_buffer.c +++ b/libavfilter/vsrc_buffer.c @@ -68,8 +68,10 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) int n = 0; 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); + (n = sscanf(args, "%d:%d:%127[^:]:%d:%d:%d:%d", &c->w, &c->h, pix_fmt_str, + &c->time_base.num, &c->time_base.den, + &c->pixel_aspect.num, &c->pixel_aspect.den)) != 7) { + av_log(ctx, AV_LOG_ERROR, "Expected 7 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) { @@ -100,6 +102,7 @@ static int config_props(AVFilterLink *link) link->w = c->w; link->h = c->h; + link->sample_aspect_ratio = c->pixel_aspect; link->time_base = c->time_base; return 0; |