diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-09-17 19:59:48 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-09-17 21:20:44 +0200 |
commit | a64b028aeb6579636e578ceb73f69b468bddb2f0 (patch) | |
tree | d370e53104f62637b4f755a6225c43cdf5af09ec /libavcodec/h264.c | |
parent | 35f38b3ab9d755aede5bce8abbe1cb9c07027f8a (diff) | |
download | ffmpeg-a64b028aeb6579636e578ceb73f69b468bddb2f0.tar.gz |
h264dec: Dont display trash before a keyframe.
Fixes Ticket472
This may (or may not) cause problems with files that have no keyframes.
Plese open a bugreport or mail me if you have a file for which this fails.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r-- | libavcodec/h264.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 3b24b6ac55..33f70fe729 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -2262,6 +2262,7 @@ static void flush_dpb(AVCodecContext *avctx){ h->s.first_field= 0; ff_h264_reset_sei(h); ff_mpeg_flush(avctx); + h->sync= 0; } static int init_poc(H264Context *h){ @@ -3711,6 +3712,8 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ s->current_picture_ptr->f.key_frame |= (hx->nal_unit_type == NAL_IDR_SLICE) || (h->sei_recovery_frame_cnt >= 0); + h->sync |= !!s->current_picture_ptr->f.key_frame; + s->current_picture_ptr->sync = h->sync; if (h->current_slice == 1) { if(!(s->flags2 & CODEC_FLAG2_CHUNKS)) { @@ -3914,13 +3917,13 @@ static int decode_frame(AVCodecContext *avctx, field_end(h, 0); - if (!h->next_output_pic) { - /* Wait for second field. */ - *data_size = 0; - - } else { - *data_size = sizeof(AVFrame); - *pict = *(AVFrame*)h->next_output_pic; + *data_size = 0; /* Wait for second field. */ + if (h->next_output_pic && h->next_output_pic->sync) { + h->sync |= 2*!!h->next_output_pic->f.key_frame; + if(h->sync>1 || h->next_output_pic->f.pict_type != AV_PICTURE_TYPE_B){ + *data_size = sizeof(AVFrame); + *pict = *(AVFrame*)h->next_output_pic; + } } } |