diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-03-15 22:14:08 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-03-15 22:14:08 +0100 |
commit | 8803b970ef98ea51278dece401d23dc870c5aa01 (patch) | |
tree | 211c6b80c91dc3cfeba6dc3528f1fddea941ab71 /ffmpeg_opt.c | |
parent | 06a3185e38614ff22e4586675b85228f07819452 (diff) | |
download | ffmpeg-8803b970ef98ea51278dece401d23dc870c5aa01.tar.gz |
ffmpeg_opt: Check ist is valid before using it in audio_channels_map init
Fixes segfault and instead provides an error message
Fixes Ticket3465
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'ffmpeg_opt.c')
-rw-r--r-- | ffmpeg_opt.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c index 7bd0817c29..ea94dd0f42 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -1430,15 +1430,27 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in /* check for channel mapping for this audio stream */ for (n = 0; n < o->nb_audio_channel_maps; n++) { AudioChannelMap *map = &o->audio_channel_maps[n]; - InputStream *ist = input_streams[ost->source_index]; - if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) && - (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) && + if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) && (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) { - if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map)) - ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx; - else - av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n", + InputStream *ist; + + if (map->channel_idx == -1) { + ist = NULL; + } else if (ost->source_index < 0) { + av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n", ost->file_index, ost->st->index); + continue; + } else { + ist = input_streams[ost->source_index]; + } + + if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) { + if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map)) + ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx; + else + av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n", + ost->file_index, ost->st->index); + } } } } |