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