diff --git a/src/gallium/frontends/va/picture.c b/src/gallium/frontends/va/picture.c index 0263baa1906..b77d46276d9 100644 --- a/src/gallium/frontends/va/picture.c +++ b/src/gallium/frontends/va/picture.c @@ -148,6 +148,8 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID context_id, VASurfaceID rende context->desc.av1enc.metadata_flags.value = 0; break; case PIPE_VIDEO_FORMAT_HEVC: + context->desc.h265enc.metadata_flags.value = 0; + break; case PIPE_VIDEO_FORMAT_MPEG4_AVC: default: break; diff --git a/src/gallium/frontends/va/picture_hevc_enc.c b/src/gallium/frontends/va/picture_hevc_enc.c index 002c5ff3029..60bcd69b489 100644 --- a/src/gallium/frontends/va/picture_hevc_enc.c +++ b/src/gallium/frontends/va/picture_hevc_enc.c @@ -35,6 +35,12 @@ enum HEVCNALUnitType { HEVC_NAL_VPS = 32, HEVC_NAL_SPS = 33, HEVC_NAL_PPS = 34, + HEVC_NAL_PREFIX_SEI = 39, +}; + +enum HEVCSEIPayloadType { + MASTERING_DISPLAY_COLOUR_VOLUME = 137, + CONTENT_LIGHT_LEVEL_INFO = 144, }; VAStatus @@ -680,6 +686,53 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp) if (st_rps) FREE(st_rps); } +static void parseEncSeiPayloadH265(vlVaContext *context, struct vl_rbsp *rbsp, int payloadType, int payloadSize) +{ + switch (payloadType) { + case MASTERING_DISPLAY_COLOUR_VOLUME: + context->desc.h265enc.metadata_flags.hdr_mdcv = 1; + for (int32_t i = 0; i < 3; i++) { + context->desc.h265enc.metadata_hdr_mdcv.primary_chromaticity_x[i] = vl_rbsp_u(rbsp, 16); + context->desc.h265enc.metadata_hdr_mdcv.primary_chromaticity_y[i] = vl_rbsp_u(rbsp, 16); + } + context->desc.h265enc.metadata_hdr_mdcv.white_point_chromaticity_x = vl_rbsp_u(rbsp, 16); + context->desc.h265enc.metadata_hdr_mdcv.white_point_chromaticity_y = vl_rbsp_u(rbsp, 16); + context->desc.h265enc.metadata_hdr_mdcv.luminance_max = vl_rbsp_u(rbsp, 32); + context->desc.h265enc.metadata_hdr_mdcv.luminance_min = vl_rbsp_u(rbsp, 32); + break; + case CONTENT_LIGHT_LEVEL_INFO: + context->desc.h265enc.metadata_flags.hdr_cll = 1; + context->desc.h265enc.metadata_hdr_cll.max_cll= vl_rbsp_u(rbsp, 16); + context->desc.h265enc.metadata_hdr_cll.max_fall= vl_rbsp_u(rbsp, 16); + break; + default: + break; + } +} + +static void parseEncSeiH265(vlVaContext *context, struct vl_rbsp *rbsp) +{ + do { + /* sei_message() */ + int payloadType = 0; + int payloadSize = 0; + + int byte = 0xFF; + while (byte == 0xFF) { + byte = vl_rbsp_u(rbsp, 8); + payloadType += byte; + } + + byte = 0xFF; + while (byte == 0xFF) { + byte = vl_rbsp_u(rbsp, 8); + payloadSize += byte; + } + parseEncSeiPayloadH265(context, rbsp, payloadType, payloadSize); + + } while (vl_rbsp_more_data(rbsp)); +} + VAStatus vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer *buf) { @@ -712,7 +765,12 @@ vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer * parseEncSpsParamsH265(context, &rbsp); break; case HEVC_NAL_VPS: + break; case HEVC_NAL_PPS: + break; + case HEVC_NAL_PREFIX_SEI: + parseEncSeiH265(context, &rbsp); + break; default: break; } diff --git a/src/gallium/frontends/va/va_private.h b/src/gallium/frontends/va/va_private.h index 7717fd30b1a..af8c67ca210 100644 --- a/src/gallium/frontends/va/va_private.h +++ b/src/gallium/frontends/va/va_private.h @@ -86,7 +86,8 @@ #define VBAQ_AUTO (1) #define ENC_PACKED_HEADERS_H264 (VA_ENC_PACKED_HEADER_SEQUENCE) -#define ENC_PACKED_HEADERS_HEVC (VA_ENC_PACKED_HEADER_SEQUENCE) +#define ENC_PACKED_HEADERS_HEVC (VA_ENC_PACKED_HEADER_SEQUENCE | \ + VA_ENC_PACKED_HEADER_MISC) #define ENC_PACKED_HEADERS_AV1 (VA_ENC_PACKED_HEADER_SEQUENCE | \ VA_ENC_PACKED_HEADER_PICTURE | \ VA_ENC_PACKED_HEADER_MISC) diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index 7ccf3eb4faa..b70332e6437 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -889,6 +889,17 @@ struct pipe_h265_enc_picture_desc unsigned max_slice_bytes; enum pipe_video_feedback_metadata_type requested_metadata; bool renew_headers_on_idr; + + union { + struct { + uint32_t hdr_cll:1; + uint32_t hdr_mdcv:1; + }; + uint32_t value; + } metadata_flags; + + struct pipe_enc_hdr_cll metadata_hdr_cll; + struct pipe_enc_hdr_mdcv metadata_hdr_mdcv; }; struct pipe_av1_enc_rate_control