}
}
- 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:
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:
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;
av_log(logctx, AV_LOG_DEBUG, "ct_type:%X pic_struct:%d\n",
h->ct_type, h->pic_struct);
}
+
+ h->present = 1;
return 0;
}
} SEI_FpaType;
typedef struct H264SEIPictureTiming {
+ int present;
SEI_PicStructType pic_struct;
/**
/* 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:
/* 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 ||