[FFmpeg-cvslog] lavfi: parsing helper for unknown channel layouts.

Nicolas George git at videolan.org
Thu Nov 28 01:36:07 CET 2013


ffmpeg | branch: release/2.0 | Nicolas George <george at nsup.org> | Fri Oct 25 15:07:40 2013 +0200| [9a4acedf3177d2fa6c521d60022d4dcc2110411a] | committer: Carl Eugen Hoyos

lavfi: parsing helper for unknown channel layouts.

Make ff_parse_channel_layout() accept unknown layouts too.
(cherry picked from commit 6e2473edfda26a556c615ebc04d8aeba800bef7e)

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9a4acedf3177d2fa6c521d60022d4dcc2110411a
---

 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(-)

diff --git a/libavfilter/af_aconvert.c b/libavfilter/af_aconvert.c
index 970e801..30737ec 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 800c40a..2475c91 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 9d2ac9c..652f759 100644
--- a/libavfilter/asrc_aevalsrc.c
+++ b/libavfilter/asrc_aevalsrc.c
@@ -109,7 +109,7 @@ static 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 5a009c3..38ddeb1 100644
--- a/libavfilter/asrc_anullsrc.c
+++ b/libavfilter/asrc_anullsrc.c
@@ -68,7 +68,7 @@ static 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 ae8a456..5843e34 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -629,10 +629,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) {
@@ -641,6 +652,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 f7df6d3..000890f 100644
--- a/libavfilter/internal.h
+++ b/libavfilter/internal.h
@@ -217,11 +217,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 nret 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);
 



More information about the ffmpeg-cvslog mailing list