diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-04-17 15:04:16 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-04-17 15:04:22 +0200 |
commit | 74e86d3147cc0c0af89b5c512fe94e19873a35a1 (patch) | |
tree | a1bd702a40e4763a4c2ae78c4c82ce65df6c781d /libavfilter | |
parent | b725202546da366772dec1ada40ce36832582ed9 (diff) | |
parent | aafed1175df76603e94c99a7748968780d6548d2 (diff) | |
download | ffmpeg-74e86d3147cc0c0af89b5c512fe94e19873a35a1.tar.gz |
Merge commit 'aafed1175df76603e94c99a7748968780d6548d2'
* commit 'aafed1175df76603e94c99a7748968780d6548d2':
af_channelmap: sanity check input channel indices in all cases.
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/af_channelmap.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/libavfilter/af_channelmap.c b/libavfilter/af_channelmap.c index a4088640a3..2db554eed9 100644 --- a/libavfilter/af_channelmap.c +++ b/libavfilter/af_channelmap.c @@ -357,23 +357,32 @@ static int channelmap_config_input(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; ChannelMapContext *s = ctx->priv; + int nb_channels = av_get_channel_layout_nb_channels(inlink->channel_layout); int i, err = 0; const char *channel_name; char layout_name[256]; - if (s->mode == MAP_PAIR_STR_INT || s->mode == MAP_PAIR_STR_STR) { - for (i = 0; i < s->nch; i++) { + for (i = 0; i < s->nch; i++) { + if (s->mode == MAP_PAIR_STR_INT || s->mode == MAP_PAIR_STR_STR) { s->map[i].in_channel_idx = av_get_channel_layout_channel_index( inlink->channel_layout, s->map[i].in_channel); - if (s->map[i].in_channel_idx < 0) { + } + + if (s->map[i].in_channel_idx < 0 || + s->map[i].in_channel_idx >= nb_channels) { + av_get_channel_layout_string(layout_name, sizeof(layout_name), + 0, inlink->channel_layout); + if (s->map[i].in_channel) { channel_name = av_get_channel_name(s->map[i].in_channel); - av_get_channel_layout_string(layout_name, sizeof(layout_name), - 0, inlink->channel_layout); av_log(ctx, AV_LOG_ERROR, "input channel '%s' not available from input layout '%s'\n", channel_name, layout_name); - err = AVERROR(EINVAL); + } else { + av_log(ctx, AV_LOG_ERROR, + "input channel #%d not available from input layout '%s'\n", + s->map[i].in_channel_idx, layout_name); } + err = AVERROR(EINVAL); } } |