diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2017-02-15 11:34:52 -0500 |
---|---|---|
committer | Vittorio Giovara <vittorio.giovara@gmail.com> | 2017-02-28 10:32:50 -0500 |
commit | d7b2bb5391bf55e8f9421bff7feb4c1fddfac4bf (patch) | |
tree | 2b9c3aafaab1eacac14fa98759ba5c89178d060f | |
parent | 21cca00dfeaec08ca93cf94ed33f4311cf1d8c84 (diff) | |
download | ffmpeg-d7b2bb5391bf55e8f9421bff7feb4c1fddfac4bf.tar.gz |
h264_sei: Check actual presence of picture timing SEI message
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
-rw-r--r-- | libavcodec/h264_parser.c | 4 | ||||
-rw-r--r-- | libavcodec/h264_sei.c | 3 | ||||
-rw-r--r-- | libavcodec/h264_sei.h | 1 | ||||
-rw-r--r-- | libavcodec/h264_slice.c | 5 |
4 files changed, 9 insertions, 4 deletions
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index 6de37c0b55..22153bd4e0 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -402,7 +402,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, } } - if (sps->pic_struct_present_flag) { + if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { switch (p->sei.picture_timing.pic_struct) { case SEI_PIC_STRUCT_TOP_FIELD: case SEI_PIC_STRUCT_BOTTOM_FIELD: @@ -433,7 +433,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, if (p->picture_structure == PICT_FRAME) { s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; - if (sps->pic_struct_present_flag) { + if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { switch (p->sei.picture_timing.pic_struct) { case SEI_PIC_STRUCT_TOP_BOTTOM: case SEI_PIC_STRUCT_TOP_BOTTOM_TOP: diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c index 4bf001ae07..17f89cec61 100644 --- a/libavcodec/h264_sei.c +++ b/libavcodec/h264_sei.c @@ -44,6 +44,7 @@ void ff_h264_sei_uninit(H264SEIContext *h) h->picture_timing.dpb_output_delay = 0; h->picture_timing.cpb_removal_delay = -1; + h->picture_timing.present = 0; h->buffering_period.present = 0; h->frame_packing.present = 0; h->display_orientation.present = 0; @@ -109,6 +110,8 @@ static int decode_picture_timing(H264SEIPictureTiming *h, GetBitContext *gb, av_log(logctx, AV_LOG_DEBUG, "ct_type:%X pic_struct:%d\n", h->ct_type, h->pic_struct); } + + h->present = 1; return 0; } diff --git a/libavcodec/h264_sei.h b/libavcodec/h264_sei.h index 58f5ecc5a9..8815aa3899 100644 --- a/libavcodec/h264_sei.h +++ b/libavcodec/h264_sei.h @@ -50,6 +50,7 @@ typedef enum { } SEI_PicStructType; typedef struct H264SEIPictureTiming { + int present; SEI_PicStructType pic_struct; /** diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index f1f5fc05f9..427cbe618c 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1004,7 +1004,7 @@ static int h264_export_frame_props(H264Context *h) /* Prioritize picture timing SEI information over used * decoding process if it exists. */ - if (sps->pic_struct_present_flag) { + if (sps->pic_struct_present_flag && h->sei.picture_timing.present) { H264SEIPictureTiming *pt = &h->sei.picture_timing; switch (pt->pic_struct) { case SEI_PIC_STRUCT_FRAME: @@ -1049,7 +1049,8 @@ static int h264_export_frame_props(H264Context *h) /* Derive top_field_first from field pocs. */ cur->f->top_field_first = cur->field_poc[0] < cur->field_poc[1]; } else { - if (cur->f->interlaced_frame || sps->pic_struct_present_flag) { + if (cur->f->interlaced_frame || + (sps->pic_struct_present_flag && h->sei.picture_timing.present)) { /* Use picture timing SEI information. Even if it is a * information of a past frame, better than nothing. */ if (h->sei.picture_timing.pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM || |