frontends/va: check hevc enc hdr sei

Decode packed header HDR sei for hevc encoding.

Signed-off-by: Yinjie Yao <yinjie.yao@amd.com>
Reviewed-by: Boyuan Zhang <boyuan.zhang@amd.com>
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30388>
This commit is contained in:
yinjiyao
2024-07-26 18:21:50 -04:00
committed by Marge Bot
parent b92134e088
commit 0460ededda
4 changed files with 73 additions and 1 deletions

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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