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 HEVCSEIPayloadType {
35 MASTERING_DISPLAY_COLOUR_VOLUME = 137,
36 CONTENT_LIGHT_LEVEL_INFO = 144,
37 };
38
39 VAStatus
vlVaHandleVAEncPictureParameterBufferTypeHEVC(vlVaDriver * drv,vlVaContext * context,vlVaBuffer * buf)40 vlVaHandleVAEncPictureParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
41 {
42 VAEncPictureParameterBufferHEVC *h265;
43 vlVaBuffer *coded_buf;
44 vlVaSurface *surf;
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 surf = handle_table_get(drv->htab, h265->decoded_curr_pic.picture_id);
55 if (!surf)
56 return VA_STATUS_ERROR_INVALID_PARAMETER;
57
58 for (i = 0; i < ARRAY_SIZE(context->desc.h265enc.dpb); i++) {
59 if (context->desc.h265enc.dpb[i].id == h265->decoded_curr_pic.picture_id) {
60 assert(surf->is_dpb);
61 break;
62 }
63 if (!context->desc.h265enc.dpb[i].id) {
64 assert(!surf->is_dpb);
65 surf->is_dpb = true;
66 if (surf->buffer) {
67 surf->buffer->destroy(surf->buffer);
68 surf->buffer = NULL;
69 }
70 if (context->decoder && context->decoder->create_dpb_buffer)
71 surf->buffer = context->decoder->create_dpb_buffer(context->decoder, &context->desc.base, &surf->templat);
72 vlVaSetSurfaceContext(drv, surf, context);
73 context->desc.h265enc.dpb_size++;
74 break;
75 }
76 }
77 if (i == ARRAY_SIZE(context->desc.h264enc.dpb))
78 return VA_STATUS_ERROR_INVALID_PARAMETER;
79 context->desc.h265enc.dpb_curr_pic = i;
80 context->desc.h265enc.dpb[i].id = h265->decoded_curr_pic.picture_id;
81 context->desc.h265enc.dpb[i].pic_order_cnt = h265->decoded_curr_pic.pic_order_cnt;
82 context->desc.h265enc.dpb[i].is_ltr = h265->decoded_curr_pic.flags & VA_PICTURE_HEVC_LONG_TERM_REFERENCE;
83 context->desc.h265enc.dpb[i].buffer = surf->buffer;
84
85 context->desc.h265enc.pic_order_cnt = h265->decoded_curr_pic.pic_order_cnt;
86 coded_buf = handle_table_get(drv->htab, h265->coded_buf);
87 if (!coded_buf)
88 return VA_STATUS_ERROR_INVALID_BUFFER;
89
90 if (!coded_buf->derived_surface.resource)
91 coded_buf->derived_surface.resource = pipe_buffer_create(drv->pipe->screen, PIPE_BIND_VERTEX_BUFFER,
92 PIPE_USAGE_STAGING, coded_buf->size);
93
94 context->coded_buf = coded_buf;
95 context->desc.h265enc.pic.log2_parallel_merge_level_minus2 = h265->log2_parallel_merge_level_minus2;
96 context->desc.h265enc.pic.nal_unit_type = h265->nal_unit_type;
97 context->desc.h265enc.rc[0].init_qp = h265->pic_init_qp;
98
99 switch(h265->pic_fields.bits.coding_type) {
100 case 1:
101 if (h265->pic_fields.bits.idr_pic_flag)
102 context->desc.h265enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_IDR;
103 else
104 context->desc.h265enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_I;
105 break;
106 case 2:
107 context->desc.h265enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_P;
108 break;
109 case 3:
110 case 4:
111 case 5:
112 context->desc.h265enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_B;
113 break;
114 }
115
116 context->desc.h265enc.pic.constrained_intra_pred_flag = h265->pic_fields.bits.constrained_intra_pred_flag;
117 context->desc.h265enc.pic.pps_loop_filter_across_slices_enabled_flag = h265->pic_fields.bits.pps_loop_filter_across_slices_enabled_flag;
118 context->desc.h265enc.pic.transform_skip_enabled_flag = h265->pic_fields.bits.transform_skip_enabled_flag;
119 context->desc.h265enc.pic.cu_qp_delta_enabled_flag = h265->pic_fields.bits.cu_qp_delta_enabled_flag;
120 context->desc.h265enc.pic.diff_cu_qp_delta_depth = h265->diff_cu_qp_delta_depth;
121
122 _mesa_hash_table_insert(context->desc.h265enc.frame_idx,
123 UINT_TO_PTR(h265->decoded_curr_pic.picture_id + 1),
124 UINT_TO_PTR(context->desc.h265enc.frame_num));
125
126 /* Initialize slice descriptors for this picture */
127 context->desc.h265enc.num_slice_descriptors = 0;
128 memset(&context->desc.h265enc.slices_descriptors, 0, sizeof(context->desc.h265enc.slices_descriptors));
129
130 context->desc.h265enc.num_ref_idx_l0_active_minus1 = h265->num_ref_idx_l0_default_active_minus1;
131 context->desc.h265enc.num_ref_idx_l1_active_minus1 = h265->num_ref_idx_l1_default_active_minus1;
132
133 return VA_STATUS_SUCCESS;
134 }
135
136 static uint8_t
vlVaDpbIndex(vlVaContext * context,VASurfaceID id)137 vlVaDpbIndex(vlVaContext *context, VASurfaceID id)
138 {
139 for (uint8_t i = 0; i < context->desc.h265enc.dpb_size; i++) {
140 if (context->desc.h265enc.dpb[i].id == id)
141 return i;
142 }
143 return PIPE_H2645_LIST_REF_INVALID_ENTRY;
144 }
145
146 VAStatus
vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver * drv,vlVaContext * context,vlVaBuffer * buf)147 vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
148 {
149 VAEncSliceParameterBufferHEVC *h265;
150 unsigned slice_qp;
151
152 h265 = buf->data;
153
154 /* Handle the slice control parameters */
155 struct h265_slice_descriptor slice_descriptor;
156 memset(&slice_descriptor, 0, sizeof(slice_descriptor));
157 slice_descriptor.slice_segment_address = h265->slice_segment_address;
158 slice_descriptor.num_ctu_in_slice = h265->num_ctu_in_slice;
159 slice_descriptor.slice_type = h265->slice_type;
160 assert(slice_descriptor.slice_type <= PIPE_H265_SLICE_TYPE_I);
161
162 if (context->desc.h265enc.num_slice_descriptors < ARRAY_SIZE(context->desc.h265enc.slices_descriptors))
163 context->desc.h265enc.slices_descriptors[context->desc.h265enc.num_slice_descriptors++] = slice_descriptor;
164 else
165 return VA_STATUS_ERROR_NOT_ENOUGH_BUFFER;
166
167 /* Only use parameters for first slice */
168 if (h265->slice_segment_address)
169 return VA_STATUS_SUCCESS;
170
171 memset(&context->desc.h265enc.ref_idx_l0_list, VA_INVALID_ID, sizeof(context->desc.h265enc.ref_idx_l0_list));
172 memset(&context->desc.h265enc.ref_idx_l1_list, VA_INVALID_ID, sizeof(context->desc.h265enc.ref_idx_l1_list));
173 memset(&context->desc.h265enc.ref_list0, PIPE_H2645_LIST_REF_INVALID_ENTRY, sizeof(context->desc.h265enc.ref_list0));
174 memset(&context->desc.h265enc.ref_list1, PIPE_H2645_LIST_REF_INVALID_ENTRY, sizeof(context->desc.h265enc.ref_list1));
175
176 if (h265->slice_fields.bits.num_ref_idx_active_override_flag) {
177 context->desc.h265enc.num_ref_idx_l0_active_minus1 = h265->num_ref_idx_l0_active_minus1;
178 context->desc.h265enc.num_ref_idx_l1_active_minus1 = h265->num_ref_idx_l1_active_minus1;
179 }
180
181 for (int i = 0; i < 15; i++) {
182 if (h265->ref_pic_list0[i].picture_id != VA_INVALID_ID) {
183 context->desc.h265enc.ref_list0[i] = vlVaDpbIndex(context, h265->ref_pic_list0[i].picture_id);
184 context->desc.h265enc.ref_idx_l0_list[i] = PTR_TO_UINT(util_hash_table_get(context->desc.h265enc.frame_idx,
185 UINT_TO_PTR(h265->ref_pic_list0[i].picture_id + 1)));
186 }
187 if (h265->ref_pic_list1[i].picture_id != VA_INVALID_ID && h265->slice_type == PIPE_H265_SLICE_TYPE_B) {
188 context->desc.h265enc.ref_list1[i] = vlVaDpbIndex(context, h265->ref_pic_list1[i].picture_id);
189 context->desc.h265enc.ref_idx_l1_list[i] = PTR_TO_UINT(util_hash_table_get(context->desc.h265enc.frame_idx,
190 UINT_TO_PTR(h265->ref_pic_list1[i].picture_id + 1)));
191 }
192 }
193
194 context->desc.h265enc.slice.max_num_merge_cand = h265->max_num_merge_cand;
195 context->desc.h265enc.slice.slice_cb_qp_offset = h265->slice_cb_qp_offset;
196 context->desc.h265enc.slice.slice_cr_qp_offset = h265->slice_cr_qp_offset;
197 context->desc.h265enc.slice.slice_beta_offset_div2 = h265->slice_beta_offset_div2;
198 context->desc.h265enc.slice.slice_tc_offset_div2 = h265->slice_tc_offset_div2;
199 context->desc.h265enc.slice.cabac_init_flag = h265->slice_fields.bits.cabac_init_flag;
200 context->desc.h265enc.slice.slice_deblocking_filter_disabled_flag = h265->slice_fields.bits.slice_deblocking_filter_disabled_flag;
201 context->desc.h265enc.slice.slice_loop_filter_across_slices_enabled_flag = h265->slice_fields.bits.slice_loop_filter_across_slices_enabled_flag;
202
203 slice_qp = context->desc.h265enc.rc[0].init_qp + h265->slice_qp_delta;
204
205 switch (context->desc.h265enc.picture_type) {
206 case PIPE_H2645_ENC_PICTURE_TYPE_I:
207 case PIPE_H2645_ENC_PICTURE_TYPE_IDR:
208 context->desc.h265enc.rc[0].quant_i_frames = slice_qp;
209 break;
210 case PIPE_H2645_ENC_PICTURE_TYPE_P:
211 context->desc.h265enc.rc[0].quant_p_frames = slice_qp;
212 break;
213 case PIPE_H2645_ENC_PICTURE_TYPE_B:
214 context->desc.h265enc.rc[0].quant_b_frames = slice_qp;
215 break;
216 default:
217 break;
218 }
219
220 return VA_STATUS_SUCCESS;
221 }
222
223 VAStatus
vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver * drv,vlVaContext * context,vlVaBuffer * buf)224 vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
225 {
226 VAEncSequenceParameterBufferHEVC *h265 = buf->data;
227 uint32_t num_units_in_tick = 0, time_scale = 0;
228
229 context->desc.h265enc.seq.general_profile_idc = h265->general_profile_idc;
230 context->desc.h265enc.seq.general_level_idc = h265->general_level_idc;
231 context->desc.h265enc.seq.general_tier_flag = h265->general_tier_flag;
232 context->desc.h265enc.seq.intra_period = h265->intra_period;
233 context->desc.h265enc.seq.ip_period = h265->ip_period;
234 context->desc.h265enc.seq.pic_width_in_luma_samples = h265->pic_width_in_luma_samples;
235 context->desc.h265enc.seq.pic_height_in_luma_samples = h265->pic_height_in_luma_samples;
236 context->desc.h265enc.seq.chroma_format_idc = h265->seq_fields.bits.chroma_format_idc;
237 context->desc.h265enc.seq.bit_depth_luma_minus8 = h265->seq_fields.bits.bit_depth_luma_minus8;
238 context->desc.h265enc.seq.bit_depth_chroma_minus8 = h265->seq_fields.bits.bit_depth_chroma_minus8;
239 context->desc.h265enc.seq.strong_intra_smoothing_enabled_flag = h265->seq_fields.bits.strong_intra_smoothing_enabled_flag;
240 context->desc.h265enc.seq.amp_enabled_flag = h265->seq_fields.bits.amp_enabled_flag;
241 context->desc.h265enc.seq.sample_adaptive_offset_enabled_flag = h265->seq_fields.bits.sample_adaptive_offset_enabled_flag;
242 context->desc.h265enc.seq.pcm_enabled_flag = h265->seq_fields.bits.pcm_enabled_flag;
243 context->desc.h265enc.seq.sps_temporal_mvp_enabled_flag = h265->seq_fields.bits.sps_temporal_mvp_enabled_flag;
244 context->desc.h265enc.seq.log2_min_luma_coding_block_size_minus3 = h265->log2_min_luma_coding_block_size_minus3;
245 context->desc.h265enc.seq.log2_diff_max_min_luma_coding_block_size = h265->log2_diff_max_min_luma_coding_block_size;
246 context->desc.h265enc.seq.log2_min_transform_block_size_minus2 = h265->log2_min_transform_block_size_minus2;
247 context->desc.h265enc.seq.log2_diff_max_min_transform_block_size = h265->log2_diff_max_min_transform_block_size;
248 context->desc.h265enc.seq.max_transform_hierarchy_depth_inter = h265->max_transform_hierarchy_depth_inter;
249 context->desc.h265enc.seq.max_transform_hierarchy_depth_intra = h265->max_transform_hierarchy_depth_intra;
250
251 context->desc.h265enc.seq.vui_parameters_present_flag = h265->vui_parameters_present_flag;
252 if (h265->vui_parameters_present_flag) {
253 context->desc.h265enc.seq.vui_flags.aspect_ratio_info_present_flag =
254 h265->vui_fields.bits.aspect_ratio_info_present_flag;
255 context->desc.h265enc.seq.aspect_ratio_idc = h265->aspect_ratio_idc;
256 context->desc.h265enc.seq.sar_width = h265->sar_width;
257 context->desc.h265enc.seq.sar_height = h265->sar_height;
258
259 context->desc.h265enc.seq.vui_flags.timing_info_present_flag =
260 h265->vui_fields.bits.vui_timing_info_present_flag;
261 num_units_in_tick = h265->vui_num_units_in_tick;
262 time_scale = h265->vui_time_scale;
263 context->desc.h265enc.seq.vui_flags.neutral_chroma_indication_flag =
264 h265->vui_fields.bits.neutral_chroma_indication_flag;
265 context->desc.h265enc.seq.vui_flags.field_seq_flag =
266 h265->vui_fields.bits.field_seq_flag;
267 context->desc.h265enc.seq.vui_flags.bitstream_restriction_flag =
268 h265->vui_fields.bits.bitstream_restriction_flag;
269 context->desc.h265enc.seq.vui_flags.tiles_fixed_structure_flag =
270 h265->vui_fields.bits.tiles_fixed_structure_flag;
271 context->desc.h265enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag =
272 h265->vui_fields.bits.motion_vectors_over_pic_boundaries_flag;
273 context->desc.h265enc.seq.vui_flags.restricted_ref_pic_lists_flag =
274 h265->vui_fields.bits.restricted_ref_pic_lists_flag;
275 context->desc.h265enc.seq.log2_max_mv_length_vertical =
276 h265->vui_fields.bits.log2_max_mv_length_vertical;
277 context->desc.h265enc.seq.log2_max_mv_length_horizontal =
278 h265->vui_fields.bits.log2_max_mv_length_horizontal;
279 context->desc.h265enc.seq.min_spatial_segmentation_idc =
280 h265->min_spatial_segmentation_idc;
281 context->desc.h265enc.seq.max_bytes_per_pic_denom =
282 h265->max_bytes_per_pic_denom;
283 } else {
284 context->desc.h265enc.seq.vui_flags.timing_info_present_flag = 0;
285 context->desc.h265enc.seq.vui_flags.neutral_chroma_indication_flag = 0;
286 context->desc.h265enc.seq.vui_flags.field_seq_flag = 0;
287 context->desc.h265enc.seq.vui_flags.bitstream_restriction_flag = 0;
288 context->desc.h265enc.seq.vui_flags.tiles_fixed_structure_flag = 0;
289 context->desc.h265enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag = 0;
290 context->desc.h265enc.seq.vui_flags.restricted_ref_pic_lists_flag = 0;
291 context->desc.h265enc.seq.log2_max_mv_length_vertical = 0;
292 context->desc.h265enc.seq.log2_max_mv_length_horizontal = 0;
293 context->desc.h265enc.seq.min_spatial_segmentation_idc = 0;
294 context->desc.h265enc.seq.max_bytes_per_pic_denom = 0;
295 }
296
297 if (!context->desc.h265enc.seq.vui_flags.timing_info_present_flag) {
298 /* if not present, set default value */
299 num_units_in_tick = PIPE_DEFAULT_FRAME_RATE_DEN;
300 time_scale = PIPE_DEFAULT_FRAME_RATE_NUM;
301 }
302
303 context->desc.h265enc.seq.num_units_in_tick = num_units_in_tick;
304 context->desc.h265enc.seq.time_scale = time_scale;
305 context->desc.h265enc.rc[0].frame_rate_num = time_scale;
306 context->desc.h265enc.rc[0].frame_rate_den = num_units_in_tick;
307
308 return VA_STATUS_SUCCESS;
309 }
310
311 VAStatus
vlVaHandleVAEncMiscParameterTypeRateControlHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)312 vlVaHandleVAEncMiscParameterTypeRateControlHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
313 {
314 unsigned temporal_id;
315 VAEncMiscParameterRateControl *rc = (VAEncMiscParameterRateControl *)misc->data;
316
317 temporal_id = context->desc.h265enc.rc[0].rate_ctrl_method !=
318 PIPE_H2645_ENC_RATE_CONTROL_METHOD_DISABLE ?
319 rc->rc_flags.bits.temporal_id :
320 0;
321
322 if (context->desc.h265enc.seq.num_temporal_layers > 0 &&
323 temporal_id >= context->desc.h265enc.seq.num_temporal_layers)
324 return VA_STATUS_ERROR_INVALID_PARAMETER;
325
326 if (context->desc.h265enc.rc[temporal_id].rate_ctrl_method ==
327 PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT)
328 context->desc.h265enc.rc[temporal_id].target_bitrate = rc->bits_per_second;
329 else
330 context->desc.h265enc.rc[temporal_id].target_bitrate =
331 rc->bits_per_second * (rc->target_percentage / 100.0);
332 context->desc.h265enc.rc[temporal_id].peak_bitrate = rc->bits_per_second;
333 if (context->desc.h265enc.rc[temporal_id].target_bitrate < 2000000)
334 context->desc.h265enc.rc[temporal_id].vbv_buffer_size =
335 MIN2((context->desc.h265enc.rc[temporal_id].target_bitrate * 2.75), 2000000);
336 else
337 context->desc.h265enc.rc[temporal_id].vbv_buffer_size = context->desc.h265enc.rc[0].target_bitrate;
338
339 context->desc.h265enc.rc[temporal_id].fill_data_enable = !(rc->rc_flags.bits.disable_bit_stuffing);
340 /* context->desc.h265enc.rc[temporal_id].skip_frame_enable = !(rc->rc_flags.bits.disable_frame_skip); */
341 context->desc.h265enc.rc[temporal_id].skip_frame_enable = 0;
342 context->desc.h265enc.rc[temporal_id].max_qp = rc->max_qp;
343 context->desc.h265enc.rc[temporal_id].min_qp = rc->min_qp;
344 /* Distinguishes from the default params set for these values in other
345 functions and app specific params passed down */
346 context->desc.h265enc.rc[temporal_id].app_requested_qp_range = ((rc->max_qp > 0) || (rc->min_qp > 0));
347
348 if (context->desc.h265enc.rc[temporal_id].rate_ctrl_method ==
349 PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE)
350 context->desc.h265enc.rc[temporal_id].vbr_quality_factor =
351 rc->quality_factor;
352
353 return VA_STATUS_SUCCESS;
354 }
355
356 VAStatus
vlVaHandleVAEncMiscParameterTypeFrameRateHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)357 vlVaHandleVAEncMiscParameterTypeFrameRateHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
358 {
359 unsigned temporal_id;
360 VAEncMiscParameterFrameRate *fr = (VAEncMiscParameterFrameRate *)misc->data;
361
362 temporal_id = context->desc.h265enc.rc[0].rate_ctrl_method !=
363 PIPE_H2645_ENC_RATE_CONTROL_METHOD_DISABLE ?
364 fr->framerate_flags.bits.temporal_id :
365 0;
366
367 if (context->desc.h265enc.seq.num_temporal_layers > 0 &&
368 temporal_id >= context->desc.h265enc.seq.num_temporal_layers)
369 return VA_STATUS_ERROR_INVALID_PARAMETER;
370
371 if (fr->framerate & 0xffff0000) {
372 context->desc.h265enc.rc[temporal_id].frame_rate_num = fr->framerate & 0xffff;
373 context->desc.h265enc.rc[temporal_id].frame_rate_den = fr->framerate >> 16 & 0xffff;
374 } else {
375 context->desc.h265enc.rc[temporal_id].frame_rate_num = fr->framerate;
376 context->desc.h265enc.rc[temporal_id].frame_rate_den = 1;
377 }
378
379 return VA_STATUS_SUCCESS;
380 }
381
382 VAStatus
vlVaHandleVAEncMiscParameterTypeQualityLevelHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)383 vlVaHandleVAEncMiscParameterTypeQualityLevelHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
384 {
385 VAEncMiscParameterBufferQualityLevel *ql = (VAEncMiscParameterBufferQualityLevel *)misc->data;
386 vlVaHandleVAEncMiscParameterTypeQualityLevel(&context->desc.h265enc.quality_modes,
387 (vlVaQualityBits *)&ql->quality_level);
388
389 return VA_STATUS_SUCCESS;
390 }
391
profile_tier(struct vl_rbsp * rbsp,struct pipe_h265_profile_tier * pt)392 static void profile_tier(struct vl_rbsp *rbsp, struct pipe_h265_profile_tier *pt)
393 {
394 pt->general_profile_space = vl_rbsp_u(rbsp, 2);
395 pt->general_tier_flag = vl_rbsp_u(rbsp, 1);
396 pt->general_profile_idc = vl_rbsp_u(rbsp, 5);
397 pt->general_profile_compatibility_flag = vl_rbsp_u(rbsp, 32);
398 pt->general_progressive_source_flag = vl_rbsp_u(rbsp, 1);
399 pt->general_interlaced_source_flag = vl_rbsp_u(rbsp, 1);
400 pt->general_non_packed_constraint_flag = vl_rbsp_u(rbsp, 1);
401 pt->general_frame_only_constraint_flag = vl_rbsp_u(rbsp, 1);
402
403 /* general_reserved_zero_44bits */
404 vl_rbsp_u(rbsp, 16);
405 vl_rbsp_u(rbsp, 16);
406 vl_rbsp_u(rbsp, 12);
407 }
408
profile_tier_level(struct vl_rbsp * rbsp,int max_sublayers_minus1,struct pipe_h265_profile_tier_level * ptl)409 static void profile_tier_level(struct vl_rbsp *rbsp,
410 int max_sublayers_minus1,
411 struct pipe_h265_profile_tier_level *ptl)
412 {
413 int i;
414
415 profile_tier(rbsp, &ptl->profile_tier);
416 ptl->general_level_idc = vl_rbsp_u(rbsp, 8);
417
418 for (i = 0; i < max_sublayers_minus1; ++i) {
419 ptl->sub_layer_profile_present_flag[i] = vl_rbsp_u(rbsp, 1);
420 ptl->sub_layer_level_present_flag[i] = vl_rbsp_u(rbsp, 1);
421 }
422
423 if (max_sublayers_minus1 > 0)
424 for (i = max_sublayers_minus1; i < 8; ++i)
425 vl_rbsp_u(rbsp, 2); /* reserved_zero_2bits */
426
427 for (i = 0; i < max_sublayers_minus1; ++i) {
428 if (ptl->sub_layer_profile_present_flag[i])
429 profile_tier(rbsp, &ptl->sub_layer_profile_tier[i]);
430
431 if (ptl->sub_layer_level_present_flag[i])
432 ptl->sub_layer_level_idc[i] = vl_rbsp_u(rbsp, 8);
433 }
434 }
435
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)436 static void parse_enc_hrd_sublayer_params_hevc(uint32_t cpb_cnt,
437 uint32_t sub_pic_hrd_params_present_flag,
438 struct vl_rbsp *rbsp,
439 struct pipe_h265_enc_sublayer_hrd_params* sublayer_params)
440 {
441 for (unsigned i = 0; i < cpb_cnt; i++ ) {
442 sublayer_params->bit_rate_value_minus1[i] = vl_rbsp_ue(rbsp);
443 sublayer_params->cpb_size_value_minus1[i] = vl_rbsp_ue(rbsp);
444 if( sub_pic_hrd_params_present_flag ) {
445 sublayer_params->cpb_size_du_value_minus1[i] = vl_rbsp_ue(rbsp);
446 sublayer_params->bit_rate_du_value_minus1[i] = vl_rbsp_ue(rbsp);
447 }
448 sublayer_params->cbr_flag[i] = vl_rbsp_u(rbsp, 1);
449 }
450 }
451
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)452 static void parse_enc_hrd_params_hevc(struct vl_rbsp *rbsp,
453 uint32_t commonInfPresentFlag,
454 uint32_t sps_max_sub_layers_minus1,
455 struct pipe_h265_enc_hrd_params* hrdParams)
456 {
457 if (commonInfPresentFlag) {
458 hrdParams->nal_hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
459 hrdParams->vcl_hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
460 if (hrdParams->nal_hrd_parameters_present_flag || hrdParams->vcl_hrd_parameters_present_flag) {
461 hrdParams->sub_pic_hrd_params_present_flag = vl_rbsp_u(rbsp, 1);
462 if (hrdParams->sub_pic_hrd_params_present_flag) {
463 hrdParams->tick_divisor_minus2 = vl_rbsp_u(rbsp, 8);
464 hrdParams->du_cpb_removal_delay_increment_length_minus1 = vl_rbsp_u(rbsp, 5);
465 hrdParams->sub_pic_cpb_params_in_pic_timing_sei_flag = vl_rbsp_u(rbsp, 1);
466 hrdParams->dpb_output_delay_du_length_minus1 = vl_rbsp_u(rbsp, 5);
467 }
468 hrdParams->bit_rate_scale = vl_rbsp_u(rbsp, 4);
469 hrdParams->cpb_rate_scale = vl_rbsp_u(rbsp, 4);
470 if (hrdParams->sub_pic_hrd_params_present_flag)
471 hrdParams->cpb_size_du_scale = vl_rbsp_u(rbsp, 4);
472 hrdParams->initial_cpb_removal_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
473 hrdParams->au_cpb_removal_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
474 hrdParams->dpb_output_delay_length_minus1 = vl_rbsp_u(rbsp, 5);
475 }
476 }
477
478 for (unsigned i = 0; i <= sps_max_sub_layers_minus1; i++) {
479 hrdParams->fixed_pic_rate_general_flag[i] = vl_rbsp_u(rbsp, 1);
480 if (!hrdParams->fixed_pic_rate_general_flag[i])
481 hrdParams->fixed_pic_rate_within_cvs_flag[i] = vl_rbsp_u(rbsp, 1);
482 if (hrdParams->fixed_pic_rate_within_cvs_flag[i])
483 hrdParams->elemental_duration_in_tc_minus1[i] = vl_rbsp_ue(rbsp);
484 else
485 hrdParams->low_delay_hrd_flag[i] = vl_rbsp_u(rbsp, 1);
486 if (!hrdParams->low_delay_hrd_flag[i])
487 hrdParams->cpb_cnt_minus1[i] = vl_rbsp_ue(rbsp);
488
489 if (hrdParams->nal_hrd_parameters_present_flag)
490 parse_enc_hrd_sublayer_params_hevc(hrdParams->cpb_cnt_minus1[i] + 1,
491 hrdParams->sub_pic_hrd_params_present_flag,
492 rbsp,
493 &hrdParams->nal_hrd_parameters[i]);
494
495 if (hrdParams->vcl_hrd_parameters_present_flag)
496 parse_enc_hrd_sublayer_params_hevc(hrdParams->cpb_cnt_minus1[i] + 1,
497 hrdParams->sub_pic_hrd_params_present_flag,
498 rbsp,
499 &hrdParams->vlc_hrd_parameters[i]);
500 }
501 }
502 /* dummy function for consuming the scaling list data if it is available */
scaling_list_data(struct vl_rbsp * rbsp)503 static void scaling_list_data(struct vl_rbsp *rbsp)
504 {
505 unsigned size_id, matrix_id, coef_num;
506 unsigned pre_mode_flag;
507 for (size_id = 0; size_id < 4; size_id++) {
508 for (matrix_id = 0; matrix_id < 6; matrix_id += (size_id == 3) ? 3 : 1) {
509 pre_mode_flag = vl_rbsp_u(rbsp, 1);
510 if (pre_mode_flag == 0)
511 vl_rbsp_ue(rbsp);
512 else {
513 coef_num = MIN2(64, (1 << (4 + (size_id << 1))));
514 if (size_id > 1)
515 vl_rbsp_se(rbsp);
516 for (unsigned i = 0; i < coef_num; i++)
517 vl_rbsp_se(rbsp);
518 }
519 }
520 }
521 }
522
523 /* i is the working rps, st_rps is the start
524 * returns num_pic_total_curr */
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)525 static unsigned st_ref_pic_set(unsigned index,
526 unsigned num_short_term_ref_pic_sets,
527 struct pipe_h265_st_ref_pic_set *st_rps,
528 struct vl_rbsp *rbsp)
529 {
530 struct pipe_h265_st_ref_pic_set *ref_rps = NULL;
531 struct pipe_h265_st_ref_pic_set *rps = &st_rps[index];
532 unsigned i, num_pic_total_curr = 0;
533
534 rps->inter_ref_pic_set_prediction_flag = index ? vl_rbsp_u(rbsp, 1) : 0;
535
536 if (rps->inter_ref_pic_set_prediction_flag) {
537 if (index == num_short_term_ref_pic_sets)
538 rps->delta_idx_minus1 = vl_rbsp_ue(rbsp);
539 rps->delta_rps_sign = vl_rbsp_u(rbsp, 1);
540 rps->abs_delta_rps_minus1 = vl_rbsp_ue(rbsp);
541 ref_rps = st_rps + index +
542 (1 - 2 * rps->delta_rps_sign) * (st_rps->delta_idx_minus1 + 1);
543 for (i = 0; i <= (ref_rps->num_negative_pics + ref_rps->num_positive_pics); i++) {
544 rps->used_by_curr_pic_flag[i] = vl_rbsp_u(rbsp, 1);
545 if (!rps->used_by_curr_pic_flag[i])
546 rps->use_delta_flag[i] = vl_rbsp_u(rbsp, 1);
547 }
548 } else {
549 rps->num_negative_pics = vl_rbsp_ue(rbsp);
550 rps->num_positive_pics = vl_rbsp_ue(rbsp);
551 for (i = 0; i < rps->num_negative_pics; i++) {
552 rps->delta_poc_s0_minus1[i] = vl_rbsp_ue(rbsp);
553 rps->used_by_curr_pic_s0_flag[i] = vl_rbsp_u(rbsp, 1);
554 if (rps->used_by_curr_pic_s0_flag[i])
555 num_pic_total_curr++;
556 }
557 for (i = 0; i < st_rps->num_positive_pics; i++) {
558 rps->delta_poc_s1_minus1[i] = vl_rbsp_ue(rbsp);
559 rps->used_by_curr_pic_s1_flag[i] = vl_rbsp_u(rbsp, 1);
560 if (rps->used_by_curr_pic_s1_flag[i])
561 num_pic_total_curr++;
562 }
563 }
564
565 return num_pic_total_curr;
566 }
567
parseEncSliceParamsH265(vlVaContext * context,struct vl_rbsp * rbsp,unsigned nal_unit_type,unsigned temporal_id)568 static void parseEncSliceParamsH265(vlVaContext *context,
569 struct vl_rbsp *rbsp,
570 unsigned nal_unit_type,
571 unsigned temporal_id)
572 {
573 struct pipe_h265_enc_pic_param *pic = &context->desc.h265enc.pic;
574 struct pipe_h265_enc_seq_param *seq = &context->desc.h265enc.seq;
575 struct pipe_h265_enc_slice_param *slice = &context->desc.h265enc.slice;
576 unsigned num_pic_total_curr = 0;
577
578 /* Only parse first slice */
579 if (!vl_rbsp_u(rbsp, 1)) /* first_slice_segment_in_pic_flag */
580 return;
581
582 pic->nal_unit_type = nal_unit_type;
583 pic->temporal_id = temporal_id;
584
585 if (nal_unit_type >= PIPE_H265_NAL_BLA_W_LP && nal_unit_type <= PIPE_H265_NAL_RSV_IRAP_VCL23)
586 slice->no_output_of_prior_pics_flag = vl_rbsp_u(rbsp, 1);
587
588 vl_rbsp_ue(rbsp); /* slice_pic_parameter_set_id */
589
590 if (slice->dependent_slice_segment_flag)
591 return;
592
593 for (uint8_t i = 0; i < pic->num_extra_slice_header_bits; i++)
594 vl_rbsp_u(rbsp, 1);
595
596 slice->slice_type = vl_rbsp_ue(rbsp);
597
598 if (pic->output_flag_present_flag)
599 slice->pic_output_flag = vl_rbsp_u(rbsp, 1);
600
601 if (nal_unit_type != PIPE_H265_NAL_IDR_W_RADL && nal_unit_type != PIPE_H265_NAL_IDR_N_LP) {
602 slice->slice_pic_order_cnt_lsb = vl_rbsp_u(rbsp, seq->log2_max_pic_order_cnt_lsb_minus4 + 4);
603 slice->short_term_ref_pic_set_sps_flag = vl_rbsp_u(rbsp, 1);
604 if (!slice->short_term_ref_pic_set_sps_flag) {
605 num_pic_total_curr = st_ref_pic_set(seq->num_short_term_ref_pic_sets, seq->num_short_term_ref_pic_sets,
606 &slice->st_ref_pic_set, rbsp);
607 }
608 else if (seq->num_short_term_ref_pic_sets > 1)
609 slice->short_term_ref_pic_set_idx = vl_rbsp_u(rbsp, util_logbase2_ceil(seq->num_short_term_ref_pic_sets));
610 if (seq->long_term_ref_pics_present_flag) {
611 slice->num_long_term_sps = 0;
612 if (seq->num_long_term_ref_pics_sps > 0)
613 slice->num_long_term_sps = vl_rbsp_ue(rbsp);
614 slice->num_long_term_pics = vl_rbsp_ue(rbsp);
615 for (unsigned i = 0; i < (slice->num_long_term_sps + slice->num_long_term_pics); i++) {
616 if (i < slice->num_long_term_sps) {
617 if (seq->num_long_term_ref_pics_sps > 1)
618 slice->lt_idx_sps[i] = vl_rbsp_u(rbsp, util_logbase2_ceil(seq->num_long_term_ref_pics_sps));
619 } else {
620 slice->poc_lsb_lt[i] = vl_rbsp_u(rbsp, seq->log2_max_pic_order_cnt_lsb_minus4 + 4);
621 slice->used_by_curr_pic_lt_flag[i] = vl_rbsp_u(rbsp, 1);
622 if (slice->used_by_curr_pic_lt_flag[i])
623 num_pic_total_curr++;
624 }
625 slice->delta_poc_msb_present_flag[i] = vl_rbsp_u(rbsp, 1);
626 if (slice->delta_poc_msb_present_flag[i])
627 slice->delta_poc_msb_cycle_lt[i] = vl_rbsp_ue(rbsp);
628 }
629 }
630 }
631
632 if (context->desc.h265enc.seq.sample_adaptive_offset_enabled_flag) {
633 slice->slice_sao_luma_flag = vl_rbsp_u(rbsp, 1);
634 slice->slice_sao_chroma_flag = vl_rbsp_u(rbsp, 1);
635 }
636
637 if (slice->slice_type == PIPE_H265_SLICE_TYPE_P || slice->slice_type == PIPE_H265_SLICE_TYPE_B) {
638 slice->num_ref_idx_active_override_flag = vl_rbsp_u(rbsp, 1);
639 if (slice->num_ref_idx_active_override_flag) {
640 slice->num_ref_idx_l0_active_minus1 = vl_rbsp_ue(rbsp);
641 if (slice->slice_type == PIPE_H265_SLICE_TYPE_B)
642 slice->num_ref_idx_l1_active_minus1 = vl_rbsp_ue(rbsp);
643 }
644 if (pic->lists_modification_present_flag && num_pic_total_curr > 1) {
645 unsigned num_bits = util_logbase2_ceil(num_pic_total_curr);
646 unsigned num_ref_l0_minus1 = slice->num_ref_idx_active_override_flag ?
647 slice->num_ref_idx_l0_active_minus1 : pic->num_ref_idx_l0_default_active_minus1;
648 slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l0 = vl_rbsp_u(rbsp, 1);
649 if (slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l0) {
650 for (unsigned i = 0; i <= num_ref_l0_minus1; i++)
651 slice->ref_pic_lists_modification.list_entry_l0[i] = vl_rbsp_u(rbsp, num_bits);
652 }
653 if (slice->slice_type == PIPE_H265_SLICE_TYPE_B) {
654 unsigned num_ref_l1_minus1 = slice->num_ref_idx_active_override_flag ?
655 slice->num_ref_idx_l1_active_minus1 : pic->num_ref_idx_l1_default_active_minus1;
656 slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l1 = vl_rbsp_u(rbsp, 1);
657 if (slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l1) {
658 for (unsigned i = 0; i <= num_ref_l1_minus1; i++)
659 slice->ref_pic_lists_modification.list_entry_l1[i] = vl_rbsp_u(rbsp, num_bits);
660 }
661 }
662 }
663 if (slice->slice_type == PIPE_H265_SLICE_TYPE_B)
664 slice->mvd_l1_zero_flag = vl_rbsp_u(rbsp, 1);
665 if (pic->cabac_init_present_flag)
666 slice->cabac_init_flag = vl_rbsp_u(rbsp, 1);
667 slice->max_num_merge_cand = 5 - vl_rbsp_ue(rbsp);
668 }
669
670 slice->slice_qp_delta = vl_rbsp_se(rbsp);
671
672 if (pic->pps_slice_chroma_qp_offsets_present_flag) {
673 slice->slice_cb_qp_offset = vl_rbsp_se(rbsp);
674 slice->slice_cr_qp_offset = vl_rbsp_se(rbsp);
675 }
676
677 if (pic->deblocking_filter_override_enabled_flag)
678 slice->deblocking_filter_override_flag = vl_rbsp_u(rbsp, 1);
679
680 if (slice->deblocking_filter_override_flag) {
681 slice->slice_deblocking_filter_disabled_flag = vl_rbsp_u(rbsp, 1);
682 if (!slice->slice_deblocking_filter_disabled_flag) {
683 slice->slice_beta_offset_div2 = vl_rbsp_se(rbsp);
684 slice->slice_tc_offset_div2 = vl_rbsp_se(rbsp);
685 }
686 }
687
688 if (pic->pps_loop_filter_across_slices_enabled_flag &&
689 (slice->slice_sao_luma_flag ||
690 slice->slice_sao_chroma_flag ||
691 !slice->slice_deblocking_filter_disabled_flag))
692 slice->slice_loop_filter_across_slices_enabled_flag = vl_rbsp_u(rbsp, 1);
693 }
694
parseEncVpsParamsH265(vlVaContext * context,struct vl_rbsp * rbsp)695 static void parseEncVpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
696 {
697 struct pipe_h265_enc_vid_param *vid = &context->desc.h265enc.vid;
698 unsigned i;
699
700 vl_rbsp_u(rbsp, 4); /* vps_video_parameter_set_id */
701 vid->vps_base_layer_internal_flag = vl_rbsp_u(rbsp, 1);
702 vid->vps_base_layer_available_flag = vl_rbsp_u(rbsp, 1);
703 vid->vps_max_layers_minus1 = vl_rbsp_u(rbsp, 6);
704 vid->vps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);
705 vid->vps_temporal_id_nesting_flag = vl_rbsp_u(rbsp, 1);
706 vl_rbsp_u(rbsp, 16); /* vps_reserved_0xffff_16bits */
707 profile_tier_level(rbsp, vid->vps_max_sub_layers_minus1, &vid->profile_tier_level);
708 vid->vps_sub_layer_ordering_info_present_flag = vl_rbsp_u(rbsp, 1);
709 i = vid->vps_sub_layer_ordering_info_present_flag ? 0 : vid->vps_max_sub_layers_minus1;
710 for (; i <= vid->vps_max_sub_layers_minus1; i++) {
711 vid->vps_max_dec_pic_buffering_minus1[i] = vl_rbsp_ue(rbsp);
712 vid->vps_max_num_reorder_pics[i] = vl_rbsp_ue(rbsp);
713 vid->vps_max_latency_increase_plus1[i] = vl_rbsp_ue(rbsp);
714 }
715 vid->vps_max_layer_id = vl_rbsp_u(rbsp, 6);
716 vid->vps_num_layer_sets_minus1 = vl_rbsp_ue(rbsp);
717 for (unsigned i = 0; i <= vid->vps_num_layer_sets_minus1; i++) {
718 for (unsigned j = 0; j <= vid->vps_max_layer_id; j++)
719 vl_rbsp_u(rbsp, 1); /* layer_id_included_flag[i][j] */
720 }
721 vid->vps_timing_info_present_flag = vl_rbsp_u(rbsp, 1);
722 if (vid->vps_timing_info_present_flag) {
723 vid->vps_num_units_in_tick = vl_rbsp_u(rbsp, 32);
724 vid->vps_time_scale = vl_rbsp_u(rbsp, 32);
725 vid->vps_poc_proportional_to_timing_flag = vl_rbsp_u(rbsp, 1);
726 if (vid->vps_poc_proportional_to_timing_flag)
727 vid->vps_num_ticks_poc_diff_one_minus1 = vl_rbsp_ue(rbsp);
728 }
729 }
730
parseEncPpsParamsH265(vlVaContext * context,struct vl_rbsp * rbsp)731 static void parseEncPpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
732 {
733 struct pipe_h265_enc_pic_param *pic = &context->desc.h265enc.pic;
734
735 vl_rbsp_ue(rbsp); /* pps_pic_parameter_set_id */
736 vl_rbsp_ue(rbsp); /* pps_seq_parameter_set_id */
737 pic->dependent_slice_segments_enabled_flag = vl_rbsp_u(rbsp, 1);
738 pic->output_flag_present_flag = vl_rbsp_u(rbsp, 1);
739 pic->num_extra_slice_header_bits = vl_rbsp_u(rbsp, 3);
740 pic->sign_data_hiding_enabled_flag = vl_rbsp_u(rbsp, 1);
741 pic->cabac_init_present_flag = vl_rbsp_u(rbsp, 1);
742 pic->num_ref_idx_l0_default_active_minus1 = vl_rbsp_ue(rbsp);
743 pic->num_ref_idx_l1_default_active_minus1 = vl_rbsp_ue(rbsp);
744 pic->init_qp_minus26 = vl_rbsp_se(rbsp);
745 pic->constrained_intra_pred_flag = vl_rbsp_u(rbsp, 1);
746 pic->transform_skip_enabled_flag = vl_rbsp_u(rbsp, 1);
747 pic->cu_qp_delta_enabled_flag = vl_rbsp_u(rbsp, 1);
748 if (pic->cu_qp_delta_enabled_flag)
749 pic->diff_cu_qp_delta_depth = vl_rbsp_ue(rbsp);
750 pic->pps_cb_qp_offset = vl_rbsp_se(rbsp);
751 pic->pps_cr_qp_offset = vl_rbsp_se(rbsp);
752 pic->pps_slice_chroma_qp_offsets_present_flag = vl_rbsp_u(rbsp, 1);
753 pic->weighted_pred_flag = vl_rbsp_u(rbsp, 1);
754 pic->weighted_bipred_flag = vl_rbsp_u(rbsp, 1);
755 pic->transquant_bypass_enabled_flag = vl_rbsp_u(rbsp, 1);
756 unsigned tiles_enabled_flag = vl_rbsp_u(rbsp, 1);
757 pic->entropy_coding_sync_enabled_flag = vl_rbsp_u(rbsp, 1);
758 if (tiles_enabled_flag) {
759 unsigned num_tile_columns_minus1 = vl_rbsp_ue(rbsp);
760 unsigned num_tile_rows_minus1 = vl_rbsp_ue(rbsp);
761 if (!vl_rbsp_u(rbsp, 1)) { /* uniform_spacing_flag */
762 for (unsigned i = 0; i < num_tile_columns_minus1; i++)
763 vl_rbsp_ue(rbsp); /* column_width_minus1[i] */
764 for (unsigned i = 0; i < num_tile_rows_minus1; i++)
765 vl_rbsp_ue(rbsp); /* row_height_minus1[i] */
766 }
767 vl_rbsp_u(rbsp, 1); /* loop_filter_across_tiles_enabled_flag */
768 }
769 pic->pps_loop_filter_across_slices_enabled_flag = vl_rbsp_u(rbsp, 1);
770 pic->deblocking_filter_control_present_flag = vl_rbsp_u(rbsp, 1);
771 if (pic->deblocking_filter_control_present_flag) {
772 pic->deblocking_filter_override_enabled_flag = vl_rbsp_u(rbsp, 1);
773 pic->pps_deblocking_filter_disabled_flag = vl_rbsp_u(rbsp, 1);
774 if (!pic->pps_deblocking_filter_disabled_flag) {
775 pic->pps_beta_offset_div2 = vl_rbsp_se(rbsp);
776 pic->pps_tc_offset_div2 = vl_rbsp_se(rbsp);
777 }
778 }
779 }
780
parseEncSpsParamsH265(vlVaContext * context,struct vl_rbsp * rbsp)781 static void parseEncSpsParamsH265(vlVaContext *context, struct vl_rbsp *rbsp)
782 {
783 unsigned i;
784
785 vl_rbsp_u(rbsp, 4); /* sps_video_parameter_set_id */
786 context->desc.h265enc.seq.sps_max_sub_layers_minus1 = vl_rbsp_u(rbsp, 3);
787 context->desc.h265enc.seq.sps_temporal_id_nesting_flag = vl_rbsp_u(rbsp, 1);
788
789 /* level_idc */
790 profile_tier_level(rbsp, context->desc.h265enc.seq.sps_max_sub_layers_minus1,
791 &context->desc.h265enc.seq.profile_tier_level);
792
793 vl_rbsp_ue(rbsp); /* sps_seq_parameter_set_id */
794 context->desc.h265enc.seq.chroma_format_idc = vl_rbsp_ue(rbsp);
795 if (context->desc.h265enc.seq.chroma_format_idc == 3)
796 vl_rbsp_u(rbsp, 1); /* separate_colour_plane_flag */
797
798 context->desc.h265enc.seq.pic_width_in_luma_samples = vl_rbsp_ue(rbsp);
799 context->desc.h265enc.seq.pic_height_in_luma_samples = vl_rbsp_ue(rbsp);
800
801 /* conformance_window_flag - used for cropping */
802 context->desc.h265enc.seq.conformance_window_flag = vl_rbsp_u(rbsp, 1);
803 if (context->desc.h265enc.seq.conformance_window_flag) {
804 context->desc.h265enc.seq.conf_win_left_offset = vl_rbsp_ue(rbsp);
805 context->desc.h265enc.seq.conf_win_right_offset = vl_rbsp_ue(rbsp);
806 context->desc.h265enc.seq.conf_win_top_offset = vl_rbsp_ue(rbsp);
807 context->desc.h265enc.seq.conf_win_bottom_offset = vl_rbsp_ue(rbsp);
808 }
809
810 context->desc.h265enc.seq.bit_depth_luma_minus8 = vl_rbsp_ue(rbsp);
811 context->desc.h265enc.seq.bit_depth_chroma_minus8 = vl_rbsp_ue(rbsp);
812 context->desc.h265enc.seq.log2_max_pic_order_cnt_lsb_minus4 = vl_rbsp_ue(rbsp);
813
814 context->desc.h265enc.seq.sps_sub_layer_ordering_info_present_flag = vl_rbsp_u(rbsp, 1);
815 i = context->desc.h265enc.seq.sps_sub_layer_ordering_info_present_flag ? 0 : context->desc.h265enc.seq.sps_max_sub_layers_minus1;
816 for (; i <= context->desc.h265enc.seq.sps_max_sub_layers_minus1; ++i) {
817 context->desc.h265enc.seq.sps_max_dec_pic_buffering_minus1[i] = vl_rbsp_ue(rbsp);
818 context->desc.h265enc.seq.sps_max_num_reorder_pics[i] = vl_rbsp_ue(rbsp);
819 context->desc.h265enc.seq.sps_max_latency_increase_plus1[i] = vl_rbsp_ue(rbsp);
820 }
821
822 context->desc.h265enc.seq.log2_min_luma_coding_block_size_minus3 = vl_rbsp_ue(rbsp);
823 context->desc.h265enc.seq.log2_diff_max_min_luma_coding_block_size = vl_rbsp_ue(rbsp);
824 context->desc.h265enc.seq.log2_min_transform_block_size_minus2 = vl_rbsp_ue(rbsp);
825 context->desc.h265enc.seq.log2_diff_max_min_transform_block_size = vl_rbsp_ue(rbsp);
826 context->desc.h265enc.seq.max_transform_hierarchy_depth_inter = vl_rbsp_ue(rbsp);
827 context->desc.h265enc.seq.max_transform_hierarchy_depth_intra = vl_rbsp_ue(rbsp);
828
829 if (vl_rbsp_u(rbsp, 1)) /* scaling_list_enabled_flag */
830 if (vl_rbsp_u(rbsp, 1)) /* sps_scaling_list_data_present_flag */
831 scaling_list_data(rbsp);
832
833 context->desc.h265enc.seq.amp_enabled_flag = vl_rbsp_u(rbsp, 1);
834 context->desc.h265enc.seq.sample_adaptive_offset_enabled_flag = vl_rbsp_u(rbsp, 1);
835
836 context->desc.h265enc.seq.pcm_enabled_flag = vl_rbsp_u(rbsp, 1);
837 if (context->desc.h265enc.seq.pcm_enabled_flag) {
838 vl_rbsp_u(rbsp, 4); /* pcm_sample_bit_depth_luma_minus1 */
839 vl_rbsp_u(rbsp, 4); /* pcm_sample_bit_depth_chroma_minus1 */
840 vl_rbsp_ue(rbsp); /* log2_min_pcm_luma_coding_block_size_minus3 */
841 vl_rbsp_ue(rbsp); /* log2_diff_max_min_pcm_luma_coding_block_size */
842 vl_rbsp_u(rbsp, 1); /* pcm_loop_filter_disabled_flag */
843 }
844
845 context->desc.h265enc.seq.num_short_term_ref_pic_sets = vl_rbsp_ue(rbsp);
846 for (i = 0; i < context->desc.h265enc.seq.num_short_term_ref_pic_sets; i++) {
847 st_ref_pic_set(i, context->desc.h265enc.seq.num_short_term_ref_pic_sets,
848 context->desc.h265enc.seq.st_ref_pic_set, rbsp);
849 }
850
851 context->desc.h265enc.seq.long_term_ref_pics_present_flag = vl_rbsp_u(rbsp, 1);
852 if (context->desc.h265enc.seq.long_term_ref_pics_present_flag) {
853 context->desc.h265enc.seq.num_long_term_ref_pics_sps = vl_rbsp_ue(rbsp);
854 for (i = 0; i < context->desc.h265enc.seq.num_long_term_ref_pics_sps; i++) {
855 context->desc.h265enc.seq.lt_ref_pic_poc_lsb_sps[i] =
856 vl_rbsp_u(rbsp, context->desc.h265enc.seq.log2_max_pic_order_cnt_lsb_minus4 + 4);
857 context->desc.h265enc.seq.used_by_curr_pic_lt_sps_flag[i] =
858 vl_rbsp_u(rbsp, 1);
859 }
860 }
861
862 context->desc.h265enc.seq.sps_temporal_mvp_enabled_flag = vl_rbsp_u(rbsp, 1);
863 context->desc.h265enc.seq.strong_intra_smoothing_enabled_flag = vl_rbsp_u(rbsp, 1);
864
865 context->desc.h265enc.seq.vui_parameters_present_flag = vl_rbsp_u(rbsp, 1);
866 if (context->desc.h265enc.seq.vui_parameters_present_flag) {
867 context->desc.h265enc.seq.vui_flags.aspect_ratio_info_present_flag = vl_rbsp_u(rbsp, 1);
868 if (context->desc.h265enc.seq.vui_flags.aspect_ratio_info_present_flag) {
869 context->desc.h265enc.seq.aspect_ratio_idc = vl_rbsp_u(rbsp, 8);
870 if (context->desc.h265enc.seq.aspect_ratio_idc == 255 /* Extended_SAR */) {
871 context->desc.h265enc.seq.sar_width = vl_rbsp_u(rbsp, 16);
872 context->desc.h265enc.seq.sar_height = vl_rbsp_u(rbsp, 16);
873 }
874 }
875
876 context->desc.h265enc.seq.vui_flags.overscan_info_present_flag = vl_rbsp_u(rbsp, 1);
877 if (context->desc.h265enc.seq.vui_flags.overscan_info_present_flag)
878 context->desc.h265enc.seq.vui_flags.overscan_appropriate_flag = vl_rbsp_u(rbsp, 1);
879
880 context->desc.h265enc.seq.vui_flags.video_signal_type_present_flag = vl_rbsp_u(rbsp, 1);
881 if (context->desc.h265enc.seq.vui_flags.video_signal_type_present_flag) {
882 context->desc.h265enc.seq.video_format = vl_rbsp_u(rbsp, 3);
883 context->desc.h265enc.seq.video_full_range_flag = vl_rbsp_u(rbsp, 1);
884 context->desc.h265enc.seq.vui_flags.colour_description_present_flag = vl_rbsp_u(rbsp, 1);
885 if (context->desc.h265enc.seq.vui_flags.colour_description_present_flag) {
886 context->desc.h265enc.seq.colour_primaries = vl_rbsp_u(rbsp, 8);
887 context->desc.h265enc.seq.transfer_characteristics = vl_rbsp_u(rbsp, 8);
888 context->desc.h265enc.seq.matrix_coefficients = vl_rbsp_u(rbsp, 8);
889 }
890 }
891
892 context->desc.h265enc.seq.vui_flags.chroma_loc_info_present_flag = vl_rbsp_u(rbsp, 1);
893 if (context->desc.h265enc.seq.vui_flags.chroma_loc_info_present_flag) {
894 context->desc.h265enc.seq.chroma_sample_loc_type_top_field = vl_rbsp_ue(rbsp);
895 context->desc.h265enc.seq.chroma_sample_loc_type_bottom_field = vl_rbsp_ue(rbsp);
896 }
897
898 context->desc.h265enc.seq.vui_flags.neutral_chroma_indication_flag = vl_rbsp_u(rbsp, 1);
899 context->desc.h265enc.seq.vui_flags.field_seq_flag = vl_rbsp_u(rbsp, 1);
900 context->desc.h265enc.seq.vui_flags.frame_field_info_present_flag = vl_rbsp_u(rbsp, 1);
901 context->desc.h265enc.seq.vui_flags.default_display_window_flag = vl_rbsp_u(rbsp, 1);
902
903 if (context->desc.h265enc.seq.vui_flags.default_display_window_flag) {
904 context->desc.h265enc.seq.def_disp_win_left_offset = vl_rbsp_ue(rbsp);
905 context->desc.h265enc.seq.def_disp_win_right_offset = vl_rbsp_ue(rbsp);
906 context->desc.h265enc.seq.def_disp_win_top_offset = vl_rbsp_ue(rbsp);
907 context->desc.h265enc.seq.def_disp_win_bottom_offset = vl_rbsp_ue(rbsp);
908 }
909
910 context->desc.h265enc.seq.vui_flags.timing_info_present_flag = vl_rbsp_u(rbsp, 1);
911
912 if (context->desc.h265enc.seq.vui_flags.timing_info_present_flag) {
913 uint32_t num_units_in_tick_high = vl_rbsp_u(rbsp, 16);
914 uint32_t num_units_in_tick_low = vl_rbsp_u(rbsp, 16);
915 context->desc.h265enc.seq.num_units_in_tick = (num_units_in_tick_high << 16) | num_units_in_tick_low;
916
917 uint32_t time_scale_high = vl_rbsp_u(rbsp, 16);
918 uint32_t time_scale_low = vl_rbsp_u(rbsp, 16);
919 context->desc.h265enc.seq.time_scale = (time_scale_high << 16) | time_scale_low;
920
921 context->desc.h265enc.seq.vui_flags.poc_proportional_to_timing_flag = vl_rbsp_u(rbsp, 1);
922 if (context->desc.h265enc.seq.vui_flags.poc_proportional_to_timing_flag) {
923 context->desc.h265enc.seq.num_ticks_poc_diff_one_minus1 = vl_rbsp_ue(rbsp);
924 context->desc.h265enc.seq.vui_flags.hrd_parameters_present_flag = vl_rbsp_u(rbsp, 1);
925 if (context->desc.h265enc.seq.vui_flags.hrd_parameters_present_flag)
926 parse_enc_hrd_params_hevc(rbsp,
927 1,
928 context->desc.h265enc.seq.sps_max_sub_layers_minus1,
929 &context->desc.h265enc.seq.hrd_parameters);
930 }
931 }
932
933 context->desc.h265enc.seq.vui_flags.bitstream_restriction_flag = vl_rbsp_u(rbsp, 1);
934 if (context->desc.h265enc.seq.vui_flags.bitstream_restriction_flag) {
935 context->desc.h265enc.seq.vui_flags.tiles_fixed_structure_flag = vl_rbsp_u(rbsp, 1);
936 context->desc.h265enc.seq.vui_flags.motion_vectors_over_pic_boundaries_flag = vl_rbsp_u(rbsp, 1);
937 context->desc.h265enc.seq.vui_flags.restricted_ref_pic_lists_flag = vl_rbsp_u(rbsp, 1);
938 context->desc.h265enc.seq.min_spatial_segmentation_idc = vl_rbsp_ue(rbsp);
939 context->desc.h265enc.seq.max_bytes_per_pic_denom = vl_rbsp_ue(rbsp);
940 context->desc.h265enc.seq.max_bits_per_min_cu_denom = vl_rbsp_ue(rbsp);
941 context->desc.h265enc.seq.log2_max_mv_length_horizontal = vl_rbsp_ue(rbsp);
942 context->desc.h265enc.seq.log2_max_mv_length_vertical = vl_rbsp_ue(rbsp);
943 }
944 }
945 }
946
parseEncSeiPayloadH265(vlVaContext * context,struct vl_rbsp * rbsp,int payloadType,int payloadSize)947 static void parseEncSeiPayloadH265(vlVaContext *context, struct vl_rbsp *rbsp, int payloadType, int payloadSize)
948 {
949 switch (payloadType) {
950 case MASTERING_DISPLAY_COLOUR_VOLUME:
951 for (int32_t i = 0; i < 3; i++) {
952 context->desc.h265enc.metadata_hdr_mdcv.primary_chromaticity_x[i] = vl_rbsp_u(rbsp, 16);
953 context->desc.h265enc.metadata_hdr_mdcv.primary_chromaticity_y[i] = vl_rbsp_u(rbsp, 16);
954 }
955 context->desc.h265enc.metadata_hdr_mdcv.white_point_chromaticity_x = vl_rbsp_u(rbsp, 16);
956 context->desc.h265enc.metadata_hdr_mdcv.white_point_chromaticity_y = vl_rbsp_u(rbsp, 16);
957 context->desc.h265enc.metadata_hdr_mdcv.luminance_max = vl_rbsp_u(rbsp, 32);
958 context->desc.h265enc.metadata_hdr_mdcv.luminance_min = vl_rbsp_u(rbsp, 32);
959 break;
960 case CONTENT_LIGHT_LEVEL_INFO:
961 context->desc.h265enc.metadata_hdr_cll.max_cll= vl_rbsp_u(rbsp, 16);
962 context->desc.h265enc.metadata_hdr_cll.max_fall= vl_rbsp_u(rbsp, 16);
963 break;
964 default:
965 break;
966 }
967 }
968
parseEncSeiH265(vlVaContext * context,struct vl_rbsp * rbsp)969 static void parseEncSeiH265(vlVaContext *context, struct vl_rbsp *rbsp)
970 {
971 do {
972 /* sei_message() */
973 int payloadType = 0;
974 int payloadSize = 0;
975
976 int byte = 0xFF;
977 while (byte == 0xFF) {
978 byte = vl_rbsp_u(rbsp, 8);
979 payloadType += byte;
980 }
981
982 byte = 0xFF;
983 while (byte == 0xFF) {
984 byte = vl_rbsp_u(rbsp, 8);
985 payloadSize += byte;
986 }
987 parseEncSeiPayloadH265(context, rbsp, payloadType, payloadSize);
988
989 } while (vl_rbsp_more_data(rbsp));
990 }
991
992 VAStatus
vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext * context,vlVaBuffer * buf)993 vlVaHandleVAEncPackedHeaderDataBufferTypeHEVC(vlVaContext *context, vlVaBuffer *buf)
994 {
995 struct vl_vlc vlc = {0};
996 uint8_t *data = buf->data;
997 int nal_start = -1;
998 unsigned nal_unit_type = 0, emulation_bytes_start = 0;
999 bool is_slice = false;
1000
1001 vl_vlc_init(&vlc, 1, (const void * const*)&data, &buf->size);
1002
1003 while (vl_vlc_bits_left(&vlc) > 0) {
1004 /* search the first 64 bytes for a startcode */
1005 for (int i = 0; i < 64 && vl_vlc_bits_left(&vlc) >= 24; ++i) {
1006 if (vl_vlc_peekbits(&vlc, 24) == 0x000001)
1007 break;
1008 vl_vlc_eatbits(&vlc, 8);
1009 vl_vlc_fillbits(&vlc);
1010 }
1011
1012 unsigned start = vlc.data - data - vl_vlc_valid_bits(&vlc) / 8;
1013 emulation_bytes_start = 5; /* 3 bytes startcode + 2 bytes header */
1014 /* handle 4 bytes startcode */
1015 if (start > 0 && data[start - 1] == 0x00) {
1016 start--;
1017 emulation_bytes_start++;
1018 }
1019 if (nal_start >= 0) {
1020 vlVaAddRawHeader(&context->desc.h265enc.raw_headers, nal_unit_type,
1021 start - nal_start, data + nal_start, is_slice, 0);
1022 }
1023 nal_start = start;
1024 is_slice = false;
1025
1026 vl_vlc_eatbits(&vlc, 24); /* eat the startcode */
1027
1028 if (vl_vlc_valid_bits(&vlc) < 15)
1029 vl_vlc_fillbits(&vlc);
1030
1031 vl_vlc_eatbits(&vlc, 1);
1032 nal_unit_type = vl_vlc_get_uimsbf(&vlc, 6);
1033 vl_vlc_eatbits(&vlc, 6);
1034 unsigned temporal_id = vl_vlc_get_uimsbf(&vlc, 3) - 1;
1035
1036 struct vl_rbsp rbsp;
1037 vl_rbsp_init(&rbsp, &vlc, ~0, context->packed_header_emulation_bytes);
1038
1039 switch (nal_unit_type) {
1040 case PIPE_H265_NAL_TRAIL_N:
1041 case PIPE_H265_NAL_TRAIL_R:
1042 case PIPE_H265_NAL_TSA_N:
1043 case PIPE_H265_NAL_TSA_R:
1044 case PIPE_H265_NAL_IDR_W_RADL:
1045 case PIPE_H265_NAL_IDR_N_LP:
1046 case PIPE_H265_NAL_CRA_NUT:
1047 is_slice = true;
1048 parseEncSliceParamsH265(context, &rbsp, nal_unit_type, temporal_id);
1049 break;
1050 case PIPE_H265_NAL_VPS:
1051 parseEncVpsParamsH265(context, &rbsp);
1052 break;
1053 case PIPE_H265_NAL_SPS:
1054 parseEncSpsParamsH265(context, &rbsp);
1055 break;
1056 case PIPE_H265_NAL_PPS:
1057 parseEncPpsParamsH265(context, &rbsp);
1058 break;
1059 case PIPE_H265_NAL_PREFIX_SEI:
1060 parseEncSeiH265(context, &rbsp);
1061 break;
1062 default:
1063 break;
1064 }
1065
1066 if (!context->packed_header_emulation_bytes)
1067 break;
1068 }
1069
1070 if (nal_start >= 0) {
1071 vlVaAddRawHeader(&context->desc.h265enc.raw_headers, nal_unit_type,
1072 buf->size - nal_start, data + nal_start, is_slice,
1073 context->packed_header_emulation_bytes ? 0 : emulation_bytes_start);
1074 }
1075
1076 return VA_STATUS_SUCCESS;
1077 }
1078
1079 VAStatus
vlVaHandleVAEncMiscParameterTypeMaxFrameSizeHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)1080 vlVaHandleVAEncMiscParameterTypeMaxFrameSizeHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
1081 {
1082 VAEncMiscParameterBufferMaxFrameSize *ms = (VAEncMiscParameterBufferMaxFrameSize *)misc->data;
1083 context->desc.h265enc.rc[0].max_au_size = ms->max_frame_size;
1084 return VA_STATUS_SUCCESS;
1085 }
1086
1087 VAStatus
vlVaHandleVAEncMiscParameterTypeHRDHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)1088 vlVaHandleVAEncMiscParameterTypeHRDHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
1089 {
1090 VAEncMiscParameterHRD *ms = (VAEncMiscParameterHRD *)misc->data;
1091
1092 if (ms->buffer_size) {
1093 context->desc.h265enc.rc[0].vbv_buffer_size = ms->buffer_size;
1094 context->desc.h265enc.rc[0].vbv_buf_lv = (ms->initial_buffer_fullness << 6 ) / ms->buffer_size;
1095 context->desc.h265enc.rc[0].vbv_buf_initial_size = ms->initial_buffer_fullness;
1096 /* Distinguishes from the default params set for these values in other
1097 functions and app specific params passed down via HRD buffer */
1098 context->desc.h265enc.rc[0].app_requested_hrd_buffer = true;
1099 }
1100
1101 return VA_STATUS_SUCCESS;
1102 }
1103
1104 VAStatus
vlVaHandleVAEncMiscParameterTypeTemporalLayerHEVC(vlVaContext * context,VAEncMiscParameterBuffer * misc)1105 vlVaHandleVAEncMiscParameterTypeTemporalLayerHEVC(vlVaContext *context, VAEncMiscParameterBuffer *misc)
1106 {
1107 VAEncMiscParameterTemporalLayerStructure *tl = (VAEncMiscParameterTemporalLayerStructure *)misc->data;
1108
1109 context->desc.h265enc.seq.num_temporal_layers = tl->number_of_layers;
1110
1111 return VA_STATUS_SUCCESS;
1112 }
1113