[FFmpeg-cvslog] r17109 - in trunk/libavcodec: h264.c h264.h
cehoyos
subversion
Tue Feb 10 00:04:16 CET 2009
Author: cehoyos
Date: Tue Feb 10 00:04:16 2009
New Revision: 17109
Log:
Add SEI recovery point frame counter to H264Context and use it when
setting key_frame.
Patch by Ivan Schreter schreter A gmx D net
Modified:
trunk/libavcodec/h264.c
trunk/libavcodec/h264.h
Modified: trunk/libavcodec/h264.c
==============================================================================
--- trunk/libavcodec/h264.c Mon Feb 9 23:45:30 2009 (r17108)
+++ trunk/libavcodec/h264.c Tue Feb 10 00:04:16 2009 (r17109)
@@ -2208,6 +2208,7 @@ static av_cold int decode_init(AVCodecCo
h->thread_context[0] = h;
h->outputed_poc = INT_MIN;
h->prev_poc_msb= 1<<16;
+ h->sei_recovery_frame_cnt = -1;
return 0;
}
@@ -3141,6 +3142,7 @@ static void flush_dpb(AVCodecContext *av
if(h->s.current_picture_ptr)
h->s.current_picture_ptr->reference= 0;
h->s.first_field= 0;
+ h->sei_recovery_frame_cnt = -1;
ff_mpeg_flush(avctx);
}
@@ -6848,6 +6850,15 @@ static int decode_unregistered_user_data
return 0;
}
+static int decode_recovery_point(H264Context *h){
+ MpegEncContext * const s = &h->s;
+
+ h->sei_recovery_frame_cnt = get_ue_golomb(&s->gb);
+ skip_bits(&s->gb, 4); /* 1b exact_match_flag, 1b broken_link_flag, 2b changing_slice_group_idc */
+
+ return 0;
+}
+
static int decode_sei(H264Context *h){
MpegEncContext * const s = &h->s;
@@ -6873,6 +6884,10 @@ static int decode_sei(H264Context *h){
if(decode_unregistered_user_data(h, size) < 0)
return -1;
break;
+ case SEI_TYPE_RECOVERY_POINT:
+ if(decode_recovery_point(h) < 0)
+ return -1;
+ break;
default:
skip_bits(&s->gb, 8*size);
}
@@ -7431,7 +7446,9 @@ static int decode_nal_units(H264Context
if((err = decode_slice_header(hx, h)))
break;
- s->current_picture_ptr->key_frame|= (hx->nal_unit_type == NAL_IDR_SLICE);
+ s->current_picture_ptr->key_frame |=
+ (hx->nal_unit_type == NAL_IDR_SLICE) ||
+ (h->sei_recovery_frame_cnt >= 0);
if(hx->redundant_pic_count==0 && hx->s.hurry_up < 5
&& (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc)
&& (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type_nos!=FF_B_TYPE)
@@ -7668,6 +7685,7 @@ static int decode_frame(AVCodecContext *
ff_er_frame_end(s);
MPV_frame_end(s);
+ h->sei_recovery_frame_cnt = -1;
if (cur->field_poc[0]==INT_MAX || cur->field_poc[1]==INT_MAX) {
/* Wait for second field. */
Modified: trunk/libavcodec/h264.h
==============================================================================
--- trunk/libavcodec/h264.h Mon Feb 9 23:45:30 2009 (r17108)
+++ trunk/libavcodec/h264.h Tue Feb 10 00:04:16 2009 (r17109)
@@ -500,6 +500,15 @@ typedef struct H264Context{
*/
SEI_PicStructType sei_pic_struct;
+ /**
+ * recovery_frame_cnt from SEI message
+ *
+ * Set to -1 if no recovery point SEI message found or to number of frames
+ * before playback synchronizes. Frames having recovery point are key
+ * frames.
+ */
+ int sei_recovery_frame_cnt;
+
int is_complex;
int luma_weight_flag[2]; ///< 7.4.3.2 luma_weight_lX_flag
More information about the ffmpeg-cvslog
mailing list