aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas George <george@nsup.org>2013-10-25 15:07:40 +0200
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2013-11-28 01:08:59 +0100
commit9a4acedf3177d2fa6c521d60022d4dcc2110411a (patch)
tree886b954614669b72c626623e45dca9000876aa87
parentc2d37e736428d3daf9d0d0795af2815fd11dc432 (diff)
downloadffmpeg-9a4acedf3177d2fa6c521d60022d4dcc2110411a.tar.gz
lavfi: parsing helper for unknown channel layouts.
Make ff_parse_channel_layout() accept unknown layouts too. (cherry picked from commit 6e2473edfda26a556c615ebc04d8aeba800bef7e)
-rw-r--r--libavfilter/af_aconvert.c2
-rw-r--r--libavfilter/af_pan.c2
-rw-r--r--libavfilter/asrc_aevalsrc.c2
-rw-r--r--libavfilter/asrc_anullsrc.c2
-rw-r--r--libavfilter/formats.c17
-rw-r--r--libavfilter/internal.h5
6 files changed, 23 insertions, 7 deletions
diff --git a/libavfilter/af_aconvert.c b/libavfilter/af_aconvert.c
index 970e801152..30737ece50 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 800c40a851..2475c91ee5 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 9d2ac9c70e..652f759665 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 5a009c38b0..38ddeb1e70 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 ae8a45694a..5843e34a2d 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 f7df6d3b41..000890f1ce 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);