[FFmpeg-cvslog] h264_sei: Check actual presence of picture timing SEI message
Michael Niedermayer
git at videolan.org
Wed Oct 4 07:05:07 EEST 2017
ffmpeg | branch: master | Michael Niedermayer <michael at niedermayer.cc> | Wed Feb 15 11:34:52 2017 -0500| [d7b2bb5391bf55e8f9421bff7feb4c1fddfac4bf] | committer: Vittorio Giovara
h264_sei: Check actual presence of picture timing SEI message
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
Signed-off-by: Vittorio Giovara <vittorio.giovara at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d7b2bb5391bf55e8f9421bff7feb4c1fddfac4bf
---
libavcodec/h264_parser.c | 4 ++--
libavcodec/h264_sei.c | 3 +++
libavcodec/h264_sei.h | 1 +
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 ||
More information about the ffmpeg-cvslog
mailing list