lavf: use number of output pictures for delay checks.
authorRonald S. Bultje <rsbultje@gmail.com>
Fri, 28 Oct 2011 03:37:34 +0000 (20:37 -0700)
committerRonald S. Bultje <rsbultje@gmail.com>
Sat, 29 Oct 2011 06:42:57 +0000 (23:42 -0700)
This fixes false positives of has_codec_delay_been_guessed() for
streams where not every input picture generates an output picture,
such as interlaced H264.

libavformat/avformat.h
libavformat/utils.c

index d16be90..dd40c7f 100644 (file)
@@ -657,6 +657,7 @@ typedef struct AVStream {
         int duration_count;
         double duration_error[MAX_STD_TIMEBASES];
         int64_t codec_info_duration;
+        int nb_decoded_frames;
     } *info;
 #if !FF_API_REORDER_PRIVATE
     const uint8_t *cur_ptr;
index 81eee97..1158079 100644 (file)
@@ -2119,7 +2119,7 @@ static int has_codec_parameters(AVCodecContext *avctx)
 static int has_decode_delay_been_guessed(AVStream *st)
 {
     return st->codec->codec_id != CODEC_ID_H264 ||
-        st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
+        st->info->nb_decoded_frames >= 6;
 }
 
 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
@@ -2145,6 +2145,8 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option
             avcodec_get_frame_defaults(&picture);
             ret = avcodec_decode_video2(st->codec, &picture,
                                         &got_picture, avpkt);
+            if (got_picture)
+                st->info->nb_decoded_frames++;
             break;
         case AVMEDIA_TYPE_AUDIO:
             data_size = FFMAX(avpkt->size, AVCODEC_MAX_AUDIO_FRAME_SIZE);