• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2017 Advanced Micro Devices, Inc.
4  *
5  * SPDX-License-Identifier: MIT
6  *
7  **************************************************************************/
8 
9 #include "pipe/p_video_codec.h"
10 #include "radeon_vcn_enc.h"
11 #include "radeon_video.h"
12 #include "si_pipe.h"
13 #include "util/u_video.h"
14 
15 #include <stdio.h>
16 
17 #define RENCODE_FW_INTERFACE_MAJOR_VERSION 1
18 #define RENCODE_FW_INTERFACE_MINOR_VERSION 9
19 
radeon_enc_session_info(struct radeon_encoder * enc)20 static void radeon_enc_session_info(struct radeon_encoder *enc)
21 {
22    RADEON_ENC_BEGIN(enc->cmd.session_info);
23    RADEON_ENC_CS(enc->enc_pic.session_info.interface_version);
24    RADEON_ENC_READWRITE(enc->si->res->buf, enc->si->res->domains, 0x0);
25    RADEON_ENC_CS(RENCODE_ENGINE_TYPE_ENCODE);
26    RADEON_ENC_END();
27 }
28 
radeon_enc_task_info(struct radeon_encoder * enc,bool need_feedback)29 static void radeon_enc_task_info(struct radeon_encoder *enc, bool need_feedback)
30 {
31    enc->enc_pic.task_info.task_id++;
32 
33    if (need_feedback)
34       enc->enc_pic.task_info.allowed_max_num_feedbacks = 1;
35    else
36       enc->enc_pic.task_info.allowed_max_num_feedbacks = 0;
37 
38    RADEON_ENC_BEGIN(enc->cmd.task_info);
39    enc->p_task_size = &enc->cs.current.buf[enc->cs.current.cdw++];
40    RADEON_ENC_CS(enc->enc_pic.task_info.task_id);
41    RADEON_ENC_CS(enc->enc_pic.task_info.allowed_max_num_feedbacks);
42    RADEON_ENC_END();
43 }
44 
radeon_enc_session_init(struct radeon_encoder * enc)45 static void radeon_enc_session_init(struct radeon_encoder *enc)
46 {
47    enc->enc_pic.session_init.display_remote = 0;
48    enc->enc_pic.session_init.pre_encode_mode = enc->enc_pic.quality_modes.pre_encode_mode;
49    enc->enc_pic.session_init.pre_encode_chroma_enabled = !!(enc->enc_pic.quality_modes.pre_encode_mode);
50 
51    RADEON_ENC_BEGIN(enc->cmd.session_init);
52    RADEON_ENC_CS(enc->enc_pic.session_init.encode_standard);
53    RADEON_ENC_CS(enc->enc_pic.session_init.aligned_picture_width);
54    RADEON_ENC_CS(enc->enc_pic.session_init.aligned_picture_height);
55    RADEON_ENC_CS(enc->enc_pic.session_init.padding_width);
56    RADEON_ENC_CS(enc->enc_pic.session_init.padding_height);
57    RADEON_ENC_CS(enc->enc_pic.session_init.pre_encode_mode);
58    RADEON_ENC_CS(enc->enc_pic.session_init.pre_encode_chroma_enabled);
59    RADEON_ENC_CS(enc->enc_pic.session_init.display_remote);
60    RADEON_ENC_END();
61 }
62 
radeon_enc_layer_control(struct radeon_encoder * enc)63 static void radeon_enc_layer_control(struct radeon_encoder *enc)
64 {
65    enc->enc_pic.layer_ctrl.max_num_temporal_layers = enc->enc_pic.num_temporal_layers;
66    enc->enc_pic.layer_ctrl.num_temporal_layers = enc->enc_pic.num_temporal_layers;
67 
68    RADEON_ENC_BEGIN(enc->cmd.layer_control);
69    RADEON_ENC_CS(enc->enc_pic.layer_ctrl.max_num_temporal_layers);
70    RADEON_ENC_CS(enc->enc_pic.layer_ctrl.num_temporal_layers);
71    RADEON_ENC_END();
72 }
73 
radeon_enc_layer_select(struct radeon_encoder * enc)74 static void radeon_enc_layer_select(struct radeon_encoder *enc)
75 {
76    RADEON_ENC_BEGIN(enc->cmd.layer_select);
77    RADEON_ENC_CS(enc->enc_pic.layer_sel.temporal_layer_index);
78    RADEON_ENC_END();
79 }
80 
radeon_enc_slice_control(struct radeon_encoder * enc)81 static void radeon_enc_slice_control(struct radeon_encoder *enc)
82 {
83    RADEON_ENC_BEGIN(enc->cmd.slice_control_h264);
84    RADEON_ENC_CS(enc->enc_pic.slice_ctrl.slice_control_mode);
85    RADEON_ENC_CS(enc->enc_pic.slice_ctrl.num_mbs_per_slice);
86    RADEON_ENC_END();
87 }
88 
radeon_enc_slice_control_hevc(struct radeon_encoder * enc)89 static void radeon_enc_slice_control_hevc(struct radeon_encoder *enc)
90 {
91    RADEON_ENC_BEGIN(enc->cmd.slice_control_hevc);
92    RADEON_ENC_CS(enc->enc_pic.hevc_slice_ctrl.slice_control_mode);
93    RADEON_ENC_CS(enc->enc_pic.hevc_slice_ctrl.fixed_ctbs_per_slice.num_ctbs_per_slice);
94    RADEON_ENC_CS(enc->enc_pic.hevc_slice_ctrl.fixed_ctbs_per_slice.num_ctbs_per_slice_segment);
95    RADEON_ENC_END();
96 }
97 
radeon_enc_spec_misc(struct radeon_encoder * enc)98 static void radeon_enc_spec_misc(struct radeon_encoder *enc)
99 {
100    RADEON_ENC_BEGIN(enc->cmd.spec_misc_h264);
101    RADEON_ENC_CS(enc->enc_pic.spec_misc.constrained_intra_pred_flag);
102    RADEON_ENC_CS(enc->enc_pic.spec_misc.cabac_enable);
103    RADEON_ENC_CS(enc->enc_pic.spec_misc.cabac_init_idc);
104    RADEON_ENC_CS(enc->enc_pic.spec_misc.half_pel_enabled);
105    RADEON_ENC_CS(enc->enc_pic.spec_misc.quarter_pel_enabled);
106    RADEON_ENC_CS(enc->enc_pic.spec_misc.profile_idc);
107    RADEON_ENC_CS(enc->enc_pic.spec_misc.level_idc);
108    RADEON_ENC_END();
109 }
110 
radeon_enc_spec_misc_hevc(struct radeon_encoder * enc)111 static void radeon_enc_spec_misc_hevc(struct radeon_encoder *enc)
112 {
113    RADEON_ENC_BEGIN(enc->cmd.spec_misc_hevc);
114    RADEON_ENC_CS(enc->enc_pic.hevc_spec_misc.log2_min_luma_coding_block_size_minus3);
115    RADEON_ENC_CS(enc->enc_pic.hevc_spec_misc.amp_disabled);
116    RADEON_ENC_CS(enc->enc_pic.hevc_spec_misc.strong_intra_smoothing_enabled);
117    RADEON_ENC_CS(enc->enc_pic.hevc_spec_misc.constrained_intra_pred_flag);
118    RADEON_ENC_CS(enc->enc_pic.hevc_spec_misc.cabac_init_flag);
119    RADEON_ENC_CS(enc->enc_pic.hevc_spec_misc.half_pel_enabled);
120    RADEON_ENC_CS(enc->enc_pic.hevc_spec_misc.quarter_pel_enabled);
121    RADEON_ENC_END();
122 }
123 
radeon_enc_rc_session_init(struct radeon_encoder * enc)124 static void radeon_enc_rc_session_init(struct radeon_encoder *enc)
125 {
126    RADEON_ENC_BEGIN(enc->cmd.rc_session_init);
127    RADEON_ENC_CS(enc->enc_pic.rc_session_init.rate_control_method);
128    RADEON_ENC_CS(enc->enc_pic.rc_session_init.vbv_buffer_level);
129    RADEON_ENC_END();
130 }
131 
radeon_enc_rc_layer_init(struct radeon_encoder * enc)132 static void radeon_enc_rc_layer_init(struct radeon_encoder *enc)
133 {
134    unsigned int i = enc->enc_pic.layer_sel.temporal_layer_index;
135    RADEON_ENC_BEGIN(enc->cmd.rc_layer_init);
136    RADEON_ENC_CS(enc->enc_pic.rc_layer_init[i].target_bit_rate);
137    RADEON_ENC_CS(enc->enc_pic.rc_layer_init[i].peak_bit_rate);
138    RADEON_ENC_CS(enc->enc_pic.rc_layer_init[i].frame_rate_num);
139    RADEON_ENC_CS(enc->enc_pic.rc_layer_init[i].frame_rate_den);
140    RADEON_ENC_CS(enc->enc_pic.rc_layer_init[i].vbv_buffer_size);
141    RADEON_ENC_CS(enc->enc_pic.rc_layer_init[i].avg_target_bits_per_picture);
142    RADEON_ENC_CS(enc->enc_pic.rc_layer_init[i].peak_bits_per_picture_integer);
143    RADEON_ENC_CS(enc->enc_pic.rc_layer_init[i].peak_bits_per_picture_fractional);
144    RADEON_ENC_END();
145 }
146 
radeon_enc_deblocking_filter_h264(struct radeon_encoder * enc)147 static void radeon_enc_deblocking_filter_h264(struct radeon_encoder *enc)
148 {
149    RADEON_ENC_BEGIN(enc->cmd.deblocking_filter_h264);
150    RADEON_ENC_CS(enc->enc_pic.h264_deblock.disable_deblocking_filter_idc);
151    RADEON_ENC_CS(enc->enc_pic.h264_deblock.alpha_c0_offset_div2);
152    RADEON_ENC_CS(enc->enc_pic.h264_deblock.beta_offset_div2);
153    RADEON_ENC_CS(enc->enc_pic.h264_deblock.cb_qp_offset);
154    RADEON_ENC_CS(enc->enc_pic.h264_deblock.cr_qp_offset);
155    RADEON_ENC_END();
156 }
157 
radeon_enc_deblocking_filter_hevc(struct radeon_encoder * enc)158 static void radeon_enc_deblocking_filter_hevc(struct radeon_encoder *enc)
159 {
160    RADEON_ENC_BEGIN(enc->cmd.deblocking_filter_hevc);
161    RADEON_ENC_CS(enc->enc_pic.hevc_deblock.loop_filter_across_slices_enabled);
162    RADEON_ENC_CS(enc->enc_pic.hevc_deblock.deblocking_filter_disabled);
163    RADEON_ENC_CS(enc->enc_pic.hevc_deblock.beta_offset_div2);
164    RADEON_ENC_CS(enc->enc_pic.hevc_deblock.tc_offset_div2);
165    RADEON_ENC_CS(enc->enc_pic.hevc_deblock.cb_qp_offset);
166    RADEON_ENC_CS(enc->enc_pic.hevc_deblock.cr_qp_offset);
167    RADEON_ENC_END();
168 }
169 
radeon_enc_quality_params(struct radeon_encoder * enc)170 static void radeon_enc_quality_params(struct radeon_encoder *enc)
171 {
172    RADEON_ENC_BEGIN(enc->cmd.quality_params);
173    RADEON_ENC_CS(enc->enc_pic.quality_params.vbaq_mode);
174    RADEON_ENC_CS(enc->enc_pic.quality_params.scene_change_sensitivity);
175    RADEON_ENC_CS(enc->enc_pic.quality_params.scene_change_min_idr_interval);
176    RADEON_ENC_CS(enc->enc_pic.quality_params.two_pass_search_center_map_mode);
177    RADEON_ENC_END();
178 }
179 
radeon_enc_write_sps(struct radeon_encoder * enc,uint8_t nal_byte,uint8_t * out)180 unsigned int radeon_enc_write_sps(struct radeon_encoder *enc, uint8_t nal_byte, uint8_t *out)
181 {
182    struct radeon_bitstream bs;
183    struct radeon_enc_pic *pic = &enc->enc_pic;
184    struct pipe_h264_enc_seq_param *sps = &pic->h264.desc->seq;
185 
186    radeon_bs_reset(&bs, out, NULL);
187    radeon_bs_set_emulation_prevention(&bs, false);
188    radeon_bs_code_fixed_bits(&bs, 0x00000001, 32);
189    radeon_bs_code_fixed_bits(&bs, nal_byte, 8);
190    radeon_bs_set_emulation_prevention(&bs, true);
191    radeon_bs_code_fixed_bits(&bs, pic->spec_misc.profile_idc, 8);
192    radeon_bs_code_fixed_bits(&bs, sps->enc_constraint_set_flags, 6);
193    radeon_bs_code_fixed_bits(&bs, 0x0, 2); /* reserved_zero_2bits */
194    radeon_bs_code_fixed_bits(&bs, pic->spec_misc.level_idc, 8);
195    radeon_bs_code_ue(&bs, 0x0); /* seq_parameter_set_id */
196 
197    if (pic->spec_misc.profile_idc == 100 || pic->spec_misc.profile_idc == 110 ||
198        pic->spec_misc.profile_idc == 122 || pic->spec_misc.profile_idc == 244 ||
199        pic->spec_misc.profile_idc == 44  || pic->spec_misc.profile_idc == 83 ||
200        pic->spec_misc.profile_idc == 86  || pic->spec_misc.profile_idc == 118 ||
201        pic->spec_misc.profile_idc == 128 || pic->spec_misc.profile_idc == 138) {
202       radeon_bs_code_ue(&bs, 0x1); /* chroma_format_idc */
203       radeon_bs_code_ue(&bs, 0x0); /* bit_depth_luma_minus8 */
204       radeon_bs_code_ue(&bs, 0x0); /* bit_depth_chroma_minus8 */
205       radeon_bs_code_fixed_bits(&bs, 0x0, 2); /* qpprime_y_zero_transform_bypass_flag + seq_scaling_matrix_present_flag */
206    }
207 
208    radeon_bs_code_ue(&bs, sps->log2_max_frame_num_minus4);
209    radeon_bs_code_ue(&bs, sps->pic_order_cnt_type);
210 
211    if (sps->pic_order_cnt_type == 0)
212       radeon_bs_code_ue(&bs, sps->log2_max_pic_order_cnt_lsb_minus4);
213 
214    radeon_bs_code_ue(&bs, sps->max_num_ref_frames);
215    radeon_bs_code_fixed_bits(&bs, sps->gaps_in_frame_num_value_allowed_flag, 1);
216    radeon_bs_code_ue(&bs, (pic->session_init.aligned_picture_width / 16 - 1));
217    radeon_bs_code_ue(&bs, (pic->session_init.aligned_picture_height / 16 - 1));
218    radeon_bs_code_fixed_bits(&bs, 0x1, 1); /* frame_mbs_only_flag */
219    radeon_bs_code_fixed_bits(&bs, 0x1, 1); /* direct_8x8_inference_flag */
220 
221    radeon_bs_code_fixed_bits(&bs, sps->enc_frame_cropping_flag, 1);
222    if (sps->enc_frame_cropping_flag) {
223       radeon_bs_code_ue(&bs, sps->enc_frame_crop_left_offset);
224       radeon_bs_code_ue(&bs, sps->enc_frame_crop_right_offset);
225       radeon_bs_code_ue(&bs, sps->enc_frame_crop_top_offset);
226       radeon_bs_code_ue(&bs, sps->enc_frame_crop_bottom_offset);
227    }
228 
229    radeon_bs_code_fixed_bits(&bs, sps->vui_parameters_present_flag, 1);
230    if (sps->vui_parameters_present_flag) {
231       radeon_bs_code_fixed_bits(&bs, (sps->vui_flags.aspect_ratio_info_present_flag), 1);
232       if (sps->vui_flags.aspect_ratio_info_present_flag) {
233          radeon_bs_code_fixed_bits(&bs, (sps->aspect_ratio_idc), 8);
234          if (sps->aspect_ratio_idc == PIPE_H2645_EXTENDED_SAR) {
235             radeon_bs_code_fixed_bits(&bs, (sps->sar_width), 16);
236             radeon_bs_code_fixed_bits(&bs, (sps->sar_height), 16);
237          }
238       }
239       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.overscan_info_present_flag, 1);
240       if (sps->vui_flags.overscan_info_present_flag)
241          radeon_bs_code_fixed_bits(&bs, sps->vui_flags.overscan_appropriate_flag, 1);
242       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.video_signal_type_present_flag, 1);
243       if (sps->vui_flags.video_signal_type_present_flag) {
244          radeon_bs_code_fixed_bits(&bs, sps->video_format, 3);
245          radeon_bs_code_fixed_bits(&bs, sps->video_full_range_flag, 1);
246          radeon_bs_code_fixed_bits(&bs, sps->vui_flags.colour_description_present_flag, 1);
247          if (sps->vui_flags.colour_description_present_flag) {
248             radeon_bs_code_fixed_bits(&bs, sps->colour_primaries, 8);
249             radeon_bs_code_fixed_bits(&bs, sps->transfer_characteristics, 8);
250             radeon_bs_code_fixed_bits(&bs, sps->matrix_coefficients, 8);
251          }
252       }
253       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.chroma_loc_info_present_flag, 1);
254       if (sps->vui_flags.chroma_loc_info_present_flag) {
255          radeon_bs_code_ue(&bs, sps->chroma_sample_loc_type_top_field);
256          radeon_bs_code_ue(&bs, sps->chroma_sample_loc_type_bottom_field);
257       }
258       radeon_bs_code_fixed_bits(&bs, (sps->vui_flags.timing_info_present_flag), 1);
259       if (sps->vui_flags.timing_info_present_flag) {
260          radeon_bs_code_fixed_bits(&bs, (sps->num_units_in_tick), 32);
261          radeon_bs_code_fixed_bits(&bs, (sps->time_scale), 32);
262          radeon_bs_code_fixed_bits(&bs, (sps->vui_flags.fixed_frame_rate_flag), 1);
263       }
264       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.nal_hrd_parameters_present_flag, 1);
265       if (sps->vui_flags.nal_hrd_parameters_present_flag)
266          radeon_bs_h264_hrd_parameters(&bs, &sps->nal_hrd_parameters);
267       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.vcl_hrd_parameters_present_flag, 1);
268       if (sps->vui_flags.vcl_hrd_parameters_present_flag)
269          radeon_bs_h264_hrd_parameters(&bs, &sps->vcl_hrd_parameters);
270       if (sps->vui_flags.nal_hrd_parameters_present_flag || sps->vui_flags.vcl_hrd_parameters_present_flag)
271          radeon_bs_code_fixed_bits(&bs, sps->vui_flags.low_delay_hrd_flag, 1);
272       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.pic_struct_present_flag, 1);
273       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.bitstream_restriction_flag, 1);
274       if (sps->vui_flags.bitstream_restriction_flag) {
275          radeon_bs_code_fixed_bits(&bs, 0x1, 1); /* motion_vectors_over_pic_boundaries_flag */
276          radeon_bs_code_ue(&bs, 0x0); /* max_bytes_per_pic_denom */
277          radeon_bs_code_ue(&bs, 0x0); /* max_bits_per_mb_denom */
278          radeon_bs_code_ue(&bs, 16); /* log2_max_mv_length_horizontal */
279          radeon_bs_code_ue(&bs, 16); /* log2_max_mv_length_vertical */
280          radeon_bs_code_ue(&bs, sps->max_num_reorder_frames);
281          radeon_bs_code_ue(&bs, sps->max_dec_frame_buffering);
282       }
283    }
284 
285    radeon_bs_code_fixed_bits(&bs, 0x1, 1);
286    radeon_bs_byte_align(&bs);
287 
288    return bs.bits_output / 8;
289 }
290 
radeon_enc_write_sps_hevc(struct radeon_encoder * enc,uint8_t * out)291 unsigned int radeon_enc_write_sps_hevc(struct radeon_encoder *enc, uint8_t *out)
292 {
293    struct radeon_bitstream bs;
294    struct radeon_enc_pic *pic = &enc->enc_pic;
295    struct pipe_h265_enc_seq_param *sps = &pic->hevc.desc->seq;
296    int i;
297 
298    radeon_bs_reset(&bs, out, NULL);
299    radeon_bs_set_emulation_prevention(&bs, false);
300    radeon_bs_code_fixed_bits(&bs, 0x00000001, 32);
301    radeon_bs_code_fixed_bits(&bs, 0x4201, 16);
302    radeon_bs_set_emulation_prevention(&bs, true);
303    radeon_bs_code_fixed_bits(&bs, 0x0, 4); /* sps_video_parameter_set_id */
304    radeon_bs_code_fixed_bits(&bs, sps->sps_max_sub_layers_minus1, 3);
305    radeon_bs_code_fixed_bits(&bs, sps->sps_temporal_id_nesting_flag, 1);
306    radeon_bs_hevc_profile_tier_level(&bs, sps->sps_max_sub_layers_minus1, &sps->profile_tier_level);
307    radeon_bs_code_ue(&bs, 0x0); /* sps_seq_parameter_set_id */
308    radeon_bs_code_ue(&bs, sps->chroma_format_idc);
309    radeon_bs_code_ue(&bs, pic->session_init.aligned_picture_width);
310    radeon_bs_code_ue(&bs, pic->session_init.aligned_picture_height);
311 
312    radeon_bs_code_fixed_bits(&bs, sps->conformance_window_flag, 1);
313    if (sps->conformance_window_flag) {
314       radeon_bs_code_ue(&bs, sps->conf_win_left_offset);
315       radeon_bs_code_ue(&bs, sps->conf_win_right_offset);
316       radeon_bs_code_ue(&bs, sps->conf_win_top_offset);
317       radeon_bs_code_ue(&bs, sps->conf_win_bottom_offset);
318    }
319 
320    radeon_bs_code_ue(&bs, sps->bit_depth_luma_minus8);
321    radeon_bs_code_ue(&bs, sps->bit_depth_chroma_minus8);
322    radeon_bs_code_ue(&bs, sps->log2_max_pic_order_cnt_lsb_minus4);
323    radeon_bs_code_fixed_bits(&bs, sps->sps_sub_layer_ordering_info_present_flag, 1);
324    i = sps->sps_sub_layer_ordering_info_present_flag ? 0 : sps->sps_max_sub_layers_minus1;
325    for (; i <= sps->sps_max_sub_layers_minus1; i++) {
326       radeon_bs_code_ue(&bs, sps->sps_max_dec_pic_buffering_minus1[i]);
327       radeon_bs_code_ue(&bs, sps->sps_max_num_reorder_pics[i]);
328       radeon_bs_code_ue(&bs, sps->sps_max_latency_increase_plus1[i]);
329    }
330 
331    unsigned log2_diff_max_min_luma_coding_block_size =
332       6 - (enc->enc_pic.hevc_spec_misc.log2_min_luma_coding_block_size_minus3 + 3);
333    unsigned log2_min_transform_block_size_minus2 =
334       enc->enc_pic.hevc_spec_misc.log2_min_luma_coding_block_size_minus3;
335    unsigned log2_diff_max_min_transform_block_size = log2_diff_max_min_luma_coding_block_size;
336    unsigned max_transform_hierarchy_depth_inter = log2_diff_max_min_luma_coding_block_size + 1;
337    unsigned max_transform_hierarchy_depth_intra = max_transform_hierarchy_depth_inter;
338 
339    radeon_bs_code_ue(&bs, pic->hevc_spec_misc.log2_min_luma_coding_block_size_minus3);
340    radeon_bs_code_ue(&bs, log2_diff_max_min_luma_coding_block_size);
341    radeon_bs_code_ue(&bs, log2_min_transform_block_size_minus2);
342    radeon_bs_code_ue(&bs, log2_diff_max_min_transform_block_size);
343    radeon_bs_code_ue(&bs, max_transform_hierarchy_depth_inter);
344    radeon_bs_code_ue(&bs, max_transform_hierarchy_depth_intra);
345 
346    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* scaling_list_enabled_flag */
347    radeon_bs_code_fixed_bits(&bs, !pic->hevc_spec_misc.amp_disabled, 1);
348    radeon_bs_code_fixed_bits(&bs, !pic->hevc_deblock.disable_sao, 1);
349    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* pcm_enabled_flag */
350 
351    radeon_bs_code_ue(&bs, sps->num_short_term_ref_pic_sets);
352    for (i = 0; i < sps->num_short_term_ref_pic_sets; i++)
353       radeon_bs_hevc_st_ref_pic_set(&bs, i, sps->num_short_term_ref_pic_sets, sps->st_ref_pic_set);
354 
355    radeon_bs_code_fixed_bits(&bs, sps->long_term_ref_pics_present_flag, 1);
356    if (sps->long_term_ref_pics_present_flag) {
357       radeon_bs_code_ue(&bs, sps->num_long_term_ref_pics_sps);
358       for (i = 0; i < sps->num_long_term_ref_pics_sps; i++) {
359          radeon_bs_code_fixed_bits(&bs, sps->lt_ref_pic_poc_lsb_sps[i], sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
360          radeon_bs_code_fixed_bits(&bs, sps->used_by_curr_pic_lt_sps_flag[i], 1);
361       }
362    }
363 
364    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* sps_temporal_mvp_enabled_flag */
365    radeon_bs_code_fixed_bits(&bs, pic->hevc_spec_misc.strong_intra_smoothing_enabled, 1);
366 
367    /* VUI parameters present flag */
368    radeon_bs_code_fixed_bits(&bs, (sps->vui_parameters_present_flag), 1);
369    if (sps->vui_parameters_present_flag) {
370       /* aspect ratio present flag */
371       radeon_bs_code_fixed_bits(&bs, (sps->vui_flags.aspect_ratio_info_present_flag), 1);
372       if (sps->vui_flags.aspect_ratio_info_present_flag) {
373          radeon_bs_code_fixed_bits(&bs, (sps->aspect_ratio_idc), 8);
374          if (sps->aspect_ratio_idc == PIPE_H2645_EXTENDED_SAR) {
375             radeon_bs_code_fixed_bits(&bs, (sps->sar_width), 16);
376             radeon_bs_code_fixed_bits(&bs, (sps->sar_height), 16);
377          }
378       }
379       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.overscan_info_present_flag, 1);
380       if (sps->vui_flags.overscan_info_present_flag)
381          radeon_bs_code_fixed_bits(&bs, sps->vui_flags.overscan_appropriate_flag, 1);
382       /* video signal type present flag  */
383       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.video_signal_type_present_flag, 1);
384       if (sps->vui_flags.video_signal_type_present_flag) {
385          radeon_bs_code_fixed_bits(&bs, sps->video_format, 3);
386          radeon_bs_code_fixed_bits(&bs, sps->video_full_range_flag, 1);
387          radeon_bs_code_fixed_bits(&bs, sps->vui_flags.colour_description_present_flag, 1);
388          if (sps->vui_flags.colour_description_present_flag) {
389             radeon_bs_code_fixed_bits(&bs, sps->colour_primaries, 8);
390             radeon_bs_code_fixed_bits(&bs, sps->transfer_characteristics, 8);
391             radeon_bs_code_fixed_bits(&bs, sps->matrix_coefficients, 8);
392          }
393       }
394       /* chroma loc info present flag */
395       radeon_bs_code_fixed_bits(&bs, sps->vui_flags.chroma_loc_info_present_flag, 1);
396       if (sps->vui_flags.chroma_loc_info_present_flag) {
397          radeon_bs_code_ue(&bs, sps->chroma_sample_loc_type_top_field);
398          radeon_bs_code_ue(&bs, sps->chroma_sample_loc_type_bottom_field);
399       }
400       radeon_bs_code_fixed_bits(&bs, 0x0, 1);  /* neutral chroma indication flag */
401       radeon_bs_code_fixed_bits(&bs, 0x0, 1);  /* field seq flag */
402       radeon_bs_code_fixed_bits(&bs, 0x0, 1);  /* frame field info present flag */
403       radeon_bs_code_fixed_bits(&bs, 0x0, 1);  /* default display windows flag */
404       /* vui timing info present flag */
405       radeon_bs_code_fixed_bits(&bs, (sps->vui_flags.timing_info_present_flag), 1);
406       if (sps->vui_flags.timing_info_present_flag) {
407          radeon_bs_code_fixed_bits(&bs, (sps->num_units_in_tick), 32);
408          radeon_bs_code_fixed_bits(&bs, (sps->time_scale), 32);
409          radeon_bs_code_fixed_bits(&bs, sps->vui_flags.poc_proportional_to_timing_flag, 1);
410          if (sps->vui_flags.poc_proportional_to_timing_flag)
411             radeon_bs_code_ue(&bs, sps->num_ticks_poc_diff_one_minus1);
412          radeon_bs_code_fixed_bits(&bs, sps->vui_flags.hrd_parameters_present_flag, 1);
413          if (sps->vui_flags.hrd_parameters_present_flag)
414             radeon_bs_hevc_hrd_parameters(&bs, 1, sps->sps_max_sub_layers_minus1, &sps->hrd_parameters);
415       }
416       radeon_bs_code_fixed_bits(&bs, 0x0, 1);  /* bitstream restriction flag */
417    }
418    radeon_bs_code_fixed_bits(&bs, 0x0, 1);  /* sps extension present flag */
419 
420    radeon_bs_code_fixed_bits(&bs, 0x1, 1);
421    radeon_bs_byte_align(&bs);
422 
423    return bs.bits_output / 8;
424 }
425 
radeon_enc_write_pps(struct radeon_encoder * enc,uint8_t nal_byte,uint8_t * out)426 unsigned int radeon_enc_write_pps(struct radeon_encoder *enc, uint8_t nal_byte, uint8_t *out)
427 {
428    struct radeon_bitstream bs;
429 
430    radeon_bs_reset(&bs, out, NULL);
431    radeon_bs_set_emulation_prevention(&bs, false);
432    radeon_bs_code_fixed_bits(&bs, 0x00000001, 32);
433    radeon_bs_code_fixed_bits(&bs, nal_byte, 8);
434    radeon_bs_set_emulation_prevention(&bs, true);
435    radeon_bs_code_ue(&bs, 0x0); /* pic_parameter_set_id */
436    radeon_bs_code_ue(&bs, 0x0); /* seq_parameter_set_id */
437    radeon_bs_code_fixed_bits(&bs, (enc->enc_pic.spec_misc.cabac_enable ? 0x1 : 0x0), 1);
438    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* bottom_field_pic_order_in_frame_present_flag */
439    radeon_bs_code_ue(&bs, 0x0); /* num_slice_groups_minus_1 */
440    radeon_bs_code_ue(&bs, enc->enc_pic.h264.desc->pic_ctrl.num_ref_idx_l0_default_active_minus1);
441    radeon_bs_code_ue(&bs, enc->enc_pic.h264.desc->pic_ctrl.num_ref_idx_l1_default_active_minus1);
442    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* weighted_pred_flag */
443    radeon_bs_code_fixed_bits(&bs, 0x0, 2); /* weighted_bipred_idc */
444    radeon_bs_code_se(&bs, 0x0); /* pic_init_qp_minus26 */
445    radeon_bs_code_se(&bs, 0x0); /* pic_init_qs_minus26 */
446    radeon_bs_code_se(&bs, enc->enc_pic.h264_deblock.cb_qp_offset); /* chroma_qp_index_offset */
447    radeon_bs_code_fixed_bits(&bs, (enc->enc_pic.spec_misc.deblocking_filter_control_present_flag), 1);
448    radeon_bs_code_fixed_bits(&bs, (enc->enc_pic.spec_misc.constrained_intra_pred_flag), 1);
449    radeon_bs_code_fixed_bits(&bs, (enc->enc_pic.spec_misc.redundant_pic_cnt_present_flag), 1);
450    radeon_bs_code_fixed_bits(&bs, (enc->enc_pic.spec_misc.transform_8x8_mode), 1);
451    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* pic_scaling_matrix_present_flag */
452    radeon_bs_code_se(&bs, enc->enc_pic.h264_deblock.cr_qp_offset); /* second_chroma_qp_index_offset */
453 
454    radeon_bs_code_fixed_bits(&bs, 0x1, 1);
455    radeon_bs_byte_align(&bs);
456 
457    return bs.bits_output / 8;
458 }
459 
radeon_enc_write_pps_hevc(struct radeon_encoder * enc,uint8_t * out)460 unsigned int radeon_enc_write_pps_hevc(struct radeon_encoder *enc, uint8_t *out)
461 {
462    struct radeon_bitstream bs;
463    struct pipe_h265_enc_pic_param *pps = &enc->enc_pic.hevc.desc->pic;
464 
465    radeon_bs_reset(&bs, out, NULL);
466    radeon_bs_set_emulation_prevention(&bs, false);
467    radeon_bs_code_fixed_bits(&bs, 0x00000001, 32);
468    radeon_bs_code_fixed_bits(&bs, 0x4401, 16);
469    radeon_bs_set_emulation_prevention(&bs, true);
470    radeon_bs_code_ue(&bs, 0x0); /* pps_pic_parameter_set_id */
471    radeon_bs_code_ue(&bs, 0x0); /* pps_seq_parameter_set_id */
472    radeon_bs_code_fixed_bits(&bs, 0x1, 1); /* dependent_slice_segments_enabled_flag */
473    radeon_bs_code_fixed_bits(&bs, pps->output_flag_present_flag, 1);
474    radeon_bs_code_fixed_bits(&bs, 0x0, 3); /* num_extra_slice_header_bits */
475    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* sign_data_hiding_enabled_flag */
476    radeon_bs_code_fixed_bits(&bs, 0x1, 1); /* cabac_init_present_flag */
477    radeon_bs_code_ue(&bs, pps->num_ref_idx_l0_default_active_minus1);
478    radeon_bs_code_ue(&bs, pps->num_ref_idx_l1_default_active_minus1);
479    radeon_bs_code_se(&bs, 0x0); /* init_qp_minus26 */
480    radeon_bs_code_fixed_bits(&bs, enc->enc_pic.hevc_spec_misc.constrained_intra_pred_flag, 1);
481    radeon_bs_code_fixed_bits(&bs, !enc->enc_pic.hevc_spec_misc.transform_skip_disabled, 1);
482    radeon_bs_code_fixed_bits(&bs, enc->enc_pic.hevc_spec_misc.cu_qp_delta_enabled_flag, 1);
483    if (enc->enc_pic.hevc_spec_misc.cu_qp_delta_enabled_flag)
484       radeon_bs_code_ue(&bs, 0); /* diff_cu_qp_delta_depth */
485    radeon_bs_code_se(&bs, enc->enc_pic.hevc_deblock.cb_qp_offset);
486    radeon_bs_code_se(&bs, enc->enc_pic.hevc_deblock.cr_qp_offset);
487    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* pps_slice_chroma_qp_offsets_present_flag */
488    radeon_bs_code_fixed_bits(&bs, 0x0, 2); /* weighted_pred_flag + weighted_bipred_flag */
489    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* transquant_bypass_enabled_flag */
490    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* tiles_enabled_flag */
491    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* entropy_coding_sync_enabled_flag */
492    radeon_bs_code_fixed_bits(&bs, enc->enc_pic.hevc_deblock.loop_filter_across_slices_enabled, 1);
493    radeon_bs_code_fixed_bits(&bs, 0x1, 1); /* deblocking_filter_control_present_flag */
494    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* deblocking_filter_override_enabled_flag */
495    radeon_bs_code_fixed_bits(&bs, enc->enc_pic.hevc_deblock.deblocking_filter_disabled, 1);
496 
497    if (!enc->enc_pic.hevc_deblock.deblocking_filter_disabled) {
498       radeon_bs_code_se(&bs, enc->enc_pic.hevc_deblock.beta_offset_div2);
499       radeon_bs_code_se(&bs, enc->enc_pic.hevc_deblock.tc_offset_div2);
500    }
501 
502    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* pps_scaling_list_data_present_flag */
503    radeon_bs_code_fixed_bits(&bs, pps->lists_modification_present_flag, 1);
504    radeon_bs_code_ue(&bs, pps->log2_parallel_merge_level_minus2);
505    radeon_bs_code_fixed_bits(&bs, 0x0, 2);
506 
507    radeon_bs_code_fixed_bits(&bs, 0x1, 1);
508    radeon_bs_byte_align(&bs);
509 
510    return bs.bits_output / 8;
511 }
512 
radeon_enc_write_vps(struct radeon_encoder * enc,uint8_t * out)513 unsigned int radeon_enc_write_vps(struct radeon_encoder *enc, uint8_t *out)
514 {
515    struct radeon_bitstream bs;
516    struct pipe_h265_enc_vid_param *vps = &enc->enc_pic.hevc.desc->vid;
517    int i;
518 
519    radeon_bs_reset(&bs, out, NULL);
520    radeon_bs_set_emulation_prevention(&bs, false);
521    radeon_bs_code_fixed_bits(&bs, 0x00000001, 32);
522    radeon_bs_code_fixed_bits(&bs, 0x4001, 16);
523    radeon_bs_set_emulation_prevention(&bs, true);
524    radeon_bs_code_fixed_bits(&bs, 0x0, 4); /* vps_video_parameter_set_id*/
525    radeon_bs_code_fixed_bits(&bs, vps->vps_base_layer_internal_flag, 1);
526    radeon_bs_code_fixed_bits(&bs, vps->vps_base_layer_available_flag, 1);
527    radeon_bs_code_fixed_bits(&bs, 0x0, 6); /* vps_max_layers_minus1 */
528    radeon_bs_code_fixed_bits(&bs, vps->vps_max_sub_layers_minus1, 3);
529    radeon_bs_code_fixed_bits(&bs, vps->vps_temporal_id_nesting_flag, 1);
530    radeon_bs_code_fixed_bits(&bs, 0xffff, 16); /* vps_reserved_0xffff_16bits */
531    radeon_bs_hevc_profile_tier_level(&bs, vps->vps_max_sub_layers_minus1, &vps->profile_tier_level);
532    radeon_bs_code_fixed_bits(&bs, vps->vps_sub_layer_ordering_info_present_flag, 1);
533    i = vps->vps_sub_layer_ordering_info_present_flag ? 0 : vps->vps_max_sub_layers_minus1;
534    for (; i <= vps->vps_max_sub_layers_minus1; i++) {
535       radeon_bs_code_ue(&bs, vps->vps_max_dec_pic_buffering_minus1[i]);
536       radeon_bs_code_ue(&bs, vps->vps_max_num_reorder_pics[i]);
537       radeon_bs_code_ue(&bs, vps->vps_max_latency_increase_plus1[i]);
538    }
539    radeon_bs_code_fixed_bits(&bs, 0x0, 6); /* vps_max_layer_id */
540    radeon_bs_code_ue(&bs, 0x0); /* vps_num_layer_sets_minus1 */
541    radeon_bs_code_fixed_bits(&bs, vps->vps_timing_info_present_flag, 1);
542    if (vps->vps_timing_info_present_flag) {
543       radeon_bs_code_fixed_bits(&bs, vps->vps_num_units_in_tick, 32);
544       radeon_bs_code_fixed_bits(&bs, vps->vps_time_scale, 32);
545       radeon_bs_code_fixed_bits(&bs, vps->vps_poc_proportional_to_timing_flag, 1);
546       if (vps->vps_poc_proportional_to_timing_flag)
547          radeon_bs_code_ue(&bs, vps->vps_num_ticks_poc_diff_one_minus1);
548       radeon_bs_code_ue(&bs, 0x0); /* vps_num_hrd_parameters */
549    }
550    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* vps_extension_flag */
551 
552    radeon_bs_code_fixed_bits(&bs, 0x1, 1);
553    radeon_bs_byte_align(&bs);
554 
555    return bs.bits_output / 8;
556 }
557 
radeon_enc_slice_header(struct radeon_encoder * enc)558 static void radeon_enc_slice_header(struct radeon_encoder *enc)
559 {
560    struct radeon_bitstream bs;
561    struct pipe_h264_enc_seq_param *sps = &enc->enc_pic.h264.desc->seq;
562    struct pipe_h264_enc_pic_control *pps = &enc->enc_pic.h264.desc->pic_ctrl;
563    struct pipe_h264_enc_slice_param *slice = &enc->enc_pic.h264.desc->slice;
564    uint32_t instruction[RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS] = {0};
565    uint32_t num_bits[RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS] = {0};
566    unsigned int inst_index = 0;
567    unsigned int cdw_start = 0;
568    unsigned int cdw_filled = 0;
569    unsigned int bits_copied = 0;
570 
571    RADEON_ENC_BEGIN(enc->cmd.slice_header);
572    radeon_bs_reset(&bs, NULL, &enc->cs);
573    radeon_bs_set_emulation_prevention(&bs, false);
574 
575    cdw_start = enc->cs.current.cdw;
576    radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* forbidden_zero_bit */
577    radeon_bs_code_fixed_bits(&bs, pps->nal_ref_idc, 2);
578    radeon_bs_code_fixed_bits(&bs, pps->nal_unit_type, 5);
579 
580    radeon_bs_flush_headers(&bs);
581    instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
582    num_bits[inst_index] = bs.bits_output - bits_copied;
583    bits_copied = bs.bits_output;
584    inst_index++;
585 
586    instruction[inst_index] = RENCODE_H264_HEADER_INSTRUCTION_FIRST_MB;
587    inst_index++;
588 
589    switch (enc->enc_pic.picture_type) {
590    case PIPE_H2645_ENC_PICTURE_TYPE_I:
591    case PIPE_H2645_ENC_PICTURE_TYPE_IDR:
592       radeon_bs_code_fixed_bits(&bs, 0x08, 7);
593       break;
594    case PIPE_H2645_ENC_PICTURE_TYPE_P:
595    case PIPE_H2645_ENC_PICTURE_TYPE_SKIP:
596       radeon_bs_code_fixed_bits(&bs, 0x06, 5);
597       break;
598    case PIPE_H2645_ENC_PICTURE_TYPE_B:
599       radeon_bs_code_fixed_bits(&bs, 0x07, 5);
600       break;
601    default:
602       radeon_bs_code_fixed_bits(&bs, 0x08, 7);
603    }
604 
605    radeon_bs_code_ue(&bs, 0x0); /* pic_parameter_set_id */
606    radeon_bs_code_fixed_bits(&bs, slice->frame_num, sps->log2_max_frame_num_minus4 + 4);
607 
608    if (enc->enc_pic.h264_enc_params.input_picture_structure !=
609        RENCODE_H264_PICTURE_STRUCTURE_FRAME) {
610       radeon_bs_code_fixed_bits(&bs, 0x1, 1);
611       radeon_bs_code_fixed_bits(&bs,
612                                  enc->enc_pic.h264_enc_params.input_picture_structure ==
613                                        RENCODE_H264_PICTURE_STRUCTURE_BOTTOM_FIELD
614                                     ? 1
615                                     : 0,
616                                  1);
617    }
618 
619    if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR)
620       radeon_bs_code_ue(&bs, slice->idr_pic_id);
621 
622    if (sps->pic_order_cnt_type == 0)
623       radeon_bs_code_fixed_bits(&bs, slice->pic_order_cnt_lsb, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
624 
625    if (pps->redundant_pic_cnt_present_flag)
626       radeon_bs_code_ue(&bs, slice->redundant_pic_cnt);
627 
628    if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B)
629       radeon_bs_code_fixed_bits(&bs, 0x1, 1); /* direct_spatial_mv_pred_flag */
630 
631    if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_P ||
632        enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B) {
633       radeon_bs_code_fixed_bits(&bs, slice->num_ref_idx_active_override_flag, 1);
634       if (slice->num_ref_idx_active_override_flag) {
635          radeon_bs_code_ue(&bs, slice->num_ref_idx_l0_active_minus1);
636          if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B)
637             radeon_bs_code_ue(&bs, slice->num_ref_idx_l1_active_minus1);
638       }
639       radeon_bs_code_fixed_bits(&bs, slice->ref_pic_list_modification_flag_l0, 1);
640       if (slice->ref_pic_list_modification_flag_l0) {
641          for (unsigned i = 0; i < slice->num_ref_list0_mod_operations; i++) {
642             struct pipe_h264_ref_list_mod_entry *op =
643                &slice->ref_list0_mod_operations[i];
644             radeon_bs_code_ue(&bs, op->modification_of_pic_nums_idc);
645             if (op->modification_of_pic_nums_idc == 0 ||
646                 op->modification_of_pic_nums_idc == 1)
647                radeon_bs_code_ue(&bs, op->abs_diff_pic_num_minus1);
648             else if (op->modification_of_pic_nums_idc == 2)
649                radeon_bs_code_ue(&bs, op->long_term_pic_num);
650          }
651          radeon_bs_code_ue(&bs, 0x3); /* modification_of_pic_nums_idc */
652       }
653       if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B) {
654          radeon_bs_code_fixed_bits(&bs, slice->ref_pic_list_modification_flag_l1, 1);
655          if (slice->ref_pic_list_modification_flag_l1) {
656             for (unsigned i = 0; i < slice->num_ref_list1_mod_operations; i++) {
657                struct pipe_h264_ref_list_mod_entry *op =
658                   &slice->ref_list1_mod_operations[i];
659                radeon_bs_code_ue(&bs, op->modification_of_pic_nums_idc);
660                if (op->modification_of_pic_nums_idc == 0 ||
661                    op->modification_of_pic_nums_idc == 1)
662                   radeon_bs_code_ue(&bs, op->abs_diff_pic_num_minus1);
663                else if (op->modification_of_pic_nums_idc == 2)
664                   radeon_bs_code_ue(&bs, op->long_term_pic_num);
665             }
666             radeon_bs_code_ue(&bs, 0x3); /* modification_of_pic_nums_idc */
667          }
668       }
669    }
670 
671    if (!enc->enc_pic.not_referenced) {
672       if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR) {
673          radeon_bs_code_fixed_bits(&bs, slice->no_output_of_prior_pics_flag, 1);
674          radeon_bs_code_fixed_bits(&bs, slice->long_term_reference_flag, 1);
675       } else {
676          radeon_bs_code_fixed_bits(&bs, slice->adaptive_ref_pic_marking_mode_flag, 1);
677          if (slice->adaptive_ref_pic_marking_mode_flag) {
678             for (unsigned i = 0; i < slice->num_ref_pic_marking_operations; i++) {
679                struct pipe_h264_ref_pic_marking_entry *op =
680                   &slice->ref_pic_marking_operations[i];
681                radeon_bs_code_ue(&bs, op->memory_management_control_operation);
682                if (op->memory_management_control_operation == 1 ||
683                    op->memory_management_control_operation == 3)
684                   radeon_bs_code_ue(&bs, op->difference_of_pic_nums_minus1);
685                if (op->memory_management_control_operation == 2)
686                   radeon_bs_code_ue(&bs, op->long_term_pic_num);
687                if (op->memory_management_control_operation == 3 ||
688                    op->memory_management_control_operation == 6)
689                   radeon_bs_code_ue(&bs, op->long_term_frame_idx);
690                if (op->memory_management_control_operation == 4)
691                   radeon_bs_code_ue(&bs, op->max_long_term_frame_idx_plus1);
692             }
693             radeon_bs_code_ue(&bs, 0); /* memory_management_control_operation */
694          }
695       }
696    }
697 
698    if ((enc->enc_pic.picture_type != PIPE_H2645_ENC_PICTURE_TYPE_IDR) &&
699        (enc->enc_pic.picture_type != PIPE_H2645_ENC_PICTURE_TYPE_I) &&
700        (enc->enc_pic.spec_misc.cabac_enable))
701       radeon_bs_code_ue(&bs, enc->enc_pic.spec_misc.cabac_init_idc);
702 
703    radeon_bs_flush_headers(&bs);
704    instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
705    num_bits[inst_index] = bs.bits_output - bits_copied;
706    bits_copied = bs.bits_output;
707    inst_index++;
708 
709    instruction[inst_index] = RENCODE_H264_HEADER_INSTRUCTION_SLICE_QP_DELTA;
710    inst_index++;
711 
712    if (enc->enc_pic.spec_misc.deblocking_filter_control_present_flag) {
713       radeon_bs_code_ue(&bs, enc->enc_pic.h264_deblock.disable_deblocking_filter_idc);
714       if (!enc->enc_pic.h264_deblock.disable_deblocking_filter_idc) {
715          radeon_bs_code_se(&bs, enc->enc_pic.h264_deblock.alpha_c0_offset_div2);
716          radeon_bs_code_se(&bs, enc->enc_pic.h264_deblock.beta_offset_div2);
717       }
718    }
719 
720    radeon_bs_flush_headers(&bs);
721    instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
722    num_bits[inst_index] = bs.bits_output - bits_copied;
723    bits_copied = bs.bits_output;
724    inst_index++;
725 
726    instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_END;
727 
728    cdw_filled = enc->cs.current.cdw - cdw_start;
729    for (int i = 0; i < RENCODE_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS - cdw_filled; i++)
730       RADEON_ENC_CS(0x00000000);
731 
732    for (int j = 0; j < RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS; j++) {
733       RADEON_ENC_CS(instruction[j]);
734       RADEON_ENC_CS(num_bits[j]);
735    }
736 
737    RADEON_ENC_END();
738 }
739 
radeon_enc_slice_header_hevc(struct radeon_encoder * enc)740 static void radeon_enc_slice_header_hevc(struct radeon_encoder *enc)
741 {
742    struct radeon_bitstream bs;
743    struct pipe_h265_enc_seq_param *sps = &enc->enc_pic.hevc.desc->seq;
744    struct pipe_h265_enc_pic_param *pps = &enc->enc_pic.hevc.desc->pic;
745    struct pipe_h265_enc_slice_param *slice = &enc->enc_pic.hevc.desc->slice;
746    uint32_t instruction[RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS] = {0};
747    uint32_t num_bits[RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS] = {0};
748    unsigned int inst_index = 0;
749    unsigned int cdw_start = 0;
750    unsigned int cdw_filled = 0;
751    unsigned int bits_copied = 0;
752    unsigned int num_pic_total_curr = 0;
753 
754    RADEON_ENC_BEGIN(enc->cmd.slice_header);
755    radeon_bs_reset(&bs, NULL, &enc->cs);
756    radeon_bs_set_emulation_prevention(&bs, false);
757 
758    cdw_start = enc->cs.current.cdw;
759    radeon_bs_code_fixed_bits(&bs, 0x0, 1);
760    radeon_bs_code_fixed_bits(&bs, enc->enc_pic.nal_unit_type, 6);
761    radeon_bs_code_fixed_bits(&bs, 0x0, 6);
762    radeon_bs_code_fixed_bits(&bs, enc->enc_pic.temporal_id + 1, 3);
763 
764    radeon_bs_flush_headers(&bs);
765    instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
766    num_bits[inst_index] = bs.bits_output - bits_copied;
767    bits_copied = bs.bits_output;
768    inst_index++;
769 
770    instruction[inst_index] = RENCODE_HEVC_HEADER_INSTRUCTION_FIRST_SLICE;
771    inst_index++;
772 
773    if ((enc->enc_pic.nal_unit_type >= 16) && (enc->enc_pic.nal_unit_type <= 23))
774       radeon_bs_code_fixed_bits(&bs, slice->no_output_of_prior_pics_flag, 1);
775 
776    radeon_bs_code_ue(&bs, 0x0); /* slice_pic_parameter_set_id */
777 
778    radeon_bs_flush_headers(&bs);
779    instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
780    num_bits[inst_index] = bs.bits_output - bits_copied;
781    bits_copied = bs.bits_output;
782    inst_index++;
783 
784    instruction[inst_index] = RENCODE_HEVC_HEADER_INSTRUCTION_SLICE_SEGMENT;
785    inst_index++;
786 
787    instruction[inst_index] = RENCODE_HEVC_HEADER_INSTRUCTION_DEPENDENT_SLICE_END;
788    inst_index++;
789 
790    switch (enc->enc_pic.picture_type) {
791    case PIPE_H2645_ENC_PICTURE_TYPE_I:
792    case PIPE_H2645_ENC_PICTURE_TYPE_IDR:
793       radeon_bs_code_ue(&bs, 0x2);
794       break;
795    case PIPE_H2645_ENC_PICTURE_TYPE_P:
796    case PIPE_H2645_ENC_PICTURE_TYPE_SKIP:
797       radeon_bs_code_ue(&bs, 0x1);
798       break;
799    case PIPE_H2645_ENC_PICTURE_TYPE_B:
800       radeon_bs_code_ue(&bs, 0x0);
801       break;
802    default:
803       radeon_bs_code_ue(&bs, 0x1);
804    }
805 
806    if (pps->output_flag_present_flag)
807       radeon_bs_code_fixed_bits(&bs, slice->pic_output_flag, 1);
808 
809    if ((enc->enc_pic.nal_unit_type != 19) && (enc->enc_pic.nal_unit_type != 20)) {
810       radeon_bs_code_fixed_bits(&bs, slice->slice_pic_order_cnt_lsb, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
811       radeon_bs_code_fixed_bits(&bs, slice->short_term_ref_pic_set_sps_flag, 1);
812       if (!slice->short_term_ref_pic_set_sps_flag) {
813          num_pic_total_curr =
814             radeon_bs_hevc_st_ref_pic_set(&bs, sps->num_short_term_ref_pic_sets,
815                                           sps->num_short_term_ref_pic_sets, sps->st_ref_pic_set);
816       } else if (sps->num_short_term_ref_pic_sets > 1) {
817          radeon_bs_code_fixed_bits(&bs, slice->short_term_ref_pic_set_idx,
818                                     util_logbase2_ceil(sps->num_short_term_ref_pic_sets));
819       }
820       if (sps->long_term_ref_pics_present_flag) {
821          if (sps->num_long_term_ref_pics_sps > 0)
822             radeon_bs_code_ue(&bs, slice->num_long_term_sps);
823          radeon_bs_code_ue(&bs, slice->num_long_term_pics);
824          for (unsigned i = 0; i < slice->num_long_term_sps + slice->num_long_term_pics; i++) {
825             if (i < slice->num_long_term_sps) {
826                if (sps->num_long_term_ref_pics_sps > 1)
827                   radeon_bs_code_fixed_bits(&bs, slice->lt_idx_sps[i], util_logbase2_ceil(sps->num_long_term_ref_pics_sps));
828             } else {
829                radeon_bs_code_fixed_bits(&bs, slice->poc_lsb_lt[i], sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
830                radeon_bs_code_fixed_bits(&bs, slice->used_by_curr_pic_lt_flag[i], 1);
831                if (slice->used_by_curr_pic_lt_flag[i])
832                   num_pic_total_curr++;
833             }
834             radeon_bs_code_fixed_bits(&bs, slice->delta_poc_msb_present_flag[i], 1);
835             if (slice->delta_poc_msb_present_flag[i])
836                radeon_bs_code_ue(&bs, slice->delta_poc_msb_cycle_lt[i]);
837          }
838       }
839    }
840 
841    if (!enc->enc_pic.hevc_deblock.disable_sao) {
842       radeon_bs_flush_headers(&bs);
843       instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
844       num_bits[inst_index] = bs.bits_output - bits_copied;
845       bits_copied = bs.bits_output;
846       inst_index++;
847 
848       instruction[inst_index] = RENCODE_HEVC_HEADER_INSTRUCTION_SAO_ENABLE;
849       inst_index++;
850    }
851 
852    if ((enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_P) ||
853        (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B)) {
854       radeon_bs_code_fixed_bits(&bs, slice->num_ref_idx_active_override_flag, 1);
855       if (slice->num_ref_idx_active_override_flag) {
856          radeon_bs_code_ue(&bs, slice->num_ref_idx_l0_active_minus1);
857          if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B)
858             radeon_bs_code_ue(&bs, slice->num_ref_idx_l1_active_minus1);
859       }
860       if (pps->lists_modification_present_flag && num_pic_total_curr > 1) {
861          unsigned num_bits = util_logbase2_ceil(num_pic_total_curr);
862          unsigned num_ref_l0_minus1 = slice->num_ref_idx_active_override_flag ?
863             slice->num_ref_idx_l0_active_minus1 : pps->num_ref_idx_l0_default_active_minus1;
864          radeon_bs_code_fixed_bits(&bs, slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l0, 1);
865          for (unsigned i = 0; i <= num_ref_l0_minus1; i++)
866             radeon_bs_code_fixed_bits(&bs, slice->ref_pic_lists_modification.list_entry_l0[i], num_bits);
867          if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B) {
868             unsigned num_ref_l1_minus1 = slice->num_ref_idx_active_override_flag ?
869                slice->num_ref_idx_l1_active_minus1 : pps->num_ref_idx_l1_default_active_minus1;
870             radeon_bs_code_fixed_bits(&bs, slice->ref_pic_lists_modification.ref_pic_list_modification_flag_l1, 1);
871             for (unsigned i = 0; i <= num_ref_l1_minus1; i++)
872                radeon_bs_code_fixed_bits(&bs, slice->ref_pic_lists_modification.list_entry_l1[i], num_bits);
873          }
874       }
875       if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B)
876          radeon_bs_code_fixed_bits(&bs, 0x0, 1); /* mvd_l1_zero_flag */
877       radeon_bs_code_fixed_bits(&bs, enc->enc_pic.hevc_spec_misc.cabac_init_flag, 1);
878       radeon_bs_code_ue(&bs, 5 - slice->max_num_merge_cand);
879    }
880 
881    radeon_bs_flush_headers(&bs);
882    instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
883    num_bits[inst_index] = bs.bits_output - bits_copied;
884    bits_copied = bs.bits_output;
885    inst_index++;
886 
887    instruction[inst_index] = RENCODE_HEVC_HEADER_INSTRUCTION_SLICE_QP_DELTA;
888    inst_index++;
889 
890    if ((enc->enc_pic.hevc_deblock.loop_filter_across_slices_enabled) &&
891        (!enc->enc_pic.hevc_deblock.deblocking_filter_disabled ||
892         !enc->enc_pic.hevc_deblock.disable_sao)) {
893        if (!enc->enc_pic.hevc_deblock.disable_sao) {
894            radeon_bs_flush_headers(&bs);
895            instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
896            num_bits[inst_index] = bs.bits_output - bits_copied;
897            bits_copied = bs.bits_output;
898            inst_index++;
899 
900            instruction[inst_index] = RENCODE_HEVC_HEADER_INSTRUCTION_LOOP_FILTER_ACROSS_SLICES_ENABLE;
901            inst_index++;
902        } else {
903            radeon_bs_code_fixed_bits(&bs, enc->enc_pic.hevc_deblock.loop_filter_across_slices_enabled, 1);
904            radeon_bs_flush_headers(&bs);
905            instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
906            num_bits[inst_index] = bs.bits_output - bits_copied;
907            bits_copied = bs.bits_output;
908            inst_index++;
909        }
910    }
911 
912    instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_END;
913 
914    cdw_filled = enc->cs.current.cdw - cdw_start;
915    for (int i = 0; i < RENCODE_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS - cdw_filled; i++)
916       RADEON_ENC_CS(0x00000000);
917 
918    for (int j = 0; j < RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS; j++) {
919       RADEON_ENC_CS(instruction[j]);
920       RADEON_ENC_CS(num_bits[j]);
921    }
922 
923    RADEON_ENC_END();
924 }
925 
radeon_enc_ctx(struct radeon_encoder * enc)926 static void radeon_enc_ctx(struct radeon_encoder *enc)
927 {
928    enc->enc_pic.ctx_buf.swizzle_mode = 0;
929    enc->enc_pic.ctx_buf.two_pass_search_center_map_offset = 0;
930 
931    RADEON_ENC_BEGIN(enc->cmd.ctx);
932    RADEON_ENC_READWRITE(enc->dpb->res->buf, enc->dpb->res->domains, 0);
933    RADEON_ENC_CS(enc->enc_pic.ctx_buf.swizzle_mode);
934    RADEON_ENC_CS(enc->enc_pic.ctx_buf.rec_luma_pitch);
935    RADEON_ENC_CS(enc->enc_pic.ctx_buf.rec_chroma_pitch);
936    RADEON_ENC_CS(enc->enc_pic.ctx_buf.num_reconstructed_pictures);
937 
938    for (int i = 0; i < RENCODE_MAX_NUM_RECONSTRUCTED_PICTURES; i++) {
939       RADEON_ENC_CS(enc->enc_pic.ctx_buf.reconstructed_pictures[i].luma_offset);
940       RADEON_ENC_CS(enc->enc_pic.ctx_buf.reconstructed_pictures[i].chroma_offset);
941    }
942 
943    RADEON_ENC_CS(enc->enc_pic.ctx_buf.pre_encode_picture_luma_pitch);
944    RADEON_ENC_CS(enc->enc_pic.ctx_buf.pre_encode_picture_chroma_pitch);
945 
946    for (int i = 0; i < RENCODE_MAX_NUM_RECONSTRUCTED_PICTURES; i++) {
947       RADEON_ENC_CS(enc->enc_pic.ctx_buf.pre_encode_reconstructed_pictures[i].luma_offset);
948       RADEON_ENC_CS(enc->enc_pic.ctx_buf.pre_encode_reconstructed_pictures[i].chroma_offset);
949    }
950 
951    RADEON_ENC_CS(enc->enc_pic.ctx_buf.pre_encode_input_picture.yuv.luma_offset);
952    RADEON_ENC_CS(enc->enc_pic.ctx_buf.pre_encode_input_picture.yuv.chroma_offset);
953 
954    RADEON_ENC_CS(enc->enc_pic.ctx_buf.two_pass_search_center_map_offset);
955    RADEON_ENC_END();
956 }
957 
radeon_enc_bitstream(struct radeon_encoder * enc)958 static void radeon_enc_bitstream(struct radeon_encoder *enc)
959 {
960    enc->enc_pic.bit_buf.mode = RENCODE_REC_SWIZZLE_MODE_LINEAR;
961    enc->enc_pic.bit_buf.video_bitstream_buffer_size = enc->bs_size;
962    enc->enc_pic.bit_buf.video_bitstream_data_offset = enc->bs_offset;
963 
964    RADEON_ENC_BEGIN(enc->cmd.bitstream);
965    RADEON_ENC_CS(enc->enc_pic.bit_buf.mode);
966    RADEON_ENC_WRITE(enc->bs_handle, RADEON_DOMAIN_GTT, 0);
967    RADEON_ENC_CS(enc->enc_pic.bit_buf.video_bitstream_buffer_size);
968    RADEON_ENC_CS(enc->enc_pic.bit_buf.video_bitstream_data_offset);
969    RADEON_ENC_END();
970 }
971 
radeon_enc_feedback(struct radeon_encoder * enc)972 static void radeon_enc_feedback(struct radeon_encoder *enc)
973 {
974    enc->enc_pic.fb_buf.mode = RENCODE_FEEDBACK_BUFFER_MODE_LINEAR;
975    enc->enc_pic.fb_buf.feedback_buffer_size = 16;
976    enc->enc_pic.fb_buf.feedback_data_size = 40;
977 
978    RADEON_ENC_BEGIN(enc->cmd.feedback);
979    RADEON_ENC_CS(enc->enc_pic.fb_buf.mode);
980    RADEON_ENC_WRITE(enc->fb->res->buf, enc->fb->res->domains, 0x0);
981    RADEON_ENC_CS(enc->enc_pic.fb_buf.feedback_buffer_size);
982    RADEON_ENC_CS(enc->enc_pic.fb_buf.feedback_data_size);
983    RADEON_ENC_END();
984 }
985 
radeon_enc_intra_refresh(struct radeon_encoder * enc)986 static void radeon_enc_intra_refresh(struct radeon_encoder *enc)
987 {
988    RADEON_ENC_BEGIN(enc->cmd.intra_refresh);
989    RADEON_ENC_CS(enc->enc_pic.intra_refresh.intra_refresh_mode);
990    RADEON_ENC_CS(enc->enc_pic.intra_refresh.offset);
991    RADEON_ENC_CS(enc->enc_pic.intra_refresh.region_size);
992    RADEON_ENC_END();
993 }
994 
radeon_enc_rc_per_pic(struct radeon_encoder * enc)995 static void radeon_enc_rc_per_pic(struct radeon_encoder *enc)
996 {
997    debug_warn_once("Obsoleted rate control is being used due to outdated VCN firmware on system. "
998                    "Updating VCN firmware is highly recommended.");
999    RADEON_ENC_BEGIN(enc->cmd.rc_per_pic);
1000    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.qp_obs);
1001    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.min_qp_app_obs);
1002    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_qp_app_obs);
1003    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_au_size_obs);
1004    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.enabled_filler_data);
1005    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.skip_frame_enable);
1006    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.enforce_hrd);
1007    RADEON_ENC_END();
1008 }
1009 
radeon_enc_rc_per_pic_ex(struct radeon_encoder * enc)1010 static void radeon_enc_rc_per_pic_ex(struct radeon_encoder *enc)
1011 {
1012    RADEON_ENC_BEGIN(enc->cmd.rc_per_pic_ex);
1013    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.qp_i);
1014    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.qp_p);
1015    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.qp_b);
1016    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.min_qp_i);
1017    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_qp_i);
1018    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.min_qp_p);
1019    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_qp_p);
1020    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.min_qp_b);
1021    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_qp_b);
1022    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_au_size_i);
1023    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_au_size_p);
1024    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_au_size_b);
1025    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.enabled_filler_data);
1026    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.skip_frame_enable);
1027    RADEON_ENC_CS(enc->enc_pic.rc_per_pic.enforce_hrd);
1028    RADEON_ENC_END();
1029 }
1030 
radeon_enc_encode_params(struct radeon_encoder * enc)1031 static void radeon_enc_encode_params(struct radeon_encoder *enc)
1032 {
1033    switch (enc->enc_pic.picture_type) {
1034    case PIPE_H2645_ENC_PICTURE_TYPE_I:
1035    case PIPE_H2645_ENC_PICTURE_TYPE_IDR:
1036       enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_I;
1037       break;
1038    case PIPE_H2645_ENC_PICTURE_TYPE_P:
1039       enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_P;
1040       break;
1041    case PIPE_H2645_ENC_PICTURE_TYPE_SKIP:
1042       enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_P_SKIP;
1043       break;
1044    case PIPE_H2645_ENC_PICTURE_TYPE_B:
1045       enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_B;
1046       break;
1047    default:
1048       enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_I;
1049    }
1050 
1051    if (enc->luma->meta_offset)
1052       RADEON_ENC_ERR("DCC surfaces not supported.\n");
1053 
1054    enc->enc_pic.enc_params.input_pic_luma_pitch = enc->luma->u.gfx9.surf_pitch;
1055    enc->enc_pic.enc_params.input_pic_chroma_pitch = enc->chroma ?
1056       enc->chroma->u.gfx9.surf_pitch : enc->luma->u.gfx9.surf_pitch;
1057    enc->enc_pic.enc_params.input_pic_swizzle_mode = enc->luma->u.gfx9.swizzle_mode;
1058 
1059    RADEON_ENC_BEGIN(enc->cmd.enc_params);
1060    RADEON_ENC_CS(enc->enc_pic.enc_params.pic_type);
1061    RADEON_ENC_CS(enc->enc_pic.enc_params.allowed_max_bitstream_size);
1062    RADEON_ENC_READ(enc->handle, RADEON_DOMAIN_VRAM, enc->luma->u.gfx9.surf_offset);
1063    RADEON_ENC_READ(enc->handle, RADEON_DOMAIN_VRAM, enc->chroma ?
1064       enc->chroma->u.gfx9.surf_offset : enc->luma->u.gfx9.surf_pitch);
1065    RADEON_ENC_CS(enc->enc_pic.enc_params.input_pic_luma_pitch);
1066    RADEON_ENC_CS(enc->enc_pic.enc_params.input_pic_chroma_pitch);
1067    RADEON_ENC_CS(enc->enc_pic.enc_params.input_pic_swizzle_mode);
1068    RADEON_ENC_CS(enc->enc_pic.enc_params.reference_picture_index);
1069    RADEON_ENC_CS(enc->enc_pic.enc_params.reconstructed_picture_index);
1070    RADEON_ENC_END();
1071 }
1072 
radeon_enc_encode_params_h264(struct radeon_encoder * enc)1073 static void radeon_enc_encode_params_h264(struct radeon_encoder *enc)
1074 {
1075    enc->enc_pic.h264_enc_params.input_picture_structure = RENCODE_H264_PICTURE_STRUCTURE_FRAME;
1076    enc->enc_pic.h264_enc_params.interlaced_mode = RENCODE_H264_INTERLACING_MODE_PROGRESSIVE;
1077    enc->enc_pic.h264_enc_params.reference_picture_structure = RENCODE_H264_PICTURE_STRUCTURE_FRAME;
1078    enc->enc_pic.h264_enc_params.reference_picture1_index = 0xFFFFFFFF;
1079 
1080    RADEON_ENC_BEGIN(enc->cmd.enc_params_h264);
1081    RADEON_ENC_CS(enc->enc_pic.h264_enc_params.input_picture_structure);
1082    RADEON_ENC_CS(enc->enc_pic.h264_enc_params.interlaced_mode);
1083    RADEON_ENC_CS(enc->enc_pic.h264_enc_params.reference_picture_structure);
1084    RADEON_ENC_CS(enc->enc_pic.h264_enc_params.reference_picture1_index);
1085    RADEON_ENC_END();
1086 }
1087 
radeon_enc_encode_statistics(struct radeon_encoder * enc)1088 static void radeon_enc_encode_statistics(struct radeon_encoder *enc)
1089 {
1090    if (!enc->stats) return;
1091 
1092    enc->enc_pic.enc_statistics.encode_stats_type = RENCODE_STATISTICS_TYPE_0;
1093 
1094    RADEON_ENC_BEGIN(enc->cmd.enc_statistics);
1095    RADEON_ENC_CS(enc->enc_pic.enc_statistics.encode_stats_type);
1096    RADEON_ENC_WRITE(enc->stats, RADEON_DOMAIN_GTT, 0);
1097    RADEON_ENC_END();
1098 }
1099 
radeon_enc_qp_map(struct radeon_encoder * enc)1100 static void radeon_enc_qp_map(struct radeon_encoder *enc)
1101 {
1102    RADEON_ENC_BEGIN(enc->cmd.enc_qp_map);
1103    RADEON_ENC_CS(enc->enc_pic.enc_qp_map.qp_map_type);
1104    if (enc->enc_pic.enc_qp_map.qp_map_type != RENCODE_QP_MAP_TYPE_NONE)
1105       RADEON_ENC_READWRITE(enc->roi->res->buf, enc->roi->res->domains, 0);
1106    else {
1107       RADEON_ENC_CS(0); /* use null for roi buffer */
1108       RADEON_ENC_CS(0); /* use null for roi buffer */
1109    }
1110    RADEON_ENC_CS(0); /* qp_map pitch set to 0 for the ib */
1111    RADEON_ENC_END();
1112 }
1113 
radeon_enc_encode_latency(struct radeon_encoder * enc)1114 static void radeon_enc_encode_latency(struct radeon_encoder *enc)
1115 {
1116    RADEON_ENC_BEGIN(enc->cmd.enc_latency);
1117    RADEON_ENC_CS(enc->enc_pic.enc_latency.encode_latency);
1118    RADEON_ENC_END();
1119 }
1120 
radeon_enc_op_init(struct radeon_encoder * enc)1121 static void radeon_enc_op_init(struct radeon_encoder *enc)
1122 {
1123    RADEON_ENC_BEGIN(RENCODE_IB_OP_INITIALIZE);
1124    RADEON_ENC_END();
1125 }
1126 
radeon_enc_op_close(struct radeon_encoder * enc)1127 static void radeon_enc_op_close(struct radeon_encoder *enc)
1128 {
1129    RADEON_ENC_BEGIN(RENCODE_IB_OP_CLOSE_SESSION);
1130    RADEON_ENC_END();
1131 }
1132 
radeon_enc_op_enc(struct radeon_encoder * enc)1133 static void radeon_enc_op_enc(struct radeon_encoder *enc)
1134 {
1135    RADEON_ENC_BEGIN(RENCODE_IB_OP_ENCODE);
1136    RADEON_ENC_END();
1137 }
1138 
radeon_enc_op_init_rc(struct radeon_encoder * enc)1139 static void radeon_enc_op_init_rc(struct radeon_encoder *enc)
1140 {
1141    RADEON_ENC_BEGIN(RENCODE_IB_OP_INIT_RC);
1142    RADEON_ENC_END();
1143 }
1144 
radeon_enc_op_init_rc_vbv(struct radeon_encoder * enc)1145 static void radeon_enc_op_init_rc_vbv(struct radeon_encoder *enc)
1146 {
1147    RADEON_ENC_BEGIN(RENCODE_IB_OP_INIT_RC_VBV_BUFFER_LEVEL);
1148    RADEON_ENC_END();
1149 }
1150 
radeon_enc_op_preset(struct radeon_encoder * enc)1151 static void radeon_enc_op_preset(struct radeon_encoder *enc)
1152 {
1153    uint32_t preset_mode;
1154 
1155    if (enc->enc_pic.quality_modes.preset_mode == RENCODE_PRESET_MODE_QUALITY)
1156       preset_mode = RENCODE_IB_OP_SET_QUALITY_ENCODING_MODE;
1157    else if (enc->enc_pic.quality_modes.preset_mode == RENCODE_PRESET_MODE_BALANCE)
1158       preset_mode = RENCODE_IB_OP_SET_BALANCE_ENCODING_MODE;
1159    else
1160       preset_mode = RENCODE_IB_OP_SET_SPEED_ENCODING_MODE;
1161 
1162    RADEON_ENC_BEGIN(preset_mode);
1163    RADEON_ENC_END();
1164 }
1165 
begin(struct radeon_encoder * enc)1166 static void begin(struct radeon_encoder *enc)
1167 {
1168    unsigned i;
1169 
1170    enc->session_info(enc);
1171    enc->total_task_size = 0;
1172    enc->task_info(enc, enc->need_feedback);
1173    enc->op_init(enc);
1174 
1175    enc->session_init(enc);
1176    enc->slice_control(enc);
1177    enc->spec_misc(enc);
1178    enc->deblocking_filter(enc);
1179 
1180    enc->layer_control(enc);
1181    enc->rc_session_init(enc);
1182    enc->quality_params(enc);
1183    enc->encode_latency(enc);
1184 
1185    i = 0;
1186    do {
1187       enc->enc_pic.layer_sel.temporal_layer_index = i;
1188       enc->layer_select(enc);
1189       enc->rc_layer_init(enc);
1190       enc->layer_select(enc);
1191       enc->rc_per_pic(enc);
1192    } while (++i < enc->enc_pic.num_temporal_layers);
1193 
1194    enc->op_init_rc(enc);
1195    enc->op_init_rc_vbv(enc);
1196    *enc->p_task_size = (enc->total_task_size);
1197 }
1198 
radeon_enc_headers_h264(struct radeon_encoder * enc)1199 static void radeon_enc_headers_h264(struct radeon_encoder *enc)
1200 {
1201    enc->slice_header(enc);
1202    enc->encode_params(enc);
1203    enc->encode_params_codec_spec(enc);
1204 }
1205 
radeon_enc_headers_hevc(struct radeon_encoder * enc)1206 static void radeon_enc_headers_hevc(struct radeon_encoder *enc)
1207 {
1208    enc->slice_header(enc);
1209    enc->encode_params(enc);
1210    enc->encode_params_codec_spec(enc);
1211 }
1212 
encode(struct radeon_encoder * enc)1213 static void encode(struct radeon_encoder *enc)
1214 {
1215    unsigned i;
1216 
1217    enc->before_encode(enc);
1218    enc->session_info(enc);
1219    enc->total_task_size = 0;
1220    enc->task_info(enc, enc->need_feedback);
1221 
1222    if (enc->need_rate_control || enc->need_rc_per_pic) {
1223       i = 0;
1224       do {
1225          enc->enc_pic.layer_sel.temporal_layer_index = i;
1226          if (enc->need_rate_control) {
1227             enc->layer_select(enc);
1228             enc->rc_layer_init(enc);
1229          }
1230          if (enc->need_rc_per_pic) {
1231             enc->layer_select(enc);
1232             enc->rc_per_pic(enc);
1233          }
1234       } while (++i < enc->enc_pic.num_temporal_layers);
1235    }
1236 
1237    enc->enc_pic.layer_sel.temporal_layer_index = enc->enc_pic.temporal_id;
1238    enc->layer_select(enc);
1239 
1240    enc->encode_headers(enc);
1241    enc->ctx(enc);
1242    enc->bitstream(enc);
1243    enc->feedback(enc);
1244    enc->intra_refresh(enc);
1245    enc->qp_map(enc);
1246 
1247    enc->op_preset(enc);
1248    enc->op_enc(enc);
1249    *enc->p_task_size = (enc->total_task_size);
1250 }
1251 
destroy(struct radeon_encoder * enc)1252 static void destroy(struct radeon_encoder *enc)
1253 {
1254    enc->session_info(enc);
1255    enc->total_task_size = 0;
1256    enc->task_info(enc, enc->need_feedback);
1257    enc->op_close(enc);
1258    *enc->p_task_size = (enc->total_task_size);
1259 }
1260 
radeon_enc_1_2_init(struct radeon_encoder * enc)1261 void radeon_enc_1_2_init(struct radeon_encoder *enc)
1262 {
1263    enc->before_encode = radeon_enc_dummy;
1264    enc->begin = begin;
1265    enc->encode = encode;
1266    enc->destroy = destroy;
1267    enc->session_info = radeon_enc_session_info;
1268    enc->task_info = radeon_enc_task_info;
1269    enc->layer_control = radeon_enc_layer_control;
1270    enc->layer_select = radeon_enc_layer_select;
1271    enc->rc_session_init = radeon_enc_rc_session_init;
1272    enc->rc_layer_init = radeon_enc_rc_layer_init;
1273    enc->quality_params = radeon_enc_quality_params;
1274    enc->ctx = radeon_enc_ctx;
1275    enc->bitstream = radeon_enc_bitstream;
1276    enc->feedback = radeon_enc_feedback;
1277    enc->intra_refresh = radeon_enc_intra_refresh;
1278    if (enc->enc_pic.use_rc_per_pic_ex == true)
1279       enc->rc_per_pic = radeon_enc_rc_per_pic_ex;
1280    else
1281       enc->rc_per_pic = radeon_enc_rc_per_pic;
1282    enc->encode_params = radeon_enc_encode_params;
1283    enc->op_init = radeon_enc_op_init;
1284    enc->op_close = radeon_enc_op_close;
1285    enc->op_enc = radeon_enc_op_enc;
1286    enc->op_init_rc = radeon_enc_op_init_rc;
1287    enc->op_init_rc_vbv = radeon_enc_op_init_rc_vbv;
1288    enc->op_preset = radeon_enc_op_preset;
1289    enc->session_init = radeon_enc_session_init;
1290    enc->encode_statistics = radeon_enc_encode_statistics;
1291    enc->qp_map = radeon_enc_qp_map;
1292    enc->encode_latency = radeon_enc_encode_latency;
1293 
1294    if (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_MPEG4_AVC) {
1295       enc->slice_control = radeon_enc_slice_control;
1296       enc->spec_misc = radeon_enc_spec_misc;
1297       enc->deblocking_filter = radeon_enc_deblocking_filter_h264;
1298       enc->slice_header = radeon_enc_slice_header;
1299       enc->encode_params_codec_spec = radeon_enc_encode_params_h264;
1300       enc->encode_headers = radeon_enc_headers_h264;
1301    } else if (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_HEVC) {
1302       enc->slice_control = radeon_enc_slice_control_hevc;
1303       enc->spec_misc = radeon_enc_spec_misc_hevc;
1304       enc->deblocking_filter = radeon_enc_deblocking_filter_hevc;
1305       enc->slice_header = radeon_enc_slice_header_hevc;
1306       enc->encode_headers = radeon_enc_headers_hevc;
1307       enc->encode_params_codec_spec = radeon_enc_dummy;
1308    }
1309 
1310    enc->enc_pic.session_info.interface_version =
1311       ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) |
1312        (RENCODE_FW_INTERFACE_MINOR_VERSION << RENCODE_IF_MINOR_VERSION_SHIFT));
1313 }
1314