# HG changeset patch # User cehoyos # Date 1244582200 0 # Node ID febe1855b64a97c168abf1e13691ed158b2837a8 # Parent bd0879f752e61bea2d7fdaed66e62761296cdbf3 Add field prev_interlaced_frame to H264Context to be able to flag soft telecine progressive. Patch by Haruhiko Yamagata, h D yamagata A nifty D com diff -r bd0879f752e6 -r febe1855b64a h264.c --- a/h264.c Tue Jun 09 20:29:52 2009 +0000 +++ b/h264.c Tue Jun 09 21:16:40 2009 +0000 @@ -3153,6 +3153,7 @@ h->delayed_pic[i]= NULL; } h->outputed_poc= INT_MIN; + h->prev_interlaced_frame = 1; idr(h); if(h->s.current_picture_ptr) h->s.current_picture_ptr->reference= 0; @@ -3807,6 +3808,7 @@ if (MPV_common_init(s) < 0) return -1; s->first_field = 0; + h->prev_interlaced_frame = 1; init_scan_tables(h); alloc_tables(h); @@ -7789,18 +7791,29 @@ *data_size = 0; } else { + cur->interlaced_frame = 0; cur->repeat_pict = 0; /* Signal interlacing information externally. */ /* Prioritize picture timing SEI information over used decoding process if it exists. */ - if (h->sei_ct_type & 3) - 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: + break; + case SEI_PIC_STRUCT_TOP_FIELD: + case SEI_PIC_STRUCT_BOTTOM_FIELD: + cur->interlaced_frame = 1; + break; + case SEI_PIC_STRUCT_TOP_BOTTOM: + case SEI_PIC_STRUCT_BOTTOM_TOP: + if (FIELD_OR_MBAFF_PICTURE) + cur->interlaced_frame = 1; + else + // try to flag soft telecine progressive + cur->interlaced_frame = h->prev_interlaced_frame; + 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) @@ -7809,18 +7822,20 @@ break; case SEI_PIC_STRUCT_FRAME_DOUBLING: // Force progressive here, as doubling interlaced frame is a bad idea. - cur->interlaced_frame = 0; cur->repeat_pict = 2; break; case SEI_PIC_STRUCT_FRAME_TRIPLING: - cur->interlaced_frame = 0; cur->repeat_pict = 4; break; } + + if ((h->sei_ct_type & 3) && h->sei_pic_struct <= SEI_PIC_STRUCT_BOTTOM_TOP) + cur->interlaced_frame = (h->sei_ct_type & (1<<1)) != 0; }else{ /* Derive interlacing flag from used decoding process. */ cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE; } + h->prev_interlaced_frame = cur->interlaced_frame; if (cur->field_poc[0] != cur->field_poc[1]){ /* Derive top_field_first from field pocs. */ diff -r bd0879f752e6 -r febe1855b64a h264.h --- a/h264.h Tue Jun 09 20:29:52 2009 +0000 +++ b/h264.h Tue Jun 09 21:16:40 2009 +0000 @@ -504,6 +504,14 @@ SEI_PicStructType sei_pic_struct; /** + * Complement sei_pic_struct + * SEI_PIC_STRUCT_TOP_BOTTOM and SEI_PIC_STRUCT_BOTTOM_TOP indicate interlaced frames. + * However, soft telecined frames may have these values. + * This is used in an attempt to flag soft telecine progressive. + */ + int prev_interlaced_frame; + + /** * 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).