[libav-devel] [PATCH] lavfi: autoinsert resample filter when necessary.

Anton Khirnov anton at khirnov.net
Thu May 10 19:55:30 CEST 2012


---
Changed it to fail when af_resample is disabled.
---
 libavfilter/avfiltergraph.c |   58 +++++++++++++++++++++++++++++++------------
 1 file changed, 42 insertions(+), 16 deletions(-)

diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index 04d9027..e576cca 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -152,8 +152,7 @@ AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, char *name)
 static int query_formats(AVFilterGraph *graph, AVClass *log_ctx)
 {
     int i, j, ret;
-    int scaler_count = 0;
-    char inst_name[30];
+    int scaler_count = 0, resampler_count = 0;
 
     /* ask all the sub-filters for their supported media formats */
     for (i = 0; i < graph->filter_count; i++) {
@@ -172,23 +171,50 @@ static int query_formats(AVFilterGraph *graph, AVClass *log_ctx)
             if (link && link->in_formats != link->out_formats) {
                 if (!avfilter_merge_formats(link->in_formats,
                                             link->out_formats)) {
-                    AVFilterContext *scale;
+                    AVFilterContext *convert;
+                    AVFilter *filter;
+                    AVFilterLink *inlink, *outlink;
                     char scale_args[256];
-                    /* couldn't merge format lists. auto-insert scale filter */
-                    snprintf(inst_name, sizeof(inst_name), "auto-inserted scaler %d",
-                             scaler_count++);
-                    snprintf(scale_args, sizeof(scale_args), "0:0:%s", graph->scale_sws_opts);
-                    if ((ret = avfilter_graph_create_filter(&scale, avfilter_get_by_name("scale"),
-                                                            inst_name, scale_args, NULL, graph)) < 0)
-                        return ret;
-                    if ((ret = avfilter_insert_filter(link, scale, 0, 0)) < 0)
+                    char inst_name[30];
+
+                    /* couldn't merge format lists. auto-insert conversion filter */
+                    switch (link->type) {
+                    case AVMEDIA_TYPE_VIDEO:
+                        snprintf(inst_name, sizeof(inst_name), "auto-inserted scaler %d",
+                                 scaler_count++);
+                        snprintf(scale_args, sizeof(scale_args), "0:0:%s", graph->scale_sws_opts);
+                        if ((ret = avfilter_graph_create_filter(&convert,
+                                                                avfilter_get_by_name("scale"),
+                                                                inst_name, scale_args, NULL,
+                                                                graph)) < 0)
+                            return ret;
+                        break;
+                    case AVMEDIA_TYPE_AUDIO:
+                        if (!(filter = avfilter_get_by_name("resample"))) {
+                            av_log(log_ctx, AV_LOG_ERROR, "'resample' filter "
+                                   "not present, cannot convert audio formats.\n");
+                            return AVERROR(EINVAL);
+                        }
+
+                        snprintf(inst_name, sizeof(inst_name), "auto-inserted resampler %d",
+                                 resampler_count++);
+                        if ((ret = avfilter_graph_create_filter(&convert,
+                                                                avfilter_get_by_name("resample"),
+                                                                inst_name, NULL, NULL, graph)) < 0)
+                            return ret;
+                        break;
+                    default:
+                        return AVERROR(EINVAL);
+                    }
+
+                    if ((ret = avfilter_insert_filter(link, convert, 0, 0)) < 0)
                         return ret;
 
-                    scale->filter->query_formats(scale);
-                    if (((link = scale-> inputs[0]) &&
-                         !avfilter_merge_formats(link->in_formats, link->out_formats)) ||
-                        ((link = scale->outputs[0]) &&
-                         !avfilter_merge_formats(link->in_formats, link->out_formats))) {
+                    convert->filter->query_formats(convert);
+                    inlink  = convert->inputs[0];
+                    outlink = convert->outputs[0];
+                    if (!avfilter_merge_formats( inlink->in_formats,  inlink->out_formats) ||
+                        !avfilter_merge_formats(outlink->in_formats, outlink->out_formats)) {
                         av_log(log_ctx, AV_LOG_ERROR,
                                "Impossible to convert between the formats supported by the filter "
                                "'%s' and the filter '%s'\n", link->src->name, link->dst->name);
-- 
1.7.9.5



More information about the libav-devel mailing list