diff options
author | Ivan Schreter <schreter@gmx.net> | 2009-03-04 19:37:19 +0000 |
---|---|---|
committer | Ivan Schreter <schreter@gmx.net> | 2009-03-04 19:37:19 +0000 |
commit | 70e01da3bf81db51135065dd7d7d19e611e9fd2d (patch) | |
tree | 405d2ed3a0d4c156b0ee3c96d31ad07a4ab94909 | |
parent | a284d0309301a271f5114ccb83d2c31d19399a71 (diff) | |
download | ffmpeg-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.c | 18 | ||||
-rw-r--r-- | libavcodec/h264.h | 7 |
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; |