summaryrefslogtreecommitdiff
path: root/ffmpeg_opt.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-03-15 22:14:08 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-03-15 22:14:08 +0100
commit8803b970ef98ea51278dece401d23dc870c5aa01 (patch)
tree211c6b80c91dc3cfeba6dc3528f1fddea941ab71 /ffmpeg_opt.c
parent06a3185e38614ff22e4586675b85228f07819452 (diff)
downloadffmpeg-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.c26
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);
+ }
}
}
}