The use of this SEI is for backward compatibility in HLG HDR systems: older devices that cannot interpret the "arib-std-b67" transfer will get the compatible transfer (usually bt709 or bt2020) from the VUI, while newer devices that can interpret HDR will read the SEI and use its value instead. Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>tags/n3.4
| @@ -382,6 +382,14 @@ static int decode_green_metadata(H264SEIGreenMetaData *h, GetBitContext *gb) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static int decode_alternative_transfer(H264SEIAlternativeTransfer *h, | |||||
| GetBitContext *gb) | |||||
| { | |||||
| h->present = 1; | |||||
| h->preferred_transfer_characteristics = get_bits(gb, 8); | |||||
| return 0; | |||||
| } | |||||
| int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, | int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, | ||||
| const H264ParamSets *ps, void *logctx) | const H264ParamSets *ps, void *logctx) | ||||
| { | { | ||||
| @@ -437,6 +445,9 @@ int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, | |||||
| case SEI_TYPE_GREEN_METADATA: | case SEI_TYPE_GREEN_METADATA: | ||||
| ret = decode_green_metadata(&h->green_metadata, gb); | ret = decode_green_metadata(&h->green_metadata, gb); | ||||
| break; | break; | ||||
| case SEI_TYPE_ALTERNATIVE_TRANSFER: | |||||
| ret = decode_alternative_transfer(&h->alternative_transfer, gb); | |||||
| break; | |||||
| default: | default: | ||||
| av_log(logctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type); | av_log(logctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type); | ||||
| } | } | ||||
| @@ -32,7 +32,8 @@ typedef enum { | |||||
| SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync) | SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync) | ||||
| SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement | SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement | ||||
| SEI_TYPE_DISPLAY_ORIENTATION = 47, ///< display orientation | SEI_TYPE_DISPLAY_ORIENTATION = 47, ///< display orientation | ||||
| SEI_TYPE_GREEN_METADATA = 56 ///< GreenMPEG information | |||||
| SEI_TYPE_GREEN_METADATA = 56, ///< GreenMPEG information | |||||
| SEI_TYPE_ALTERNATIVE_TRANSFER = 147, ///< alternative transfer | |||||
| } SEI_Type; | } SEI_Type; | ||||
| /** | /** | ||||
| @@ -144,6 +145,11 @@ typedef struct H264SEIGreenMetaData { | |||||
| uint16_t xsd_metric_value; | uint16_t xsd_metric_value; | ||||
| } H264SEIGreenMetaData; | } H264SEIGreenMetaData; | ||||
| typedef struct H264SEIAlternativeTransfer { | |||||
| int present; | |||||
| int preferred_transfer_characteristics; | |||||
| } H264SEIAlternativeTransfer; | |||||
| typedef struct H264SEIContext { | typedef struct H264SEIContext { | ||||
| H264SEIPictureTiming picture_timing; | H264SEIPictureTiming picture_timing; | ||||
| H264SEIAFD afd; | H264SEIAFD afd; | ||||
| @@ -154,6 +160,7 @@ typedef struct H264SEIContext { | |||||
| H264SEIFramePacking frame_packing; | H264SEIFramePacking frame_packing; | ||||
| H264SEIDisplayOrientation display_orientation; | H264SEIDisplayOrientation display_orientation; | ||||
| H264SEIGreenMetaData green_metadata; | H264SEIGreenMetaData green_metadata; | ||||
| H264SEIAlternativeTransfer alternative_transfer; | |||||
| } H264SEIContext; | } H264SEIContext; | ||||
| struct H264ParamSets; | struct H264ParamSets; | ||||
| @@ -1287,6 +1287,12 @@ static int h264_export_frame_props(H264Context *h) | |||||
| h->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS; | h->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS; | ||||
| } | } | ||||
| if (h->sei.alternative_transfer.present && | |||||
| av_color_transfer_name(h->sei.alternative_transfer.preferred_transfer_characteristics) && | |||||
| h->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) { | |||||
| h->avctx->color_trc = cur->f->color_trc = h->sei.alternative_transfer.preferred_transfer_characteristics; | |||||
| } | |||||
| return 0; | return 0; | ||||
| } | } | ||||