[FFmpeg-devel] [PATCH 1/4] lavfi: parsing helper for unknown channel layouts.

Nicolas George george at nsup.org
Fri Oct 25 16:20:55 CEST 2013


Make ff_parse_channel_layout() accept unknown layouts too.

Signed-off-by: Nicolas George <george at nsup.org>
---
 libavfilter/af_aconvert.c   |  2 +-
 libavfilter/af_pan.c        |  2 +-
 libavfilter/asrc_aevalsrc.c |  2 +-
 libavfilter/asrc_anullsrc.c |  2 +-
 libavfilter/formats.c       | 17 +++++++++++++++--
 libavfilter/internal.h      |  5 ++++-
 6 files changed, 23 insertions(+), 7 deletions(-)


At some point, some cleanup will probably be necessary amongst these various
functions that do almost the same thing.
Unfortunately, I believe there are plans to break everything on the fork.


diff --git a/libavfilter/af_aconvert.c b/libavfilter/af_aconvert.c
index a198d2b..43158f0 100644
--- a/libavfilter/af_aconvert.c
+++ b/libavfilter/af_aconvert.c
@@ -66,7 +66,7 @@ static av_cold int init(AVFilterContext *ctx)
         (ret = ff_parse_sample_format(&aconvert->out_sample_fmt, aconvert->format_str, ctx)) < 0)
         return ret;
     if (aconvert->channel_layout_str && strcmp(aconvert->channel_layout_str, "auto"))
-        return ff_parse_channel_layout(&aconvert->out_chlayout, aconvert->channel_layout_str, ctx);
+        return ff_parse_channel_layout(&aconvert->out_chlayout, NULL, aconvert->channel_layout_str, ctx);
     return ret;
 }
 
diff --git a/libavfilter/af_pan.c b/libavfilter/af_pan.c
index 9cee9d9..e742d9e 100644
--- a/libavfilter/af_pan.c
+++ b/libavfilter/af_pan.c
@@ -116,7 +116,7 @@ static av_cold int init(AVFilterContext *ctx)
     if (!args)
         return AVERROR(ENOMEM);
     arg = av_strtok(args, "|", &tokenizer);
-    ret = ff_parse_channel_layout(&pan->out_channel_layout, arg, ctx);
+    ret = ff_parse_channel_layout(&pan->out_channel_layout, NULL, arg, ctx);
     if (ret < 0)
         goto fail;
     pan->nb_output_channels = av_get_channel_layout_nb_channels(pan->out_channel_layout);
diff --git a/libavfilter/asrc_aevalsrc.c b/libavfilter/asrc_aevalsrc.c
index 3f71ac3..79fb4b2 100644
--- a/libavfilter/asrc_aevalsrc.c
+++ b/libavfilter/asrc_aevalsrc.c
@@ -109,7 +109,7 @@ static av_cold int init(AVFilterContext *ctx)
 
     if (eval->chlayout_str) {
         int n;
-        ret = ff_parse_channel_layout(&eval->chlayout, eval->chlayout_str, ctx);
+        ret = ff_parse_channel_layout(&eval->chlayout, NULL, eval->chlayout_str, ctx);
         if (ret < 0)
             goto end;
 
diff --git a/libavfilter/asrc_anullsrc.c b/libavfilter/asrc_anullsrc.c
index 4f76759..a4bf013 100644
--- a/libavfilter/asrc_anullsrc.c
+++ b/libavfilter/asrc_anullsrc.c
@@ -68,7 +68,7 @@ static av_cold int init(AVFilterContext *ctx)
                                      null->sample_rate_str, ctx)) < 0)
         return ret;
 
-    if ((ret = ff_parse_channel_layout(&null->channel_layout,
+    if ((ret = ff_parse_channel_layout(&null->channel_layout, NULL,
                                         null->channel_layout_str, ctx)) < 0)
         return ret;
 
diff --git a/libavfilter/formats.c b/libavfilter/formats.c
index d51bf3c..5816032 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -615,10 +615,21 @@ int ff_parse_sample_rate(int *ret, const char *arg, void *log_ctx)
     return 0;
 }
 
-int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx)
+int ff_parse_channel_layout(int64_t *ret, int *nret, const char *arg,
+                            void *log_ctx)
 {
     char *tail;
-    int64_t chlayout = av_get_channel_layout(arg);
+    int64_t chlayout, count;
+
+    if (nret) {
+        count = strtol(arg, &tail, 10);
+        if (*tail == 'c' && !tail[1] && count > 0 && count < 63) {
+            *nret = count;
+            *ret = 0;
+            return 0;
+        }
+    }
+    chlayout = av_get_channel_layout(arg);
     if (chlayout == 0) {
         chlayout = strtol(arg, &tail, 10);
         if (*tail || chlayout == 0) {
@@ -627,6 +638,8 @@ int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx)
         }
     }
     *ret = chlayout;
+    if (nret)
+        *nret = av_get_channel_layout_nb_channels(chlayout);
     return 0;
 }
 
diff --git a/libavfilter/internal.h b/libavfilter/internal.h
index f8d0cce..0cb3c35 100644
--- a/libavfilter/internal.h
+++ b/libavfilter/internal.h
@@ -207,11 +207,14 @@ int ff_parse_sample_format(int *ret, const char *arg, void *log_ctx);
  * Parse a channel layout or a corresponding integer representation.
  *
  * @param ret 64bit integer pointer to where the value should be written.
+ * @param ret integer pointer to the number of channels;
+ *            if not NULL, then unknown channel layouts are accepted
  * @param arg string to parse
  * @param log_ctx log context
  * @return >= 0 in case of success, a negative AVERROR code on error
  */
-int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx);
+int ff_parse_channel_layout(int64_t *ret, int *nret, const char *arg,
+                            void *log_ctx);
 
 void ff_update_link_current_pts(AVFilterLink *link, int64_t pts);
 
-- 
1.8.4.rc3



More information about the ffmpeg-devel mailing list