Commit 70e01da3 authored by Ivan Schreter's avatar Ivan Schreter

Add support for ct_type to correctly detect interlaced flag

Originally committed as revision 17811 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent a284d030
...@@ -6795,6 +6795,7 @@ static int decode_picture_timing(H264Context *h){ ...@@ -6795,6 +6795,7 @@ static int decode_picture_timing(H264Context *h){
if(h->sps.pic_struct_present_flag){ if(h->sps.pic_struct_present_flag){
unsigned int i, num_clock_ts; unsigned int i, num_clock_ts;
h->sei_pic_struct = get_bits(&s->gb, 4); h->sei_pic_struct = get_bits(&s->gb, 4);
h->sei_ct_type = 0;
if (h->sei_pic_struct > SEI_PIC_STRUCT_FRAME_TRIPLING) if (h->sei_pic_struct > SEI_PIC_STRUCT_FRAME_TRIPLING)
return -1; return -1;
...@@ -6804,7 +6805,7 @@ static int decode_picture_timing(H264Context *h){ ...@@ -6804,7 +6805,7 @@ static int decode_picture_timing(H264Context *h){
for (i = 0 ; i < num_clock_ts ; i++){ for (i = 0 ; i < num_clock_ts ; i++){
if(get_bits(&s->gb, 1)){ /* clock_timestamp_flag */ if(get_bits(&s->gb, 1)){ /* clock_timestamp_flag */
unsigned int full_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, 1); /* nuit_field_based_flag */
skip_bits(&s->gb, 5); /* counting_type */ skip_bits(&s->gb, 5); /* counting_type */
full_timestamp_flag = get_bits(&s->gb, 1); full_timestamp_flag = get_bits(&s->gb, 1);
...@@ -7762,24 +7763,19 @@ static int decode_frame(AVCodecContext *avctx, ...@@ -7762,24 +7763,19 @@ static int decode_frame(AVCodecContext *avctx,
/* Signal interlacing information externally. */ /* Signal interlacing information externally. */
/* Prioritize picture timing SEI information over used decoding process if it exists. */ /* 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){ if(h->sps.pic_struct_present_flag){
switch (h->sei_pic_struct) 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_TOP_BOTTOM_TOP:
case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM:
// Signal the possibility of telecined film externally (pic_struct 5,6) // Signal the possibility of telecined film externally (pic_struct 5,6)
// From these hints, let the applications decide if they apply deinterlacing. // From these hints, let the applications decide if they apply deinterlacing.
cur->repeat_pict = 1; cur->repeat_pict = 1;
cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE;
break; break;
case SEI_PIC_STRUCT_FRAME_DOUBLING: case SEI_PIC_STRUCT_FRAME_DOUBLING:
// Force progressive here, as doubling interlaced frame is a bad idea. // Force progressive here, as doubling interlaced frame is a bad idea.
......
...@@ -503,6 +503,13 @@ typedef struct H264Context{ ...@@ -503,6 +503,13 @@ typedef struct H264Context{
*/ */
SEI_PicStructType sei_pic_struct; 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 * dpb_output_delay in picture timing SEI message, see H.264 C.2.2
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment