This avoids confusion with equivalent H.265 SEI values when both are being used at the same time.tags/n4.0
@@ -404,23 +404,23 @@ static inline int parse_nal_units(AVCodecParserContext *s, | |||||
if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { | 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_BOTTOM_FIELD: | |||||
case H264_SEI_PIC_STRUCT_TOP_FIELD: | |||||
case H264_SEI_PIC_STRUCT_BOTTOM_FIELD: | |||||
s->repeat_pict = 0; | s->repeat_pict = 0; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_FRAME: | |||||
case SEI_PIC_STRUCT_TOP_BOTTOM: | |||||
case SEI_PIC_STRUCT_BOTTOM_TOP: | |||||
case H264_SEI_PIC_STRUCT_FRAME: | |||||
case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | |||||
case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | |||||
s->repeat_pict = 1; | s->repeat_pict = 1; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | |||||
case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | |||||
case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | |||||
case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | |||||
s->repeat_pict = 2; | s->repeat_pict = 2; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_FRAME_DOUBLING: | |||||
case H264_SEI_PIC_STRUCT_FRAME_DOUBLING: | |||||
s->repeat_pict = 3; | s->repeat_pict = 3; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_FRAME_TRIPLING: | |||||
case H264_SEI_PIC_STRUCT_FRAME_TRIPLING: | |||||
s->repeat_pict = 5; | s->repeat_pict = 5; | ||||
break; | break; | ||||
default: | default: | ||||
@@ -435,12 +435,12 @@ static inline int parse_nal_units(AVCodecParserContext *s, | |||||
s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; | s->picture_structure = AV_PICTURE_STRUCTURE_FRAME; | ||||
if (sps->pic_struct_present_flag && p->sei.picture_timing.present) { | 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_TOP: | |||||
case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | |||||
case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | |||||
s->field_order = AV_FIELD_TT; | s->field_order = AV_FIELD_TT; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_BOTTOM_TOP: | |||||
case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | |||||
case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | |||||
case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | |||||
s->field_order = AV_FIELD_BB; | s->field_order = AV_FIELD_BB; | ||||
break; | break; | ||||
default: | default: | ||||
@@ -71,7 +71,7 @@ static int decode_picture_timing(H264SEIPictureTiming *h, GetBitContext *gb, | |||||
h->pic_struct = get_bits(gb, 4); | h->pic_struct = get_bits(gb, 4); | ||||
h->ct_type = 0; | h->ct_type = 0; | ||||
if (h->pic_struct > SEI_PIC_STRUCT_FRAME_TRIPLING) | |||||
if (h->pic_struct > H264_SEI_PIC_STRUCT_FRAME_TRIPLING) | |||||
return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
num_clock_ts = sei_num_clock_ts_table[h->pic_struct]; | num_clock_ts = sei_num_clock_ts_table[h->pic_struct]; | ||||
@@ -375,25 +375,25 @@ int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, | |||||
} | } | ||||
switch (type) { | switch (type) { | ||||
case SEI_TYPE_PIC_TIMING: // Picture timing SEI | |||||
case H264_SEI_TYPE_PIC_TIMING: // Picture timing SEI | |||||
ret = decode_picture_timing(&h->picture_timing, gb, ps->sps, logctx); | ret = decode_picture_timing(&h->picture_timing, gb, ps->sps, logctx); | ||||
break; | break; | ||||
case SEI_TYPE_USER_DATA_REGISTERED: | |||||
case H264_SEI_TYPE_USER_DATA_REGISTERED: | |||||
ret = decode_registered_user_data(h, gb, logctx, size); | ret = decode_registered_user_data(h, gb, logctx, size); | ||||
break; | break; | ||||
case SEI_TYPE_USER_DATA_UNREGISTERED: | |||||
case H264_SEI_TYPE_USER_DATA_UNREGISTERED: | |||||
ret = decode_unregistered_user_data(&h->unregistered, gb, logctx, size); | ret = decode_unregistered_user_data(&h->unregistered, gb, logctx, size); | ||||
break; | break; | ||||
case SEI_TYPE_RECOVERY_POINT: | |||||
case H264_SEI_TYPE_RECOVERY_POINT: | |||||
ret = decode_recovery_point(&h->recovery_point, gb); | ret = decode_recovery_point(&h->recovery_point, gb); | ||||
break; | break; | ||||
case SEI_TYPE_BUFFERING_PERIOD: | |||||
case H264_SEI_TYPE_BUFFERING_PERIOD: | |||||
ret = decode_buffering_period(&h->buffering_period, gb, ps, logctx); | ret = decode_buffering_period(&h->buffering_period, gb, ps, logctx); | ||||
break; | break; | ||||
case SEI_TYPE_FRAME_PACKING: | |||||
case H264_SEI_TYPE_FRAME_PACKING: | |||||
ret = decode_frame_packing_arrangement(&h->frame_packing, gb); | ret = decode_frame_packing_arrangement(&h->frame_packing, gb); | ||||
break; | break; | ||||
case SEI_TYPE_DISPLAY_ORIENTATION: | |||||
case H264_SEI_TYPE_DISPLAY_ORIENTATION: | |||||
ret = decode_display_orientation(&h->display_orientation, gb); | ret = decode_display_orientation(&h->display_orientation, gb); | ||||
break; | break; | ||||
default: | default: | ||||
@@ -25,33 +25,34 @@ | |||||
* SEI message types | * SEI message types | ||||
*/ | */ | ||||
typedef enum { | typedef enum { | ||||
SEI_TYPE_BUFFERING_PERIOD = 0, ///< buffering period (H.264, D.1.1) | |||||
SEI_TYPE_PIC_TIMING = 1, ///< picture timing | |||||
SEI_TYPE_USER_DATA_REGISTERED = 4, ///< registered user data as specified by Rec. ITU-T T.35 | |||||
SEI_TYPE_USER_DATA_UNREGISTERED = 5, ///< unregistered user data | |||||
SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync) | |||||
SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement | |||||
SEI_TYPE_DISPLAY_ORIENTATION = 47, ///< display orientation | |||||
} SEI_Type; | |||||
H264_SEI_TYPE_BUFFERING_PERIOD = 0, ///< buffering period (H.264, D.1.1) | |||||
H264_SEI_TYPE_PIC_TIMING = 1, ///< picture timing | |||||
H264_SEI_TYPE_FILLER_PAYLOAD = 3, ///< filler data | |||||
H264_SEI_TYPE_USER_DATA_REGISTERED = 4, ///< registered user data as specified by Rec. ITU-T T.35 | |||||
H264_SEI_TYPE_USER_DATA_UNREGISTERED = 5, ///< unregistered user data | |||||
H264_SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync) | |||||
H264_SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement | |||||
H264_SEI_TYPE_DISPLAY_ORIENTATION = 47, ///< display orientation | |||||
} H264_SEI_Type; | |||||
/** | /** | ||||
* pic_struct in picture timing SEI message | * pic_struct in picture timing SEI message | ||||
*/ | */ | ||||
typedef enum { | typedef enum { | ||||
SEI_PIC_STRUCT_FRAME = 0, ///< 0: %frame | |||||
SEI_PIC_STRUCT_TOP_FIELD = 1, ///< 1: top field | |||||
SEI_PIC_STRUCT_BOTTOM_FIELD = 2, ///< 2: bottom field | |||||
SEI_PIC_STRUCT_TOP_BOTTOM = 3, ///< 3: top field, bottom field, in that order | |||||
SEI_PIC_STRUCT_BOTTOM_TOP = 4, ///< 4: bottom field, top field, in that order | |||||
SEI_PIC_STRUCT_TOP_BOTTOM_TOP = 5, ///< 5: top field, bottom field, top field repeated, in that order | |||||
SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6, ///< 6: bottom field, top field, bottom field repeated, in that order | |||||
SEI_PIC_STRUCT_FRAME_DOUBLING = 7, ///< 7: %frame doubling | |||||
SEI_PIC_STRUCT_FRAME_TRIPLING = 8 ///< 8: %frame tripling | |||||
} SEI_PicStructType; | |||||
H264_SEI_PIC_STRUCT_FRAME = 0, ///< 0: %frame | |||||
H264_SEI_PIC_STRUCT_TOP_FIELD = 1, ///< 1: top field | |||||
H264_SEI_PIC_STRUCT_BOTTOM_FIELD = 2, ///< 2: bottom field | |||||
H264_SEI_PIC_STRUCT_TOP_BOTTOM = 3, ///< 3: top field, bottom field, in that order | |||||
H264_SEI_PIC_STRUCT_BOTTOM_TOP = 4, ///< 4: bottom field, top field, in that order | |||||
H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP = 5, ///< 5: top field, bottom field, top field repeated, in that order | |||||
H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM = 6, ///< 6: bottom field, top field, bottom field repeated, in that order | |||||
H264_SEI_PIC_STRUCT_FRAME_DOUBLING = 7, ///< 7: %frame doubling | |||||
H264_SEI_PIC_STRUCT_FRAME_TRIPLING = 8 ///< 8: %frame tripling | |||||
} H264_SEI_PicStructType; | |||||
typedef struct H264SEIPictureTiming { | typedef struct H264SEIPictureTiming { | ||||
int present; | int present; | ||||
SEI_PicStructType pic_struct; | |||||
H264_SEI_PicStructType pic_struct; | |||||
/** | /** | ||||
* Bit set of clock types for fields/frames in picture timing SEI message. | * Bit set of clock types for fields/frames in picture timing SEI message. | ||||
@@ -1007,37 +1007,37 @@ static int h264_export_frame_props(H264Context *h) | |||||
if (sps->pic_struct_present_flag && h->sei.picture_timing.present) { | 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 H264_SEI_PIC_STRUCT_FRAME: | |||||
break; | break; | ||||
case SEI_PIC_STRUCT_TOP_FIELD: | |||||
case SEI_PIC_STRUCT_BOTTOM_FIELD: | |||||
case H264_SEI_PIC_STRUCT_TOP_FIELD: | |||||
case H264_SEI_PIC_STRUCT_BOTTOM_FIELD: | |||||
cur->f->interlaced_frame = 1; | cur->f->interlaced_frame = 1; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_TOP_BOTTOM: | |||||
case SEI_PIC_STRUCT_BOTTOM_TOP: | |||||
case H264_SEI_PIC_STRUCT_TOP_BOTTOM: | |||||
case H264_SEI_PIC_STRUCT_BOTTOM_TOP: | |||||
if (FIELD_OR_MBAFF_PICTURE(h)) | if (FIELD_OR_MBAFF_PICTURE(h)) | ||||
cur->f->interlaced_frame = 1; | cur->f->interlaced_frame = 1; | ||||
else | else | ||||
// try to flag soft telecine progressive | // try to flag soft telecine progressive | ||||
cur->f->interlaced_frame = h->prev_interlaced_frame; | cur->f->interlaced_frame = h->prev_interlaced_frame; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | |||||
case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | |||||
case H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | |||||
case H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | |||||
/* Signal the possibility of telecined film externally | /* Signal the possibility of telecined film externally | ||||
* (pic_struct 5,6). From these hints, let the applications | * (pic_struct 5,6). From these hints, let the applications | ||||
* decide if they apply deinterlacing. */ | * decide if they apply deinterlacing. */ | ||||
cur->f->repeat_pict = 1; | cur->f->repeat_pict = 1; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_FRAME_DOUBLING: | |||||
case H264_SEI_PIC_STRUCT_FRAME_DOUBLING: | |||||
cur->f->repeat_pict = 2; | cur->f->repeat_pict = 2; | ||||
break; | break; | ||||
case SEI_PIC_STRUCT_FRAME_TRIPLING: | |||||
case H264_SEI_PIC_STRUCT_FRAME_TRIPLING: | |||||
cur->f->repeat_pict = 4; | cur->f->repeat_pict = 4; | ||||
break; | break; | ||||
} | } | ||||
if ((pt->ct_type & 3) && | if ((pt->ct_type & 3) && | ||||
pt->pic_struct <= SEI_PIC_STRUCT_BOTTOM_TOP) | |||||
pt->pic_struct <= H264_SEI_PIC_STRUCT_BOTTOM_TOP) | |||||
cur->f->interlaced_frame = (pt->ct_type & (1 << 1)) != 0; | cur->f->interlaced_frame = (pt->ct_type & (1 << 1)) != 0; | ||||
} else { | } else { | ||||
/* Derive interlacing flag from used decoding process. */ | /* Derive interlacing flag from used decoding process. */ | ||||
@@ -1053,8 +1053,8 @@ static int h264_export_frame_props(H264Context *h) | |||||
(sps->pic_struct_present_flag && h->sei.picture_timing.present)) { | (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 || | |||||
h->sei.picture_timing.pic_struct == SEI_PIC_STRUCT_TOP_BOTTOM_TOP) | |||||
if (h->sei.picture_timing.pic_struct == H264_SEI_PIC_STRUCT_TOP_BOTTOM || | |||||
h->sei.picture_timing.pic_struct == H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP) | |||||
cur->f->top_field_first = 1; | cur->f->top_field_first = 1; | ||||
else | else | ||||
cur->f->top_field_first = 0; | cur->f->top_field_first = 0; | ||||
@@ -650,18 +650,18 @@ static void vaapi_encode_h264_write_sei(PutBitContext *pbc, | |||||
for (payload_type = 0; payload_type < 64; payload_type++) { | for (payload_type = 0; payload_type < 64; payload_type++) { | ||||
switch (payload_type) { | switch (payload_type) { | ||||
case SEI_TYPE_BUFFERING_PERIOD: | |||||
case H264_SEI_TYPE_BUFFERING_PERIOD: | |||||
if (!priv->send_timing_sei || | if (!priv->send_timing_sei || | ||||
pic->type != PICTURE_TYPE_IDR) | pic->type != PICTURE_TYPE_IDR) | ||||
continue; | continue; | ||||
write_payload = &vaapi_encode_h264_write_buffering_period; | write_payload = &vaapi_encode_h264_write_buffering_period; | ||||
break; | break; | ||||
case SEI_TYPE_PIC_TIMING: | |||||
case H264_SEI_TYPE_PIC_TIMING: | |||||
if (!priv->send_timing_sei) | if (!priv->send_timing_sei) | ||||
continue; | continue; | ||||
write_payload = &vaapi_encode_h264_write_pic_timing; | write_payload = &vaapi_encode_h264_write_pic_timing; | ||||
break; | break; | ||||
case SEI_TYPE_USER_DATA_UNREGISTERED: | |||||
case H264_SEI_TYPE_USER_DATA_UNREGISTERED: | |||||
if (pic->encode_order != 0) | if (pic->encode_order != 0) | ||||
continue; | continue; | ||||
write_payload = &vaapi_encode_h264_write_identifier; | write_payload = &vaapi_encode_h264_write_identifier; | ||||