Browse Source

Correctly reset SEI variables.

Patch by Ivan Schreter, schreter gmx net

Originally committed as revision 17651 to svn://svn.ffmpeg.org/ffmpeg/trunk
tags/v0.5
Ivan Schreter Carl Eugen Hoyos 16 years ago
parent
commit
03831f462e
1 changed files with 15 additions and 12 deletions
  1. +15
    -12
      libavcodec/h264.c

+ 15
- 12
libavcodec/h264.c View File

@@ -2161,6 +2161,18 @@ static av_cold void common_init(H264Context *h){
memset(h->pps.scaling_matrix8, 16, 2*64*sizeof(uint8_t)); memset(h->pps.scaling_matrix8, 16, 2*64*sizeof(uint8_t));
} }


/**
* Reset SEI values at the beginning of the frame.
*
* @param h H.264 context.
*/
static void reset_sei(H264Context *h) {
h->sei_recovery_frame_cnt = -1;
h->sei_dpb_output_delay = 0;
h->sei_cpb_removal_delay = -1;
h->sei_buffering_period_present = 0;
}

static av_cold int decode_init(AVCodecContext *avctx){ static av_cold int decode_init(AVCodecContext *avctx){
H264Context *h= avctx->priv_data; H264Context *h= avctx->priv_data;
MpegEncContext * const s = &h->s; MpegEncContext * const s = &h->s;
@@ -2197,10 +2209,7 @@ static av_cold int decode_init(AVCodecContext *avctx){
h->thread_context[0] = h; h->thread_context[0] = h;
h->outputed_poc = INT_MIN; h->outputed_poc = INT_MIN;
h->prev_poc_msb= 1<<16; h->prev_poc_msb= 1<<16;
h->sei_recovery_frame_cnt = -1;
h->sei_dpb_output_delay = 0;
h->sei_cpb_removal_delay = -1;
h->sei_buffering_period_present = 0;
reset_sei(h);
if(avctx->codec_id == CODEC_ID_H264) if(avctx->codec_id == CODEC_ID_H264)
avctx->ticks_per_frame = 2; avctx->ticks_per_frame = 2;
return 0; return 0;
@@ -3137,10 +3146,7 @@ static void flush_dpb(AVCodecContext *avctx){
if(h->s.current_picture_ptr) if(h->s.current_picture_ptr)
h->s.current_picture_ptr->reference= 0; h->s.current_picture_ptr->reference= 0;
h->s.first_field= 0; h->s.first_field= 0;
h->sei_recovery_frame_cnt = -1;
h->sei_dpb_output_delay = 0;
h->sei_cpb_removal_delay = -1;
h->sei_buffering_period_present = 0;
reset_sei(h);
ff_mpeg_flush(avctx); ff_mpeg_flush(avctx);
} }


@@ -7407,6 +7413,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
h->current_slice = 0; h->current_slice = 0;
if (!s->first_field) if (!s->first_field)
s->current_picture_ptr= NULL; s->current_picture_ptr= NULL;
reset_sei(h);
} }


for(;;){ for(;;){
@@ -7744,10 +7751,6 @@ static int decode_frame(AVCodecContext *avctx,
ff_er_frame_end(s); ff_er_frame_end(s);


MPV_frame_end(s); MPV_frame_end(s);
h->sei_recovery_frame_cnt = -1;
h->sei_dpb_output_delay = 0;
h->sei_cpb_removal_delay = -1;
h->sei_buffering_period_present = 0;


if (cur->field_poc[0]==INT_MAX || cur->field_poc[1]==INT_MAX) { if (cur->field_poc[0]==INT_MAX || cur->field_poc[1]==INT_MAX) {
/* Wait for second field. */ /* Wait for second field. */


Loading…
Cancel
Save