diff --git a/ffmpeg.c b/ffmpeg.c index 60b10cce5b..7999f7277f 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -483,6 +483,9 @@ static void ffmpeg_cleanup(int ret) av_freep(&ost->avfilter); av_freep(&ost->logfile_prefix); + av_freep(&ost->audio_channels_map); + ost->audio_channels_mapped = 0; + avcodec_free_context(&ost->enc_ctx); av_freep(&output_streams[i]); diff --git a/ffmpeg.h b/ffmpeg.h index d124a2cf9b..6545286ad0 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -402,8 +402,7 @@ typedef struct OutputStream { double forced_keyframes_expr_const_values[FKF_NB]; /* audio only */ -#define FF_CH_MAX 32 - int audio_channels_map[FF_CH_MAX]; /* list of the channels id to pick from the source stream */ + int *audio_channels_map; /* list of the channels id to pick from the source stream */ int audio_channels_mapped; /* number of channels in audio_channels_map */ char *logfile_prefix; diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c index 1962cf48cb..3cf78f0f79 100644 --- a/ffmpeg_opt.c +++ b/ffmpeg_opt.c @@ -1478,11 +1478,13 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in } 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); + if (av_reallocp_array(&ost->audio_channels_map, + ost->audio_channels_mapped + 1, + sizeof(*ost->audio_channels_map) + ) < 0 ) + exit_program(1); + + ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx; } } }