You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avfilter/af_aresample: Use preinit instead of init_dict
By using preinit, the SwrContext already exists directly after allocating the filter, so that the filter's AVClass's child_next becomes usable for setting options with the AV_OPT_SEARCH_CHILDREN search flag. This means that it is no longer necessary to use the init_dict callback for this filter. Furthermore, the earlier code did not abide by the documentation of the init_dict callback at all: Instead of only returning the options that have not been recognized it always returned all options on any av_opt_set() error and errored out in this case; yet if the error was just caused by an unrecognized option, it should not error out at all and instead return said option. This behaviour has been inherited by avfilter_init_dict(), contradicting its documentation. This is also fixed by this commit. Reviewed-by: Nicolas George <george@nsup.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
		| @@ -43,31 +43,16 @@ typedef struct AResampleContext { | |||||||
|     int more_data; |     int more_data; | ||||||
| } AResampleContext; | } AResampleContext; | ||||||
|  |  | ||||||
| static av_cold int init_dict(AVFilterContext *ctx, AVDictionary **opts) | static av_cold int preinit(AVFilterContext *ctx) | ||||||
| { | { | ||||||
|     AResampleContext *aresample = ctx->priv; |     AResampleContext *aresample = ctx->priv; | ||||||
|     int ret = 0; |  | ||||||
|  |  | ||||||
|     aresample->next_pts = AV_NOPTS_VALUE; |     aresample->next_pts = AV_NOPTS_VALUE; | ||||||
|     aresample->swr = swr_alloc(); |     aresample->swr = swr_alloc(); | ||||||
|     if (!aresample->swr) { |     if (!aresample->swr) | ||||||
|         ret = AVERROR(ENOMEM); |         return AVERROR(ENOMEM); | ||||||
|         goto end; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (opts) { |     return 0; | ||||||
|         AVDictionaryEntry *e = NULL; |  | ||||||
|  |  | ||||||
|         while ((e = av_dict_get(*opts, "", e, AV_DICT_IGNORE_SUFFIX))) { |  | ||||||
|             if ((ret = av_opt_set(aresample->swr, e->key, e->value, 0)) < 0) |  | ||||||
|                 goto end; |  | ||||||
|         } |  | ||||||
|         av_dict_free(opts); |  | ||||||
|     } |  | ||||||
|     if (aresample->sample_rate_arg > 0) |  | ||||||
|         av_opt_set_int(aresample->swr, "osr", aresample->sample_rate_arg, 0); |  | ||||||
| end: |  | ||||||
|     return ret; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static av_cold void uninit(AVFilterContext *ctx) | static av_cold void uninit(AVFilterContext *ctx) | ||||||
| @@ -90,6 +75,8 @@ static int query_formats(AVFilterContext *ctx) | |||||||
|     AVFilterChannelLayouts *in_layouts, *out_layouts; |     AVFilterChannelLayouts *in_layouts, *out_layouts; | ||||||
|     int ret; |     int ret; | ||||||
|  |  | ||||||
|  |     if (aresample->sample_rate_arg > 0) | ||||||
|  |         av_opt_set_int(aresample->swr, "osr", aresample->sample_rate_arg, 0); | ||||||
|     av_opt_get_sample_fmt(aresample->swr, "osf", 0, &out_format); |     av_opt_get_sample_fmt(aresample->swr, "osf", 0, &out_format); | ||||||
|     av_opt_get_int(aresample->swr, "osr", 0, &out_rate); |     av_opt_get_int(aresample->swr, "osr", 0, &out_rate); | ||||||
|     av_opt_get_int(aresample->swr, "ocl", 0, &out_layout); |     av_opt_get_int(aresample->swr, "ocl", 0, &out_layout); | ||||||
| @@ -343,7 +330,7 @@ static const AVFilterPad aresample_outputs[] = { | |||||||
| const AVFilter ff_af_aresample = { | const AVFilter ff_af_aresample = { | ||||||
|     .name          = "aresample", |     .name          = "aresample", | ||||||
|     .description   = NULL_IF_CONFIG_SMALL("Resample audio data."), |     .description   = NULL_IF_CONFIG_SMALL("Resample audio data."), | ||||||
|     .init_dict     = init_dict, |     .preinit       = preinit, | ||||||
|     .uninit        = uninit, |     .uninit        = uninit, | ||||||
|     .query_formats = query_formats, |     .query_formats = query_formats, | ||||||
|     .priv_size     = sizeof(AResampleContext), |     .priv_size     = sizeof(AResampleContext), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user