aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanne Grunau <janne-libav@jannau.net>2012-11-16 14:31:09 +0100
committerReinhard Tartler <siretart@tauware.de>2013-01-12 17:59:40 +0100
commit6cd92c3880956ee58fa59aca2d0656b10f506988 (patch)
treecaf420624cb00a61f3a947ba0bf5861aee2ddda5
parent522e97bd9e91903249b5b7f9fb9f267bb55cb967 (diff)
downloadffmpeg-6cd92c3880956ee58fa59aca2d0656b10f506988.tar.gz
h264: enable low delay only if no delayed frames were seen
Dropping frames is undesirable but that is the only way by which the decoder could return to low delay mode. Instead emit a warning and continue with delayed frames. Fixes a crash in fuzzed sample nasa-8s2.ts_s20033 caused by a larger than expected has_b_frames value. Low delay keeps getting re-enabled from a presumely broken SPS. CC: libav-stable@libav.org (cherry picked from commit 706acb558a38eba633056773280155d66c2f4b24) Conflicts: libavcodec/h264.c
-rw-r--r--libavcodec/h264.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index b866917e5f..1c5b841889 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -4030,9 +4030,16 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
ff_h264_decode_seq_parameter_set(h);
}
- if (s->flags& CODEC_FLAG_LOW_DELAY ||
- (h->sps.bitstream_restriction_flag && !h->sps.num_reorder_frames))
- s->low_delay=1;
+ if (s->flags & CODEC_FLAG_LOW_DELAY ||
+ (h->sps.bitstream_restriction_flag &&
+ !h->sps.num_reorder_frames)) {
+ if (s->avctx->has_b_frames > 1 || h->delayed_pic[0])
+ av_log(avctx, AV_LOG_WARNING, "Delayed frames seen "
+ "reenabling low delay requires a codec "
+ "flush.\n");
+ else
+ s->low_delay = 1;
+ }
if(avctx->has_b_frames < 2)
avctx->has_b_frames= !s->low_delay;