diff options
author | Nicolas George <george@nsup.org> | 2013-10-25 15:07:40 +0200 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2013-11-28 01:05:14 +0100 |
commit | 838a453e39624a76071f551c070c707ab7d5600b (patch) | |
tree | a0d71ef293802ec3ac4867cbd4de1c584fe5efcd | |
parent | 1a676881caad21a3b038206e1d596ca2b241c4a3 (diff) | |
download | ffmpeg-838a453e39624a76071f551c070c707ab7d5600b.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.c | 2 | ||||
-rw-r--r-- | libavfilter/af_pan.c | 2 | ||||
-rw-r--r-- | libavfilter/asrc_aevalsrc.c | 2 | ||||
-rw-r--r-- | libavfilter/asrc_anullsrc.c | 2 | ||||
-rw-r--r-- | libavfilter/formats.c | 17 | ||||
-rw-r--r-- | libavfilter/internal.h | 5 |
6 files changed, 23 insertions, 7 deletions
diff --git a/libavfilter/af_aconvert.c b/libavfilter/af_aconvert.c index a198d2b396..43158f08e8 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 9cee9d9c3d..e742d9e999 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 3f71ac33d8..79fb4b276c 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 4f76759419..a4bf01394a 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 d51bf3c51d..5816032746 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 f8d0cce638..5e19698d07 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 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); |