1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

lavfi: parsing helper for unknown channel layouts.

Make ff_parse_channel_layout() accept unknown layouts too.
This commit is contained in:
Nicolas George 2013-10-25 15:07:40 +02:00
parent d300f5f6f5
commit 6e2473edfd
6 changed files with 23 additions and 7 deletions

View File

@ -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) (ret = ff_parse_sample_format(&aconvert->out_sample_fmt, aconvert->format_str, ctx)) < 0)
return ret; return ret;
if (aconvert->channel_layout_str && strcmp(aconvert->channel_layout_str, "auto")) 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; return ret;
} }

View File

@ -116,7 +116,7 @@ static av_cold int init(AVFilterContext *ctx)
if (!args) if (!args)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
arg = av_strtok(args, "|", &tokenizer); 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) if (ret < 0)
goto fail; goto fail;
pan->nb_output_channels = av_get_channel_layout_nb_channels(pan->out_channel_layout); pan->nb_output_channels = av_get_channel_layout_nb_channels(pan->out_channel_layout);

View File

@ -109,7 +109,7 @@ static av_cold int init(AVFilterContext *ctx)
if (eval->chlayout_str) { if (eval->chlayout_str) {
int n; 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) if (ret < 0)
goto end; goto end;

View File

@ -68,7 +68,7 @@ static av_cold int init(AVFilterContext *ctx)
null->sample_rate_str, ctx)) < 0) null->sample_rate_str, ctx)) < 0)
return ret; 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) null->channel_layout_str, ctx)) < 0)
return ret; return ret;

View File

@ -615,10 +615,21 @@ int ff_parse_sample_rate(int *ret, const char *arg, void *log_ctx)
return 0; 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; 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) { if (chlayout == 0) {
chlayout = strtol(arg, &tail, 10); chlayout = strtol(arg, &tail, 10);
if (*tail || chlayout == 0) { if (*tail || chlayout == 0) {
@ -627,6 +638,8 @@ int ff_parse_channel_layout(int64_t *ret, const char *arg, void *log_ctx)
} }
} }
*ret = chlayout; *ret = chlayout;
if (nret)
*nret = av_get_channel_layout_nb_channels(chlayout);
return 0; return 0;
} }

View File

@ -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. * Parse a channel layout or a corresponding integer representation.
* *
* @param ret 64bit integer pointer to where the value should be written. * @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 arg string to parse
* @param log_ctx log context * @param log_ctx log context
* @return >= 0 in case of success, a negative AVERROR code on error * @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); void ff_update_link_current_pts(AVFilterLink *link, int64_t pts);