diff options
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r-- | libavformat/utils.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index 24dbd88..5985511 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2167,6 +2167,7 @@ int av_find_stream_info(AVFormatContext *ic) } info[MAX_STREAMS] = {{0}}; for(i=0;i<ic->nb_streams;i++) { + AVCodec *codec; st = ic->streams[i]; if (st->codec->codec_id == CODEC_ID_AAC) { st->codec->sample_rate = 0; @@ -2187,9 +2188,17 @@ int av_find_stream_info(AVFormatContext *ic) } } assert(!st->codec->codec); + codec = avcodec_find_decoder(st->codec->codec_id); + + /* Force decoding of at least one frame of codec data + * this makes sure the codec initializes the channel configuration + * and does not trust the values from the container. + */ + if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF) + st->codec->channels = 0; + //try to just open decoders, in case this is enough to get parameters if(!has_codec_parameters(st->codec)){ - AVCodec *codec = avcodec_find_decoder(st->codec->codec_id); if (codec) avcodec_open(st->codec, codec); } |