You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavfi: connect libavresample options to af_resample via AVFilterGraph
This commit is contained in:
		| @@ -13,6 +13,10 @@ libavutil:     2012-10-22 | ||||
|  | ||||
| API changes, most recent first: | ||||
|  | ||||
| 2013-xx-xx - xxxxxxx - lavfi 3.4.0 - avfiltergraph.h | ||||
|   Add resample_lavr_opts to AVFilterGraph for setting libavresample options | ||||
|   for auto-inserted resample filters. | ||||
|  | ||||
| 2013-xx-xx - xxxxxxx - lavu 52.7.0 - dict.h | ||||
|   Add av_dict_parse_string() to set multiple key/value pairs at once from a | ||||
|   string. | ||||
|   | ||||
| @@ -25,6 +25,7 @@ | ||||
| #include "libavutil/avassert.h" | ||||
| #include "libavutil/avstring.h" | ||||
| #include "libavutil/common.h" | ||||
| #include "libavutil/dict.h" | ||||
| #include "libavutil/mathematics.h" | ||||
| #include "libavutil/opt.h" | ||||
|  | ||||
| @@ -37,6 +38,7 @@ | ||||
|  | ||||
| typedef struct ResampleContext { | ||||
|     AVAudioResampleContext *avr; | ||||
|     AVDictionary *options; | ||||
|  | ||||
|     int64_t next_pts; | ||||
|  | ||||
| @@ -44,6 +46,29 @@ typedef struct ResampleContext { | ||||
|     int got_output; | ||||
| } ResampleContext; | ||||
|  | ||||
| static av_cold int init(AVFilterContext *ctx, const char *args) | ||||
| { | ||||
|     ResampleContext *s = ctx->priv; | ||||
|  | ||||
|     if (args) { | ||||
|         int ret = av_dict_parse_string(&s->options, args, "=", ":", 0); | ||||
|         if (ret < 0) { | ||||
|             av_log(ctx, AV_LOG_ERROR, "error setting option string: %s\n", args); | ||||
|             return ret; | ||||
|         } | ||||
|  | ||||
|         /* do not allow the user to override basic format options */ | ||||
|         av_dict_set(&s->options,  "in_channel_layout", NULL, 0); | ||||
|         av_dict_set(&s->options, "out_channel_layout", NULL, 0); | ||||
|         av_dict_set(&s->options,  "in_sample_fmt",     NULL, 0); | ||||
|         av_dict_set(&s->options, "out_sample_fmt",     NULL, 0); | ||||
|         av_dict_set(&s->options,  "in_sample_rate",    NULL, 0); | ||||
|         av_dict_set(&s->options, "out_sample_rate",    NULL, 0); | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static av_cold void uninit(AVFilterContext *ctx) | ||||
| { | ||||
|     ResampleContext *s = ctx->priv; | ||||
| @@ -52,6 +77,7 @@ static av_cold void uninit(AVFilterContext *ctx) | ||||
|         avresample_close(s->avr); | ||||
|         avresample_free(&s->avr); | ||||
|     } | ||||
|     av_dict_free(&s->options); | ||||
| } | ||||
|  | ||||
| static int query_formats(AVFilterContext *ctx) | ||||
| @@ -103,6 +129,14 @@ static int config_output(AVFilterLink *outlink) | ||||
|     if (!(s->avr = avresample_alloc_context())) | ||||
|         return AVERROR(ENOMEM); | ||||
|  | ||||
|     if (s->options) { | ||||
|         AVDictionaryEntry *e = NULL; | ||||
|         while ((e = av_dict_get(s->options, "", e, AV_DICT_IGNORE_SUFFIX))) | ||||
|             av_log(ctx, AV_LOG_VERBOSE, "lavr option: %s=%s\n", e->key, e->value); | ||||
|  | ||||
|         av_opt_set_dict(s->avr, &s->options); | ||||
|     } | ||||
|  | ||||
|     av_opt_set_int(s->avr,  "in_channel_layout", inlink ->channel_layout, 0); | ||||
|     av_opt_set_int(s->avr, "out_channel_layout", outlink->channel_layout, 0); | ||||
|     av_opt_set_int(s->avr,  "in_sample_fmt",     inlink ->format,         0); | ||||
| @@ -264,6 +298,7 @@ AVFilter avfilter_af_resample = { | ||||
|     .description   = NULL_IF_CONFIG_SMALL("Audio resampling and conversion."), | ||||
|     .priv_size     = sizeof(ResampleContext), | ||||
|  | ||||
|     .init           = init, | ||||
|     .uninit         = uninit, | ||||
|     .query_formats  = query_formats, | ||||
|  | ||||
|   | ||||
| @@ -54,6 +54,7 @@ void avfilter_graph_free(AVFilterGraph **graph) | ||||
|     for (; (*graph)->filter_count > 0; (*graph)->filter_count--) | ||||
|         avfilter_free((*graph)->filters[(*graph)->filter_count - 1]); | ||||
|     av_freep(&(*graph)->scale_sws_opts); | ||||
|     av_freep(&(*graph)->resample_lavr_opts); | ||||
|     av_freep(&(*graph)->filters); | ||||
|     av_freep(graph); | ||||
| } | ||||
| @@ -235,8 +236,13 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx) | ||||
|  | ||||
|                     snprintf(inst_name, sizeof(inst_name), "auto-inserted resampler %d", | ||||
|                              resampler_count++); | ||||
|                     scale_args[0] = '\0'; | ||||
|                     if (graph->resample_lavr_opts) | ||||
|                         snprintf(scale_args, sizeof(scale_args), "%s", | ||||
|                                  graph->resample_lavr_opts); | ||||
|                     if ((ret = avfilter_graph_create_filter(&convert, filter, | ||||
|                                                             inst_name, NULL, NULL, graph)) < 0) | ||||
|                                                             inst_name, scale_args, | ||||
|                                                             NULL, graph)) < 0) | ||||
|                         return ret; | ||||
|                     break; | ||||
|                 default: | ||||
|   | ||||
| @@ -31,6 +31,7 @@ typedef struct AVFilterGraph { | ||||
|     AVFilterContext **filters; | ||||
|  | ||||
|     char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters | ||||
|     char *resample_lavr_opts;   ///< libavresample options to use for the auto-inserted resample filters | ||||
| } AVFilterGraph; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -29,7 +29,7 @@ | ||||
| #include "libavutil/avutil.h" | ||||
|  | ||||
| #define LIBAVFILTER_VERSION_MAJOR  3 | ||||
| #define LIBAVFILTER_VERSION_MINOR  3 | ||||
| #define LIBAVFILTER_VERSION_MINOR  4 | ||||
| #define LIBAVFILTER_VERSION_MICRO  0 | ||||
|  | ||||
| #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user