1 /************************************************************************** 2 * 3 * Copyright 2017 Advanced Micro Devices, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 #include <stdio.h> 29 30 #include "pipe/p_video_codec.h" 31 32 #include "util/u_video.h" 33 #include "util/u_memory.h" 34 35 #include "vl/vl_video_buffer.h" 36 37 #include "r600_pipe_common.h" 38 #include "radeon_video.h" 39 #include "radeon_vcn_enc.h" 40 41 #define RADEON_ENC_CS(value) (enc->cs->current.buf[enc->cs->current.cdw++] = (value)) 42 #define RADEON_ENC_BEGIN(cmd) { \ 43 uint32_t *begin = &enc->cs->current.buf[enc->cs->current.cdw++]; \ 44 RADEON_ENC_CS(cmd) 45 #define RADEON_ENC_READ(buf, domain, off) radeon_enc_add_buffer(enc, (buf), RADEON_USAGE_READ, (domain), (off)) 46 #define RADEON_ENC_WRITE(buf, domain, off) radeon_enc_add_buffer(enc, (buf), RADEON_USAGE_WRITE, (domain), (off)) 47 #define RADEON_ENC_READWRITE(buf, domain, off) radeon_enc_add_buffer(enc, (buf), RADEON_USAGE_READWRITE, (domain), (off)) 48 #define RADEON_ENC_END() *begin = (&enc->cs->current.buf[enc->cs->current.cdw] - begin) * 4; \ 49 enc->total_task_size += *begin;} 50 51 static const unsigned profiles[7] = { 66, 77, 88, 100, 110, 122, 244 }; 52 static const unsigned index_to_shifts[4] = {24, 16, 8, 0}; 53 54 static void radeon_enc_add_buffer(struct radeon_encoder *enc, struct pb_buffer *buf, 55 enum radeon_bo_usage usage, enum radeon_bo_domain domain, 56 signed offset) 57 { 58 enc->ws->cs_add_buffer(enc->cs, buf, usage | RADEON_USAGE_SYNCHRONIZED, 59 domain, RADEON_PRIO_VCE); 60 uint64_t addr; 61 addr = enc->ws->buffer_get_virtual_address(buf); 62 addr = addr + offset; 63 RADEON_ENC_CS(addr >> 32); 64 RADEON_ENC_CS(addr); 65 } 66 67 static void radeon_enc_set_emulation_prevention(struct radeon_encoder *enc, bool set) 68 { 69 if (set != enc->emulation_prevention) { 70 enc->emulation_prevention = set; 71 enc->num_zeros = 0; 72 } 73 } 74 75 static void radeon_enc_output_one_byte(struct radeon_encoder *enc, unsigned char byte) 76 { 77 if (enc->byte_index == 0) 78 enc->cs->current.buf[enc->cs->current.cdw] = 0; 79 enc->cs->current.buf[enc->cs->current.cdw] |= ((unsigned int)(byte) << index_to_shifts[enc->byte_index]); 80 enc->byte_index++; 81 82 if (enc->byte_index >= 4) { 83 enc->byte_index = 0; 84 enc->cs->current.cdw++; 85 } 86 } 87 88 static void radeon_enc_emulation_prevention(struct radeon_encoder *enc, unsigned char byte) 89 { 90 if(enc->emulation_prevention) { 91 if((enc->num_zeros >= 2) && ((byte == 0x00) || (byte == 0x01) || (byte == 0x03))) { 92 radeon_enc_output_one_byte(enc, 0x03); 93 enc->bits_output += 8; 94 enc->num_zeros = 0; 95 } 96 enc->num_zeros = (byte == 0 ? (enc->num_zeros + 1) : 0); 97 } 98 } 99 100 static void radeon_enc_code_fixed_bits(struct radeon_encoder *enc, unsigned int value, unsigned int num_bits) 101 { 102 unsigned int bits_to_pack = 0; 103 104 while(num_bits > 0) { 105 unsigned int value_to_pack = value & (0xffffffff >> (32 - num_bits)); 106 bits_to_pack = num_bits > (32 - enc->bits_in_shifter) ? (32 - enc->bits_in_shifter) : num_bits; 107 108 if (bits_to_pack < num_bits) 109 value_to_pack = value_to_pack >> (num_bits - bits_to_pack); 110 111 enc->shifter |= value_to_pack << (32 - enc->bits_in_shifter - bits_to_pack); 112 num_bits -= bits_to_pack; 113 enc->bits_in_shifter += bits_to_pack; 114 115 while(enc->bits_in_shifter >= 8) { 116 unsigned char output_byte = (unsigned char)(enc->shifter >> 24); 117 enc->shifter <<= 8; 118 radeon_enc_emulation_prevention(enc, output_byte); 119 radeon_enc_output_one_byte(enc, output_byte); 120 enc->bits_in_shifter -= 8; 121 enc->bits_output += 8; 122 } 123 } 124 } 125 126 static void radeon_enc_reset(struct radeon_encoder *enc) 127 { 128 enc->emulation_prevention = false; 129 enc->shifter = 0; 130 enc->bits_in_shifter = 0; 131 enc->bits_output = 0; 132 enc->num_zeros = 0; 133 enc->byte_index = 0; 134 } 135 136 static void radeon_enc_byte_align(struct radeon_encoder *enc) 137 { 138 unsigned int num_padding_zeros = (32 - enc->bits_in_shifter) % 8; 139 140 if (num_padding_zeros > 0) 141 radeon_enc_code_fixed_bits(enc, 0, num_padding_zeros); 142 } 143 144 static void radeon_enc_flush_headers(struct radeon_encoder *enc) 145 { 146 if (enc->bits_in_shifter != 0) { 147 unsigned char output_byte = (unsigned char)(enc->shifter >> 24); 148 radeon_enc_emulation_prevention(enc, output_byte); 149 radeon_enc_output_one_byte(enc, output_byte); 150 enc->bits_output += enc->bits_in_shifter; 151 enc->shifter = 0; 152 enc->bits_in_shifter = 0; 153 enc->num_zeros = 0; 154 } 155 156 if (enc->byte_index > 0) { 157 enc->cs->current.cdw++; 158 enc->byte_index = 0; 159 } 160 } 161 162 static void radeon_enc_code_ue(struct radeon_encoder *enc, unsigned int value) 163 { 164 int x = -1; 165 unsigned int ue_code = value + 1; 166 value += 1; 167 168 while (value) { 169 value = (value >> 1); 170 x += 1; 171 } 172 173 unsigned int ue_length = (x << 1) + 1; 174 radeon_enc_code_fixed_bits(enc, ue_code, ue_length); 175 } 176 177 static void radeon_enc_code_se(struct radeon_encoder *enc, int value) 178 { 179 unsigned int v = 0; 180 181 if (value != 0) 182 v = (value < 0 ? ((unsigned int)(0 - value) << 1) : (((unsigned int)(value) << 1) - 1)); 183 184 radeon_enc_code_ue(enc, v); 185 } 186 187 static void radeon_enc_session_info(struct radeon_encoder *enc) 188 { 189 unsigned int interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) | 190 (RENCODE_FW_INTERFACE_MINOR_VERSION << RENCODE_IF_MINOR_VERSION_SHIFT)); 191 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_SESSION_INFO); 192 RADEON_ENC_CS(interface_version); 193 RADEON_ENC_READWRITE(enc->si->res->buf, enc->si->res->domains, 0x0); 194 RADEON_ENC_END(); 195 } 196 197 static void radeon_enc_task_info(struct radeon_encoder *enc, bool need_feedback) 198 { 199 enc->enc_pic.task_info.task_id++; 200 201 if (need_feedback) 202 enc->enc_pic.task_info.allowed_max_num_feedbacks = 1; 203 else 204 enc->enc_pic.task_info.allowed_max_num_feedbacks = 0; 205 206 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_TASK_INFO); 207 enc->p_task_size = &enc->cs->current.buf[enc->cs->current.cdw++]; 208 RADEON_ENC_CS(enc->enc_pic.task_info.task_id); 209 RADEON_ENC_CS(enc->enc_pic.task_info.allowed_max_num_feedbacks); 210 RADEON_ENC_END(); 211 } 212 213 static void radeon_enc_session_init(struct radeon_encoder *enc) 214 { 215 enc->enc_pic.session_init.encode_standard = RENCODE_ENCODE_STANDARD_H264; 216 enc->enc_pic.session_init.aligned_picture_width = align(enc->base.width, 16); 217 enc->enc_pic.session_init.aligned_picture_height = align(enc->base.height, 16); 218 enc->enc_pic.session_init.padding_width = enc->enc_pic.session_init.aligned_picture_width - enc->base.width; 219 enc->enc_pic.session_init.padding_height = enc->enc_pic.session_init.aligned_picture_height - enc->base.height; 220 enc->enc_pic.session_init.pre_encode_mode = RENCODE_PREENCODE_MODE_NONE; 221 enc->enc_pic.session_init.pre_encode_chroma_enabled = false; 222 223 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_SESSION_INIT); 224 RADEON_ENC_CS(enc->enc_pic.session_init.encode_standard); 225 RADEON_ENC_CS(enc->enc_pic.session_init.aligned_picture_width); 226 RADEON_ENC_CS(enc->enc_pic.session_init.aligned_picture_height); 227 RADEON_ENC_CS(enc->enc_pic.session_init.padding_width); 228 RADEON_ENC_CS(enc->enc_pic.session_init.padding_height); 229 RADEON_ENC_CS(enc->enc_pic.session_init.pre_encode_mode); 230 RADEON_ENC_CS(enc->enc_pic.session_init.pre_encode_chroma_enabled); 231 RADEON_ENC_END(); 232 } 233 234 static void radeon_enc_layer_control(struct radeon_encoder *enc) 235 { 236 enc->enc_pic.layer_ctrl.max_num_temporal_layers = 1; 237 enc->enc_pic.layer_ctrl.num_temporal_layers = 1; 238 239 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_LAYER_CONTROL); 240 RADEON_ENC_CS(enc->enc_pic.layer_ctrl.max_num_temporal_layers); 241 RADEON_ENC_CS(enc->enc_pic.layer_ctrl.num_temporal_layers); 242 RADEON_ENC_END(); 243 } 244 245 static void radeon_enc_layer_select(struct radeon_encoder *enc) 246 { 247 enc->enc_pic.layer_sel.temporal_layer_index = 0; 248 249 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_LAYER_SELECT); 250 RADEON_ENC_CS(enc->enc_pic.layer_sel.temporal_layer_index); 251 RADEON_ENC_END(); 252 } 253 254 static void radeon_enc_slice_control(struct radeon_encoder *enc) 255 { 256 enc->enc_pic.slice_ctrl.slice_control_mode = RENCODE_H264_SLICE_CONTROL_MODE_FIXED_MBS; 257 enc->enc_pic.slice_ctrl.num_mbs_per_slice = align(enc->base.width, 16) / 16 * align(enc->base.height, 16) / 16; 258 259 RADEON_ENC_BEGIN(RENCODE_H264_IB_PARAM_SLICE_CONTROL); 260 RADEON_ENC_CS(enc->enc_pic.slice_ctrl.slice_control_mode); 261 RADEON_ENC_CS(enc->enc_pic.slice_ctrl.num_mbs_per_slice); 262 RADEON_ENC_END(); 263 } 264 265 static void radeon_enc_spec_misc(struct radeon_encoder *enc) 266 { 267 enc->enc_pic.spec_misc.constrained_intra_pred_flag = 0; 268 enc->enc_pic.spec_misc.cabac_enable = 0; 269 enc->enc_pic.spec_misc.cabac_init_idc = 0; 270 enc->enc_pic.spec_misc.half_pel_enabled = 1; 271 enc->enc_pic.spec_misc.quarter_pel_enabled = 1; 272 enc->enc_pic.spec_misc.profile_idc = profiles[enc->base.profile - PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE]; 273 enc->enc_pic.spec_misc.level_idc = enc->base.level; 274 275 RADEON_ENC_BEGIN(RENCODE_H264_IB_PARAM_SPEC_MISC); 276 RADEON_ENC_CS(enc->enc_pic.spec_misc.constrained_intra_pred_flag); 277 RADEON_ENC_CS(enc->enc_pic.spec_misc.cabac_enable); 278 RADEON_ENC_CS(enc->enc_pic.spec_misc.cabac_init_idc); 279 RADEON_ENC_CS(enc->enc_pic.spec_misc.half_pel_enabled); 280 RADEON_ENC_CS(enc->enc_pic.spec_misc.quarter_pel_enabled); 281 RADEON_ENC_CS(enc->enc_pic.spec_misc.profile_idc); 282 RADEON_ENC_CS(enc->enc_pic.spec_misc.level_idc); 283 RADEON_ENC_END(); 284 } 285 286 static void radeon_enc_rc_session_init(struct radeon_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 287 { 288 switch(pic->rate_ctrl.rate_ctrl_method) { 289 case PIPE_H264_ENC_RATE_CONTROL_METHOD_DISABLE: 290 enc->enc_pic.rc_session_init.rate_control_method = RENCODE_RATE_CONTROL_METHOD_NONE; 291 break; 292 case PIPE_H264_ENC_RATE_CONTROL_METHOD_CONSTANT_SKIP: 293 case PIPE_H264_ENC_RATE_CONTROL_METHOD_CONSTANT: 294 enc->enc_pic.rc_session_init.rate_control_method = RENCODE_RATE_CONTROL_METHOD_CBR; 295 break; 296 case PIPE_H264_ENC_RATE_CONTROL_METHOD_VARIABLE_SKIP: 297 case PIPE_H264_ENC_RATE_CONTROL_METHOD_VARIABLE: 298 enc->enc_pic.rc_session_init.rate_control_method = RENCODE_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR; 299 break; 300 default: 301 enc->enc_pic.rc_session_init.rate_control_method = RENCODE_RATE_CONTROL_METHOD_NONE; 302 } 303 304 enc->enc_pic.rc_session_init.vbv_buffer_level = pic->rate_ctrl.vbv_buf_lv; 305 306 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_RATE_CONTROL_SESSION_INIT); 307 RADEON_ENC_CS(enc->enc_pic.rc_session_init.rate_control_method); 308 RADEON_ENC_CS(enc->enc_pic.rc_session_init.vbv_buffer_level); 309 RADEON_ENC_END(); 310 } 311 312 static void radeon_enc_rc_layer_init(struct radeon_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 313 { 314 enc->enc_pic.rc_layer_init.target_bit_rate = pic->rate_ctrl.target_bitrate; 315 enc->enc_pic.rc_layer_init.peak_bit_rate = pic->rate_ctrl.peak_bitrate; 316 enc->enc_pic.rc_layer_init.frame_rate_num = pic->rate_ctrl.frame_rate_num; 317 enc->enc_pic.rc_layer_init.frame_rate_den = pic->rate_ctrl.frame_rate_den; 318 enc->enc_pic.rc_layer_init.vbv_buffer_size = pic->rate_ctrl.vbv_buffer_size; 319 enc->enc_pic.rc_layer_init.avg_target_bits_per_picture = pic->rate_ctrl.target_bits_picture; 320 enc->enc_pic.rc_layer_init.peak_bits_per_picture_integer = pic->rate_ctrl.peak_bits_picture_integer; 321 enc->enc_pic.rc_layer_init.peak_bits_per_picture_fractional = pic->rate_ctrl.peak_bits_picture_fraction; 322 323 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_RATE_CONTROL_LAYER_INIT); 324 RADEON_ENC_CS(enc->enc_pic.rc_layer_init.target_bit_rate); 325 RADEON_ENC_CS(enc->enc_pic.rc_layer_init.peak_bit_rate); 326 RADEON_ENC_CS(enc->enc_pic.rc_layer_init.frame_rate_num); 327 RADEON_ENC_CS(enc->enc_pic.rc_layer_init.frame_rate_den); 328 RADEON_ENC_CS(enc->enc_pic.rc_layer_init.vbv_buffer_size); 329 RADEON_ENC_CS(enc->enc_pic.rc_layer_init.avg_target_bits_per_picture); 330 RADEON_ENC_CS(enc->enc_pic.rc_layer_init.peak_bits_per_picture_integer); 331 RADEON_ENC_CS(enc->enc_pic.rc_layer_init.peak_bits_per_picture_fractional); 332 RADEON_ENC_END(); 333 } 334 335 static void radeon_enc_deblocking_filter_h264(struct radeon_encoder *enc) 336 { 337 enc->enc_pic.h264_deblock.disable_deblocking_filter_idc = 0; 338 enc->enc_pic.h264_deblock.alpha_c0_offset_div2 = 0; 339 enc->enc_pic.h264_deblock.beta_offset_div2 = 0; 340 enc->enc_pic.h264_deblock.cb_qp_offset = 0; 341 enc->enc_pic.h264_deblock.cr_qp_offset = 0; 342 343 RADEON_ENC_BEGIN(RENCODE_H264_IB_PARAM_DEBLOCKING_FILTER); 344 RADEON_ENC_CS(enc->enc_pic.h264_deblock.disable_deblocking_filter_idc); 345 RADEON_ENC_CS(enc->enc_pic.h264_deblock.alpha_c0_offset_div2); 346 RADEON_ENC_CS(enc->enc_pic.h264_deblock.beta_offset_div2); 347 RADEON_ENC_CS(enc->enc_pic.h264_deblock.cb_qp_offset); 348 RADEON_ENC_CS(enc->enc_pic.h264_deblock.cr_qp_offset); 349 RADEON_ENC_END(); 350 } 351 352 static void radeon_enc_quality_params(struct radeon_encoder *enc) 353 { 354 enc->enc_pic.quality_params.vbaq_mode = 0; 355 enc->enc_pic.quality_params.scene_change_sensitivity = 0; 356 enc->enc_pic.quality_params.scene_change_min_idr_interval = 0; 357 358 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_QUALITY_PARAMS); 359 RADEON_ENC_CS(enc->enc_pic.quality_params.vbaq_mode); 360 RADEON_ENC_CS(enc->enc_pic.quality_params.scene_change_sensitivity); 361 RADEON_ENC_CS(enc->enc_pic.quality_params.scene_change_min_idr_interval); 362 RADEON_ENC_END(); 363 } 364 365 static void radeon_enc_nalu_sps(struct radeon_encoder *enc) 366 { 367 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_DIRECT_OUTPUT_NALU); 368 RADEON_ENC_CS(RENCODE_DIRECT_OUTPUT_NALU_TYPE_SPS); 369 uint32_t *size_in_bytes = &enc->cs->current.buf[enc->cs->current.cdw++]; 370 radeon_enc_reset(enc); 371 radeon_enc_set_emulation_prevention(enc, false); 372 radeon_enc_code_fixed_bits(enc, 0x00000001, 32); 373 radeon_enc_code_fixed_bits(enc, 0x67, 8); 374 radeon_enc_byte_align(enc); 375 radeon_enc_set_emulation_prevention(enc, true); 376 radeon_enc_code_fixed_bits(enc, enc->enc_pic.spec_misc.profile_idc, 8); 377 radeon_enc_code_fixed_bits(enc, 0x44, 8); //hardcode to constrained baseline 378 radeon_enc_code_fixed_bits(enc, enc->enc_pic.spec_misc.level_idc, 8); 379 radeon_enc_code_ue(enc, 0x0); 380 381 if(enc->enc_pic.spec_misc.profile_idc == 100 || enc->enc_pic.spec_misc.profile_idc == 110 || enc->enc_pic.spec_misc.profile_idc == 122 || 382 enc->enc_pic.spec_misc.profile_idc == 244 || enc->enc_pic.spec_misc.profile_idc == 44 || enc->enc_pic.spec_misc.profile_idc == 83 || 383 enc->enc_pic.spec_misc.profile_idc == 86 || enc->enc_pic.spec_misc.profile_idc == 118 || enc->enc_pic.spec_misc.profile_idc == 128 || 384 enc->enc_pic.spec_misc.profile_idc == 138) { 385 radeon_enc_code_ue(enc, 0x1); 386 radeon_enc_code_ue(enc, 0x0); 387 radeon_enc_code_ue(enc, 0x0); 388 radeon_enc_code_fixed_bits(enc, 0x0, 2); 389 } 390 391 radeon_enc_code_ue(enc, 1); 392 radeon_enc_code_ue(enc, enc->enc_pic.pic_order_cnt_type); 393 394 if (enc->enc_pic.pic_order_cnt_type == 0) 395 radeon_enc_code_ue(enc, 1); 396 397 radeon_enc_code_ue(enc, (enc->base.max_references + 1)); 398 radeon_enc_code_fixed_bits(enc, enc->enc_pic.layer_ctrl.max_num_temporal_layers > 1 ? 0x1 : 0x0, 1); 399 radeon_enc_code_ue(enc, (enc->enc_pic.session_init.aligned_picture_width / 16 - 1)); 400 radeon_enc_code_ue(enc, (enc->enc_pic.session_init.aligned_picture_height / 16 - 1)); 401 bool progressive_only = true; 402 radeon_enc_code_fixed_bits(enc, progressive_only ? 0x1 : 0x0, 1); 403 404 if (!progressive_only) 405 radeon_enc_code_fixed_bits(enc, 0x0, 1); 406 407 radeon_enc_code_fixed_bits(enc, 0x1, 1); 408 409 if ((enc->enc_pic.crop_left != 0) || (enc->enc_pic.crop_right != 0) || 410 (enc->enc_pic.crop_top != 0) || (enc->enc_pic.crop_bottom != 0)) { 411 radeon_enc_code_fixed_bits(enc, 0x1, 1); 412 radeon_enc_code_ue(enc, enc->enc_pic.crop_left); 413 radeon_enc_code_ue(enc, enc->enc_pic.crop_right); 414 radeon_enc_code_ue(enc, enc->enc_pic.crop_top); 415 radeon_enc_code_ue(enc, enc->enc_pic.crop_bottom); 416 } else 417 radeon_enc_code_fixed_bits(enc, 0x0, 1); 418 419 radeon_enc_code_fixed_bits(enc, 0x1, 1); 420 radeon_enc_code_fixed_bits(enc, 0x0, 1); 421 radeon_enc_code_fixed_bits(enc, 0x0, 1); 422 radeon_enc_code_fixed_bits(enc, 0x0, 1); 423 radeon_enc_code_fixed_bits(enc, 0x0, 1); 424 radeon_enc_code_fixed_bits(enc, 0x0, 1); 425 radeon_enc_code_fixed_bits(enc, 0x0, 1); 426 radeon_enc_code_fixed_bits(enc, 0x0, 1); 427 radeon_enc_code_fixed_bits(enc, 0x0, 1); 428 radeon_enc_code_fixed_bits(enc, 0x1, 1); 429 radeon_enc_code_fixed_bits(enc, 0x1, 1); 430 radeon_enc_code_ue(enc, 0x0); 431 radeon_enc_code_ue(enc, 0x0); 432 radeon_enc_code_ue(enc, 16); 433 radeon_enc_code_ue(enc, 16); 434 radeon_enc_code_ue(enc, 0x0); 435 radeon_enc_code_ue(enc, (enc->base.max_references + 1)); 436 437 radeon_enc_code_fixed_bits(enc, 0x1, 1); 438 439 radeon_enc_byte_align(enc); 440 radeon_enc_flush_headers(enc); 441 *size_in_bytes = (enc->bits_output + 7) / 8; 442 RADEON_ENC_END(); 443 } 444 445 static void radeon_enc_nalu_pps(struct radeon_encoder *enc) 446 { 447 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_DIRECT_OUTPUT_NALU); 448 RADEON_ENC_CS(RENCODE_DIRECT_OUTPUT_NALU_TYPE_PPS); 449 uint32_t *size_in_bytes = &enc->cs->current.buf[enc->cs->current.cdw++]; 450 radeon_enc_reset(enc); 451 radeon_enc_set_emulation_prevention(enc, false); 452 radeon_enc_code_fixed_bits(enc, 0x00000001, 32); 453 radeon_enc_code_fixed_bits(enc, 0x68, 8); 454 radeon_enc_byte_align(enc); 455 radeon_enc_set_emulation_prevention(enc, true); 456 radeon_enc_code_ue(enc, 0x0); 457 radeon_enc_code_ue(enc, 0x0); 458 radeon_enc_code_fixed_bits(enc, (enc->enc_pic.spec_misc.cabac_enable ? 0x1 : 0x0), 1); 459 radeon_enc_code_fixed_bits(enc, 0x0, 1); 460 radeon_enc_code_ue(enc, 0x0); 461 radeon_enc_code_ue(enc, 0x0); 462 radeon_enc_code_ue(enc, 0x0); 463 radeon_enc_code_fixed_bits(enc, 0x0, 1); 464 radeon_enc_code_fixed_bits(enc, 0x0, 2); 465 radeon_enc_code_se(enc, 0x0); 466 radeon_enc_code_se(enc, 0x0); 467 radeon_enc_code_se(enc, 0x0); 468 radeon_enc_code_fixed_bits(enc, 0x1, 1); 469 radeon_enc_code_fixed_bits(enc, 0x0, 1); 470 radeon_enc_code_fixed_bits(enc, 0x0, 1); 471 472 radeon_enc_code_fixed_bits(enc, 0x1, 1); 473 474 radeon_enc_byte_align(enc); 475 radeon_enc_flush_headers(enc); 476 *size_in_bytes = (enc->bits_output + 7) / 8; 477 RADEON_ENC_END(); 478 } 479 480 static void radeon_enc_slice_header(struct radeon_encoder *enc) 481 { 482 uint32_t instruction[RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS] = {0}; 483 uint32_t num_bits[RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS] = {0}; 484 unsigned int inst_index = 0; 485 unsigned int bit_index = 0; 486 unsigned int bits_copied = 0; 487 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_SLICE_HEADER); 488 radeon_enc_reset(enc); 489 radeon_enc_set_emulation_prevention(enc, false); 490 491 if (enc->enc_pic.is_idr) 492 radeon_enc_code_fixed_bits(enc, 0x65, 8); 493 else if (enc->enc_pic.not_referenced) 494 radeon_enc_code_fixed_bits(enc, 0x01, 8); 495 else 496 radeon_enc_code_fixed_bits(enc, 0x41, 8); 497 498 radeon_enc_flush_headers(enc); 499 bit_index ++; 500 instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY; 501 num_bits[inst_index] = enc->bits_output - bits_copied; 502 bits_copied = enc->bits_output; 503 inst_index++; 504 505 instruction[inst_index] = RENCODE_H264_HEADER_INSTRUCTION_FIRST_MB; 506 inst_index++; 507 508 switch(enc->enc_pic.picture_type) { 509 case PIPE_H264_ENC_PICTURE_TYPE_I: 510 case PIPE_H264_ENC_PICTURE_TYPE_IDR: 511 radeon_enc_code_fixed_bits(enc, 0x08, 7); 512 break; 513 case PIPE_H264_ENC_PICTURE_TYPE_P: 514 case PIPE_H264_ENC_PICTURE_TYPE_SKIP: 515 radeon_enc_code_fixed_bits(enc, 0x06, 5); 516 break; 517 case PIPE_H264_ENC_PICTURE_TYPE_B: 518 radeon_enc_code_fixed_bits(enc, 0x07, 5); 519 break; 520 default: 521 radeon_enc_code_fixed_bits(enc, 0x08, 7); 522 } 523 524 radeon_enc_code_ue(enc, 0x0); 525 radeon_enc_code_fixed_bits(enc, enc->enc_pic.frame_num % 32, 5); 526 527 if (enc->enc_pic.h264_enc_params.input_picture_structure != RENCODE_H264_PICTURE_STRUCTURE_FRAME) { 528 radeon_enc_code_fixed_bits(enc, 0x1, 1); 529 radeon_enc_code_fixed_bits(enc, enc->enc_pic.h264_enc_params.input_picture_structure == RENCODE_H264_PICTURE_STRUCTURE_BOTTOM_FIELD ? 1 : 0, 1); 530 } 531 532 if (enc->enc_pic.is_idr) 533 radeon_enc_code_ue(enc, enc->enc_pic.is_even_frame); 534 535 enc->enc_pic.is_even_frame = !enc->enc_pic.is_even_frame; 536 537 if (enc->enc_pic.pic_order_cnt_type == 0) 538 radeon_enc_code_fixed_bits(enc, enc->enc_pic.pic_order_cnt % 32, 5); 539 540 if (enc->enc_pic.picture_type != PIPE_H264_ENC_PICTURE_TYPE_IDR) { 541 radeon_enc_code_fixed_bits(enc, 0x0, 1); 542 543 if (enc->enc_pic.frame_num - enc->enc_pic.ref_idx_l0 > 1) { 544 radeon_enc_code_fixed_bits(enc, 0x1, 1); 545 radeon_enc_code_ue(enc, 0x0); 546 radeon_enc_code_ue(enc, (enc->enc_pic.frame_num - enc->enc_pic.ref_idx_l0 - 1)); 547 radeon_enc_code_ue(enc, 0x3); 548 } else 549 radeon_enc_code_fixed_bits(enc, 0x0, 1); 550 } 551 552 if (enc->enc_pic.is_idr) { 553 radeon_enc_code_fixed_bits(enc, 0x0, 1); 554 radeon_enc_code_fixed_bits(enc, 0x0, 1); 555 } else 556 radeon_enc_code_fixed_bits(enc, 0x0, 1); 557 558 if ((enc->enc_pic.picture_type != PIPE_H264_ENC_PICTURE_TYPE_IDR) && (enc->enc_pic.spec_misc.cabac_enable)) 559 radeon_enc_code_ue(enc, enc->enc_pic.spec_misc.cabac_init_idc); 560 561 radeon_enc_flush_headers(enc); 562 bit_index ++; 563 instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY; 564 num_bits[inst_index] = enc->bits_output - bits_copied; 565 bits_copied = enc->bits_output; 566 inst_index++; 567 568 instruction[inst_index] = RENCODE_H264_HEADER_INSTRUCTION_SLICE_QP_DELTA; 569 inst_index++; 570 571 radeon_enc_code_ue(enc, enc->enc_pic.h264_deblock.disable_deblocking_filter_idc ? 1: 0); 572 573 if (!enc->enc_pic.h264_deblock.disable_deblocking_filter_idc) { 574 radeon_enc_code_se(enc, enc->enc_pic.h264_deblock.alpha_c0_offset_div2); 575 radeon_enc_code_se(enc, enc->enc_pic.h264_deblock.beta_offset_div2); 576 } 577 578 radeon_enc_flush_headers(enc); 579 bit_index ++; 580 instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY; 581 num_bits[inst_index] = enc->bits_output - bits_copied; 582 bits_copied = enc->bits_output; 583 inst_index++; 584 585 instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_END; 586 587 for (int i = bit_index; i < RENCODE_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS; i++) 588 RADEON_ENC_CS(0x00000000); 589 590 for (int j = 0; j < RENCODE_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS; j++) { 591 RADEON_ENC_CS(instruction[j]); 592 RADEON_ENC_CS(num_bits[j]); 593 } 594 595 RADEON_ENC_END(); 596 } 597 598 static void radeon_enc_ctx(struct radeon_encoder *enc) 599 { 600 enc->enc_pic.ctx_buf.swizzle_mode = 0; 601 enc->enc_pic.ctx_buf.rec_luma_pitch = align(enc->base.width, enc->alignment); 602 enc->enc_pic.ctx_buf.rec_chroma_pitch = align(enc->base.width, enc->alignment); 603 enc->enc_pic.ctx_buf.num_reconstructed_pictures = 2; 604 605 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_ENCODE_CONTEXT_BUFFER); 606 RADEON_ENC_READWRITE(enc->cpb.res->buf, enc->cpb.res->domains, 0); 607 RADEON_ENC_CS(enc->enc_pic.ctx_buf.swizzle_mode); 608 RADEON_ENC_CS(enc->enc_pic.ctx_buf.rec_luma_pitch); 609 RADEON_ENC_CS(enc->enc_pic.ctx_buf.rec_chroma_pitch); 610 RADEON_ENC_CS(enc->enc_pic.ctx_buf.num_reconstructed_pictures); 611 /* reconstructed_picture_1_luma_offset */ 612 RADEON_ENC_CS(0x00000000); 613 /* reconstructed_picture_1_chroma_offset */ 614 RADEON_ENC_CS(align(enc->base.width, enc->alignment) * align(enc->base.height, 16)); 615 /* reconstructed_picture_2_luma_offset */ 616 RADEON_ENC_CS(align(enc->base.width, enc->alignment) * align(enc->base.height, 16) * 3 / 2); 617 /* reconstructed_picture_2_chroma_offset */ 618 RADEON_ENC_CS(align(enc->base.width, enc->alignment) * align(enc->base.height, 16) * 5 / 2); 619 620 for (int i = 0; i < 136 ; i++) 621 RADEON_ENC_CS(0x00000000); 622 623 RADEON_ENC_END(); 624 } 625 626 static void radeon_enc_bitstream(struct radeon_encoder *enc) 627 { 628 enc->enc_pic.bit_buf.mode = RENCODE_REC_SWIZZLE_MODE_LINEAR; 629 enc->enc_pic.bit_buf.video_bitstream_buffer_size = enc->bs_size; 630 enc->enc_pic.bit_buf.video_bitstream_data_offset = 0; 631 632 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_VIDEO_BITSTREAM_BUFFER); 633 RADEON_ENC_CS(enc->enc_pic.bit_buf.mode); 634 RADEON_ENC_WRITE(enc->bs_handle, RADEON_DOMAIN_GTT, 0); 635 RADEON_ENC_CS(enc->enc_pic.bit_buf.video_bitstream_buffer_size); 636 RADEON_ENC_CS(enc->enc_pic.bit_buf.video_bitstream_data_offset); 637 RADEON_ENC_END(); 638 } 639 640 static void radeon_enc_feedback(struct radeon_encoder *enc) 641 { 642 enc->enc_pic.fb_buf.mode = RENCODE_FEEDBACK_BUFFER_MODE_LINEAR; 643 enc->enc_pic.fb_buf.feedback_buffer_size = 16; 644 enc->enc_pic.fb_buf.feedback_data_size = 40; 645 646 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_FEEDBACK_BUFFER); 647 RADEON_ENC_CS(enc->enc_pic.fb_buf.mode); 648 RADEON_ENC_WRITE(enc->fb->res->buf, enc->fb->res->domains, 0x0); 649 RADEON_ENC_CS(enc->enc_pic.fb_buf.feedback_buffer_size); 650 RADEON_ENC_CS(enc->enc_pic.fb_buf.feedback_data_size); 651 RADEON_ENC_END(); 652 } 653 654 static void radeon_enc_intra_refresh(struct radeon_encoder *enc) 655 { 656 enc->enc_pic.intra_ref.intra_refresh_mode = RENCODE_INTRA_REFRESH_MODE_NONE; 657 enc->enc_pic.intra_ref.offset = 0; 658 enc->enc_pic.intra_ref.region_size = 0; 659 660 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_INTRA_REFRESH); 661 RADEON_ENC_CS(enc->enc_pic.intra_ref.intra_refresh_mode); 662 RADEON_ENC_CS(enc->enc_pic.intra_ref.offset); 663 RADEON_ENC_CS(enc->enc_pic.intra_ref.region_size); 664 RADEON_ENC_END(); 665 } 666 667 static void radeon_enc_rc_per_pic(struct radeon_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 668 { 669 enc->enc_pic.rc_per_pic.qp = pic->quant_i_frames; 670 enc->enc_pic.rc_per_pic.min_qp_app = 0; 671 enc->enc_pic.rc_per_pic.max_qp_app = 51; 672 enc->enc_pic.rc_per_pic.max_au_size = 0; 673 enc->enc_pic.rc_per_pic.enabled_filler_data = pic->rate_ctrl.fill_data_enable; 674 enc->enc_pic.rc_per_pic.skip_frame_enable = false; 675 enc->enc_pic.rc_per_pic.enforce_hrd = pic->rate_ctrl.enforce_hrd; 676 677 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_RATE_CONTROL_PER_PICTURE); 678 RADEON_ENC_CS(enc->enc_pic.rc_per_pic.qp); 679 RADEON_ENC_CS(enc->enc_pic.rc_per_pic.min_qp_app); 680 RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_qp_app); 681 RADEON_ENC_CS(enc->enc_pic.rc_per_pic.max_au_size); 682 RADEON_ENC_CS(enc->enc_pic.rc_per_pic.enabled_filler_data); 683 RADEON_ENC_CS(enc->enc_pic.rc_per_pic.skip_frame_enable); 684 RADEON_ENC_CS(enc->enc_pic.rc_per_pic.enforce_hrd); 685 RADEON_ENC_END(); 686 } 687 688 static void radeon_enc_encode_params(struct radeon_encoder *enc) 689 { 690 switch(enc->enc_pic.picture_type) { 691 case PIPE_H264_ENC_PICTURE_TYPE_I: 692 case PIPE_H264_ENC_PICTURE_TYPE_IDR: 693 enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_I; 694 break; 695 case PIPE_H264_ENC_PICTURE_TYPE_P: 696 enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_P; 697 break; 698 case PIPE_H264_ENC_PICTURE_TYPE_SKIP: 699 enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_P_SKIP; 700 break; 701 case PIPE_H264_ENC_PICTURE_TYPE_B: 702 enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_B; 703 break; 704 default: 705 enc->enc_pic.enc_params.pic_type = RENCODE_PICTURE_TYPE_I; 706 } 707 708 enc->enc_pic.enc_params.allowed_max_bitstream_size = enc->bs_size; 709 enc->enc_pic.enc_params.input_pic_luma_pitch = enc->luma->u.gfx9.surf_pitch; 710 enc->enc_pic.enc_params.input_pic_chroma_pitch = enc->chroma->u.gfx9.surf_pitch; 711 enc->enc_pic.enc_params.input_pic_swizzle_mode = RENCODE_INPUT_SWIZZLE_MODE_LINEAR; 712 713 if(enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR) 714 enc->enc_pic.enc_params.reference_picture_index = 0xFFFFFFFF; 715 else 716 enc->enc_pic.enc_params.reference_picture_index = (enc->enc_pic.frame_num - 1) % 2; 717 718 enc->enc_pic.enc_params.reconstructed_picture_index = enc->enc_pic.frame_num % 2; 719 720 RADEON_ENC_BEGIN(RENCODE_IB_PARAM_ENCODE_PARAMS); 721 RADEON_ENC_CS(enc->enc_pic.enc_params.pic_type); 722 RADEON_ENC_CS(enc->enc_pic.enc_params.allowed_max_bitstream_size); 723 RADEON_ENC_READ(enc->handle, RADEON_DOMAIN_VRAM, enc->luma->u.gfx9.surf_offset); 724 RADEON_ENC_READ(enc->handle, RADEON_DOMAIN_VRAM, enc->chroma->u.gfx9.surf_offset); 725 RADEON_ENC_CS(enc->enc_pic.enc_params.input_pic_luma_pitch); 726 RADEON_ENC_CS(enc->enc_pic.enc_params.input_pic_chroma_pitch); 727 RADEON_ENC_CS(enc->enc_pic.enc_params.input_pic_swizzle_mode); 728 RADEON_ENC_CS(enc->enc_pic.enc_params.reference_picture_index); 729 RADEON_ENC_CS(enc->enc_pic.enc_params.reconstructed_picture_index); 730 RADEON_ENC_END(); 731 } 732 static void radeon_enc_encode_params_h264(struct radeon_encoder *enc) 733 { 734 enc->enc_pic.h264_enc_params.input_picture_structure = RENCODE_H264_PICTURE_STRUCTURE_FRAME; 735 enc->enc_pic.h264_enc_params.interlaced_mode = RENCODE_H264_INTERLACING_MODE_PROGRESSIVE; 736 enc->enc_pic.h264_enc_params.reference_picture_structure = RENCODE_H264_PICTURE_STRUCTURE_FRAME; 737 enc->enc_pic.h264_enc_params.reference_picture1_index = 0xFFFFFFFF; 738 739 RADEON_ENC_BEGIN(RENCODE_H264_IB_PARAM_ENCODE_PARAMS); 740 RADEON_ENC_CS(enc->enc_pic.h264_enc_params.input_picture_structure); 741 RADEON_ENC_CS(enc->enc_pic.h264_enc_params.interlaced_mode); 742 RADEON_ENC_CS(enc->enc_pic.h264_enc_params.reference_picture_structure); 743 RADEON_ENC_CS(enc->enc_pic.h264_enc_params.reference_picture1_index); 744 RADEON_ENC_END(); 745 } 746 747 static void radeon_enc_op_init(struct radeon_encoder *enc) 748 { 749 RADEON_ENC_BEGIN(RENCODE_IB_OP_INITIALIZE); 750 RADEON_ENC_END(); 751 } 752 753 static void radeon_enc_op_close(struct radeon_encoder *enc) 754 { 755 RADEON_ENC_BEGIN(RENCODE_IB_OP_CLOSE_SESSION); 756 RADEON_ENC_END(); 757 } 758 759 static void radeon_enc_op_enc(struct radeon_encoder *enc) 760 { 761 RADEON_ENC_BEGIN(RENCODE_IB_OP_ENCODE); 762 RADEON_ENC_END(); 763 } 764 765 static void radeon_enc_op_init_rc(struct radeon_encoder *enc) 766 { 767 RADEON_ENC_BEGIN(RENCODE_IB_OP_INIT_RC); 768 RADEON_ENC_END(); 769 } 770 771 static void radeon_enc_op_init_rc_vbv(struct radeon_encoder *enc) 772 { 773 RADEON_ENC_BEGIN(RENCODE_IB_OP_INIT_RC_VBV_BUFFER_LEVEL); 774 RADEON_ENC_END(); 775 } 776 777 static void radeon_enc_op_speed(struct radeon_encoder *enc) 778 { 779 RADEON_ENC_BEGIN(RENCODE_IB_OP_SET_SPEED_ENCODING_MODE); 780 RADEON_ENC_END(); 781 } 782 783 static void begin(struct radeon_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 784 { 785 radeon_enc_session_info(enc); 786 enc->total_task_size = 0; 787 radeon_enc_task_info(enc, enc->need_feedback); 788 radeon_enc_op_init(enc); 789 radeon_enc_session_init(enc); 790 radeon_enc_layer_control(enc); 791 radeon_enc_slice_control(enc); 792 radeon_enc_spec_misc(enc); 793 radeon_enc_rc_session_init(enc, pic); 794 radeon_enc_deblocking_filter_h264(enc); 795 radeon_enc_quality_params(enc); 796 radeon_enc_layer_select(enc); 797 radeon_enc_rc_layer_init(enc, pic); 798 radeon_enc_layer_select(enc); 799 radeon_enc_rc_per_pic(enc, pic); 800 radeon_enc_op_init_rc(enc); 801 radeon_enc_op_init_rc_vbv(enc); 802 *enc->p_task_size = (enc->total_task_size); 803 } 804 805 static void encode(struct radeon_encoder *enc) 806 { 807 radeon_enc_session_info(enc); 808 enc->total_task_size = 0; 809 radeon_enc_task_info(enc, enc->need_feedback); 810 811 if (enc->enc_pic.is_idr) { 812 radeon_enc_nalu_sps(enc); 813 radeon_enc_nalu_pps(enc); 814 } 815 816 radeon_enc_slice_header(enc); 817 radeon_enc_ctx(enc); 818 radeon_enc_bitstream(enc); 819 radeon_enc_feedback(enc); 820 radeon_enc_intra_refresh(enc); 821 radeon_enc_encode_params(enc); 822 radeon_enc_encode_params_h264(enc); 823 radeon_enc_op_speed(enc); 824 radeon_enc_op_enc(enc); 825 *enc->p_task_size = (enc->total_task_size); 826 } 827 828 static void destroy(struct radeon_encoder *enc) 829 { 830 radeon_enc_session_info(enc); 831 enc->total_task_size = 0; 832 radeon_enc_task_info(enc, enc->need_feedback); 833 radeon_enc_op_close(enc); 834 *enc->p_task_size = (enc->total_task_size); 835 } 836 837 void radeon_enc_1_2_init(struct radeon_encoder *enc) 838 { 839 enc->begin = begin; 840 enc->encode = encode; 841 enc->destroy = destroy; 842 } 843