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