avfilter/vf_setparams: use YUV colorspace negotiation API
When this filter overrides frame properties, the outgoing frames have a different YUV colorspace than the incoming ones. This requires signalling the new colorspace on the outlink, and in particular, making sure it's *not* set to a common ref with the input - otherwise the point of this filter would be destroyed. Untouched fields will continue being passed through, so we don't need to do anything there.
This commit is contained in:
		
							parent
							
								
									aa3bf6d41c
								
							
						
					
					
						commit
						3bf80df3cc
					
				| @ -23,6 +23,7 @@ | |||||||
| #include "libavutil/pixfmt.h" | #include "libavutil/pixfmt.h" | ||||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||||
| #include "avfilter.h" | #include "avfilter.h" | ||||||
|  | #include "formats.h" | ||||||
| #include "internal.h" | #include "internal.h" | ||||||
| #include "video.h" | #include "video.h" | ||||||
| 
 | 
 | ||||||
| @ -120,6 +121,29 @@ static const AVOption setparams_options[] = { | |||||||
| 
 | 
 | ||||||
| AVFILTER_DEFINE_CLASS(setparams); | AVFILTER_DEFINE_CLASS(setparams); | ||||||
| 
 | 
 | ||||||
|  | static int query_formats(AVFilterContext *ctx) | ||||||
|  | { | ||||||
|  |     SetParamsContext *s = ctx->priv; | ||||||
|  |     AVFilterLink *outlink = ctx->outputs[0]; | ||||||
|  |     int ret; | ||||||
|  | 
 | ||||||
|  |     if (s->colorspace >= 0) { | ||||||
|  |         ret = ff_formats_ref(ff_make_formats_list_singleton(s->colorspace), | ||||||
|  |                              &outlink->incfg.color_spaces); | ||||||
|  |         if (ret < 0) | ||||||
|  |             return ret; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (s->color_range >= 0) { | ||||||
|  |         ret = ff_formats_ref(ff_make_formats_list_singleton(s->color_range), | ||||||
|  |                              &outlink->incfg.color_ranges); | ||||||
|  |         if (ret < 0) | ||||||
|  |             return ret; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int filter_frame(AVFilterLink *inlink, AVFrame *frame) | static int filter_frame(AVFilterLink *inlink, AVFrame *frame) | ||||||
| { | { | ||||||
|     AVFilterContext *ctx = inlink->dst; |     AVFilterContext *ctx = inlink->dst; | ||||||
| @ -177,6 +201,7 @@ const AVFilter ff_vf_setparams = { | |||||||
|     .flags       = AVFILTER_FLAG_METADATA_ONLY, |     .flags       = AVFILTER_FLAG_METADATA_ONLY, | ||||||
|     FILTER_INPUTS(inputs), |     FILTER_INPUTS(inputs), | ||||||
|     FILTER_OUTPUTS(ff_video_default_filterpad), |     FILTER_OUTPUTS(ff_video_default_filterpad), | ||||||
|  |     FILTER_QUERY_FUNC(query_formats), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #if CONFIG_SETRANGE_FILTER | #if CONFIG_SETRANGE_FILTER | ||||||
| @ -217,6 +242,7 @@ const AVFilter ff_vf_setrange = { | |||||||
|     .flags       = AVFILTER_FLAG_METADATA_ONLY, |     .flags       = AVFILTER_FLAG_METADATA_ONLY, | ||||||
|     FILTER_INPUTS(inputs), |     FILTER_INPUTS(inputs), | ||||||
|     FILTER_OUTPUTS(ff_video_default_filterpad), |     FILTER_OUTPUTS(ff_video_default_filterpad), | ||||||
|  |     FILTER_QUERY_FUNC(query_formats), | ||||||
| }; | }; | ||||||
| #endif /* CONFIG_SETRANGE_FILTER */ | #endif /* CONFIG_SETRANGE_FILTER */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user