diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2017-02-14 23:45:01 +0100 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2017-02-15 00:19:50 +0100 |
commit | 6a37abc59af4d87d4c55f7d812ac62d4d6a7464b (patch) | |
tree | 765f0197449375f36b353d91b1a8af19eca5df88 | |
parent | 5fe2b437023f46394dfd4a4c991aa4a3ac3d8e72 (diff) |
avcodec/h264_sei: Check actual presence of SEI picture timing instead of implying it
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-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 | 4 |
4 files changed, 8 insertions, 4 deletions
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index bca00717c4..bc35a6146e 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -471,7 +471,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: @@ -502,7 +502,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 5053962fe1..a7e627eba3 100644 --- a/libavcodec/h264_sei.c +++ b/libavcodec/h264_sei.c @@ -45,6 +45,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; @@ -119,6 +120,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 91977952ca..da3b391860 100644 --- a/libavcodec/h264_sei.h +++ b/libavcodec/h264_sei.h @@ -64,6 +64,7 @@ typedef enum { } SEI_FpaType; typedef struct H264SEIPictureTiming { + int present; SEI_PicStructType pic_struct; /** diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 91a3b2524a..a703853872 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1131,7 +1131,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: @@ -1176,7 +1176,7 @@ 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 (sps->pic_struct_present_flag) { + if (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 || |