summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorHaruhiko Yamagata <h.yamagata@nifty.com>2009-06-09 21:16:40 +0000
committerCarl Eugen Hoyos <cehoyos@rainbow.studorg.tuwien.ac.at>2009-06-09 21:16:40 +0000
commitb19d493f2b9b59e50547c6ccb0d4d68c29267923 (patch)
tree8260285e03627b6b0e9eb6346d8400f69d29537d /libavcodec
parent277a28e8fc39cdc8bc69ed11532205f6f92a66ad (diff)
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
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/h264.c27
-rw-r--r--libavcodec/h264.h8
2 files changed, 29 insertions, 6 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index f2e785b9fc..d269795d45 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -3153,6 +3153,7 @@ static void flush_dpb(AVCodecContext *avctx){
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 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
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 @@ static int decode_frame(AVCodecContext *avctx,
*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 @@ static int decode_frame(AVCodecContext *avctx,
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 --git a/libavcodec/h264.h b/libavcodec/h264.h
index b58d86a67d..fa348a201f 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -504,6 +504,14 @@ typedef struct H264Context{
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).