diff --git a/src/gallium/frontends/va/picture_hevc_enc.c b/src/gallium/frontends/va/picture_hevc_enc.c index 4c27ffff276..8455a3e7533 100644 --- a/src/gallium/frontends/va/picture_hevc_enc.c +++ b/src/gallium/frontends/va/picture_hevc_enc.c @@ -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: diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index 1a32c1f7b96..dadf0035dd8 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -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;