@ -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 ; i < ic - > nb_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 ; i < ic - > nb_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 ; i < ic - > nb_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 ; i < ic - > nb_streams ; i + + ) {
st = ic - > streams [ i ] ;