1 /**************************************************************************
2 *
3 * Copyright 2018 Advanced Micro Devices, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #include "util/u_handle_table.h"
29 #include "util/u_video.h"
30 #include "va_private.h"
31
32 #include "util/vl_rbsp.h"
33
34 enum HEVCNALUnitType {
35 HEVC_NAL_VPS = 32,
36 HEVC_NAL_SPS = 33,
37 HEVC_NAL_PPS = 34,
38 };
39
40 VAStatus
vlVaHandleVAEncPictureParameterBufferTypeHEVC(vlVaDriver * drv,vlVaContext * context,vlVaBuffer * buf)41 vlVaHandleVAEncPictureParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
42 {
43 VAEncPictureParameterBufferHEVC *h265;
44 vlVaBuffer *coded_buf;
45 int i;
46
47 h265 = buf->data;
48 context->desc.h265enc.decoded_curr_pic = h265->decoded_curr_pic.picture_id;
49 context->desc.h265enc.not_referenced = !h265->pic_fields.bits.reference_pic_flag;
50
51 for (i = 0; i < 15; i++)
52 context->desc.h265enc.reference_frames[i] = h265->reference_frames[i].picture_id;
53
54 context->desc.h265enc.pic_order_cnt = h265->decoded_curr_pic.pic_order_cnt;
55 coded_buf = handle_table_get(drv->htab, h265->coded_buf);
56 if (!coded_buf)
57 return VA_STATUS_ERROR_INVALID_BUFFER;
58
59 if (!coded_buf->derived_surface.resource)
60 coded_buf->derived_surface.resource = pipe_buffer_create(drv->pipe->screen, PIPE_BIND_VERTEX_BUFFER,
61 PIPE_USAGE_STAGING, coded_buf->size);
62
63 context->coded_buf = coded_buf;
64 context->desc.h265enc.pic.log2_parallel_merge_level_minus2 = h265->log2_parallel_merge_level_minus2;
65 context->desc.h265enc.pic.nal_unit_type = h265->nal_unit_type;
66 context->desc.h265enc.rc.quant_i_frames = h265->pic_init_qp;
67 context->desc.h265enc.rc.quant_p_frames = h265->pic_init_qp;
68 context->desc.h265enc.rc.quant_b_frames = h265->pic_init_qp;
69
70 switch(h265->pic_fields.bits.coding_type) {
71 case 1:
72 if (h265->pic_fields.bits.idr_pic_flag)
73 context->desc.h265enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_IDR;
74 else
75 context->desc.h265enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_I;
76 break;
77 case 2:
78 context->desc.h265enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_P;
79 break;
80 case 3:
81 case 4:
82 case 5:
83 context->desc.h265enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_B;
84 break;
85 }
86
87 context->desc.h265enc.pic.constrained_intra_pred_flag = h265->pic_fields.bits.constrained_intra_pred_flag;
88 context->desc.h265enc.pic.pps_loop_filter_across_slices_enabled_flag = h265->pic_fields.bits.pps_loop_filter_across_slices_enabled_flag;
89 context->desc.h265enc.pic.transform_skip_enabled_flag = h265->pic_fields.bits.transform_skip_enabled_flag;
90
91 _mesa_hash_table_insert(context->desc.h265enc.frame_idx,
92 UINT_TO_PTR(h265->decoded_curr_pic.picture_id + 1),
93 UINT_TO_PTR(context->desc.h265enc.frame_num));
94
95 /* Initialize slice descriptors for this picture */
96 context->desc.h265enc.num_slice_descriptors = 0;
97 memset(&context->desc.h265enc.slices_descriptors, 0, sizeof(context->desc.h265enc.slices_descriptors));
98
99 context->desc.h265enc.num_ref_idx_l0_active_minus1 = h265->num_ref_idx_l0_default_active_minus1;
100 context->desc.h265enc.num_ref_idx_l1_active_minus1 = h265->num_ref_idx_l1_default_active_minus1;
101
102 return VA_STATUS_SUCCESS;
103 }
104
105 VAStatus
vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver * drv,vlVaContext * context,vlVaBuffer * buf)106 vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
107 {
108 VAEncSliceParameterBufferHEVC *h265;
109
110 h265 = buf->data;
111 memset(&context->desc.h265enc.ref_idx_l0_list, VA_INVALID_ID, sizeof(context->desc.h265enc.ref_idx_l0_list));
112 memset(&context->desc.h265enc.ref_idx_l1_list, VA_INVALID_ID, sizeof(context->desc.h265enc.ref_idx_l1_list));
113
114 if (h265->slice_fields.bits.num_ref_idx_active_override_flag) {
115 context->desc.h265enc.num_ref_idx_l0_active_minus1 = h265->num_ref_idx_l0_active_minus1;
116 context->desc.h265enc.num_ref_idx_l1_active_minus1 = h265->num_ref_idx_l1_active_minus1;
117 }
118
119 for (int i = 0; i < 15; i++) {
120 if (h265->ref_pic_list0[i].picture_id != VA_INVALID_ID) {
121 context->desc.h265enc.ref_idx_l0_list[i] = PTR_TO_UINT(util_hash_table_get(context->desc.h265enc.frame_idx,
122 UINT_TO_PTR(h265->ref_pic_list0[i].picture_id + 1)));
123 }
124 if (h265->ref_pic_list1[i].picture_id != VA_INVALID_ID && h265->slice_type == PIPE_H265_SLICE_TYPE_B) {
125 context->desc.h265enc.ref_idx_l1_list[i] = PTR_TO_UINT(util_hash_table_get(context->desc.h265enc.frame_idx,
126 UINT_TO_PTR(h265->ref_pic_list1[i].picture_id + 1)));
127 }
128 }
129
130 context->desc.h265enc.slice.max_num_merge_cand = h265->max_num_merge_cand;
131 context->desc.h265enc.slice.slice_cb_qp_offset = h265->slice_cb_qp_offset;
132 context->desc.h265enc.slice.slice_cr_qp_offset = h265->slice_cr_qp_offset;
133 context->desc.h265enc.slice.slice_beta_offset_div2 = h265->slice_beta_offset_div2;
134 context->desc.h265enc.slice.slice_tc_offset_div2 = h265->slice_tc_offset_div2;
135 context->desc.h265enc.slice.cabac_init_flag = h265->slice_fields.bits.cabac_init_flag;
136 context->desc.h265enc.slice.slice_deblocking_filter_disabled_flag = h265->slice_fields.bits.slice_deblocking_filter_disabled_flag;
137 context->desc.h265enc.slice.slice_loop_filter_across_slices_enabled_flag = h265->slice_fields.bits.slice_loop_filter_across_slices_enabled_flag;
138
139 /* Handle the slice control parameters */
140 struct h265_slice_descriptor slice_descriptor;
141 memset(&slice_descriptor, 0, sizeof(slice_descriptor));
142 slice_descriptor.slice_segment_address = h265->slice_segment_address;
143 slice_descriptor.num_ctu_in_slice = h265->num_ctu_in_slice;
144 slice_descriptor.slice_type = h265->slice_type;
145 assert(slice_descriptor.slice_type <= PIPE_H265_SLICE_TYPE_I);
146
147 if (context->desc.h265enc.num_slice_descriptors < ARRAY_SIZE(context->desc.h265enc.slices_descriptors))
148 context->desc.h265enc.slices_descriptors[context->desc.h265enc.num_slice_descriptors++] = slice_descriptor;
149 else
150 return VA_STATUS_ERROR_NOT_ENOUGH_BUFFER;
151
152 return VA_STATUS_SUCCESS;
153 }
154
155 VAStatus
vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver * drv,vlVaContext * context,vlVaBuffer * buf)156 vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
157 {
158 VAEncSequenceParameterBufferHEVC *h265 = (VAEncSequenceParameterBufferHEVC *)buf->data;
159 uint32_t num_units_in_tick = 0, time_scale = 0;
160
161 if (!context->decoder) {
162 context->templat.max_references = PIPE_H265_MAX_REFERENCES;
163 context->templat.level = h265->general_level_idc;
164 context->decoder = drv->pipe->create_video_codec(drv->pipe, &context->templat);
165
166 if (!context->decoder)
167 return VA_STATUS_ERROR_ALLOCATION_FAILED;
168
169 getEncParamPresetH265(context);
170 context->desc.h265enc.rc.vbv_buffer_size = 20000000;
171 context->desc.h265enc.rc.vbv_buf_lv = 48;
172 context->desc.h265enc.rc.fill_data_enable = 1;
173 context->desc.h265enc.rc.enforce_hrd = 1;
174 context->desc.h265enc.rc.max_qp = 51;
175 context->desc.h265enc.rc.min_qp = 0;
176 context->desc.h265enc.intra_refresh.mode = INTRA_REFRESH_MODE_NONE;
177 context->desc.h265enc.intra_refresh.offset = 0;
178 context->desc.h265enc.intra_refresh.region_size = 0;
179 context->desc.h265enc.intra_refresh.need_sequence_header = 0;
180 }
181
182 context->desc.h265enc.seq.general_profile_idc = h265->general_profile_idc;
183 context->desc.h265enc.seq.general_level_idc = h265->general_level_idc;
184 context->desc.h265enc.seq.general_tier_flag = h265->general_tier_flag;
185 context->desc.h265enc.seq.intra_period = h265->intra_period;
186 context->desc.h265enc.seq.ip_period = h265->ip_period;
187 context->desc.h265enc.seq.pic_width_in_luma_samples = h265->pic_width_in_luma_samples;
188 context->desc.h265enc.seq.pic_height_in_luma_samples = h265->pic_height_in_luma_samples;
189 context->desc.h265enc.seq.chroma_format_idc = h265->seq_fields.bits.chroma_format_idc;
190 context->desc.h265enc.seq.bit_depth_luma_minus8 = h265->seq_fields.bits.bit_depth_luma_minus8;
191 context->desc.h265enc.seq.bit_depth_chroma_minus8 = h265->seq_fields.bits.bit_depth_chroma_minus8;
192 context->desc.h265enc.seq.strong_intra_smoothing_enabled_flag = h265->seq_fields.bits.strong_intra_smoothing_enabled_flag;
193 context->desc.h265enc.seq.amp_enabled_flag = h265->seq_fields.bits.amp_enabled_flag;
194 context->desc.h265enc.seq.sample_adaptive_offset_enabled_flag = h265->seq_fields.bits.sample_adaptive_offset_enabled_flag;
195 context->desc.h265enc.seq.pcm_enabled_flag = h265->seq_fields.bits.pcm_enabled_flag;
196 context->desc.h265enc.seq.sps_temporal_mvp_enabled_flag = h265->seq_fields.bits.sps_temporal_mvp_enabled_flag;
197 context->desc.h265enc.seq.log2_min_luma_coding_block_size_minus3 = h265->log2_min_luma_coding_block_size_minus3;
198 context->desc.h265enc.seq.log2_diff_max_min_luma_coding_block_size = h265->log2_diff_max_min_luma_coding_block_size;
199 context->desc.h265enc.seq.log2_min_transform_block_size_minus2 = h265->log2_min_transform_block_size_minus2;
200 context->desc.h265enc.seq.log2_diff_max_min_transform_block_size = h265->log2_diff_max_min_transform_block_size;
201 context->desc.h265enc.seq.max_transform_hierarchy_depth_inter = h265->max_transform_hierarchy_depth_inter;
202 context->desc.h265enc.seq.max_transform_hierarchy_depth_intra = h265->max_transform_hierarchy_depth_intra;
203
204 context->desc.h265enc.seq.vui_parameters_present_flag = h265->vui_parameters_present_flag;
205 if (h265->vui_parameters_present_flag) {
206 context->desc.h265enc.seq.vui_flags.aspect_ratio_info_present_flag =
207 h265->vui_fields.bits.aspect_ratio_info_present_flag;
208 context->desc.h265enc.seq.aspect_ratio_idc = h265->aspect_ratio_idc;
209 context->desc.h265enc.seq.sar_width = h265->sar_width;
210 context->desc.h265enc.seq.sar_height = h265->sar_height;
211
212 context->desc.h265enc.seq.vui_flags.timing_info_present_flag =
213 h265->vui_fields.bits.vui_timing_info_present_flag;
214 num_units_in_tick = h265->vui_num_units_in_tick;
215 time_scale = h265->vui_time_scale;
216 context->desc.h265enc.seq.vui_flags.neutral_chroma_indication_flag =
217 h265->vui_fields.bits.neutral_chroma_indication_flag;
218 context->desc.h265enc.seq.vui_flags.field_seq_flag =
219 h265->vui_fields.bits.field_seq_flag;
220 context->desc.h265enc.seq.vui_flags.bitstream_restriction_flag =
221 h265->vui_fields.bits.bitstream_restriction_flag;
222 context->desc.h265enc.seq.vui_flags.tiles_fixed_structure_flag =
223 h265->vui_fields.bits.tiles_fixed_structure_flag;
224 context->desc.h265enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag =
225 h265->vui_fields.bits.motion_vectors_over_pic_boundaries_flag;
226 context->desc.h265enc.seq.vui_flags.restricted_ref_pic_lists_flag =
227 h265->vui_fields.bits.restricted_ref_pic_lists_flag;
228 context->desc.h265enc.seq.log2_max_mv_length_vertical =
229 h265->vui_fields.bits.log2_max_mv_length_vertical;
230 context->desc.h265enc.seq.log2_max_mv_length_horizontal =
231 h265->vui_fields.bits.log2_max_mv_length_horizontal;
232 context->desc.h265enc.seq.min_spatial_segmentation_idc =
233 h265->min_spatial_segmentation_idc;
234 context->desc.h265enc.seq.max_bytes_per_pic_denom =
235 h265->max_bytes_per_pic_denom;
236 } else {
237 context->desc.h265enc.seq.vui_flags.timing_info_present_flag = 0;
238 context->desc.h265enc.seq.vui_flags.neutral_chroma_indication_flag = 0;
239 context->desc.h265enc.seq.vui_flags.field_seq_flag = 0;
240 context->desc.h265enc.seq.vui_flags.bitstream_restriction_flag = 0;
241 context->desc.h265enc.seq.vui_flags.tiles_fixed_structure_flag = 0;
242 context->desc.h265enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag = 0;
243 context->desc.h265enc.seq.vui_flags.restricted_ref_pic_lists_flag = 0;
244 context->desc.h265enc.seq.log2_max_mv_length_vertical = 0;
245 context->desc.h265enc.seq.log2_max_mv_length_horizontal = 0;
246 context->desc.h265enc.seq.min_spatial_segmentation_idc = 0;
247 context->desc.h265enc.seq.max_bytes_per_pic_denom = 0;
248 }
249
250 if (!context->desc.h265enc.seq.vui_flags.timing_info_present_flag) {
251 /* if not present, set default value */
252 num_units_in_tick = PIPE_DEFAULT_FRAME_RATE_DEN;
253 time_scale = PIPE_DEFAULT_FRAME_RATE_NUM;
254 }
255
256 context->desc.h265enc.seq.num_units_in_tick = num_units_in_tick;
257 context->desc.h265enc.seq.time_scale = time_scale;
258 context->desc.h265enc.rc.frame_rate_num = time_scale;
259 context->desc.h265enc.rc.frame_rate_den = num_units_in_tick;
260
261 return VA_STATUS_SUCCESS;
262 }
263
264 VAStatus
vlVaHandleVAEncMiscParameterTypeRateControlHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)265 vlVaHandleVAEncMiscParameterTypeRateControlHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
266 {
267 VAEncMiscParameterRateControl *rc = (VAEncMiscParameterRateControl *)misc->data;
268
269 if (context->desc.h265enc.rc.rate_ctrl_method ==
270 PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT)
271 context->desc.h265enc.rc.target_bitrate = rc->bits_per_second;
272 else
273 context->desc.h265enc.rc.target_bitrate = rc->bits_per_second * (rc->target_percentage / 100.0);
274 context->desc.h265enc.rc.peak_bitrate = rc->bits_per_second;
275 if (context->desc.h265enc.rc.target_bitrate < 2000000)
276 context->desc.h265enc.rc.vbv_buffer_size = MIN2((context->desc.h265enc.rc.target_bitrate * 2.75), 2000000);
277 else
278 context->desc.h265enc.rc.vbv_buffer_size = context->desc.h265enc.rc.target_bitrate;
279
280 context->desc.h265enc.rc.fill_data_enable = !(rc->rc_flags.bits.disable_bit_stuffing);
281 /* context->desc.h265enc.rc.skip_frame_enable = !(rc->rc_flags.bits.disable_frame_skip); */
282 context->desc.h265enc.rc.skip_frame_enable = 0;
283 context->desc.h265enc.rc.max_qp = rc->max_qp;
284 context->desc.h265enc.rc.min_qp = rc->min_qp;
285 /* Distinguishes from the default params set for these values in other
286 functions and app specific params passed down */
287 context->desc.h265enc.rc.app_requested_qp_range = ((rc->max_qp > 0) || (rc->min_qp > 0));
288
289 if (context->desc.h265enc.rc.rate_ctrl_method ==
290 PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE)
291 context->desc.h265enc.rc.vbr_quality_factor =
292 rc->quality_factor;
293
294 return VA_STATUS_SUCCESS;
295 }
296
297 VAStatus
vlVaHandleVAEncMiscParameterTypeFrameRateHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)298 vlVaHandleVAEncMiscParameterTypeFrameRateHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
299 {
300 VAEncMiscParameterFrameRate *fr = (VAEncMiscParameterFrameRate *)misc->data;
301
302 if (fr->framerate & 0xffff0000) {
303 context->desc.h265enc.rc.frame_rate_num = fr->framerate & 0xffff;
304 context->desc.h265enc.rc.frame_rate_den = fr->framerate >> 16 & 0xffff;
305 } else {
306 context->desc.h265enc.rc.frame_rate_num = fr->framerate;
307 context->desc.h265enc.rc.frame_rate_den = 1;
308 }
309
310 return VA_STATUS_SUCCESS;
311 }
312
313 VAStatus
vlVaHandleVAEncMiscParameterTypeQualityLevelHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)314 vlVaHandleVAEncMiscParameterTypeQualityLevelHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
315 {
316 VAEncMiscParameterBufferQualityLevel *ql = (VAEncMiscParameterBufferQualityLevel *)misc->data;
317 vlVaHandleVAEncMiscParameterTypeQualityLevel(&context->desc.h265enc.quality_modes,
318 (vlVaQualityBits *)&ql->quality_level);
319
320 return VA_STATUS_SUCCESS;
321 }
322
profile_tier(struct vl_rbsp * rbsp)323 static void profile_tier(struct vl_rbsp *rbsp)
324 {
325 vl_rbsp_u(rbsp, 2); /* general_profile_space */
326 vl_rbsp_u(rbsp, 1); /* general_tier_flag */
327 vl_rbsp_u(rbsp, 5); /* general_profile_idc */
328
329 /* general_profile_compatibility_flag */
330 for(int i = 0; i < 32; ++i)
331 vl_rbsp_u(rbsp, 1);
332
333 vl_rbsp_u(rbsp, 1); /* general_progressive_source_flag */
334 vl_rbsp_u(rbsp, 1); /* general_interlaced_source_flag */
335 vl_rbsp_u(rbsp, 1); /* general_non_packed_constraint_flag */
336 vl_rbsp_u(rbsp, 1); /* general_frame_only_constraint_flag */
337
338 /* general_reserved_zero_44bits */
339 vl_rbsp_u(rbsp, 16);
340 vl_rbsp_u(rbsp, 16);
341 vl_rbsp_u(rbsp, 12);
342 }
343
profile_tier_level(struct vl_rbsp * rbsp,int max_sublayers_minus1)344 static unsigned profile_tier_level(struct vl_rbsp *rbsp,
345 int max_sublayers_minus1)
346 {
347 bool sub_layer_profile_present_flag[6];
348 bool sub_layer_level_present_flag[6];
349 unsigned level_idc;
350 int i;
351
352 profile_tier(rbsp);
353 level_idc = vl_rbsp_u(rbsp, 8); /* general_level_idc */
354
355 for (i = 0; i < max_sublayers_minus1; ++i) {
356 sub_layer_profile_present_flag[i] = vl_rbsp_u(rbsp, 1);
357 sub_layer_level_present_flag[i] = vl_rbsp_u(rbsp, 1);
358 }
359
360 if (max_sublayers_minus1 > 0)
361 for (i = max_sublayers_minus1; i < 8; ++i)
362 vl_rbsp_u(rbsp, 2); /* reserved_zero_2bits */
363
364 for (i = 0; i < max_sublayers_minus1; ++i) {
365 if (sub_layer_profile_present_flag[i])
366 profile_tier(rbsp);
367
368 if (sub_layer_level_present_flag[i])
369 vl_rbsp_u(rbsp, 8); /* sub_layer_level_idc */
370 }
371
372 return level_idc;
373 }
374
parse_enc_hrd_sublayer_params_hevc(uint32_t cpb_cnt,uint32_t sub_pic_hrd_params_present_flag,struct vl_rbsp * rbsp,struct pipe_h265_enc_sublayer_hrd_params * sublayer_params)375 static void parse_enc_hrd_sublayer_params_hevc(uint32_t cpb_cnt,
376 uint32_t sub_pic_hrd_params_present_flag,
377 struct vl_rbsp *rbsp,
378 struct pipe_h265_enc_sublayer_hrd_params* sublayer_params)
379 {
380 for (unsigned i = 0; i < cpb_cnt; i++ ) {
381 sublayer_params->bit_rate_value_minus1[i] = vl_rbsp_ue(rbsp);
382 sublayer_params->cpb_size_value_minus1[i] = vl_rbsp_ue(rbsp);
383 if( sub_pic_hrd_params_present_flag ) {
384 sublayer_params->cpb_size_du_value_minus1[i] = vl_rbsp_ue(rbsp);
385 sublayer_params->bit_rate_du_value_minus1[i] = vl_rbsp_ue(rbsp);
386 }
387 sublayer_params->cbr_flag[i] = vl_rbsp_u(rbsp, 1);
388 }
389 }
390
parse_enc_hrd_params_hevc(struct vl_rbsp * rbsp,uint32_t commonInfPresentFlag,uint32_t sps_max_sub_layers_minus1,struct pipe_h265_enc_hrd_params * hrdParams)391 static void parse_enc_hrd_params_hevc(struct vl_rbsp *rbsp,
392 uint32_t commonInfPresentFlag,
393 uint32_t sps_max_sub_layers_minus1,
394 struct pipe_h265_enc_hrd_params* hrdParams)
395 {
396 if (commonInfPresentFlag) {
397 hrdParams->nal_hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
398 hrdParams->vcl_hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
399 if (hrdParams->nal_hrd_parameters_present_flag || hrdParams->vcl_hrd_parameters_present_flag) {
400 hrdParams->sub_pic_hrd_params_present_flag = vl_rbsp_u(rbsp, 1);
401 if (hrdParams->sub_pic_hrd_params_present_flag) {
402 hrdParams->tick_divisor_minus2 = vl_rbsp_u(rbsp, 8);
403 hrdParams->du_cpb_removal_delay_increment_length_minus1 = vl_rbsp_u(rbsp, 5);
404 hrdParams->sub_pic_cpb_params_in_pic_timing_sei_flag = vl_rbsp_u(rbsp, 1);
405 hrdParams->dpb_output_delay_du_length_minus1 = vl_rbsp_u(rbsp, 5);
406 }
407 hrdParams->bit_rate_scale = vl_rbsp_u(rbsp, 4);
408 hrdParams->cpb_rate_scale = vl_rbsp_u(rbsp, 4);
409 if (hrdParams->sub_pic_hrd_params_present_flag)
410 hrdParams->cpb_size_du_scale = vl_rbsp_u(rbsp, 4);
411 hrdParams->initial_cpb_removal_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
412 hrdParams->au_cpb_removal_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
413 hrdParams->dpb_output_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
414 }
415 }
416
417 for (unsigned i = 0; i <= sps_max_sub_layers_minus1; i++) {
418 hrdParams->fixed_pic_rate_general_flag[i] = vl_rbsp_u(rbsp, 1);
419 if (!hrdParams->fixed_pic_rate_general_flag[i])
420 hrdParams->fixed_pic_rate_within_cvs_flag[i] = vl_rbsp_u(rbsp, 1);
421 if (hrdParams->fixed_pic_rate_within_cvs_flag[i])
422 hrdParams->elemental_duration_in_tc_minus1[i] = vl_rbsp_ue(rbsp);
423 else
424 hrdParams->low_delay_hrd_flag[i] = vl_rbsp_u(rbsp, 1);
425 if (!hrdParams->low_delay_hrd_flag[i])
426 hrdParams->cpb_cnt_minus1[i] = vl_rbsp_ue(rbsp);
427
428 if (hrdParams->nal_hrd_parameters_present_flag)
429 parse_enc_hrd_sublayer_params_hevc(hrdParams->cpb_cnt_minus1[i] + 1,
430 hrdParams->sub_pic_hrd_params_present_flag,
431 rbsp,
432 &hrdParams->nal_hrd_parameters[i]);
433
434 if (hrdParams->vcl_hrd_parameters_present_flag)
435 parse_enc_hrd_sublayer_params_hevc(hrdParams->cpb_cnt_minus1[i] + 1,
436 hrdParams->sub_pic_hrd_params_present_flag,
437 rbsp,
438 &hrdParams->vlc_hrd_parameters[i]);
439 }
440 }
441 /* dummy function for consuming the scaling list data if it is available */
scaling_list_data(struct vl_rbsp * rbsp)442 static void scaling_list_data(struct vl_rbsp *rbsp)
443 {
444 unsigned size_id, matrix_id, coef_num;
445 unsigned pre_mode_flag;
446 for (size_id = 0; size_id < 4; size_id++) {
447 for (matrix_id = 0; matrix_id < 6; matrix_id += (size_id == 3) ? 3 : 1) {
448 pre_mode_flag = vl_rbsp_u(rbsp, 1);
449 if (pre_mode_flag == 0)
450 vl_rbsp_ue(rbsp);
451 else {
452 coef_num = MIN2(64, (1 << (4 + (size_id << 1))));
453 if (size_id > 1)
454 vl_rbsp_se(rbsp);
455 for (unsigned i = 0; i < coef_num; i++)
456 vl_rbsp_se(rbsp);
457 }
458 }
459 }
460 }
461
462 /* i is the working rps, st_rps is the start */
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)463 static void st_ref_pic_set(unsigned index,
464 unsigned num_short_term_ref_pic_sets,
465 struct pipe_h265_st_ref_pic_set *st_rps,
466 struct vl_rbsp *rbsp)
467 {
468 unsigned inter_ref_pic_set_pred_flag = (index) ? vl_rbsp_u(rbsp, 1) : 0;
469 struct pipe_h265_st_ref_pic_set *ref_rps = NULL;
470 unsigned delta_idx_minus1 = 0;
471 unsigned i;
472
473 if (inter_ref_pic_set_pred_flag) {
474 if (index == num_short_term_ref_pic_sets)
475 delta_idx_minus1 = vl_rbsp_ue(rbsp);
476 vl_rbsp_u(rbsp, 1); /* delta_rps_sign */
477 vl_rbsp_ue(rbsp); /* abs_delta_rps_minus1 */
478 ref_rps = st_rps + index - (delta_idx_minus1 + 1);
479 for (i = 0; i <= (ref_rps->num_neg_pics + ref_rps->num_pos_pics); i++) {
480 if (!vl_rbsp_u(rbsp, 1)) /* used_by_curr_pic_flag */
481 vl_rbsp_u(rbsp, 1); /* use_delta_flag */
482 }
483 } else {
484 st_rps->num_neg_pics = vl_rbsp_ue(rbsp);
485 st_rps->num_pos_pics = vl_rbsp_ue(rbsp);
486 for (i = 0; i < st_rps->num_neg_pics; i++) {
487 vl_rbsp_ue(rbsp); /* delta_poc_s0_minus1 */
488 vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_s0_flag */
489 }
490 for (i = 0; i < st_rps->num_pos_pics; i++) {
491 vl_rbsp_ue(rbsp); /* delta_poc_s1_minus1 */
492 vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_s1_flag */
493 }
494 }
495 }
496
parseEncSpsParamsH265(vlVaContext * context,struct vl_rbsp * rbsp)497 static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
498 {
499 int sps_max_sub_layers_minus1;
500 unsigned i, sps_sub_layer_ordering_info_present_flag;
501 unsigned num_st_ref_pic_sets, num_long_term_ref_pics_sps;
502 unsigned log2_max_pic_order_cnt_lsb_minus4;
503 struct pipe_h265_st_ref_pic_set *st_rps = NULL;
504
505 vl_rbsp_u(rbsp, 4); /* sps_video_parameter_set_id */
506 sps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);
507 vl_rbsp_u(rbsp, 1); /* sps_temporal_id_nesting_flag */
508
509 /* level_idc */
510 profile_tier_level(rbsp, sps_max_sub_layers_minus1);
511
512 vl_rbsp_ue(rbsp); /* id */
513 context->desc.h265enc.seq.chroma_format_idc = vl_rbsp_ue(rbsp);
514 if (context->desc.h265enc.seq.chroma_format_idc == 3)
515 vl_rbsp_u(rbsp, 1); /* separate_colour_plane_flag */
516
517 context->desc.h265enc.seq.pic_width_in_luma_samples = vl_rbsp_ue(rbsp);
518 context->desc.h265enc.seq.pic_height_in_luma_samples = vl_rbsp_ue(rbsp);
519
520 /* conformance_window_flag - used for cropping */
521 context->desc.h265enc.seq.conformance_window_flag = vl_rbsp_u(rbsp, 1);
522 if (context->desc.h265enc.seq.conformance_window_flag) {
523 context->desc.h265enc.seq.conf_win_left_offset = vl_rbsp_ue(rbsp);
524 context->desc.h265enc.seq.conf_win_right_offset = vl_rbsp_ue(rbsp);
525 context->desc.h265enc.seq.conf_win_top_offset = vl_rbsp_ue(rbsp);
526 context->desc.h265enc.seq.conf_win_bottom_offset = vl_rbsp_ue(rbsp);
527 }
528
529 vl_rbsp_ue(rbsp); /* bit_depth_luma_minus8 */
530 vl_rbsp_ue(rbsp); /* bit_depth_chroma_minus8 */
531 log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);
532
533 sps_sub_layer_ordering_info_present_flag = vl_rbsp_u(rbsp, 1);
534 i = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1;
535 for (; i <= sps_max_sub_layers_minus1; ++i) {
536 vl_rbsp_ue(rbsp); /* sps_max_dec_pic_buffering_minus1[i] */
537 vl_rbsp_ue(rbsp); /* sps_max_num_reorder_pics[i] */
538 vl_rbsp_ue(rbsp); /* sps_max_latency_increase_plus1[i] */
539 }
540
541 vl_rbsp_ue(rbsp); /* log2_min_luma_coding_block_size_minus3 */
542 vl_rbsp_ue(rbsp); /* log2_diff_max_min_luma_coding_block_size */
543 vl_rbsp_ue(rbsp); /* log2_min_luma_transform_block_size_minus2 */
544 vl_rbsp_ue(rbsp); /* log2_diff_max_min_luma_transform_block_size */
545 vl_rbsp_ue(rbsp); /* max_transform_hierarchy_depth_inter */
546 vl_rbsp_ue(rbsp); /* max_transform_hierarchy_depth_intra */
547
548 if (vl_rbsp_u(rbsp, 1)) /* scaling_list_enabled_flag */
549 if (vl_rbsp_u(rbsp, 1)) /* sps_scaling_list_data_present_flag */
550 scaling_list_data(rbsp);
551
552 vl_rbsp_u(rbsp, 1); /* amp_enabled_flag */
553 vl_rbsp_u(rbsp, 1); /* sample_adaptive_offset_enabled_flag */
554 if (vl_rbsp_u(rbsp, 1)) { /* pcm_enabled_flag */
555 vl_rbsp_u(rbsp, 4); /* pcm_sample_bit_depth_luma_minus1 */
556 vl_rbsp_u(rbsp, 4); /* pcm_sample_bit_depth_chroma_minus1 */
557 vl_rbsp_ue(rbsp); /* log2_min_pcm_luma_coding_block_size_minus3 */
558 vl_rbsp_ue(rbsp); /* log2_diff_max_min_pcm_luma_coding_block_size */
559 vl_rbsp_u(rbsp, 1); /* pcm_loop_filter_disabled_flag */
560 }
561
562 num_st_ref_pic_sets = vl_rbsp_ue(rbsp); /* num_short_term_ref_pic_sets */
563 for (i = 0; i < num_st_ref_pic_sets; i++) {
564 if (i == 0) /* allocating st_ref_pic_sets */
565 st_rps = (struct pipe_h265_st_ref_pic_set *)
566 CALLOC(num_st_ref_pic_sets + 1, sizeof(struct pipe_h265_st_ref_pic_set));
567
568 st_ref_pic_set(i, num_st_ref_pic_sets, st_rps, rbsp);
569 }
570
571 if (vl_rbsp_u(rbsp, 1)) {/* long_term_ref_pics_present_flag */
572 num_long_term_ref_pics_sps = vl_rbsp_ue(rbsp);
573 for (i = 0; i < num_long_term_ref_pics_sps; i++) {
574 /* lt_ref_pic_poc_lsb_sps */
575 vl_rbsp_u(rbsp, log2_max_pic_order_cnt_lsb_minus4 + 4);
576 vl_rbsp_u(rbsp, 1); /* used_by_curr_pic_lt_sps_flag */
577 }
578 }
579
580 vl_rbsp_u(rbsp, 1); /* sps_temporal_mvp_enabled_flag */
581 vl_rbsp_u(rbsp, 1); /* strong_intra_smoothing_enabled_flag */
582
583 context->desc.h265enc.seq.vui_parameters_present_flag = vl_rbsp_u(rbsp, 1);
584 if (context->desc.h265enc.seq.vui_parameters_present_flag) {
585 context->desc.h265enc.seq.vui_flags.aspect_ratio_info_present_flag = vl_rbsp_u(rbsp, 1);
586 if (context->desc.h265enc.seq.vui_flags.aspect_ratio_info_present_flag) {
587 context->desc.h265enc.seq.aspect_ratio_idc = vl_rbsp_u(rbsp, 8);
588 if (context->desc.h265enc.seq.aspect_ratio_idc == 255 /* Extended_SAR */) {
589 context->desc.h265enc.seq.sar_width = vl_rbsp_u(rbsp, 16);
590 context->desc.h265enc.seq.sar_height = vl_rbsp_u(rbsp, 16);
591 }
592 }
593
594 context->desc.h265enc.seq.vui_flags.overscan_info_present_flag = vl_rbsp_u(rbsp, 1);
595 if (context->desc.h265enc.seq.vui_flags.overscan_info_present_flag)
596 context->desc.h265enc.seq.vui_flags.overscan_appropriate_flag = vl_rbsp_u(rbsp, 1);
597
598 context->desc.h265enc.seq.vui_flags.video_signal_type_present_flag = vl_rbsp_u(rbsp, 1);
599 if (context->desc.h265enc.seq.vui_flags.video_signal_type_present_flag) {
600 context->desc.h265enc.seq.video_format = vl_rbsp_u(rbsp, 3);
601 context->desc.h265enc.seq.video_full_range_flag = vl_rbsp_u(rbsp, 1);
602 context->desc.h265enc.seq.vui_flags.colour_description_present_flag = vl_rbsp_u(rbsp, 1);
603 if (context->desc.h265enc.seq.vui_flags.colour_description_present_flag) {
604 context->desc.h265enc.seq.colour_primaries = vl_rbsp_u(rbsp, 8);
605 context->desc.h265enc.seq.transfer_characteristics = vl_rbsp_u(rbsp, 8);
606 context->desc.h265enc.seq.matrix_coefficients = vl_rbsp_u(rbsp, 8);
607 }
608 }
609
610 context->desc.h265enc.seq.vui_flags.chroma_loc_info_present_flag = vl_rbsp_u(rbsp, 1);
611 if (context->desc.h265enc.seq.vui_flags.chroma_loc_info_present_flag) {
612 context->desc.h265enc.seq.chroma_sample_loc_type_top_field = vl_rbsp_ue(rbsp);
613 context->desc.h265enc.seq.chroma_sample_loc_type_bottom_field = vl_rbsp_ue(rbsp);
614 }
615
616 context->desc.h265enc.seq.vui_flags.neutral_chroma_indication_flag = vl_rbsp_u(rbsp, 1);
617 context->desc.h265enc.seq.vui_flags.field_seq_flag = vl_rbsp_u(rbsp, 1);
618 context->desc.h265enc.seq.vui_flags.frame_field_info_present_flag = vl_rbsp_u(rbsp, 1);
619 context->desc.h265enc.seq.vui_flags.default_display_window_flag = vl_rbsp_u(rbsp, 1);
620
621 if (context->desc.h265enc.seq.vui_flags.default_display_window_flag) {
622 context->desc.h265enc.seq.def_disp_win_left_offset = vl_rbsp_ue(rbsp);
623 context->desc.h265enc.seq.def_disp_win_right_offset = vl_rbsp_ue(rbsp);
624 context->desc.h265enc.seq.def_disp_win_top_offset = vl_rbsp_ue(rbsp);
625 context->desc.h265enc.seq.def_disp_win_bottom_offset = vl_rbsp_ue(rbsp);
626 }
627
628 context->desc.h265enc.seq.vui_flags.timing_info_present_flag = vl_rbsp_u(rbsp, 1);
629
630 if (context->desc.h265enc.seq.vui_flags.timing_info_present_flag) {
631 uint32_t num_units_in_tick_high = vl_rbsp_u(rbsp, 16);
632 uint32_t num_units_in_tick_low = vl_rbsp_u(rbsp, 16);
633 context->desc.h265enc.seq.num_units_in_tick = (num_units_in_tick_high << 16) | num_units_in_tick_low;
634
635 uint32_t time_scale_high = vl_rbsp_u(rbsp, 16);
636 uint32_t time_scale_low = vl_rbsp_u(rbsp, 16);
637 context->desc.h265enc.seq.time_scale = (time_scale_high << 16) | time_scale_low;
638
639 context->desc.h265enc.seq.vui_flags.poc_proportional_to_timing_flag = vl_rbsp_u(rbsp, 1);
640 if (context->desc.h265enc.seq.vui_flags.poc_proportional_to_timing_flag) {
641 context->desc.h265enc.seq.num_ticks_poc_diff_one_minus1 = vl_rbsp_ue(rbsp);
642 context->desc.h265enc.seq.vui_flags.hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
643 if (context->desc.h265enc.seq.vui_flags.hrd_parameters_present_flag)
644 parse_enc_hrd_params_hevc(rbsp,
645 1,
646 sps_max_sub_layers_minus1,
647 &context->desc.h265enc.seq.hrd_parameters);
648 }
649 }
650
651 context->desc.h265enc.seq.vui_flags.bitstream_restriction_flag = vl_rbsp_u(rbsp, 1);
652 if (context->desc.h265enc.seq.vui_flags.bitstream_restriction_flag) {
653 context->desc.h265enc.seq.vui_flags.tiles_fixed_structure_flag = vl_rbsp_u(rbsp, 1);
654 context->desc.h265enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag = vl_rbsp_u(rbsp, 1);
655 context->desc.h265enc.seq.vui_flags.restricted_ref_pic_lists_flag = vl_rbsp_u(rbsp, 1);
656 context->desc.h265enc.seq.min_spatial_segmentation_idc = vl_rbsp_ue(rbsp);
657 context->desc.h265enc.seq.max_bytes_per_pic_denom = vl_rbsp_ue(rbsp);
658 context->desc.h265enc.seq.max_bits_per_min_cu_denom = vl_rbsp_ue(rbsp);
659 context->desc.h265enc.seq.log2_max_mv_length_horizontal = vl_rbsp_ue(rbsp);
660 context->desc.h265enc.seq.log2_max_mv_length_vertical = vl_rbsp_ue(rbsp);
661 }
662 }
663
664 if (st_rps) FREE(st_rps);
665 }
666
667 VAStatus
vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext * context,vlVaBuffer * buf)668 vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer *buf)
669 {
670 struct vl_vlc vlc = {0};
671 vl_vlc_init(&vlc, 1, (const void * const*)&buf->data, &buf->size);
672
673 while (vl_vlc_bits_left(&vlc) > 0) {
674 /* search the first 64 bytes for a startcode */
675 for (int i = 0; i < 64 && vl_vlc_bits_left(&vlc) >= 24; ++i) {
676 if (vl_vlc_peekbits(&vlc, 24) == 0x000001)
677 break;
678 vl_vlc_eatbits(&vlc, 8);
679 vl_vlc_fillbits(&vlc);
680 }
681 vl_vlc_eatbits(&vlc, 24); /* eat the startcode */
682
683 if (vl_vlc_valid_bits(&vlc) < 15)
684 vl_vlc_fillbits(&vlc);
685
686 vl_vlc_eatbits(&vlc, 1);
687 unsigned nal_unit_type = vl_vlc_get_uimsbf(&vlc, 6);
688 vl_vlc_eatbits(&vlc, 6);
689 vl_vlc_eatbits(&vlc, 3);
690
691 struct vl_rbsp rbsp;
692 vl_rbsp_init(&rbsp, &vlc, ~0, context->packed_header_emulation_bytes);
693
694 switch(nal_unit_type) {
695 case HEVC_NAL_SPS:
696 parseEncSpsParamsH265(context, &rbsp);
697 break;
698 case HEVC_NAL_VPS:
699 case HEVC_NAL_PPS:
700 default:
701 break;
702 }
703
704 if (!context->packed_header_emulation_bytes)
705 break;
706 }
707
708 return VA_STATUS_SUCCESS;
709 }
710
711 VAStatus
vlVaHandleVAEncMiscParameterTypeMaxFrameSizeHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)712 vlVaHandleVAEncMiscParameterTypeMaxFrameSizeHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
713 {
714 VAEncMiscParameterBufferMaxFrameSize *ms = (VAEncMiscParameterBufferMaxFrameSize *)misc->data;
715 context->desc.h265enc.rc.max_au_size = ms->max_frame_size;
716 return VA_STATUS_SUCCESS;
717 }
718
719 VAStatus
vlVaHandleVAEncMiscParameterTypeHRDHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)720 vlVaHandleVAEncMiscParameterTypeHRDHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
721 {
722 VAEncMiscParameterHRD *ms = (VAEncMiscParameterHRD *)misc->data;
723
724 if (ms->buffer_size) {
725 context->desc.h265enc.rc.vbv_buffer_size = ms->buffer_size;
726 context->desc.h265enc.rc.vbv_buf_lv = (ms->initial_buffer_fullness << 6 ) / ms->buffer_size;
727 context->desc.h265enc.rc.vbv_buf_initial_size = ms->initial_buffer_fullness;
728 /* Distinguishes from the default params set for these values in other
729 functions and app specific params passed down via HRD buffer */
730 context->desc.h265enc.rc.app_requested_hrd_buffer = true;
731 }
732
733 return VA_STATUS_SUCCESS;
734 }
735
getEncParamPresetH265(vlVaContext * context)736 void getEncParamPresetH265(vlVaContext *context)
737 {
738 //rate control
739 if (context->desc.h265enc.rc.frame_rate_num == 0 ||
740 context->desc.h265enc.rc.frame_rate_den == 0) {
741 context->desc.h265enc.rc.frame_rate_num = 30;
742 context->desc.h265enc.rc.frame_rate_den = 1;
743 }
744 context->desc.h265enc.rc.target_bits_picture =
745 context->desc.h265enc.rc.target_bitrate *
746 ((float)context->desc.h265enc.rc.frame_rate_den /
747 context->desc.h265enc.rc.frame_rate_num);
748 context->desc.h265enc.rc.peak_bits_picture_integer =
749 context->desc.h265enc.rc.peak_bitrate *
750 ((float)context->desc.h265enc.rc.frame_rate_den /
751 context->desc.h265enc.rc.frame_rate_num);
752
753 context->desc.h265enc.rc.peak_bits_picture_fraction = 0;
754 }
755