frontends/va: Parse HEVC slice packed header

This also adds additional fields from VPS, SPS and PPS.

Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Reviewed-By: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30672>
This commit is contained in:
David Rosca 2024-08-13 13:11:26 +02:00 committed by Marge Bot
parent c78ebe97c6
commit ef8ba75718
2 changed files with 526 additions and 127 deletions

View file

@ -32,11 +32,20 @@
#include "util/vl_rbsp.h"
enum HEVCNALUnitType {
HEVC_NAL_VPS = 32,
HEVC_NAL_SPS = 33,
HEVC_NAL_PPS = 34,
HEVC_NAL_AUD = 35,
HEVC_NAL_PREFIX_SEI = 39,
HEVC_NAL_TRAIL_N = 0,
HEVC_NAL_TRAIL_R = 1,
HEVC_NAL_TSA_N = 2,
HEVC_NAL_TSA_R = 3,
HEVC_NAL_BLA_W_LP = 16,
HEVC_NAL_IDR_W_RADL = 19,
HEVC_NAL_IDR_N_LP = 20,
HEVC_NAL_CRA_NUT = 21,
HEVC_NAL_RSV_IRAP_VCL23 = 23,
HEVC_NAL_VPS = 32,
HEVC_NAL_SPS = 33,
HEVC_NAL_PPS = 34,
HEVC_NAL_AUD = 35,
HEVC_NAL_PREFIX_SEI = 39,
};
enum HEVCSEIPayloadType {
@ -129,6 +138,15 @@ vlVaHandleVAEncPictureParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *cont
context->desc.h265enc.num_ref_idx_l0_active_minus1 = h265->num_ref_idx_l0_default_active_minus1;
context->desc.h265enc.num_ref_idx_l1_active_minus1 = h265->num_ref_idx_l1_default_active_minus1;
if (!(context->desc.base.packed_headers & VA_ENC_PACKED_HEADER_SLICE)) {
unsigned max_poc = 1 << (context->desc.h265enc.seq.log2_max_pic_order_cnt_lsb_minus4 + 4);
context->desc.h265enc.slice.slice_pic_order_cnt_lsb = h265->decoded_curr_pic.pic_order_cnt % max_poc;
if (context->desc.h265enc.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_P) {
context->desc.h265enc.slice.st_ref_pic_set.num_negative_pics = 1;
context->desc.h265enc.slice.st_ref_pic_set.used_by_curr_pic_s0_flag[0] = 1;
}
}
return VA_STATUS_SUCCESS;
}
@ -326,9 +344,19 @@ vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *con
context->desc.h265enc.rc[0].frame_rate_den = num_units_in_tick;
if (!(context->desc.base.packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE)) {
struct pipe_h265_profile_tier_level *ptl =
&context->desc.h265enc.vid.profile_tier_level;
context->desc.h265enc.header_flags.vps = 1;
context->desc.h265enc.header_flags.sps = 1;
context->desc.h265enc.header_flags.pps = 1;
context->desc.h265enc.vid.vps_base_layer_internal_flag = 1;
context->desc.h265enc.vid.vps_base_layer_available_flag = 1;
ptl->profile_tier.general_tier_flag = h265->general_tier_flag;
ptl->profile_tier.general_profile_idc = h265->general_profile_idc;
ptl->profile_tier.general_progressive_source_flag = 1;
ptl->profile_tier.general_frame_only_constraint_flag = 1;
ptl->general_level_idc = h265->general_level_idc;
context->desc.h265enc.seq.profile_tier_level = *ptl;
}
return VA_STATUS_SUCCESS;
@ -415,20 +443,16 @@ vlVaHandleVAEncMiscParameterTypeQualityLevelHEVC(vlVaContext *context, VAEncMisc
return VA_STATUS_SUCCESS;
}
static void profile_tier(struct vl_rbsp *rbsp)
static void profile_tier(struct vl_rbsp *rbsp, struct pipe_h265_profile_tier *pt)
{
vl_rbsp_u(rbsp, 2); /* general_profile_space */
vl_rbsp_u(rbsp, 1); /* general_tier_flag */
vl_rbsp_u(rbsp, 5); /* general_profile_idc */
/* general_profile_compatibility_flag */
for(int i = 0; i < 32; ++i)
vl_rbsp_u(rbsp, 1);
vl_rbsp_u(rbsp, 1); /* general_progressive_source_flag */
vl_rbsp_u(rbsp, 1); /* general_interlaced_source_flag */
vl_rbsp_u(rbsp, 1); /* general_non_packed_constraint_flag */
vl_rbsp_u(rbsp, 1); /* general_frame_only_constraint_flag */
pt->general_profile_space = vl_rbsp_u(rbsp, 2);
pt->general_tier_flag = vl_rbsp_u(rbsp, 1);
pt->general_profile_idc = vl_rbsp_u(rbsp, 5);
pt->general_profile_compatibility_flag = vl_rbsp_u(rbsp, 32);
pt->general_progressive_source_flag = vl_rbsp_u(rbsp, 1);
pt->general_interlaced_source_flag = vl_rbsp_u(rbsp, 1);
pt->general_non_packed_constraint_flag = vl_rbsp_u(rbsp, 1);
pt->general_frame_only_constraint_flag = vl_rbsp_u(rbsp, 1);
/* general_reserved_zero_44bits */
vl_rbsp_u(rbsp, 16);
@ -436,20 +460,18 @@ static void profile_tier(struct vl_rbsp *rbsp)
vl_rbsp_u(rbsp, 12);
}
static unsigned profile_tier_level(struct vl_rbsp *rbsp,
int max_sublayers_minus1)
static void profile_tier_level(struct vl_rbsp *rbsp,
int max_sublayers_minus1,
struct pipe_h265_profile_tier_level *ptl)
{
bool sub_layer_profile_present_flag[6];
bool sub_layer_level_present_flag[6];
unsigned level_idc;
int i;
profile_tier(rbsp);
level_idc = vl_rbsp_u(rbsp, 8); /* general_level_idc */
profile_tier(rbsp, &ptl->profile_tier);
ptl->general_level_idc = vl_rbsp_u(rbsp, 8);
for (i = 0; i < max_sublayers_minus1; ++i) {
sub_layer_profile_present_flag[i] = vl_rbsp_u(rbsp, 1);
sub_layer_level_present_flag[i] = vl_rbsp_u(rbsp, 1);
ptl->sub_layer_profile_present_flag[i] = vl_rbsp_u(rbsp, 1);
ptl->sub_layer_level_present_flag[i] = vl_rbsp_u(rbsp, 1);
}
if (max_sublayers_minus1 > 0)
@ -457,14 +479,12 @@ static unsigned profile_tier_level(struct vl_rbsp *rbsp,
vl_rbsp_u(rbsp, 2); /* reserved_zero_2bits */
for (i = 0; i < max_sublayers_minus1; ++i) {
if (sub_layer_profile_present_flag[i])
profile_tier(rbsp);
if (ptl->sub_layer_profile_present_flag[i])
profile_tier(rbsp, &ptl->sub_layer_profile_tier[i]);
if (sub_layer_level_present_flag[i])
vl_rbsp_u(rbsp, 8); /* sub_layer_level_idc */
if (ptl->sub_layer_level_present_flag[i])
ptl->sub_layer_level_idc[i] = vl_rbsp_u(rbsp, 8);
}
return level_idc;
}
static void parse_enc_hrd_sublayer_params_hevc(uint32_t cpb_cnt,
@ -554,57 +574,277 @@ static void scaling_list_data(struct vl_rbsp *rbsp)
}
}
/* i is the working rps, st_rps is the start */
static void st_ref_pic_set(unsigned index,
unsigned num_short_term_ref_pic_sets,
struct pipe_h265_st_ref_pic_set *st_rps,
struct vl_rbsp *rbsp)
/* i is the working rps, st_rps is the start
* returns num_pic_total_curr */
static unsigned st_ref_pic_set(unsigned index,
unsigned num_short_term_ref_pic_sets,
struct pipe_h265_st_ref_pic_set *st_rps,
struct vl_rbsp *rbsp)
{
unsigned inter_ref_pic_set_pred_flag = (index) ? vl_rbsp_u(rbsp, 1) : 0;
struct pipe_h265_st_ref_pic_set *ref_rps = NULL;
unsigned delta_idx_minus1 = 0;
unsigned i;
struct pipe_h265_st_ref_pic_set *rps = &st_rps[index];
unsigned i, num_pic_total_curr = 0;
if (inter_ref_pic_set_pred_flag) {
rps->inter_ref_pic_set_prediction_flag = index ? vl_rbsp_u(rbsp, 1) : 0;
if (rps->inter_ref_pic_set_prediction_flag) {
if (index == num_short_term_ref_pic_sets)
delta_idx_minus1 = vl_rbsp_ue(rbsp);
vl_rbsp_u(rbsp, 1); /* delta_rps_sign */
vl_rbsp_ue(rbsp); /* abs_delta_rps_minus1 */
ref_rps = st_rps + index - (delta_idx_minus1 + 1);
for (i = 0; i <= (ref_rps->num_neg_pics + ref_rps->num_pos_pics); i++) {
if (!vl_rbsp_u(rbsp, 1)) /* used_by_curr_pic_flag */
vl_rbsp_u(rbsp, 1); /* use_delta_flag */
rps->delta_idx_minus1 = vl_rbsp_ue(rbsp);
rps->delta_rps_sign = vl_rbsp_u(rbsp, 1);
rps->abs_delta_rps_minus1 = vl_rbsp_ue(rbsp);
ref_rps = st_rps + index +
(1 - 2 * rps->delta_rps_sign) * (st_rps->delta_idx_minus1 + 1);
for (i = 0; i <= (ref_rps->num_negative_pics + ref_rps->num_positive_pics); i++) {
rps->used_by_curr_pic_flag[i] = vl_rbsp_u(rbsp, 1);
if (!rps->used_by_curr_pic_flag[i])
rps->use_delta_flag[i] = vl_rbsp_u(rbsp, 1);
}
} else {
st_rps->num_neg_pics = vl_rbsp_ue(rbsp);
st_rps->num_pos_pics = vl_rbsp_ue(rbsp);
for (i = 0; i < st_rps->num_neg_pics; i++) {
vl_rbsp_ue(rbsp); /* delta_poc_s0_minus1 */
vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_s0_flag */
rps->num_negative_pics = vl_rbsp_ue(rbsp);
rps->num_positive_pics = vl_rbsp_ue(rbsp);
for (i = 0; i < rps->num_negative_pics; i++) {
rps->delta_poc_s0_minus1[i] = vl_rbsp_ue(rbsp);
rps->used_by_curr_pic_s0_flag[i] = vl_rbsp_u(rbsp, 1);
if (rps->used_by_curr_pic_s0_flag[i])
num_pic_total_curr++;
}
for (i = 0; i < st_rps->num_pos_pics; i++) {
vl_rbsp_ue(rbsp); /* delta_poc_s1_minus1 */
vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_s1_flag */
for (i = 0; i < st_rps->num_positive_pics; i++) {
rps->delta_poc_s1_minus1[i] = vl_rbsp_ue(rbsp);
rps->used_by_curr_pic_s1_flag[i] = vl_rbsp_u(rbsp, 1);
if (rps->used_by_curr_pic_s1_flag[i])
num_pic_total_curr++;
}
}
return num_pic_total_curr;
}
static void parseEncSliceParamsH265(vlVaContext *context,
struct vl_rbsp *rbsp,
unsigned nal_unit_type,
unsigned temporal_id)
{
struct pipe_h265_enc_pic_param *pic = &context->desc.h265enc.pic;
struct pipe_h265_enc_seq_param *seq = &context->desc.h265enc.seq;
struct pipe_h265_enc_slice_param *slice = &context->desc.h265enc.slice;
unsigned num_pic_total_curr = 0;
/* Only parse first slice */
if (!vl_rbsp_u(rbsp, 1)) /* first_slice_segment_in_pic_flag */
return;
pic->nal_unit_type = nal_unit_type;
pic->temporal_id = temporal_id;
if (nal_unit_type >= HEVC_NAL_BLA_W_LP && nal_unit_type <= HEVC_NAL_RSV_IRAP_VCL23)
slice->no_output_of_prior_pics_flag = vl_rbsp_u(rbsp, 1);
vl_rbsp_ue(rbsp); /* slice_pic_parameter_set_id */
if (slice->dependent_slice_segment_flag)
return;
for (uint8_t i = 0; i < pic->num_extra_slice_header_bits; i++)
vl_rbsp_u(rbsp, 1);
slice->slice_type = vl_rbsp_ue(rbsp);
if (pic->output_flag_present_flag)
slice->pic_output_flag = vl_rbsp_u(rbsp, 1);
if (nal_unit_type != HEVC_NAL_IDR_W_RADL && nal_unit_type != HEVC_NAL_IDR_N_LP) {
slice->slice_pic_order_cnt_lsb = vl_rbsp_u(rbsp, seq->log2_max_pic_order_cnt_lsb_minus4 + 4);
slice->short_term_ref_pic_set_sps_flag = vl_rbsp_u(rbsp, 1);
if (!slice->short_term_ref_pic_set_sps_flag) {
num_pic_total_curr = st_ref_pic_set(seq->num_short_term_ref_pic_sets, seq->num_short_term_ref_pic_sets,
&slice->st_ref_pic_set, rbsp);
}
else if (seq->num_short_term_ref_pic_sets > 1)
slice->short_term_ref_pic_set_idx = vl_rbsp_u(rbsp, util_logbase2_ceil(seq->num_short_term_ref_pic_sets));
if (seq->long_term_ref_pics_present_flag) {
slice->num_long_term_sps = 0;
if (seq->num_long_term_ref_pics_sps > 0)
slice->num_long_term_sps = vl_rbsp_ue(rbsp);
slice->num_long_term_pics = vl_rbsp_ue(rbsp);
for (unsigned i = 0; i < (slice->num_long_term_sps + slice->num_long_term_pics); i++) {
if (i < slice->num_long_term_sps) {
if (seq->num_long_term_ref_pics_sps > 1)
slice->lt_idx_sps[i] = vl_rbsp_u(rbsp, util_logbase2_ceil(seq->num_long_term_ref_pics_sps));
} else {
slice->poc_lsb_lt[i] = vl_rbsp_u(rbsp, seq->log2_max_pic_order_cnt_lsb_minus4 + 4);
slice->used_by_curr_pic_lt_flag[i] = vl_rbsp_u(rbsp, 1);
if (slice->used_by_curr_pic_lt_flag[i])
num_pic_total_curr++;
}
slice->delta_poc_msb_present_flag[i] = vl_rbsp_u(rbsp, 1);
if (slice->delta_poc_msb_present_flag[i])
slice->delta_poc_msb_cycle_lt[i] = vl_rbsp_ue(rbsp);
}
}
}
if (context->desc.h265enc.seq.sample_adaptive_offset_enabled_flag) {
slice->slice_sao_luma_flag = vl_rbsp_u(rbsp, 1);
slice->slice_sao_chroma_flag = vl_rbsp_u(rbsp, 1);
}
if (slice->slice_type == PIPE_H265_SLICE_TYPE_P || slice->slice_type == PIPE_H265_SLICE_TYPE_B) {
slice->num_ref_idx_active_override_flag = vl_rbsp_u(rbsp, 1);
if (slice->num_ref_idx_active_override_flag) {
slice->num_ref_idx_l0_active_minus1 = vl_rbsp_ue(rbsp);
if (slice->slice_type == PIPE_H265_SLICE_TYPE_B)
slice->num_ref_idx_l1_active_minus1 = vl_rbsp_ue(rbsp);
}
if (pic->lists_modification_present_flag && num_pic_total_curr > 1) {
unsigned num_bits = util_logbase2_ceil(num_pic_total_curr);
unsigned num_ref_l0_minus1 = slice->num_ref_idx_active_override_flag ?
slice->num_ref_idx_l0_active_minus1 : pic->num_ref_idx_l0_default_active_minus1;
slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l0 = vl_rbsp_u(rbsp, 1);
if (slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l0) {
for (unsigned i = 0; i <= num_ref_l0_minus1; i++)
slice->ref_pic_lists_modification.list_entry_l0[i] = vl_rbsp_u(rbsp, num_bits);
}
if (slice->slice_type == PIPE_H265_SLICE_TYPE_B) {
unsigned num_ref_l1_minus1 = slice->num_ref_idx_active_override_flag ?
slice->num_ref_idx_l1_active_minus1 : pic->num_ref_idx_l1_default_active_minus1;
slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l1 = vl_rbsp_u(rbsp, 1);
if (slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l1) {
for (unsigned i = 0; i <= num_ref_l1_minus1; i++)
slice->ref_pic_lists_modification.list_entry_l1[i] = vl_rbsp_u(rbsp, num_bits);
}
}
}
if (slice->slice_type == PIPE_H265_SLICE_TYPE_B)
slice->mvd_l1_zero_flag = vl_rbsp_u(rbsp, 1);
if (pic->cabac_init_present_flag)
slice->cabac_init_flag = vl_rbsp_u(rbsp, 1);
slice->max_num_merge_cand = 5 - vl_rbsp_ue(rbsp);
}
slice->slice_qp_delta = vl_rbsp_se(rbsp);
if (pic->pps_slice_chroma_qp_offsets_present_flag) {
slice->slice_cb_qp_offset = vl_rbsp_se(rbsp);
slice->slice_cr_qp_offset = vl_rbsp_se(rbsp);
}
if (pic->deblocking_filter_override_enabled_flag)
slice->deblocking_filter_override_flag = vl_rbsp_u(rbsp, 1);
if (slice->deblocking_filter_override_flag) {
slice->slice_deblocking_filter_disabled_flag = vl_rbsp_u(rbsp, 1);
if (!slice->slice_deblocking_filter_disabled_flag) {
slice->slice_beta_offset_div2 = vl_rbsp_se(rbsp);
slice->slice_tc_offset_div2 = vl_rbsp_se(rbsp);
}
}
if (pic->pps_loop_filter_across_slices_enabled_flag &&
(slice->slice_sao_luma_flag ||
slice->slice_sao_chroma_flag ||
!slice->slice_deblocking_filter_disabled_flag))
slice->slice_loop_filter_across_slices_enabled_flag = vl_rbsp_u(rbsp, 1);
}
static void parseEncVpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
{
struct pipe_h265_enc_vid_param *vid = &context->desc.h265enc.vid;
unsigned i;
vl_rbsp_u(rbsp, 4); /* vps_video_parameter_set_id */
vid->vps_base_layer_internal_flag = vl_rbsp_u(rbsp, 1);
vid->vps_base_layer_available_flag = vl_rbsp_u(rbsp, 1);
vid->vps_max_layers_minus1 = vl_rbsp_u(rbsp, 6);
vid->vps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);
vid->vps_temporal_id_nesting_flag = vl_rbsp_u(rbsp, 1);
vl_rbsp_u(rbsp, 16); /* vps_reserved_0xffff_16bits */
profile_tier_level(rbsp, vid->vps_max_sub_layers_minus1, &vid->profile_tier_level);
vid->vps_sub_layer_ordering_info_present_flag = vl_rbsp_u(rbsp, 1);
i = vid->vps_sub_layer_ordering_info_present_flag ? 0 : vid->vps_max_sub_layers_minus1;
for (; i <= vid->vps_max_sub_layers_minus1; i++) {
vid->vps_max_dec_pic_buffering_minus1[i] = vl_rbsp_ue(rbsp);
vid->vps_max_num_reorder_pics[i] = vl_rbsp_ue(rbsp);
vid->vps_max_latency_increase_plus1[i] = vl_rbsp_ue(rbsp);
}
vid->vps_max_layer_id = vl_rbsp_u(rbsp, 6);
vid->vps_num_layer_sets_minus1 = vl_rbsp_ue(rbsp);
for (unsigned i = 0; i <= vid->vps_num_layer_sets_minus1; i++) {
for (unsigned j = 0; j <= vid->vps_max_layer_id; j++)
vl_rbsp_u(rbsp, 1); /* layer_id_included_flag[i][j] */
}
vid->vps_timing_info_present_flag = vl_rbsp_u(rbsp, 1);
if (vid->vps_timing_info_present_flag) {
vid->vps_num_units_in_tick = vl_rbsp_u(rbsp, 32);
vid->vps_time_scale = vl_rbsp_u(rbsp, 32);
vid->vps_poc_proportional_to_timing_flag = vl_rbsp_u(rbsp, 1);
if (vid->vps_poc_proportional_to_timing_flag)
vid->vps_num_ticks_poc_diff_one_minus1 = vl_rbsp_ue(rbsp);
}
}
static void parseEncPpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
{
struct pipe_h265_enc_pic_param *pic = &context->desc.h265enc.pic;
vl_rbsp_ue(rbsp); /* pps_pic_parameter_set_id */
vl_rbsp_ue(rbsp); /* pps_seq_parameter_set_id */
pic->dependent_slice_segments_enabled_flag = vl_rbsp_u(rbsp, 1);
pic->output_flag_present_flag = vl_rbsp_u(rbsp, 1);
pic->num_extra_slice_header_bits = vl_rbsp_u(rbsp, 3);
pic->sign_data_hiding_enabled_flag = vl_rbsp_u(rbsp, 1);
pic->cabac_init_present_flag = vl_rbsp_u(rbsp, 1);
pic->num_ref_idx_l0_default_active_minus1 = vl_rbsp_ue(rbsp);
pic->num_ref_idx_l1_default_active_minus1 = vl_rbsp_ue(rbsp);
pic->init_qp_minus26 = vl_rbsp_se(rbsp);
pic->constrained_intra_pred_flag = vl_rbsp_u(rbsp, 1);
pic->transform_skip_enabled_flag = vl_rbsp_u(rbsp, 1);
pic->cu_qp_delta_enabled_flag = vl_rbsp_u(rbsp, 1);
if (pic->cu_qp_delta_enabled_flag)
pic->diff_cu_qp_delta_depth = vl_rbsp_ue(rbsp);
pic->pps_cb_qp_offset = vl_rbsp_se(rbsp);
pic->pps_cr_qp_offset = vl_rbsp_se(rbsp);
pic->pps_slice_chroma_qp_offsets_present_flag = vl_rbsp_u(rbsp, 1);
pic->weighted_pred_flag = vl_rbsp_u(rbsp, 1);
pic->weighted_bipred_flag = vl_rbsp_u(rbsp, 1);
pic->transquant_bypass_enabled_flag = vl_rbsp_u(rbsp, 1);
unsigned tiles_enabled_flag = vl_rbsp_u(rbsp, 1);
pic->entropy_coding_sync_enabled_flag = vl_rbsp_u(rbsp, 1);
if (tiles_enabled_flag) {
unsigned num_tile_columns_minus1 = vl_rbsp_ue(rbsp);
unsigned num_tile_rows_minus1 = vl_rbsp_ue(rbsp);
if (!vl_rbsp_u(rbsp, 1)) { /* uniform_spacing_flag */
for (unsigned i = 0; i < num_tile_columns_minus1; i++)
vl_rbsp_ue(rbsp); /* column_width_minus1[i] */
for (unsigned i = 0; i < num_tile_rows_minus1; i++)
vl_rbsp_ue(rbsp); /* row_height_minus1[i] */
}
vl_rbsp_u(rbsp, 1); /* loop_filter_across_tiles_enabled_flag */
}
pic->pps_loop_filter_across_slices_enabled_flag = vl_rbsp_u(rbsp, 1);
pic->deblocking_filter_control_present_flag = vl_rbsp_u(rbsp, 1);
if (pic->deblocking_filter_control_present_flag) {
pic->deblocking_filter_override_enabled_flag = vl_rbsp_u(rbsp, 1);
pic->pps_deblocking_filter_disabled_flag = vl_rbsp_u(rbsp, 1);
if (!pic->pps_deblocking_filter_disabled_flag) {
pic->pps_beta_offset_div2 = vl_rbsp_se(rbsp);
pic->pps_tc_offset_div2 = vl_rbsp_se(rbsp);
}
}
}
static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
{
int sps_max_sub_layers_minus1;
unsigned i, sps_sub_layer_ordering_info_present_flag;
unsigned num_st_ref_pic_sets, num_long_term_ref_pics_sps;
unsigned log2_max_pic_order_cnt_lsb_minus4;
struct pipe_h265_st_ref_pic_set *st_rps = NULL;
unsigned i;
vl_rbsp_u(rbsp, 4); /* sps_video_parameter_set_id */
sps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);
vl_rbsp_u(rbsp, 1); /* sps_temporal_id_nesting_flag */
context->desc.h265enc.seq.sps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);
context->desc.h265enc.seq.sps_temporal_id_nesting_flag = vl_rbsp_u(rbsp, 1);
/* level_idc */
profile_tier_level(rbsp, sps_max_sub_layers_minus1);
profile_tier_level(rbsp, context->desc.h265enc.seq.sps_max_sub_layers_minus1,
&context->desc.h265enc.seq.profile_tier_level);
vl_rbsp_ue(rbsp); /* id */
vl_rbsp_ue(rbsp); /* sps_seq_parameter_set_id */
context->desc.h265enc.seq.chroma_format_idc = vl_rbsp_ue(rbsp);
if (context->desc.h265enc.seq.chroma_format_idc == 3)
vl_rbsp_u(rbsp, 1); /* separate_colour_plane_flag */
@ -621,32 +861,34 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
context->desc.h265enc.seq.conf_win_bottom_offset = vl_rbsp_ue(rbsp);
}
vl_rbsp_ue(rbsp); /* bit_depth_luma_minus8 */
vl_rbsp_ue(rbsp); /* bit_depth_chroma_minus8 */
log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.bit_depth_luma_minus8 = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.bit_depth_chroma_minus8 = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);
sps_sub_layer_ordering_info_present_flag = vl_rbsp_u(rbsp, 1);
i = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1;
for (; i <= sps_max_sub_layers_minus1; ++i) {
vl_rbsp_ue(rbsp); /* sps_max_dec_pic_buffering_minus1[i] */
vl_rbsp_ue(rbsp); /* sps_max_num_reorder_pics[i] */
vl_rbsp_ue(rbsp); /* sps_max_latency_increase_plus1[i] */
context->desc.h265enc.seq.sps_sub_layer_ordering_info_present_flag = vl_rbsp_u(rbsp, 1);
i = context->desc.h265enc.seq.sps_sub_layer_ordering_info_present_flag ? 0 : context->desc.h265enc.seq.sps_max_sub_layers_minus1;
for (; i <= context->desc.h265enc.seq.sps_max_sub_layers_minus1; ++i) {
context->desc.h265enc.seq.sps_max_dec_pic_buffering_minus1[i] = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.sps_max_num_reorder_pics[i] = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.sps_max_latency_increase_plus1[i] = vl_rbsp_ue(rbsp);
}
vl_rbsp_ue(rbsp); /* log2_min_luma_coding_block_size_minus3 */
vl_rbsp_ue(rbsp); /* log2_diff_max_min_luma_coding_block_size */
vl_rbsp_ue(rbsp); /* log2_min_luma_transform_block_size_minus2 */
vl_rbsp_ue(rbsp); /* log2_diff_max_min_luma_transform_block_size */
vl_rbsp_ue(rbsp); /* max_transform_hierarchy_depth_inter */
vl_rbsp_ue(rbsp); /* max_transform_hierarchy_depth_intra */
context->desc.h265enc.seq.log2_min_luma_coding_block_size_minus3 = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.log2_diff_max_min_luma_coding_block_size = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.log2_min_transform_block_size_minus2 = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.log2_diff_max_min_transform_block_size = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.max_transform_hierarchy_depth_inter = vl_rbsp_ue(rbsp);
context->desc.h265enc.seq.max_transform_hierarchy_depth_intra = vl_rbsp_ue(rbsp);
if (vl_rbsp_u(rbsp, 1)) /* scaling_list_enabled_flag */
if (vl_rbsp_u(rbsp, 1)) /* sps_scaling_list_data_present_flag */
scaling_list_data(rbsp);
vl_rbsp_u(rbsp, 1); /* amp_enabled_flag */
vl_rbsp_u(rbsp, 1); /* sample_adaptive_offset_enabled_flag */
if (vl_rbsp_u(rbsp, 1)) { /* pcm_enabled_flag */
context->desc.h265enc.seq.amp_enabled_flag = vl_rbsp_u(rbsp, 1);
context->desc.h265enc.seq.sample_adaptive_offset_enabled_flag = vl_rbsp_u(rbsp, 1);
context->desc.h265enc.seq.pcm_enabled_flag = vl_rbsp_u(rbsp, 1);
if (context->desc.h265enc.seq.pcm_enabled_flag) {
vl_rbsp_u(rbsp, 4); /* pcm_sample_bit_depth_luma_minus1 */
vl_rbsp_u(rbsp, 4); /* pcm_sample_bit_depth_chroma_minus1 */
vl_rbsp_ue(rbsp); /* log2_min_pcm_luma_coding_block_size_minus3 */
@ -654,26 +896,25 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
vl_rbsp_u(rbsp, 1); /* pcm_loop_filter_disabled_flag */
}
num_st_ref_pic_sets = vl_rbsp_ue(rbsp); /* num_short_term_ref_pic_sets */
for (i = 0; i < num_st_ref_pic_sets; i++) {
if (i == 0) /* allocating st_ref_pic_sets */
st_rps = (struct pipe_h265_st_ref_pic_set *)
CALLOC(num_st_ref_pic_sets + 1, sizeof(struct pipe_h265_st_ref_pic_set));
st_ref_pic_set(i, num_st_ref_pic_sets, st_rps, rbsp);
context->desc.h265enc.seq.num_short_term_ref_pic_sets = vl_rbsp_ue(rbsp);
for (i = 0; i < context->desc.h265enc.seq.num_short_term_ref_pic_sets; i++) {
st_ref_pic_set(i, context->desc.h265enc.seq.num_short_term_ref_pic_sets,
context->desc.h265enc.seq.st_ref_pic_set, rbsp);
}
if (vl_rbsp_u(rbsp, 1)) {/* long_term_ref_pics_present_flag */
num_long_term_ref_pics_sps = vl_rbsp_ue(rbsp);
for (i = 0; i < num_long_term_ref_pics_sps; i++) {
/* lt_ref_pic_poc_lsb_sps */
vl_rbsp_u(rbsp, log2_max_pic_order_cnt_lsb_minus4 + 4);
vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_lt_sps_flag */
context->desc.h265enc.seq.long_term_ref_pics_present_flag = vl_rbsp_u(rbsp, 1);
if (context->desc.h265enc.seq.long_term_ref_pics_present_flag) {
context->desc.h265enc.seq.num_long_term_ref_pics_sps = vl_rbsp_ue(rbsp);
for (i = 0; i < context->desc.h265enc.seq.num_long_term_ref_pics_sps; i++) {
context->desc.h265enc.seq.lt_ref_pic_poc_lsb_sps[i] =
vl_rbsp_u(rbsp, context->desc.h265enc.seq.log2_max_pic_order_cnt_lsb_minus4 + 4);
context->desc.h265enc.seq.used_by_curr_pic_lt_sps_flag[i] =
vl_rbsp_u(rbsp, 1);
}
}
vl_rbsp_u(rbsp, 1); /* sps_temporal_mvp_enabled_flag */
vl_rbsp_u(rbsp, 1); /* strong_intra_smoothing_enabled_flag */
context->desc.h265enc.seq.sps_temporal_mvp_enabled_flag = vl_rbsp_u(rbsp, 1);
context->desc.h265enc.seq.strong_intra_smoothing_enabled_flag = vl_rbsp_u(rbsp, 1);
context->desc.h265enc.seq.vui_parameters_present_flag = vl_rbsp_u(rbsp, 1);
if (context->desc.h265enc.seq.vui_parameters_present_flag) {
@ -738,7 +979,7 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
if (context->desc.h265enc.seq.vui_flags.hrd_parameters_present_flag)
parse_enc_hrd_params_hevc(rbsp,
1,
sps_max_sub_layers_minus1,
context->desc.h265enc.seq.sps_max_sub_layers_minus1,
&context->desc.h265enc.seq.hrd_parameters);
}
}
@ -755,8 +996,6 @@ static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
context->desc.h265enc.seq.log2_max_mv_length_vertical = vl_rbsp_ue(rbsp);
}
}
if (st_rps) FREE(st_rps);
}
static void parseEncSeiPayloadH265(vlVaContext *context, struct vl_rbsp *rbsp, int payloadType, int payloadSize)
@ -828,13 +1067,23 @@ vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer *
vl_vlc_eatbits(&vlc, 1);
unsigned nal_unit_type = vl_vlc_get_uimsbf(&vlc, 6);
vl_vlc_eatbits(&vlc, 6);
context->desc.h265enc.pic.temporal_id = vl_vlc_get_uimsbf(&vlc, 3) - 1;
unsigned temporal_id = vl_vlc_get_uimsbf(&vlc, 3) - 1;
struct vl_rbsp rbsp;
vl_rbsp_init(&rbsp, &vlc, ~0, context->packed_header_emulation_bytes);
switch(nal_unit_type) {
switch (nal_unit_type) {
case HEVC_NAL_TRAIL_N:
case HEVC_NAL_TRAIL_R:
case HEVC_NAL_TSA_N:
case HEVC_NAL_TSA_R:
case HEVC_NAL_IDR_W_RADL:
case HEVC_NAL_IDR_N_LP:
case HEVC_NAL_CRA_NUT:
parseEncSliceParamsH265(context, &rbsp, nal_unit_type, temporal_id);
break;
case HEVC_NAL_VPS:
parseEncVpsParamsH265(context, &rbsp);
context->desc.h265enc.header_flags.vps = 1;
break;
case HEVC_NAL_SPS:
@ -842,6 +1091,7 @@ vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer *
context->desc.h265enc.header_flags.sps = 1;
break;
case HEVC_NAL_PPS:
parseEncPpsParamsH265(context, &rbsp);
context->desc.h265enc.header_flags.pps = 1;
break;
case HEVC_NAL_AUD:

View file

@ -53,6 +53,13 @@ extern "C" {
#define PIPE_ENC_ROI_REGION_NUM_MAX 32
#define PIPE_DEFAULT_DECODER_FEEDBACK_TIMEOUT_NS 1000000000
#define PIPE_H2645_LIST_REF_INVALID_ENTRY 0xff
#define PIPE_H265_MAX_LONG_TERM_REF_PICS_SPS 32
#define PIPE_H265_MAX_LONG_TERM_PICS 16
#define PIPE_H265_MAX_DELTA_POC 48
#define PIPE_H265_MAX_DPB_SIZE 16
#define PIPE_H265_MAX_NUM_LIST_REF 15
#define PIPE_H265_MAX_ST_REF_PIC_SETS 64
#define PIPE_H265_MAX_SUB_LAYERS 7
/*
* see table 6-12 in the spec
@ -790,8 +797,30 @@ struct pipe_h264_enc_picture_desc
struct pipe_h265_st_ref_pic_set
{
uint32_t num_neg_pics;
uint32_t num_pos_pics;
struct {
uint32_t inter_ref_pic_set_prediction_flag : 1;
};
uint32_t delta_idx_minus1;
uint8_t delta_rps_sign;
uint16_t abs_delta_rps_minus1;
uint8_t used_by_curr_pic_flag[PIPE_H265_MAX_DPB_SIZE];
uint8_t use_delta_flag[PIPE_H265_MAX_DPB_SIZE];
uint8_t num_negative_pics;
uint8_t num_positive_pics;
uint16_t delta_poc_s0_minus1[PIPE_H265_MAX_DPB_SIZE];
uint8_t used_by_curr_pic_s0_flag[PIPE_H265_MAX_DPB_SIZE];
uint16_t delta_poc_s1_minus1[PIPE_H265_MAX_DPB_SIZE];
uint8_t used_by_curr_pic_s1_flag[PIPE_H265_MAX_DPB_SIZE];
};
struct pipe_h265_ref_pic_lists_modification
{
struct {
uint32_t ref_pic_list_modification_flag_l0 : 1;
uint32_t ref_pic_list_modification_flag_l1 : 1;
};
uint8_t list_entry_l0[PIPE_H265_MAX_NUM_LIST_REF];
uint8_t list_entry_l1[PIPE_H265_MAX_NUM_LIST_REF];
};
struct pipe_h265_enc_sublayer_hrd_params
@ -818,17 +847,77 @@ struct pipe_h265_enc_hrd_params
uint32_t initial_cpb_removal_delay_length_minus1;
uint32_t au_cpb_removal_delay_length_minus1;
uint32_t dpb_output_delay_length_minus1;
uint32_t fixed_pic_rate_general_flag[7];
uint32_t fixed_pic_rate_within_cvs_flag[7];
uint32_t elemental_duration_in_tc_minus1[7];
uint32_t low_delay_hrd_flag[7];
uint32_t cpb_cnt_minus1[7];
struct pipe_h265_enc_sublayer_hrd_params nal_hrd_parameters[7];
struct pipe_h265_enc_sublayer_hrd_params vlc_hrd_parameters[7];
uint32_t fixed_pic_rate_general_flag[PIPE_H265_MAX_SUB_LAYERS];
uint32_t fixed_pic_rate_within_cvs_flag[PIPE_H265_MAX_SUB_LAYERS];
uint32_t elemental_duration_in_tc_minus1[PIPE_H265_MAX_SUB_LAYERS];
uint32_t low_delay_hrd_flag[PIPE_H265_MAX_SUB_LAYERS];
uint32_t cpb_cnt_minus1[PIPE_H265_MAX_SUB_LAYERS];
struct pipe_h265_enc_sublayer_hrd_params nal_hrd_parameters[PIPE_H265_MAX_SUB_LAYERS];
struct pipe_h265_enc_sublayer_hrd_params vlc_hrd_parameters[PIPE_H265_MAX_SUB_LAYERS];
};
struct pipe_h265_profile_tier
{
struct {
uint32_t general_tier_flag : 1;
uint32_t general_progressive_source_flag : 1;
uint32_t general_interlaced_source_flag : 1;
uint32_t general_non_packed_constraint_flag : 1;
uint32_t general_frame_only_constraint_flag : 1;
};
uint8_t general_profile_space;
uint8_t general_profile_idc;
uint32_t general_profile_compatibility_flag;
};
struct pipe_h265_profile_tier_level
{
uint8_t general_level_idc;
uint8_t sub_layer_profile_present_flag[PIPE_H265_MAX_SUB_LAYERS];
uint8_t sub_layer_level_present_flag[PIPE_H265_MAX_SUB_LAYERS];
uint8_t sub_layer_level_idc[PIPE_H265_MAX_SUB_LAYERS];
struct pipe_h265_profile_tier profile_tier;
struct pipe_h265_profile_tier sub_layer_profile_tier[PIPE_H265_MAX_SUB_LAYERS];
};
struct pipe_h265_enc_vid_param
{
struct {
uint32_t vps_base_layer_internal_flag : 1;
uint32_t vps_base_layer_available_flag : 1;
uint32_t vps_temporal_id_nesting_flag : 1;
uint32_t vps_sub_layer_ordering_info_present_flag : 1;
uint32_t vps_timing_info_present_flag : 1;
uint32_t vps_poc_proportional_to_timing_flag : 1;
};
uint8_t vps_max_layers_minus1;
uint8_t vps_max_sub_layers_minus1;
uint8_t vps_max_dec_pic_buffering_minus1[PIPE_H265_MAX_SUB_LAYERS];
uint8_t vps_max_num_reorder_pics[PIPE_H265_MAX_SUB_LAYERS];
uint32_t vps_max_latency_increase_plus1[PIPE_H265_MAX_SUB_LAYERS];
uint8_t vps_max_layer_id;
uint32_t vps_num_layer_sets_minus1;
uint32_t vps_num_units_in_tick;
uint32_t vps_time_scale;
uint32_t vps_num_ticks_poc_diff_one_minus1;
struct pipe_h265_profile_tier_level profile_tier_level;
};
struct pipe_h265_enc_seq_param
{
struct {
uint32_t sps_temporal_id_nesting_flag : 1;
uint32_t strong_intra_smoothing_enabled_flag : 1;
uint32_t amp_enabled_flag : 1;
uint32_t sample_adaptive_offset_enabled_flag : 1;
uint32_t pcm_enabled_flag : 1;
uint32_t sps_temporal_mvp_enabled_flag : 1;
uint32_t conformance_window_flag : 1;
uint32_t vui_parameters_present_flag : 1;
uint32_t video_full_range_flag : 1;
uint32_t long_term_ref_pics_present_flag : 1;
uint32_t sps_sub_layer_ordering_info_present_flag : 1;
};
uint8_t general_profile_idc;
uint8_t general_level_idc;
uint8_t general_tier_flag;
@ -839,23 +928,17 @@ struct pipe_h265_enc_seq_param
uint32_t chroma_format_idc;
uint32_t bit_depth_luma_minus8;
uint32_t bit_depth_chroma_minus8;
bool strong_intra_smoothing_enabled_flag;
bool amp_enabled_flag;
bool sample_adaptive_offset_enabled_flag;
bool pcm_enabled_flag;
bool sps_temporal_mvp_enabled_flag;
uint8_t log2_max_pic_order_cnt_lsb_minus4;
uint8_t log2_min_luma_coding_block_size_minus3;
uint8_t log2_diff_max_min_luma_coding_block_size;
uint8_t log2_min_transform_block_size_minus2;
uint8_t log2_diff_max_min_transform_block_size;
uint8_t max_transform_hierarchy_depth_inter;
uint8_t max_transform_hierarchy_depth_intra;
uint8_t conformance_window_flag;
uint16_t conf_win_left_offset;
uint16_t conf_win_right_offset;
uint16_t conf_win_top_offset;
uint16_t conf_win_bottom_offset;
uint32_t vui_parameters_present_flag;
struct {
uint32_t aspect_ratio_info_present_flag: 1;
uint32_t timing_info_present_flag: 1;
@ -881,7 +964,6 @@ struct pipe_h265_enc_seq_param
uint32_t num_units_in_tick;
uint32_t time_scale;
uint32_t video_format;
uint32_t video_full_range_flag;
uint32_t colour_primaries;
uint32_t transfer_characteristics;
uint32_t matrix_coefficients;
@ -898,29 +980,95 @@ struct pipe_h265_enc_seq_param
uint32_t log2_max_mv_length_horizontal;
uint32_t log2_max_mv_length_vertical;
uint32_t num_temporal_layers;
uint32_t num_short_term_ref_pic_sets;
uint32_t num_long_term_ref_pics_sps;
uint32_t lt_ref_pic_poc_lsb_sps[PIPE_H265_MAX_LONG_TERM_REF_PICS_SPS];
uint8_t used_by_curr_pic_lt_sps_flag[PIPE_H265_MAX_LONG_TERM_REF_PICS_SPS];
uint8_t sps_max_sub_layers_minus1;
uint8_t sps_max_dec_pic_buffering_minus1[PIPE_H265_MAX_SUB_LAYERS];
uint8_t sps_max_num_reorder_pics[PIPE_H265_MAX_SUB_LAYERS];
uint32_t sps_max_latency_increase_plus1[PIPE_H265_MAX_SUB_LAYERS];
struct pipe_h265_profile_tier_level profile_tier_level;
struct pipe_h265_enc_hrd_params hrd_parameters;
struct pipe_h265_st_ref_pic_set st_ref_pic_set[PIPE_H265_MAX_ST_REF_PIC_SETS];
};
struct pipe_h265_enc_pic_param
{
struct {
uint32_t dependent_slice_segments_enabled_flag : 1;
uint32_t output_flag_present_flag : 1;
uint32_t sign_data_hiding_enabled_flag : 1;
uint32_t cabac_init_present_flag : 1;
uint32_t constrained_intra_pred_flag : 1;
uint32_t transform_skip_enabled_flag : 1;
uint32_t cu_qp_delta_enabled_flag : 1;
uint32_t weighted_pred_flag : 1;
uint32_t weighted_bipred_flag : 1;
uint32_t transquant_bypass_enabled_flag : 1;
uint32_t entropy_coding_sync_enabled_flag : 1;
uint32_t pps_slice_chroma_qp_offsets_present_flag : 1;
uint32_t pps_loop_filter_across_slices_enabled_flag : 1;
uint32_t deblocking_filter_control_present_flag : 1;
uint32_t deblocking_filter_override_enabled_flag : 1;
uint32_t pps_deblocking_filter_disabled_flag : 1;
uint32_t lists_modification_present_flag : 1;
};
uint8_t log2_parallel_merge_level_minus2;
uint8_t nal_unit_type;
uint8_t temporal_id;
bool constrained_intra_pred_flag;
bool pps_loop_filter_across_slices_enabled_flag;
bool transform_skip_enabled_flag;
uint8_t num_extra_slice_header_bits;
uint8_t num_ref_idx_l0_default_active_minus1;
uint8_t num_ref_idx_l1_default_active_minus1;
int8_t init_qp_minus26;
uint8_t diff_cu_qp_delta_depth;
int8_t pps_cb_qp_offset;
int8_t pps_cr_qp_offset;
int8_t pps_beta_offset_div2;
int8_t pps_tc_offset_div2;
};
struct pipe_h265_enc_slice_param
{
struct {
uint32_t no_output_of_prior_pics_flag : 1;
uint32_t dependent_slice_segment_flag : 1;
uint32_t pic_output_flag : 1;
uint32_t short_term_ref_pic_set_sps_flag : 1;
uint32_t slice_sao_luma_flag : 1;
uint32_t slice_sao_chroma_flag : 1;
uint32_t slice_temporal_mvp_enabled_flag : 1;
uint32_t num_ref_idx_active_override_flag : 1;
uint32_t mvd_l1_zero_flag : 1;
uint32_t cabac_init_flag : 1;
uint32_t collocated_from_l0_flag : 1;
uint32_t cu_chroma_qp_offset_enabled_flag : 1;
uint32_t deblocking_filter_override_flag : 1;
uint32_t slice_deblocking_filter_disabled_flag : 1;
uint32_t slice_loop_filter_across_slices_enabled_flag : 1;
};
uint8_t slice_type;
uint32_t slice_pic_order_cnt_lsb;
uint8_t colour_plane_id;
uint8_t short_term_ref_pic_set_idx;
uint8_t num_long_term_sps;
uint8_t num_long_term_pics;
uint8_t lt_idx_sps[PIPE_H265_MAX_LONG_TERM_REF_PICS_SPS];
uint8_t poc_lsb_lt[PIPE_H265_MAX_LONG_TERM_PICS];
uint8_t used_by_curr_pic_lt_flag[PIPE_H265_MAX_LONG_TERM_PICS];
uint8_t delta_poc_msb_present_flag[PIPE_H265_MAX_DELTA_POC];
uint8_t delta_poc_msb_cycle_lt[PIPE_H265_MAX_DELTA_POC];
uint8_t num_ref_idx_l0_active_minus1;
uint8_t num_ref_idx_l1_active_minus1;
uint8_t collocated_ref_idx;
uint8_t max_num_merge_cand;
int8_t slice_qp_delta;
int8_t slice_cb_qp_offset;
int8_t slice_cr_qp_offset;
int8_t slice_beta_offset_div2;
int8_t slice_tc_offset_div2;
bool cabac_init_flag;
uint32_t slice_deblocking_filter_disabled_flag;
bool slice_loop_filter_across_slices_enabled_flag;
struct pipe_h265_st_ref_pic_set st_ref_pic_set;
struct pipe_h265_ref_pic_lists_modification ref_pic_lists_modification;
};
struct pipe_h265_enc_rate_control
@ -964,6 +1112,7 @@ struct pipe_h265_enc_picture_desc
{
struct pipe_picture_desc base;
struct pipe_h265_enc_vid_param vid;
struct pipe_h265_enc_seq_param seq;
struct pipe_h265_enc_pic_param pic;
struct pipe_h265_enc_slice_param slice;