mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-09-29 16:23:10 +02:00
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 Originally committed as revision 19141 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
277a28e8fc
commit
b19d493f2b
@ -3153,6 +3153,7 @@ static void flush_dpb(AVCodecContext *avctx){
|
|||||||
h->delayed_pic[i]= NULL;
|
h->delayed_pic[i]= NULL;
|
||||||
}
|
}
|
||||||
h->outputed_poc= INT_MIN;
|
h->outputed_poc= INT_MIN;
|
||||||
|
h->prev_interlaced_frame = 1;
|
||||||
idr(h);
|
idr(h);
|
||||||
if(h->s.current_picture_ptr)
|
if(h->s.current_picture_ptr)
|
||||||
h->s.current_picture_ptr->reference= 0;
|
h->s.current_picture_ptr->reference= 0;
|
||||||
@ -3807,6 +3808,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
|
|||||||
if (MPV_common_init(s) < 0)
|
if (MPV_common_init(s) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
s->first_field = 0;
|
s->first_field = 0;
|
||||||
|
h->prev_interlaced_frame = 1;
|
||||||
|
|
||||||
init_scan_tables(h);
|
init_scan_tables(h);
|
||||||
alloc_tables(h);
|
alloc_tables(h);
|
||||||
@ -7789,18 +7791,29 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
*data_size = 0;
|
*data_size = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
cur->interlaced_frame = 0;
|
||||||
cur->repeat_pict = 0;
|
cur->repeat_pict = 0;
|
||||||
|
|
||||||
/* 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 & 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){
|
if(h->sps.pic_struct_present_flag){
|
||||||
switch (h->sei_pic_struct)
|
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_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)
|
||||||
@ -7809,18 +7822,20 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
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.
|
||||||
cur->interlaced_frame = 0;
|
|
||||||
cur->repeat_pict = 2;
|
cur->repeat_pict = 2;
|
||||||
break;
|
break;
|
||||||
case SEI_PIC_STRUCT_FRAME_TRIPLING:
|
case SEI_PIC_STRUCT_FRAME_TRIPLING:
|
||||||
cur->interlaced_frame = 0;
|
|
||||||
cur->repeat_pict = 4;
|
cur->repeat_pict = 4;
|
||||||
break;
|
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{
|
}else{
|
||||||
/* Derive interlacing flag from used decoding process. */
|
/* Derive interlacing flag from used decoding process. */
|
||||||
cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE;
|
cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE;
|
||||||
}
|
}
|
||||||
|
h->prev_interlaced_frame = cur->interlaced_frame;
|
||||||
|
|
||||||
if (cur->field_poc[0] != cur->field_poc[1]){
|
if (cur->field_poc[0] != cur->field_poc[1]){
|
||||||
/* Derive top_field_first from field pocs. */
|
/* Derive top_field_first from field pocs. */
|
||||||
|
@ -503,6 +503,14 @@ typedef struct H264Context{
|
|||||||
*/
|
*/
|
||||||
SEI_PicStructType sei_pic_struct;
|
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.
|
* 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
|
* For each found ct_type, appropriate bit is set (e.g., bit 1 for
|
||||||
|
Loading…
Reference in New Issue
Block a user