Add sample_aspect_ratio fields to vsrc_buffer arguments.

This fixes aspect handling in ffmpeg
This is based on a patch by baptiste
This commit is contained in:
Michael Niedermayer 2011-01-31 20:48:35 +01:00
parent 14b171cd71
commit 7b3ea5507c
5 changed files with 33 additions and 8 deletions

View File

@ -13,6 +13,9 @@ libavutil: 2009-03-08
API changes, most recent first: 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 2011-01-31 - X - lavfi 1.75.0 - AVFilterLink sample_aspect_ratio
Add sample_aspect_ratio field to AVFilterLink. Add sample_aspect_ratio field to AVFilterLink.

View File

@ -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}. through the interface defined in @file{libavfilter/vsrc_buffer.h}.
It accepts the following parameters: 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. All the parameters need to be explicitely defined.
@ -1033,15 +1033,20 @@ name.
@item timebase_num, timebase_den @item timebase_num, timebase_den
Specify numerator and denomitor of the timebase assumed by the Specify numerator and denomitor of the timebase assumed by the
timestamps of the buffered frames. 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 @end table
For example: For example:
@example @example
buffer=320:240:yuv410p:1:24 buffer=320:240:yuv410p:1:24:1:1
@end example @end example
will instruct the source to accept video frames with size 320x240 and 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 Since the pixel format with name "yuv410p" corresponds to the number 6
(check the enum PixelFormat definition in @file{libavutil/pixfmt.h}), (check the enum PixelFormat definition in @file{libavutil/pixfmt.h}),
this example corresponds to: this example corresponds to:

View File

@ -355,13 +355,21 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
AVCodecContext *codec = ost->st->codec; AVCodecContext *codec = ost->st->codec;
AVCodecContext *icodec = ist->st->codec; AVCodecContext *icodec = ist->st->codec;
FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt }; FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
AVRational sample_aspect_ratio;
char args[255]; char args[255];
int ret; int ret;
graph = avfilter_graph_alloc(); graph = avfilter_graph_alloc();
snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width, if (ist->st->sample_aspect_ratio.num){
ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE); 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"), ret = avfilter_graph_create_filter(&ist->input_video_filter, avfilter_get_by_name("buffer"),
"src", args, NULL, graph); "src", args, NULL, graph);
if (ret < 0) 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->width = ist->output_video_filter->inputs[0]->w;
codec->height = ist->output_video_filter->inputs[0]->h; 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; return 0;
} }
@ -2845,6 +2855,10 @@ static void opt_frame_aspect_ratio(const char *arg)
ffmpeg_exit(1); ffmpeg_exit(1);
} }
frame_aspect_ratio = ar; 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) static int opt_metadata(const char *opt, const char *arg)

View File

@ -27,7 +27,7 @@
#include "libavcore/samplefmt.h" #include "libavcore/samplefmt.h"
#define LIBAVFILTER_VERSION_MAJOR 1 #define LIBAVFILTER_VERSION_MAJOR 1
#define LIBAVFILTER_VERSION_MINOR 75 #define LIBAVFILTER_VERSION_MINOR 76
#define LIBAVFILTER_VERSION_MICRO 0 #define LIBAVFILTER_VERSION_MICRO 0
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \

View File

@ -68,8 +68,10 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
int n = 0; int n = 0;
if (!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) { (n = sscanf(args, "%d:%d:%127[^:]:%d:%d:%d:%d", &c->w, &c->h, pix_fmt_str,
av_log(ctx, AV_LOG_ERROR, "Expected 5 arguments, but only %d found in '%s'\n", n, args); &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); return AVERROR(EINVAL);
} }
if ((c->pix_fmt = av_get_pix_fmt(pix_fmt_str)) == PIX_FMT_NONE) { 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->w = c->w;
link->h = c->h; link->h = c->h;
link->sample_aspect_ratio = c->pixel_aspect;
link->time_base = c->time_base; link->time_base = c->time_base;
return 0; return 0;