1 /************************************************************************** 2 * 3 * Copyright 2018 Advanced Micro Devices, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 #ifndef _RADEON_UVD_ENC_H 29 #define _RADEON_UVD_ENC_H 30 31 #include "radeon_video.h" 32 33 #define RENC_UVD_FW_INTERFACE_MAJOR_VERSION 1 34 #define RENC_UVD_FW_INTERFACE_MINOR_VERSION 1 35 36 #define RENC_UVD_IB_PARAM_SESSION_INFO 0x00000001 37 #define RENC_UVD_IB_PARAM_TASK_INFO 0x00000002 38 #define RENC_UVD_IB_PARAM_SESSION_INIT 0x00000003 39 #define RENC_UVD_IB_PARAM_LAYER_CONTROL 0x00000004 40 #define RENC_UVD_IB_PARAM_LAYER_SELECT 0x00000005 41 #define RENC_UVD_IB_PARAM_SLICE_CONTROL 0x00000006 42 #define RENC_UVD_IB_PARAM_SPEC_MISC 0x00000007 43 #define RENC_UVD_IB_PARAM_RATE_CONTROL_SESSION_INIT 0x00000008 44 #define RENC_UVD_IB_PARAM_RATE_CONTROL_LAYER_INIT 0x00000009 45 #define RENC_UVD_IB_PARAM_RATE_CONTROL_PER_PICTURE 0x0000000a 46 #define RENC_UVD_IB_PARAM_SLICE_HEADER 0x0000000b 47 #define RENC_UVD_IB_PARAM_ENCODE_PARAMS 0x0000000c 48 #define RENC_UVD_IB_PARAM_QUALITY_PARAMS 0x0000000d 49 #define RENC_UVD_IB_PARAM_DEBLOCKING_FILTER 0x0000000e 50 #define RENC_UVD_IB_PARAM_INTRA_REFRESH 0x0000000f 51 #define RENC_UVD_IB_PARAM_ENCODE_CONTEXT_BUFFER 0x00000010 52 #define RENC_UVD_IB_PARAM_VIDEO_BITSTREAM_BUFFER 0x00000011 53 #define RENC_UVD_IB_PARAM_FEEDBACK_BUFFER 0x00000012 54 #define RENC_UVD_IB_PARAM_INSERT_NALU_BUFFER 0x00000013 55 #define RENC_UVD_IB_PARAM_FEEDBACK_BUFFER_ADDITIONAL 0x00000014 56 57 #define RENC_UVD_IB_OP_INITIALIZE 0x08000001 58 #define RENC_UVD_IB_OP_CLOSE_SESSION 0x08000002 59 #define RENC_UVD_IB_OP_ENCODE 0x08000003 60 #define RENC_UVD_IB_OP_INIT_RC 0x08000004 61 #define RENC_UVD_IB_OP_INIT_RC_VBV_BUFFER_LEVEL 0x08000005 62 #define RENC_UVD_IB_OP_SET_SPEED_ENCODING_MODE 0x08000006 63 #define RENC_UVD_IB_OP_SET_BALANCE_ENCODING_MODE 0x08000007 64 #define RENC_UVD_IB_OP_SET_QUALITY_ENCODING_MODE 0x08000008 65 66 #define RENC_UVD_IF_MAJOR_VERSION_MASK 0xFFFF0000 67 #define RENC_UVD_IF_MAJOR_VERSION_SHIFT 16 68 #define RENC_UVD_IF_MINOR_VERSION_MASK 0x0000FFFF 69 #define RENC_UVD_IF_MINOR_VERSION_SHIFT 0 70 71 #define RENC_UVD_PREENCODE_MODE_NONE 0x00000000 72 #define RENC_UVD_PREENCODE_MODE_1X 0x00000001 73 #define RENC_UVD_PREENCODE_MODE_2X 0x00000002 74 #define RENC_UVD_PREENCODE_MODE_4X 0x00000004 75 76 #define RENC_UVD_SLICE_CONTROL_MODE_FIXED_CTBS 0x00000000 77 #define RENC_UVD_SLICE_CONTROL_MODE_FIXED_BITS 0x00000001 78 79 #define RENC_UVD_RATE_CONTROL_METHOD_NONE 0x00000000 80 #define RENC_UVD_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR 0x00000001 81 #define RENC_UVD_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR 0x00000002 82 #define RENC_UVD_RATE_CONTROL_METHOD_CBR 0x00000003 83 84 #define RENC_UVD_NALU_TYPE_AUD 0x00000001 85 #define RENC_UVD_NALU_TYPE_VPS 0x00000002 86 #define RENC_UVD_NALU_TYPE_SPS 0x00000003 87 #define RENC_UVD_NALU_TYPE_PPS 0x00000004 88 #define RENC_UVD_NALU_TYPE_END_OF_SEQUENCE 0x00000005 89 90 #define RENC_UVD_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS 16 91 #define RENC_UVD_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS 16 92 93 #define RENC_UVD_HEADER_INSTRUCTION_END 0 94 #define RENC_UVD_HEADER_INSTRUCTION_DEPENDENT_SLICE_END 1 95 #define RENC_UVD_HEADER_INSTRUCTION_COPY 2 96 #define RENC_UVD_HEADER_INSTRUCTION_FIRST_SLICE 3 97 #define RENC_UVD_HEADER_INSTRUCTION_SLICE_SEGMENT 4 98 #define RENC_UVD_HEADER_INSTRUCTION_SLICE_QP_DELTA 5 99 100 #define RENC_UVD_PICTURE_TYPE_B 0 101 #define RENC_UVD_PICTURE_TYPE_P 1 102 #define RENC_UVD_PICTURE_TYPE_I 2 103 #define RENC_UVD_PICTURE_TYPE_P_SKIP 3 104 105 #define RENC_UVD_SWIZZLE_MODE_LINEAR 0 106 #define RENC_UVD_SWIZZLE_MODE_256B_D 2 107 #define RENC_UVD_SWIZZLE_MODE_4kB_D 6 108 #define RENC_UVD_SWIZZLE_MODE_64kB_D 10 109 #define RENC_UVD_INTRA_REFRESH_MODE_NONE 0 110 #define RENC_UVD_INTRA_REFRESH_MODE_CTB_MB_ROWS 1 111 #define RENC_UVD_INTRA_REFRESH_MODE_CTB_MB_COLUMNS 2 112 113 #define RENC_UVD_MAX_NUM_RECONSTRUCTED_PICTURES 34 114 #define RENC_UVD_ADDR_MODE_LINEAR 0 115 #define RENC_UVD_ADDR_MODE_PELE_8X8_1D 1 116 #define RENC_UVD_ADDR_MODE_32AS8_88 2 117 118 #define RENC_UVD_ARRAY_MODE_LINEAR 0 119 #define RENC_UVD_ARRAY_MODE_PELE_8X8_1D 2 120 #define RENC_UVD_ARRAY_MODE_2D_TILED_THIN1 4 121 122 #define RENC_UVD_VIDEO_BITSTREAM_BUFFER_MODE_LINEAR 0 123 #define RENC_UVD_VIDEO_BITSTREAM_BUFFER_MODE_CIRCULAR 1 124 125 #define RENC_UVD_FEEDBACK_BUFFER_MODE_LINEAR 0 126 #define RENC_UVD_FEEDBACK_BUFFER_MODE_CIRCULAR 1 127 128 #define RENC_UVD_FEEDBACK_STATUS_OK 0x00000000 129 #define RENC_UVD_FEEDBACK_STATUS_NOT_ENCODED 0x10000001 130 131 typedef struct radeon_uvd_enc_feedback_s { 132 uint32_t task_id; 133 uint32_t first_in_task; 134 uint32_t last_in_task; 135 uint32_t status; 136 uint32_t has_bitstream; 137 uint32_t bitstream_offset; 138 uint32_t bitstream_size; 139 uint32_t enabled_filler_data; 140 uint32_t filler_data_size; 141 uint32_t extra_bytes; 142 } radeon_uvd_enc_feedback_t; 143 144 typedef struct ruvd_enc_session_info_s { 145 uint32_t reserved; 146 uint32_t interface_version; 147 uint32_t sw_context_address_hi; 148 uint32_t sw_context_address_lo; 149 } ruvd_enc_session_info_t; 150 151 typedef struct ruvd_enc_task_info_s { 152 uint32_t total_size_of_all_packages; 153 uint32_t task_id; 154 uint32_t allowed_max_num_feedbacks; 155 } ruvd_enc_task_info_t; 156 157 typedef struct ruvd_enc_session_init_s { 158 uint32_t aligned_picture_width; 159 uint32_t aligned_picture_height; 160 uint32_t padding_width; 161 uint32_t padding_height; 162 uint32_t pre_encode_mode; 163 uint32_t pre_encode_chroma_enabled; 164 } ruvd_enc_session_init_t; 165 166 typedef struct ruvd_enc_layer_control_s { 167 uint32_t max_num_temporal_layers; 168 uint32_t num_temporal_layers; 169 } ruvd_enc_layer_control_t; 170 171 typedef struct ruvd_enc_layer_select_s { 172 uint32_t temporal_layer_index; 173 } ruvd_enc_layer_select_t; 174 175 typedef struct ruvd_enc_hevc_slice_control_s { 176 uint32_t slice_control_mode; 177 union { 178 struct { 179 uint32_t num_ctbs_per_slice; 180 uint32_t num_ctbs_per_slice_segment; 181 } fixed_ctbs_per_slice; 182 183 struct { 184 uint32_t num_bits_per_slice; 185 uint32_t num_bits_per_slice_segment; 186 } fixed_bits_per_slice; 187 }; 188 } ruvd_enc_hevc_slice_control_t; 189 190 typedef struct ruvd_enc_hevc_spec_misc_s { 191 uint32_t log2_min_luma_coding_block_size_minus3; 192 uint32_t amp_disabled; 193 uint32_t strong_intra_smoothing_enabled; 194 uint32_t constrained_intra_pred_flag; 195 uint32_t cabac_init_flag; 196 uint32_t half_pel_enabled; 197 uint32_t quarter_pel_enabled; 198 } ruvd_enc_hevc_spec_misc_t; 199 200 typedef struct ruvd_enc_rate_ctl_session_init_s { 201 uint32_t rate_control_method; 202 uint32_t vbv_buffer_level; 203 } ruvd_enc_rate_ctl_session_init_t; 204 205 typedef struct ruvd_enc_rate_ctl_layer_init_s { 206 uint32_t target_bit_rate; 207 uint32_t peak_bit_rate; 208 uint32_t frame_rate_num; 209 uint32_t frame_rate_den; 210 uint32_t vbv_buffer_size; 211 uint32_t avg_target_bits_per_picture; 212 uint32_t peak_bits_per_picture_integer; 213 uint32_t peak_bits_per_picture_fractional; 214 } ruvd_enc_rate_ctl_layer_init_t; 215 216 typedef struct ruvd_enc_rate_ctl_per_picture_s { 217 uint32_t qp; 218 uint32_t min_qp_app; 219 uint32_t max_qp_app; 220 uint32_t max_au_size; 221 uint32_t enabled_filler_data; 222 uint32_t skip_frame_enable; 223 uint32_t enforce_hrd; 224 } ruvd_enc_rate_ctl_per_picture_t; 225 226 typedef struct ruvd_enc_quality_params_s { 227 uint32_t vbaq_mode; 228 uint32_t scene_change_sensitivity; 229 uint32_t scene_change_min_idr_interval; 230 } ruvd_enc_quality_params_t; 231 232 typedef struct ruvd_enc_direct_output_nalu_s { 233 uint32_t type; 234 uint32_t size; 235 uint32_t data[1]; 236 } ruvd_enc_direct_output_nalu_t; 237 238 typedef struct ruvd_enc_slice_header_s { 239 uint32_t bitstream_template[RENC_UVD_SLICE_HEADER_TEMPLATE_MAX_TEMPLATE_SIZE_IN_DWORDS]; 240 struct { 241 uint32_t instruction; 242 uint32_t num_bits; 243 } instructions[RENC_UVD_SLICE_HEADER_TEMPLATE_MAX_NUM_INSTRUCTIONS]; 244 } ruvd_enc_slice_header_t; 245 246 typedef struct ruvd_enc_encode_params_s { 247 uint32_t pic_type; 248 uint32_t allowed_max_bitstream_size; 249 uint32_t input_picture_luma_address_hi; 250 uint32_t input_picture_luma_address_lo; 251 uint32_t input_picture_chroma_address_hi; 252 uint32_t input_picture_chroma_address_lo; 253 uint32_t input_pic_luma_pitch; 254 uint32_t input_pic_chroma_pitch; 255 union { 256 uint32_t input_pic_addr_mode; 257 uint32_t reserved; 258 }; 259 union { 260 uint32_t input_pic_array_mode; 261 uint32_t input_pic_swizzle_mode; 262 }; 263 uint32_t reference_picture_index; 264 uint32_t reconstructed_picture_index; 265 } ruvd_enc_encode_params_t; 266 267 typedef struct ruvd_enc_hevc_deblocking_filter_s { 268 uint32_t loop_filter_across_slices_enabled; 269 int32_t deblocking_filter_disabled; 270 int32_t beta_offset_div2; 271 int32_t tc_offset_div2; 272 int32_t cb_qp_offset; 273 int32_t cr_qp_offset; 274 } ruvd_enc_hevc_deblocking_filter_t; 275 276 typedef struct ruvd_enc_intra_refresh_s { 277 uint32_t intra_refresh_mode; 278 uint32_t offset; 279 uint32_t region_size; 280 } ruvd_enc_intra_refresh_t; 281 282 typedef struct ruvd_enc_reconstructed_picture_s { 283 uint32_t luma_offset; 284 uint32_t chroma_offset; 285 } ruvd_enc_reconstructed_picture_t; 286 287 typedef struct ruvd_enc_encode_context_buffer_s { 288 uint32_t encode_context_address_hi; 289 uint32_t encode_context_address_lo; 290 union { 291 uint32_t addr_mode; 292 uint32_t reserved; 293 }; 294 union { 295 uint32_t array_mode; 296 uint32_t swizzle_mode; 297 }; 298 uint32_t rec_luma_pitch; 299 uint32_t rec_chroma_pitch; 300 uint32_t num_reconstructed_pictures; 301 ruvd_enc_reconstructed_picture_t reconstructed_pictures[RENC_UVD_MAX_NUM_RECONSTRUCTED_PICTURES]; 302 uint32_t pre_encode_picture_luma_pitch; 303 uint32_t pre_encode_picture_chroma_pitch; 304 ruvd_enc_reconstructed_picture_t 305 pre_encode_reconstructed_pictures[RENC_UVD_MAX_NUM_RECONSTRUCTED_PICTURES]; 306 ruvd_enc_reconstructed_picture_t pre_encode_input_picture; 307 } ruvd_enc_encode_context_buffer_t; 308 309 typedef struct ruvd_enc_video_bitstream_buffer_s { 310 uint32_t mode; 311 uint32_t video_bitstream_buffer_address_hi; 312 uint32_t video_bitstream_buffer_address_lo; 313 uint32_t video_bitstream_buffer_size; 314 uint32_t video_bitstream_data_offset; 315 } ruvd_enc_video_bitstream_buffer_t; 316 317 typedef struct ruvd_enc_feedback_buffer_s { 318 uint32_t mode; 319 uint32_t feedback_buffer_address_hi; 320 uint32_t feedback_buffer_address_lo; 321 uint32_t feedback_buffer_size; 322 uint32_t feedback_data_size; 323 } ruvd_enc_feedback_buffer_t; 324 325 typedef void (*radeon_uvd_enc_get_buffer)(struct pipe_resource *resource, struct pb_buffer **handle, 326 struct radeon_surf **surface); 327 328 struct pipe_video_codec *radeon_uvd_create_encoder(struct pipe_context *context, 329 const struct pipe_video_codec *templat, 330 struct radeon_winsys *ws, 331 radeon_uvd_enc_get_buffer get_buffer); 332 333 struct radeon_uvd_enc_pic { 334 enum pipe_h265_enc_picture_type picture_type; 335 336 unsigned frame_num; 337 unsigned pic_order_cnt; 338 unsigned pic_order_cnt_type; 339 unsigned crop_left; 340 unsigned crop_right; 341 unsigned crop_top; 342 unsigned crop_bottom; 343 unsigned general_tier_flag; 344 unsigned general_profile_idc; 345 unsigned general_level_idc; 346 unsigned max_poc; 347 unsigned log2_max_poc; 348 unsigned chroma_format_idc; 349 unsigned pic_width_in_luma_samples; 350 unsigned pic_height_in_luma_samples; 351 unsigned log2_diff_max_min_luma_coding_block_size; 352 unsigned log2_min_transform_block_size_minus2; 353 unsigned log2_diff_max_min_transform_block_size; 354 unsigned max_transform_hierarchy_depth_inter; 355 unsigned max_transform_hierarchy_depth_intra; 356 unsigned log2_parallel_merge_level_minus2; 357 unsigned bit_depth_luma_minus8; 358 unsigned bit_depth_chroma_minus8; 359 unsigned nal_unit_type; 360 unsigned max_num_merge_cand; 361 362 bool not_referenced; 363 bool is_iframe; 364 bool is_even_frame; 365 bool sample_adaptive_offset_enabled_flag; 366 bool pcm_enabled_flag; 367 bool sps_temporal_mvp_enabled_flag; 368 369 ruvd_enc_task_info_t task_info; 370 ruvd_enc_session_init_t session_init; 371 ruvd_enc_layer_control_t layer_ctrl; 372 ruvd_enc_layer_select_t layer_sel; 373 ruvd_enc_hevc_slice_control_t hevc_slice_ctrl; 374 ruvd_enc_hevc_spec_misc_t hevc_spec_misc; 375 ruvd_enc_rate_ctl_session_init_t rc_session_init; 376 ruvd_enc_rate_ctl_layer_init_t rc_layer_init; 377 ruvd_enc_hevc_deblocking_filter_t hevc_deblock; 378 ruvd_enc_rate_ctl_per_picture_t rc_per_pic; 379 ruvd_enc_quality_params_t quality_params; 380 ruvd_enc_encode_context_buffer_t ctx_buf; 381 ruvd_enc_video_bitstream_buffer_t bit_buf; 382 ruvd_enc_feedback_buffer_t fb_buf; 383 ruvd_enc_intra_refresh_t intra_ref; 384 ruvd_enc_encode_params_t enc_params; 385 }; 386 387 struct radeon_uvd_encoder { 388 struct pipe_video_codec base; 389 390 void (*begin)(struct radeon_uvd_encoder *enc, struct pipe_picture_desc *pic); 391 void (*encode)(struct radeon_uvd_encoder *enc); 392 void (*destroy)(struct radeon_uvd_encoder *enc); 393 394 unsigned stream_handle; 395 396 struct pipe_screen *screen; 397 struct radeon_winsys *ws; 398 struct radeon_cmdbuf *cs; 399 400 radeon_uvd_enc_get_buffer get_buffer; 401 402 struct pb_buffer *handle; 403 struct radeon_surf *luma; 404 struct radeon_surf *chroma; 405 406 struct pb_buffer *bs_handle; 407 unsigned bs_size; 408 409 unsigned cpb_num; 410 411 struct rvid_buffer *si; 412 struct rvid_buffer *fb; 413 struct rvid_buffer cpb; 414 struct radeon_uvd_enc_pic enc_pic; 415 416 unsigned shifter; 417 unsigned bits_in_shifter; 418 unsigned num_zeros; 419 unsigned byte_index; 420 unsigned bits_output; 421 uint32_t total_task_size; 422 uint32_t *p_task_size; 423 424 bool emulation_prevention; 425 bool need_feedback; 426 }; 427 428 struct si_screen; 429 430 void radeon_uvd_enc_1_1_init(struct radeon_uvd_encoder *enc); 431 bool si_radeon_uvd_enc_supported(struct si_screen *sscreen); 432 433 #endif // _RADEON_UVD_ENC_H 434