aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Schreter <schreter@gmx.net>2009-03-04 19:37:19 +0000
committerIvan Schreter <schreter@gmx.net>2009-03-04 19:37:19 +0000
commit70e01da3bf81db51135065dd7d7d19e611e9fd2d (patch)
tree405d2ed3a0d4c156b0ee3c96d31ad07a4ab94909
parenta284d0309301a271f5114ccb83d2c31d19399a71 (diff)
downloadffmpeg-70e01da3bf81db51135065dd7d7d19e611e9fd2d.tar.gz
Add support for ct_type to correctly detect interlaced flag
Originally committed as revision 17811 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/h264.c18
-rw-r--r--libavcodec/h264.h7
2 files changed, 14 insertions, 11 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 0e1690d7de..403d62e0b2 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -6795,6 +6795,7 @@ static int decode_picture_timing(H264Context *h){
if(h->sps.pic_struct_present_flag){
unsigned int i, num_clock_ts;
h->sei_pic_struct = get_bits(&s->gb, 4);
+ h->sei_ct_type = 0;
if (h->sei_pic_struct > SEI_PIC_STRUCT_FRAME_TRIPLING)
return -1;
@@ -6804,7 +6805,7 @@ static int decode_picture_timing(H264Context *h){
for (i = 0 ; i < num_clock_ts ; i++){
if(get_bits(&s->gb, 1)){ /* clock_timestamp_flag */
unsigned int full_timestamp_flag;
- skip_bits(&s->gb, 2); /* ct_type */
+ h->sei_ct_type |= 1<<get_bits(&s->gb, 2);
skip_bits(&s->gb, 1); /* nuit_field_based_flag */
skip_bits(&s->gb, 5); /* counting_type */
full_timestamp_flag = get_bits(&s->gb, 1);
@@ -7762,24 +7763,19 @@ static int decode_frame(AVCodecContext *avctx,
/* Signal interlacing information externally. */
/* Prioritize picture timing SEI information over used decoding process if it exists. */
+ if (h->sei_ct_type)
+ cur->interlaced_frame = (h->sei_ct_type & (1<<1)) != 0;
+ else
+ cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE;
+
if(h->sps.pic_struct_present_flag){
switch (h->sei_pic_struct)
{
- case SEI_PIC_STRUCT_FRAME:
- cur->interlaced_frame = 0;
- break;
- case SEI_PIC_STRUCT_TOP_FIELD:
- case SEI_PIC_STRUCT_BOTTOM_FIELD:
- case SEI_PIC_STRUCT_TOP_BOTTOM:
- case SEI_PIC_STRUCT_BOTTOM_TOP:
- cur->interlaced_frame = 1;
- break;
case SEI_PIC_STRUCT_TOP_BOTTOM_TOP:
case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM:
// Signal the possibility of telecined film externally (pic_struct 5,6)
// From these hints, let the applications decide if they apply deinterlacing.
cur->repeat_pict = 1;
- cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE;
break;
case SEI_PIC_STRUCT_FRAME_DOUBLING:
// Force progressive here, as doubling interlaced frame is a bad idea.
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 587f1e3f1c..fc9cef5d36 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -504,6 +504,13 @@ typedef struct H264Context{
SEI_PicStructType sei_pic_struct;
/**
+ * Bit set of clock types for fields/frames in picture timing SEI message.
+ * For each found ct_type, appropriate bit is set (e.g., bit 1 for
+ * interlaced).
+ */
+ int sei_ct_type;
+
+ /**
* dpb_output_delay in picture timing SEI message, see H.264 C.2.2
*/
int sei_dpb_output_delay;