[FFmpeg-cvslog] Fix decoding of mpegts streams with h264 video that does *NOT* have b frames

Mike Scheutzow git at videolan.org
Sat Jun 18 05:18:45 CEST 2011


ffmpeg | branch: master | Mike Scheutzow <mike.scheutzow at alcatel-lucent.com> | Thu Apr 28 10:14:26 2011 -0400| [aa15e68721b15f8020da9d392954b343f195f22c] | committer: Anton Khirnov

Fix decoding of mpegts streams with h264 video that does *NOT* have b frames

One of the causes of this bug is that the h264 parser defaults low_delay
to 1, but the h264 codec defaults low_delay to 0. Really Ugly.

After many hours of looking at this, I'm still not sure how has_b_frames
is *intended* to behave, but to me the implementation appears way more
complicated than it ought to be.

My patch relies on the encoder to set an optional field in the SPS. This
works for libx264 streams, but I'm not sure that all h264 encoders will
set it.

Signed-off-by: Anton Khirnov <anton at khirnov.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=aa15e68721b15f8020da9d392954b343f195f22c
---

 libavcodec/h264.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 78ca414..0aac097 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -3768,7 +3768,8 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
             init_get_bits(&s->gb, ptr, bit_length);
             ff_h264_decode_seq_parameter_set(h);
 
-            if(s->flags& CODEC_FLAG_LOW_DELAY)
+            if (s->flags& CODEC_FLAG_LOW_DELAY ||
+                (h->sps.bitstream_restriction_flag && !h->sps.num_reorder_frames))
                 s->low_delay=1;
 
             if(avctx->has_b_frames < 2)



More information about the ffmpeg-cvslog mailing list