You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	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:
		| @@ -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. | ||||
|  | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
							
								
								
									
										18
									
								
								ffmpeg.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								ffmpeg.c
									
									
									
									
									
								
							| @@ -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) | ||||
|   | ||||
| @@ -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, \ | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user