mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 01:38:06 +02:00
frontends/va: check av1 enc hdr metadata
Decode packed header HDR metadata for av1 encoding. Reviewed-by: David Rosca <david.rosca@amd.com> Signed-off-by: Ruijing Dong <ruijing.dong@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30237>
This commit is contained in:
parent
35e4d0db9c
commit
8ea977ca5e
2 changed files with 70 additions and 1 deletions
|
|
@ -45,7 +45,12 @@
|
|||
#define FRAME_TYPE_SWITCH (3)
|
||||
#define OBU_TYPE_SEQUENCE_HEADER (1)
|
||||
#define OBU_TYPE_FRAME_HEADER (3)
|
||||
#define OBU_TYPE_META (5)
|
||||
#define OBU_TYPE_FRAME (6)
|
||||
#define METADATA_TYPE_HDR_CLL (1)
|
||||
#define METADATA_TYPE_HDR_MDCV (2)
|
||||
#define METADATA_TYPE_ITU_T35 (4)
|
||||
#define METADATA_TYPE_TIMECODE (5)
|
||||
#define AV1_MIN_QP_DEFAULT (1)
|
||||
#define AV1_MAX_QP_DEFAULT (255)
|
||||
|
||||
|
|
@ -750,6 +755,41 @@ static void av1_frame_header(vlVaContext *context, struct vl_vlc *vlc)
|
|||
av1->uniform_tile_spacing = av1_f(vlc, 1);
|
||||
}
|
||||
|
||||
static void av1_metatype_hdr_cll(vlVaContext *context, struct vl_vlc *vlc)
|
||||
{
|
||||
struct pipe_av1_enc_picture_desc *av1 = &context->desc.av1enc;
|
||||
|
||||
av1->metadata_flags.hdr_cll = 1;
|
||||
av1->metadata_hdr_cll.max_cll = av1_f(vlc, 16);
|
||||
av1->metadata_hdr_cll.max_fall = av1_f(vlc, 16);
|
||||
}
|
||||
|
||||
static void av1_metatype_hdr_mdcv(vlVaContext *context, struct vl_vlc *vlc)
|
||||
{
|
||||
struct pipe_av1_enc_picture_desc *av1 = &context->desc.av1enc;
|
||||
|
||||
av1->metadata_flags.hdr_mdcv = 1;
|
||||
|
||||
for (int32_t i = 0; i < 3; i++) {
|
||||
av1->metadata_hdr_mdcv.primary_chromaticity_x[i] = av1_f(vlc, 16);
|
||||
av1->metadata_hdr_mdcv.primary_chromaticity_y[i] = av1_f(vlc, 16);
|
||||
}
|
||||
av1->metadata_hdr_mdcv.white_point_chromaticity_x = av1_f(vlc, 16);
|
||||
av1->metadata_hdr_mdcv.white_point_chromaticity_y = av1_f(vlc, 16);
|
||||
av1->metadata_hdr_mdcv.luminance_max = av1_f(vlc, 32);
|
||||
av1->metadata_hdr_mdcv.luminance_min = av1_f(vlc, 32);
|
||||
}
|
||||
|
||||
static void av1_meta_obu(vlVaContext *context, struct vl_vlc *vlc)
|
||||
{
|
||||
unsigned meta_type = av1_uleb128(vlc);
|
||||
|
||||
if (meta_type == METADATA_TYPE_HDR_CLL)
|
||||
av1_metatype_hdr_cll(context, vlc);
|
||||
else if (meta_type == METADATA_TYPE_HDR_MDCV)
|
||||
av1_metatype_hdr_mdcv(context, vlc);
|
||||
}
|
||||
|
||||
VAStatus
|
||||
vlVaHandleVAEncPackedHeaderDataBufferTypeAV1(vlVaContext *context, vlVaBuffer *buf)
|
||||
{
|
||||
|
|
@ -758,12 +798,13 @@ vlVaHandleVAEncPackedHeaderDataBufferTypeAV1(vlVaContext *context, vlVaBuffer *b
|
|||
|
||||
while (vl_vlc_bits_left(&vlc) > 0) {
|
||||
unsigned obu_type = 0;
|
||||
/* search sequece header in the first 8 bytes */
|
||||
/* search sequence header in the first 8 bytes */
|
||||
for (int i = 0; i < 8 && vl_vlc_bits_left(&vlc) >= 8; ++i) {
|
||||
/* then start decoding , first 5 bits has to be 0000 1xxx for sequence header */
|
||||
obu_type = vl_vlc_peekbits(&vlc, 5);
|
||||
if (obu_type == OBU_TYPE_SEQUENCE_HEADER
|
||||
|| obu_type == OBU_TYPE_FRAME_HEADER
|
||||
|| obu_type == OBU_TYPE_META
|
||||
|| obu_type == OBU_TYPE_FRAME)
|
||||
break;
|
||||
vl_vlc_eatbits(&vlc, 8);
|
||||
|
|
@ -787,6 +828,8 @@ vlVaHandleVAEncPackedHeaderDataBufferTypeAV1(vlVaContext *context, vlVaBuffer *b
|
|||
av1_sequence_header(context, &vlc);
|
||||
else if (obu_type == OBU_TYPE_FRAME_HEADER || obu_type == OBU_TYPE_FRAME)
|
||||
av1_frame_header(context, &vlc);
|
||||
else if (obu_type == OBU_TYPE_META)
|
||||
av1_meta_obu(context, &vlc);
|
||||
else
|
||||
assert(0);
|
||||
|
||||
|
|
|
|||
|
|
@ -554,6 +554,20 @@ struct h265_slice_descriptor
|
|||
enum pipe_h265_slice_type slice_type;
|
||||
};
|
||||
|
||||
struct pipe_enc_hdr_cll {
|
||||
uint16_t max_cll;
|
||||
uint16_t max_fall;
|
||||
};
|
||||
|
||||
struct pipe_enc_hdr_mdcv {
|
||||
uint16_t primary_chromaticity_x[3];
|
||||
uint16_t primary_chromaticity_y[3];
|
||||
uint16_t white_point_chromaticity_x;
|
||||
uint16_t white_point_chromaticity_y;
|
||||
uint32_t luminance_max;
|
||||
uint32_t luminance_min;
|
||||
};
|
||||
|
||||
typedef struct pipe_h264_enc_hrd_params
|
||||
{
|
||||
uint32_t cpb_cnt_minus1;
|
||||
|
|
@ -1090,7 +1104,19 @@ struct pipe_av1_enc_picture_desc
|
|||
uint8_t temporal_id;
|
||||
uint8_t spatial_id;
|
||||
} tg_obu_header;
|
||||
|
||||
enum pipe_video_feedback_metadata_type requested_metadata;
|
||||
|
||||
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_h265_sps
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue