xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/va/picture_hevc_enc.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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