diff --git a/libavformat/utils.c b/libavformat/utils.c index 795ecb774c..5a7d87aa1a 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2386,6 +2386,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) AVPacket pkt1, *pkt; int64_t old_offset = avio_tell(ic->pb); int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those + int flush_codecs = 1; for(i=0;inb_streams;i++) { AVCodec *codec; @@ -2465,6 +2466,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) /* if we found the info for all the codecs, we can stop */ ret = count; av_log(ic, AV_LOG_DEBUG, "All info found\n"); + flush_codecs = 0; break; } } @@ -2483,29 +2485,6 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) if (ret < 0) { /* EOF or error*/ - AVPacket empty_pkt = { 0 }; - int err; - av_init_packet(&empty_pkt); - - ret = -1; /* we could not have all the codec parameters before EOF */ - for(i=0;inb_streams;i++) { - st = ic->streams[i]; - - /* flush the decoders */ - while ((err = try_decode_frame(st, &empty_pkt, - (options && i < orig_nb_streams) ? - &options[i] : NULL)) >= 0) - if (has_codec_parameters(st->codec)) - break; - - if (!has_codec_parameters(st->codec)){ - char buf[256]; - avcodec_string(buf, sizeof(buf), st->codec, 0); - av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf); - } else { - ret = 0; - } - } break; } @@ -2581,6 +2560,32 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) count++; } + if (flush_codecs) { + AVPacket empty_pkt = { 0 }; + int err; + av_init_packet(&empty_pkt); + + ret = -1; /* we could not have all the codec parameters before EOF */ + for(i=0;inb_streams;i++) { + st = ic->streams[i]; + + /* flush the decoders */ + while ((err = try_decode_frame(st, &empty_pkt, + (options && i < orig_nb_streams) ? + &options[i] : NULL)) >= 0) + if (has_codec_parameters(st->codec)) + break; + + if (!has_codec_parameters(st->codec)){ + char buf[256]; + avcodec_string(buf, sizeof(buf), st->codec, 0); + av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf); + } else { + ret = 0; + } + } + } + // close codecs which were opened in try_decode_frame() for(i=0;inb_streams;i++) { st = ic->streams[i];