mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avcodec/h264_sei: Check actual presence of SEI picture timing instead of implying it
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
5fe2b43702
commit
6a37abc59a
@ -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) {
|
switch (p->sei.picture_timing.pic_struct) {
|
||||||
case SEI_PIC_STRUCT_TOP_FIELD:
|
case SEI_PIC_STRUCT_TOP_FIELD:
|
||||||
case SEI_PIC_STRUCT_BOTTOM_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) {
|
if (p->picture_structure == PICT_FRAME) {
|
||||||
s->picture_structure = AV_PICTURE_STRUCTURE_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) {
|
switch (p->sei.picture_timing.pic_struct) {
|
||||||
case SEI_PIC_STRUCT_TOP_BOTTOM:
|
case SEI_PIC_STRUCT_TOP_BOTTOM:
|
||||||
case SEI_PIC_STRUCT_TOP_BOTTOM_TOP:
|
case SEI_PIC_STRUCT_TOP_BOTTOM_TOP:
|
||||||
|
@ -45,6 +45,7 @@ void ff_h264_sei_uninit(H264SEIContext *h)
|
|||||||
h->picture_timing.dpb_output_delay = 0;
|
h->picture_timing.dpb_output_delay = 0;
|
||||||
h->picture_timing.cpb_removal_delay = -1;
|
h->picture_timing.cpb_removal_delay = -1;
|
||||||
|
|
||||||
|
h->picture_timing.present = 0;
|
||||||
h->buffering_period.present = 0;
|
h->buffering_period.present = 0;
|
||||||
h->frame_packing.present = 0;
|
h->frame_packing.present = 0;
|
||||||
h->display_orientation.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",
|
av_log(logctx, AV_LOG_DEBUG, "ct_type:%X pic_struct:%d\n",
|
||||||
h->ct_type, h->pic_struct);
|
h->ct_type, h->pic_struct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h->present = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ typedef enum {
|
|||||||
} SEI_FpaType;
|
} SEI_FpaType;
|
||||||
|
|
||||||
typedef struct H264SEIPictureTiming {
|
typedef struct H264SEIPictureTiming {
|
||||||
|
int present;
|
||||||
SEI_PicStructType pic_struct;
|
SEI_PicStructType pic_struct;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1131,7 +1131,7 @@ static int h264_export_frame_props(H264Context *h)
|
|||||||
/* Prioritize picture timing SEI information over used
|
/* Prioritize picture timing SEI information over used
|
||||||
* decoding process if it exists. */
|
* 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;
|
H264SEIPictureTiming *pt = &h->sei.picture_timing;
|
||||||
switch (pt->pic_struct) {
|
switch (pt->pic_struct) {
|
||||||
case SEI_PIC_STRUCT_FRAME:
|
case SEI_PIC_STRUCT_FRAME:
|
||||||
@ -1176,7 +1176,7 @@ static int h264_export_frame_props(H264Context *h)
|
|||||||
/* Derive top_field_first from field pocs. */
|
/* Derive top_field_first from field pocs. */
|
||||||
cur->f->top_field_first = cur->field_poc[0] < cur->field_poc[1];
|
cur->f->top_field_first = cur->field_poc[0] < cur->field_poc[1];
|
||||||
} else {
|
} 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
|
/* Use picture timing SEI information. Even if it is a
|
||||||
* information of a past frame, better than nothing. */
|
* information of a past frame, better than nothing. */
|
||||||
if (h->sei.picture_timing.pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM ||
|
if (h->sei.picture_timing.pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM ||
|
||||||
|
Loading…
Reference in New Issue
Block a user