1/************************************************************************** 2 * 3 * Copyright 2015 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 "radeonsi/si_pipe.h" 38#include "radeon_video.h" 39#include "radeon_vce.h" 40 41static void get_rate_control_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 42{ 43 enc->enc_pic.rc.rc_method = pic->rate_ctrl.rate_ctrl_method; 44 enc->enc_pic.rc.target_bitrate = pic->rate_ctrl.target_bitrate; 45 enc->enc_pic.rc.peak_bitrate = pic->rate_ctrl.peak_bitrate; 46 enc->enc_pic.rc.quant_i_frames = pic->quant_i_frames; 47 enc->enc_pic.rc.quant_p_frames = pic->quant_p_frames; 48 enc->enc_pic.rc.quant_b_frames = pic->quant_b_frames; 49 enc->enc_pic.rc.gop_size = pic->gop_size; 50 enc->enc_pic.rc.frame_rate_num = pic->rate_ctrl.frame_rate_num; 51 enc->enc_pic.rc.frame_rate_den = pic->rate_ctrl.frame_rate_den; 52 enc->enc_pic.rc.max_qp = 51; 53 enc->enc_pic.rc.vbv_buffer_size = pic->rate_ctrl.vbv_buffer_size; 54 enc->enc_pic.rc.vbv_buf_lv = pic->rate_ctrl.vbv_buf_lv; 55 enc->enc_pic.rc.fill_data_enable = pic->rate_ctrl.fill_data_enable; 56 enc->enc_pic.rc.enforce_hrd = pic->rate_ctrl.enforce_hrd; 57 enc->enc_pic.rc.target_bits_picture = pic->rate_ctrl.target_bits_picture; 58 enc->enc_pic.rc.peak_bits_picture_integer = pic->rate_ctrl.peak_bits_picture_integer; 59 enc->enc_pic.rc.peak_bits_picture_fraction = pic->rate_ctrl.peak_bits_picture_fraction; 60} 61 62static void get_motion_estimation_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 63{ 64 enc->enc_pic.me.motion_est_quarter_pixel = pic->motion_est.motion_est_quarter_pixel; 65 enc->enc_pic.me.enc_disable_sub_mode = pic->motion_est.enc_disable_sub_mode; 66 enc->enc_pic.me.lsmvert = pic->motion_est.lsmvert; 67 enc->enc_pic.me.enc_en_ime_overw_dis_subm = pic->motion_est.enc_en_ime_overw_dis_subm; 68 enc->enc_pic.me.enc_ime_overw_dis_subm_no = pic->motion_est.enc_ime_overw_dis_subm_no; 69 enc->enc_pic.me.enc_ime2_search_range_x = pic->motion_est.enc_ime2_search_range_x; 70 enc->enc_pic.me.enc_ime2_search_range_y = pic->motion_est.enc_ime2_search_range_y; 71 enc->enc_pic.me.enc_ime_decimation_search = 0x00000001; 72 enc->enc_pic.me.motion_est_half_pixel = 0x00000001; 73 enc->enc_pic.me.enc_search_range_x = 0x00000010; 74 enc->enc_pic.me.enc_search_range_y = 0x00000010; 75 enc->enc_pic.me.enc_search1_range_x = 0x00000010; 76 enc->enc_pic.me.enc_search1_range_y = 0x00000010; 77} 78 79static void get_pic_control_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 80{ 81 unsigned encNumMBsPerSlice; 82 encNumMBsPerSlice = align(enc->base.width, 16) / 16; 83 encNumMBsPerSlice *= align(enc->base.height, 16) / 16; 84 if (pic->pic_ctrl.enc_frame_cropping_flag) { 85 enc->enc_pic.pc.enc_crop_left_offset = pic->pic_ctrl.enc_frame_crop_left_offset; 86 enc->enc_pic.pc.enc_crop_right_offset = pic->pic_ctrl.enc_frame_crop_right_offset; 87 enc->enc_pic.pc.enc_crop_top_offset = pic->pic_ctrl.enc_frame_crop_top_offset; 88 enc->enc_pic.pc.enc_crop_bottom_offset = pic->pic_ctrl.enc_frame_crop_bottom_offset; 89 } else { 90 enc->enc_pic.pc.enc_crop_right_offset = (align(enc->base.width, 16) - enc->base.width) >> 1; 91 enc->enc_pic.pc.enc_crop_bottom_offset = (align(enc->base.height, 16) - enc->base.height) >> 1; 92 } 93 enc->enc_pic.pc.enc_num_mbs_per_slice = encNumMBsPerSlice; 94 enc->enc_pic.pc.enc_b_pic_pattern = MAX2(enc->base.max_references, 1) - 1; 95 enc->enc_pic.pc.enc_number_of_reference_frames = MIN2(enc->base.max_references, 2); 96 enc->enc_pic.pc.enc_max_num_ref_frames = enc->base.max_references + 1; 97 enc->enc_pic.pc.enc_num_default_active_ref_l0 = 0x00000001; 98 enc->enc_pic.pc.enc_num_default_active_ref_l1 = 0x00000001; 99 enc->enc_pic.pc.enc_cabac_enable = pic->pic_ctrl.enc_cabac_enable; 100 enc->enc_pic.pc.enc_constraint_set_flags = pic->pic_ctrl.enc_constraint_set_flags; 101 enc->enc_pic.pc.enc_num_default_active_ref_l0 = 0x00000001; 102 enc->enc_pic.pc.enc_num_default_active_ref_l1 = 0x00000001; 103} 104 105static void get_task_info_param(struct rvce_encoder *enc) 106{ 107 enc->enc_pic.ti.offset_of_next_task_info = 0xffffffff; 108} 109 110static void get_feedback_buffer_param(struct rvce_encoder *enc) 111{ 112 enc->enc_pic.fb.feedback_ring_size = 0x00000001; 113} 114 115static void get_config_ext_param(struct rvce_encoder *enc) 116{ 117 enc->enc_pic.ce.enc_enable_perf_logging = 0x00000003; 118} 119 120static void get_vui_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 121{ 122 enc->enc_pic.enable_vui = pic->enable_vui; 123 enc->enc_pic.vui.video_format = 0x00000005; 124 enc->enc_pic.vui.color_prim = 0x00000002; 125 enc->enc_pic.vui.transfer_char = 0x00000002; 126 enc->enc_pic.vui.matrix_coef = 0x00000002; 127 enc->enc_pic.vui.timing_info_present_flag = 0x00000001; 128 enc->enc_pic.vui.num_units_in_tick = pic->rate_ctrl.frame_rate_den; 129 enc->enc_pic.vui.time_scale = pic->rate_ctrl.frame_rate_num * 2; 130 enc->enc_pic.vui.fixed_frame_rate_flag = 0x00000001; 131 enc->enc_pic.vui.bit_rate_scale = 0x00000004; 132 enc->enc_pic.vui.cpb_size_scale = 0x00000006; 133 enc->enc_pic.vui.initial_cpb_removal_delay_length_minus1 = 0x00000017; 134 enc->enc_pic.vui.cpb_removal_delay_length_minus1 = 0x00000017; 135 enc->enc_pic.vui.dpb_output_delay_length_minus1 = 0x00000017; 136 enc->enc_pic.vui.time_offset_length = 0x00000018; 137 enc->enc_pic.vui.motion_vectors_over_pic_boundaries_flag = 0x00000001; 138 enc->enc_pic.vui.max_bytes_per_pic_denom = 0x00000002; 139 enc->enc_pic.vui.max_bits_per_mb_denom = 0x00000001; 140 enc->enc_pic.vui.log2_max_mv_length_hori = 0x00000010; 141 enc->enc_pic.vui.log2_max_mv_length_vert = 0x00000010; 142 enc->enc_pic.vui.num_reorder_frames = 0x00000003; 143 enc->enc_pic.vui.max_dec_frame_buffering = 0x00000003; 144} 145 146void si_vce_52_get_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_desc *pic) 147{ 148 get_rate_control_param(enc, pic); 149 get_motion_estimation_param(enc, pic); 150 get_pic_control_param(enc, pic); 151 get_task_info_param(enc); 152 get_feedback_buffer_param(enc); 153 get_vui_param(enc, pic); 154 get_config_ext_param(enc); 155 156 enc->enc_pic.picture_type = pic->picture_type; 157 enc->enc_pic.frame_num = pic->frame_num; 158 enc->enc_pic.frame_num_cnt = pic->frame_num_cnt; 159 enc->enc_pic.p_remain = pic->p_remain; 160 enc->enc_pic.i_remain = pic->i_remain; 161 enc->enc_pic.gop_cnt = pic->gop_cnt; 162 enc->enc_pic.pic_order_cnt = pic->pic_order_cnt; 163 enc->enc_pic.ref_idx_l0 = pic->ref_idx_l0; 164 enc->enc_pic.ref_idx_l1 = pic->ref_idx_l1; 165 enc->enc_pic.not_referenced = pic->not_referenced; 166 if (enc->dual_inst) 167 enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants = 0x00000201; 168 else 169 enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants = 0x01000201; 170 enc->enc_pic.is_idr = (pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR); 171} 172 173static void create(struct rvce_encoder *enc) 174{ 175 struct si_screen *sscreen = (struct si_screen *)enc->screen; 176 enc->task_info(enc, 0x00000000, 0, 0, 0); 177 178 RVCE_BEGIN(0x01000001); // create cmd 179 RVCE_CS(enc->enc_pic.ec.enc_use_circular_buffer); 180 RVCE_CS(u_get_h264_profile_idc(enc->base.profile)); // encProfile 181 RVCE_CS(enc->base.level); // encLevel 182 RVCE_CS(enc->enc_pic.ec.enc_pic_struct_restriction); 183 RVCE_CS(enc->base.width); // encImageWidth 184 RVCE_CS(enc->base.height); // encImageHeight 185 186 if (sscreen->info.chip_class < GFX9) { 187 RVCE_CS(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe); // encRefPicLumaPitch 188 RVCE_CS(enc->chroma->u.legacy.level[0].nblk_x * enc->chroma->bpe); // encRefPicChromaPitch 189 RVCE_CS(align(enc->luma->u.legacy.level[0].nblk_y, 16) / 8); // encRefYHeightInQw 190 } else { 191 RVCE_CS(enc->luma->u.gfx9.surf_pitch * enc->luma->bpe); // encRefPicLumaPitch 192 RVCE_CS(enc->chroma->u.gfx9.surf_pitch * enc->chroma->bpe); // encRefPicChromaPitch 193 RVCE_CS(align(enc->luma->u.gfx9.surf_height, 16) / 8); // encRefYHeightInQw 194 } 195 196 RVCE_CS(enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants); 197 198 RVCE_CS(enc->enc_pic.ec.enc_pre_encode_context_buffer_offset); 199 RVCE_CS(enc->enc_pic.ec.enc_pre_encode_input_luma_buffer_offset); 200 RVCE_CS(enc->enc_pic.ec.enc_pre_encode_input_chroma_buffer_offset); 201 RVCE_CS(enc->enc_pic.ec.enc_pre_encode_mode_chromaflag_vbaqmode_scenechangesensitivity); 202 RVCE_END(); 203} 204 205static void encode(struct rvce_encoder *enc) 206{ 207 struct si_screen *sscreen = (struct si_screen *)enc->screen; 208 signed luma_offset, chroma_offset, bs_offset; 209 unsigned dep, bs_idx = enc->bs_idx++; 210 int i; 211 212 if (enc->dual_inst) { 213 if (bs_idx == 0) 214 dep = 1; 215 else if (enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR) 216 dep = 0; 217 else 218 dep = 2; 219 } else 220 dep = 0; 221 222 enc->task_info(enc, 0x00000003, dep, 0, bs_idx); 223 224 RVCE_BEGIN(0x05000001); // context buffer 225 RVCE_READWRITE(enc->cpb.res->buf, enc->cpb.res->domains, 0); // encodeContextAddressHi/Lo 226 RVCE_END(); 227 228 bs_offset = -(signed)(bs_idx * enc->bs_size); 229 230 RVCE_BEGIN(0x05000004); // video bitstream buffer 231 RVCE_WRITE(enc->bs_handle, RADEON_DOMAIN_GTT, bs_offset); // videoBitstreamRingAddressHi/Lo 232 RVCE_CS(enc->bs_size); // videoBitstreamRingSize 233 RVCE_END(); 234 235 if (enc->dual_pipe) { 236 unsigned aux_offset = enc->cpb.res->buf->size - 237 RVCE_MAX_AUX_BUFFER_NUM * RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE * 2; 238 RVCE_BEGIN(0x05000002); // auxiliary buffer 239 for (i = 0; i < 8; ++i) { 240 RVCE_CS(aux_offset); 241 aux_offset += RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE; 242 } 243 for (i = 0; i < 8; ++i) 244 RVCE_CS(RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE); 245 RVCE_END(); 246 } 247 248 RVCE_BEGIN(0x03000001); // encode 249 RVCE_CS(enc->enc_pic.frame_num ? 0x0 : 0x11); // insertHeaders 250 RVCE_CS(enc->enc_pic.eo.picture_structure); 251 RVCE_CS(enc->bs_size); // allowedMaxBitstreamSize 252 RVCE_CS(enc->enc_pic.eo.force_refresh_map); 253 RVCE_CS(enc->enc_pic.eo.insert_aud); 254 RVCE_CS(enc->enc_pic.eo.end_of_sequence); 255 RVCE_CS(enc->enc_pic.eo.end_of_stream); 256 257 if (sscreen->info.chip_class < GFX9) { 258 RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, 259 enc->luma->u.legacy.level[0].offset); // inputPictureLumaAddressHi/Lo 260 RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, 261 enc->chroma->u.legacy.level[0].offset); // inputPictureChromaAddressHi/Lo 262 RVCE_CS(align(enc->luma->u.legacy.level[0].nblk_y, 16)); // encInputFrameYPitch 263 RVCE_CS(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe); // encInputPicLumaPitch 264 RVCE_CS(enc->chroma->u.legacy.level[0].nblk_x * enc->chroma->bpe); // encInputPicChromaPitch 265 } else { 266 RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, 267 enc->luma->u.gfx9.surf_offset); // inputPictureLumaAddressHi/Lo 268 RVCE_READ(enc->handle, RADEON_DOMAIN_VRAM, 269 enc->chroma->u.gfx9.surf_offset); // inputPictureChromaAddressHi/Lo 270 RVCE_CS(align(enc->luma->u.gfx9.surf_height, 16)); // encInputFrameYPitch 271 RVCE_CS(enc->luma->u.gfx9.surf_pitch * enc->luma->bpe); // encInputPicLumaPitch 272 RVCE_CS(enc->chroma->u.gfx9.surf_pitch * enc->chroma->bpe); // encInputPicChromaPitch 273 } 274 275 if (enc->dual_pipe) 276 enc->enc_pic.eo.enc_input_pic_addr_array_disable2pipe_disablemboffload = 0x00000000; 277 else 278 enc->enc_pic.eo.enc_input_pic_addr_array_disable2pipe_disablemboffload = 0x00010000; 279 RVCE_CS(enc->enc_pic.eo.enc_input_pic_addr_array_disable2pipe_disablemboffload); 280 RVCE_CS(enc->enc_pic.eo.enc_input_pic_tile_config); 281 RVCE_CS(enc->enc_pic.picture_type); // encPicType 282 RVCE_CS(enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR); // encIdrFlag 283 if ((enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR) && (enc->enc_pic.eo.enc_idr_pic_id !=0)) 284 enc->enc_pic.eo.enc_idr_pic_id = enc->enc_pic.idr_pic_id - 1; 285 else 286 enc->enc_pic.eo.enc_idr_pic_id = 0x00000000; 287 RVCE_CS(enc->enc_pic.eo.enc_idr_pic_id); 288 RVCE_CS(enc->enc_pic.eo.enc_mgs_key_pic); 289 RVCE_CS(!enc->enc_pic.not_referenced); 290 RVCE_CS(enc->enc_pic.eo.enc_temporal_layer_index); 291 RVCE_CS(enc->enc_pic.eo.num_ref_idx_active_override_flag); 292 RVCE_CS(enc->enc_pic.eo.num_ref_idx_l0_active_minus1); 293 RVCE_CS(enc->enc_pic.eo.num_ref_idx_l1_active_minus1); 294 295 i = enc->enc_pic.frame_num - enc->enc_pic.ref_idx_l0; 296 if (i > 1 && enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_P) { 297 enc->enc_pic.eo.enc_ref_list_modification_op = 0x00000001; 298 enc->enc_pic.eo.enc_ref_list_modification_num = i - 1; 299 RVCE_CS(enc->enc_pic.eo.enc_ref_list_modification_op); 300 RVCE_CS(enc->enc_pic.eo.enc_ref_list_modification_num); 301 } else { 302 enc->enc_pic.eo.enc_ref_list_modification_op = 0x00000000; 303 enc->enc_pic.eo.enc_ref_list_modification_num = 0x00000000; 304 RVCE_CS(enc->enc_pic.eo.enc_ref_list_modification_op); 305 RVCE_CS(enc->enc_pic.eo.enc_ref_list_modification_num); 306 } 307 308 for (i = 0; i < 3; ++i) { 309 enc->enc_pic.eo.enc_ref_list_modification_op = 0x00000000; 310 enc->enc_pic.eo.enc_ref_list_modification_num = 0x00000000; 311 RVCE_CS(enc->enc_pic.eo.enc_ref_list_modification_op); 312 RVCE_CS(enc->enc_pic.eo.enc_ref_list_modification_num); 313 } 314 for (i = 0; i < 4; ++i) { 315 RVCE_CS(enc->enc_pic.eo.enc_decoded_picture_marking_op); 316 RVCE_CS(enc->enc_pic.eo.enc_decoded_picture_marking_num); 317 RVCE_CS(enc->enc_pic.eo.enc_decoded_picture_marking_idx); 318 RVCE_CS(enc->enc_pic.eo.enc_decoded_ref_base_picture_marking_op); 319 RVCE_CS(enc->enc_pic.eo.enc_decoded_ref_base_picture_marking_num); 320 } 321 322 // encReferencePictureL0[0] 323 RVCE_CS(0x00000000); // pictureStructure 324 if(enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_P || 325 enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_B) { 326 struct rvce_cpb_slot *l0 = si_l0_slot(enc); 327 si_vce_frame_offset(enc, l0, &luma_offset, &chroma_offset); 328 RVCE_CS(l0->picture_type); 329 RVCE_CS(l0->frame_num); 330 RVCE_CS(l0->pic_order_cnt); 331 RVCE_CS(luma_offset); 332 RVCE_CS(chroma_offset); 333 } else { 334 enc->enc_pic.eo.l0_enc_pic_type = 0x00000000; 335 enc->enc_pic.eo.l0_frame_number = 0x00000000; 336 enc->enc_pic.eo.l0_picture_order_count = 0x00000000; 337 enc->enc_pic.eo.l0_luma_offset = 0xffffffff; 338 enc->enc_pic.eo.l0_chroma_offset = 0xffffffff; 339 RVCE_CS(enc->enc_pic.eo.l0_enc_pic_type); 340 RVCE_CS(enc->enc_pic.eo.l0_frame_number); 341 RVCE_CS(enc->enc_pic.eo.l0_picture_order_count); 342 RVCE_CS(enc->enc_pic.eo.l0_luma_offset); 343 RVCE_CS(enc->enc_pic.eo.l0_chroma_offset); 344 } 345 346 // encReferencePictureL0[1] 347 enc->enc_pic.eo.l0_picture_structure = 0x00000000; 348 enc->enc_pic.eo.l0_enc_pic_type = 0x00000000; 349 enc->enc_pic.eo.l0_frame_number = 0x00000000; 350 enc->enc_pic.eo.l0_picture_order_count = 0x00000000; 351 enc->enc_pic.eo.l0_luma_offset = 0xffffffff; 352 enc->enc_pic.eo.l0_chroma_offset = 0xffffffff; 353 RVCE_CS(enc->enc_pic.eo.l0_picture_structure); 354 RVCE_CS(enc->enc_pic.eo.l0_enc_pic_type); 355 RVCE_CS(enc->enc_pic.eo.l0_frame_number); 356 RVCE_CS(enc->enc_pic.eo.l0_picture_order_count); 357 RVCE_CS(enc->enc_pic.eo.l0_luma_offset); 358 RVCE_CS(enc->enc_pic.eo.l0_chroma_offset); 359 360 // encReferencePictureL1[0] 361 RVCE_CS(0x00000000); // pictureStructure 362 if(enc->enc_pic.picture_type == PIPE_H264_ENC_PICTURE_TYPE_B) { 363 struct rvce_cpb_slot *l1 = si_l1_slot(enc); 364 si_vce_frame_offset(enc, l1, &luma_offset, &chroma_offset); 365 RVCE_CS(l1->picture_type); 366 RVCE_CS(l1->frame_num); 367 RVCE_CS(l1->pic_order_cnt); 368 RVCE_CS(luma_offset); 369 RVCE_CS(chroma_offset); 370 } else { 371 enc->enc_pic.eo.l1_enc_pic_type = 0x00000000; 372 enc->enc_pic.eo.l1_frame_number = 0x00000000; 373 enc->enc_pic.eo.l1_picture_order_count = 0x00000000; 374 enc->enc_pic.eo.l1_luma_offset = 0xffffffff; 375 enc->enc_pic.eo.l1_chroma_offset = 0xffffffff; 376 RVCE_CS(enc->enc_pic.eo.l1_enc_pic_type); 377 RVCE_CS(enc->enc_pic.eo.l1_frame_number); 378 RVCE_CS(enc->enc_pic.eo.l1_picture_order_count); 379 RVCE_CS(enc->enc_pic.eo.l1_luma_offset); 380 RVCE_CS(enc->enc_pic.eo.l1_chroma_offset); 381 } 382 383 si_vce_frame_offset(enc, si_current_slot(enc), &luma_offset, &chroma_offset); 384 RVCE_CS(luma_offset); 385 RVCE_CS(chroma_offset); 386 RVCE_CS(enc->enc_pic.eo.enc_coloc_buffer_offset); 387 RVCE_CS(enc->enc_pic.eo.enc_reconstructed_ref_base_picture_luma_offset); 388 RVCE_CS(enc->enc_pic.eo.enc_reconstructed_ref_base_picture_chroma_offset); 389 RVCE_CS(enc->enc_pic.eo.enc_reference_ref_base_picture_luma_offset); 390 RVCE_CS(enc->enc_pic.eo.enc_reference_ref_base_picture_chroma_offset); 391 RVCE_CS(enc->enc_pic.frame_num_cnt-1); 392 RVCE_CS(enc->enc_pic.frame_num); 393 RVCE_CS(enc->enc_pic.pic_order_cnt); 394 RVCE_CS(enc->enc_pic.i_remain); 395 RVCE_CS(enc->enc_pic.p_remain); 396 RVCE_CS(enc->enc_pic.eo.num_b_pic_remain_in_rcgop); 397 RVCE_CS(enc->enc_pic.eo.num_ir_pic_remain_in_rcgop); 398 RVCE_CS(enc->enc_pic.eo.enable_intra_refresh); 399 400 RVCE_CS(enc->enc_pic.eo.aq_variance_en); 401 RVCE_CS(enc->enc_pic.eo.aq_block_size); 402 RVCE_CS(enc->enc_pic.eo.aq_mb_variance_sel); 403 RVCE_CS(enc->enc_pic.eo.aq_frame_variance_sel); 404 RVCE_CS(enc->enc_pic.eo.aq_param_a); 405 RVCE_CS(enc->enc_pic.eo.aq_param_b); 406 RVCE_CS(enc->enc_pic.eo.aq_param_c); 407 RVCE_CS(enc->enc_pic.eo.aq_param_d); 408 RVCE_CS(enc->enc_pic.eo.aq_param_e); 409 410 RVCE_CS(enc->enc_pic.eo.context_in_sfb); 411 RVCE_END(); 412} 413 414static void rate_control(struct rvce_encoder *enc) 415{ 416 RVCE_BEGIN(0x04000005); // rate control 417 RVCE_CS(enc->enc_pic.rc.rc_method); 418 RVCE_CS(enc->enc_pic.rc.target_bitrate); 419 RVCE_CS(enc->enc_pic.rc.peak_bitrate); 420 RVCE_CS(enc->enc_pic.rc.frame_rate_num); 421 RVCE_CS(enc->enc_pic.rc.gop_size); 422 RVCE_CS(enc->enc_pic.rc.quant_i_frames); 423 RVCE_CS(enc->enc_pic.rc.quant_p_frames); 424 RVCE_CS(enc->enc_pic.rc.quant_b_frames); 425 RVCE_CS(enc->enc_pic.rc.vbv_buffer_size); 426 RVCE_CS(enc->enc_pic.rc.frame_rate_den); 427 RVCE_CS(enc->enc_pic.rc.vbv_buf_lv); 428 RVCE_CS(enc->enc_pic.rc.max_au_size); 429 RVCE_CS(enc->enc_pic.rc.qp_initial_mode); 430 RVCE_CS(enc->enc_pic.rc.target_bits_picture); 431 RVCE_CS(enc->enc_pic.rc.peak_bits_picture_integer); 432 RVCE_CS(enc->enc_pic.rc.peak_bits_picture_fraction); 433 RVCE_CS(enc->enc_pic.rc.min_qp); 434 RVCE_CS(enc->enc_pic.rc.max_qp); 435 RVCE_CS(enc->enc_pic.rc.skip_frame_enable); 436 RVCE_CS(enc->enc_pic.rc.fill_data_enable); 437 RVCE_CS(enc->enc_pic.rc.enforce_hrd); 438 RVCE_CS(enc->enc_pic.rc.b_pics_delta_qp); 439 RVCE_CS(enc->enc_pic.rc.ref_b_pics_delta_qp); 440 RVCE_CS(enc->enc_pic.rc.rc_reinit_disable); 441 RVCE_CS(enc->enc_pic.rc.enc_lcvbr_init_qp_flag); 442 RVCE_CS(enc->enc_pic.rc.lcvbrsatd_based_nonlinear_bit_budget_flag); 443 RVCE_END(); 444} 445 446static void config(struct rvce_encoder *enc) 447{ 448 enc->task_info(enc, 0x00000002, 0, 0xffffffff, 0); 449 enc->rate_control(enc); 450 enc->config_extension(enc); 451 enc->motion_estimation(enc); 452 enc->rdo(enc); 453 if (enc->use_vui) 454 enc->vui(enc); 455 enc->pic_control(enc); 456} 457 458static void config_extension(struct rvce_encoder *enc) 459{ 460 RVCE_BEGIN(0x04000001); // config extension 461 RVCE_CS(enc->enc_pic.ce.enc_enable_perf_logging); 462 RVCE_END(); 463} 464 465static void feedback(struct rvce_encoder *enc) 466{ 467 RVCE_BEGIN(0x05000005); // feedback buffer 468 RVCE_WRITE(enc->fb->res->buf, enc->fb->res->domains, 0x0); // feedbackRingAddressHi/Lo 469 RVCE_CS(enc->enc_pic.fb.feedback_ring_size); 470 RVCE_END(); 471} 472 473static void destroy(struct rvce_encoder *enc) 474{ 475 enc->task_info(enc, 0x00000001, 0, 0, 0); 476 477 feedback(enc); 478 479 RVCE_BEGIN(0x02000001); // destroy 480 RVCE_END(); 481} 482 483static void motion_estimation(struct rvce_encoder *enc) 484{ 485 RVCE_BEGIN(0x04000007); // motion estimation 486 RVCE_CS(enc->enc_pic.me.enc_ime_decimation_search); 487 RVCE_CS(enc->enc_pic.me.motion_est_half_pixel); 488 RVCE_CS(enc->enc_pic.me.motion_est_quarter_pixel); 489 RVCE_CS(enc->enc_pic.me.disable_favor_pmv_point); 490 RVCE_CS(enc->enc_pic.me.force_zero_point_center); 491 RVCE_CS(enc->enc_pic.me.lsmvert); 492 RVCE_CS(enc->enc_pic.me.enc_search_range_x); 493 RVCE_CS(enc->enc_pic.me.enc_search_range_y); 494 RVCE_CS(enc->enc_pic.me.enc_search1_range_x); 495 RVCE_CS(enc->enc_pic.me.enc_search1_range_y); 496 RVCE_CS(enc->enc_pic.me.disable_16x16_frame1); 497 RVCE_CS(enc->enc_pic.me.disable_satd); 498 RVCE_CS(enc->enc_pic.me.enable_amd); 499 RVCE_CS(enc->enc_pic.me.enc_disable_sub_mode); 500 RVCE_CS(enc->enc_pic.me.enc_ime_skip_x); 501 RVCE_CS(enc->enc_pic.me.enc_ime_skip_y); 502 RVCE_CS(enc->enc_pic.me.enc_en_ime_overw_dis_subm); 503 RVCE_CS(enc->enc_pic.me.enc_ime_overw_dis_subm_no); 504 RVCE_CS(enc->enc_pic.me.enc_ime2_search_range_x); 505 RVCE_CS(enc->enc_pic.me.enc_ime2_search_range_y); 506 RVCE_CS(enc->enc_pic.me.parallel_mode_speedup_enable); 507 RVCE_CS(enc->enc_pic.me.fme0_enc_disable_sub_mode); 508 RVCE_CS(enc->enc_pic.me.fme1_enc_disable_sub_mode); 509 RVCE_CS(enc->enc_pic.me.ime_sw_speedup_enable); 510 RVCE_END(); 511} 512 513static void pic_control(struct rvce_encoder *enc) 514{ 515 RVCE_BEGIN(0x04000002); // pic control 516 RVCE_CS(enc->enc_pic.pc.enc_use_constrained_intra_pred); 517 RVCE_CS(enc->enc_pic.pc.enc_cabac_enable); 518 RVCE_CS(enc->enc_pic.pc.enc_cabac_idc); 519 RVCE_CS(enc->enc_pic.pc.enc_loop_filter_disable); 520 RVCE_CS(enc->enc_pic.pc.enc_lf_beta_offset); 521 RVCE_CS(enc->enc_pic.pc.enc_lf_alpha_c0_offset); 522 RVCE_CS(enc->enc_pic.pc.enc_crop_left_offset); 523 RVCE_CS(enc->enc_pic.pc.enc_crop_right_offset); 524 RVCE_CS(enc->enc_pic.pc.enc_crop_top_offset); 525 RVCE_CS(enc->enc_pic.pc.enc_crop_bottom_offset); 526 RVCE_CS(enc->enc_pic.pc.enc_num_mbs_per_slice); 527 RVCE_CS(enc->enc_pic.pc.enc_intra_refresh_num_mbs_per_slot); 528 RVCE_CS(enc->enc_pic.pc.enc_force_intra_refresh); 529 RVCE_CS(enc->enc_pic.pc.enc_force_imb_period); 530 RVCE_CS(enc->enc_pic.pc.enc_pic_order_cnt_type); 531 RVCE_CS(enc->enc_pic.pc.log2_max_pic_order_cnt_lsb_minus4); 532 RVCE_CS(enc->enc_pic.pc.enc_sps_id); 533 RVCE_CS(enc->enc_pic.pc.enc_pps_id); 534 RVCE_CS(enc->enc_pic.pc.enc_constraint_set_flags); 535 RVCE_CS(enc->enc_pic.pc.enc_b_pic_pattern); 536 RVCE_CS(enc->enc_pic.pc.weight_pred_mode_b_picture); 537 RVCE_CS(enc->enc_pic.pc.enc_number_of_reference_frames); 538 RVCE_CS(enc->enc_pic.pc.enc_max_num_ref_frames); 539 RVCE_CS(enc->enc_pic.pc.enc_num_default_active_ref_l0); 540 RVCE_CS(enc->enc_pic.pc.enc_num_default_active_ref_l1); 541 RVCE_CS(enc->enc_pic.pc.enc_slice_mode); 542 RVCE_CS(enc->enc_pic.pc.enc_max_slice_size); 543 RVCE_END(); 544} 545 546static void rdo(struct rvce_encoder *enc) 547{ 548 RVCE_BEGIN(0x04000008); // rdo 549 RVCE_CS(enc->enc_pic.rdo.enc_disable_tbe_pred_i_frame); 550 RVCE_CS(enc->enc_pic.rdo.enc_disable_tbe_pred_p_frame); 551 RVCE_CS(enc->enc_pic.rdo.use_fme_interpol_y); 552 RVCE_CS(enc->enc_pic.rdo.use_fme_interpol_uv); 553 RVCE_CS(enc->enc_pic.rdo.use_fme_intrapol_y); 554 RVCE_CS(enc->enc_pic.rdo.use_fme_intrapol_uv); 555 RVCE_CS(enc->enc_pic.rdo.use_fme_interpol_y_1); 556 RVCE_CS(enc->enc_pic.rdo.use_fme_interpol_uv_1); 557 RVCE_CS(enc->enc_pic.rdo.use_fme_intrapol_y_1); 558 RVCE_CS(enc->enc_pic.rdo.use_fme_intrapol_uv_1); 559 RVCE_CS(enc->enc_pic.rdo.enc_16x16_cost_adj); 560 RVCE_CS(enc->enc_pic.rdo.enc_skip_cost_adj); 561 RVCE_CS(enc->enc_pic.rdo.enc_force_16x16_skip); 562 RVCE_CS(enc->enc_pic.rdo.enc_disable_threshold_calc_a); 563 RVCE_CS(enc->enc_pic.rdo.enc_luma_coeff_cost); 564 RVCE_CS(enc->enc_pic.rdo.enc_luma_mb_coeff_cost); 565 RVCE_CS(enc->enc_pic.rdo.enc_chroma_coeff_cost); 566 RVCE_END(); 567} 568 569static void session(struct rvce_encoder *enc) 570{ 571 RVCE_BEGIN(0x00000001); // session cmd 572 RVCE_CS(enc->stream_handle); 573 RVCE_END(); 574} 575 576static void task_info(struct rvce_encoder *enc, uint32_t op, 577 uint32_t dep, uint32_t fb_idx, uint32_t ring_idx) 578{ 579 RVCE_BEGIN(0x00000002); // task info 580 if (op == 0x3) { 581 if (enc->task_info_idx) { 582 uint32_t offs = enc->cs->current.cdw - enc->task_info_idx + 3; 583 // Update offsetOfNextTaskInfo 584 enc->cs->current.buf[enc->task_info_idx] = offs; 585 } 586 enc->task_info_idx = enc->cs->current.cdw; 587 } 588 enc->enc_pic.ti.task_operation = op; 589 enc->enc_pic.ti.reference_picture_dependency = dep; 590 enc->enc_pic.ti.feedback_index = fb_idx; 591 enc->enc_pic.ti.video_bitstream_ring_index = ring_idx; 592 RVCE_CS(enc->enc_pic.ti.offset_of_next_task_info); 593 RVCE_CS(enc->enc_pic.ti.task_operation); 594 RVCE_CS(enc->enc_pic.ti.reference_picture_dependency); 595 RVCE_CS(enc->enc_pic.ti.collocate_flag_dependency); 596 RVCE_CS(enc->enc_pic.ti.feedback_index); 597 RVCE_CS(enc->enc_pic.ti.video_bitstream_ring_index); 598 RVCE_END(); 599} 600 601static void vui(struct rvce_encoder *enc) 602{ 603 int i; 604 605 if (!enc->enc_pic.enable_vui) 606 return; 607 608 RVCE_BEGIN(0x04000009); // vui 609 RVCE_CS(enc->enc_pic.vui.aspect_ratio_info_present_flag); 610 RVCE_CS(enc->enc_pic.vui.aspect_ratio_idc); 611 RVCE_CS(enc->enc_pic.vui.sar_width); 612 RVCE_CS(enc->enc_pic.vui.sar_height); 613 RVCE_CS(enc->enc_pic.vui.overscan_info_present_flag); 614 RVCE_CS(enc->enc_pic.vui.overscan_Approp_flag); 615 RVCE_CS(enc->enc_pic.vui.video_signal_type_present_flag); 616 RVCE_CS(enc->enc_pic.vui.video_format); 617 RVCE_CS(enc->enc_pic.vui.video_full_range_flag); 618 RVCE_CS(enc->enc_pic.vui.color_description_present_flag); 619 RVCE_CS(enc->enc_pic.vui.color_prim); 620 RVCE_CS(enc->enc_pic.vui.transfer_char); 621 RVCE_CS(enc->enc_pic.vui.matrix_coef); 622 RVCE_CS(enc->enc_pic.vui.chroma_loc_info_present_flag); 623 RVCE_CS(enc->enc_pic.vui.chroma_loc_top); 624 RVCE_CS(enc->enc_pic.vui.chroma_loc_bottom); 625 RVCE_CS(enc->enc_pic.vui.timing_info_present_flag); 626 RVCE_CS(enc->enc_pic.vui.num_units_in_tick); 627 RVCE_CS(enc->enc_pic.vui.time_scale); 628 RVCE_CS(enc->enc_pic.vui.fixed_frame_rate_flag); 629 RVCE_CS(enc->enc_pic.vui.nal_hrd_parameters_present_flag); 630 RVCE_CS(enc->enc_pic.vui.cpb_cnt_minus1); 631 RVCE_CS(enc->enc_pic.vui.bit_rate_scale); 632 RVCE_CS(enc->enc_pic.vui.cpb_size_scale); 633 for (i = 0; i < 32; i++) { 634 RVCE_CS(enc->enc_pic.vui.bit_rate_value_minus); 635 RVCE_CS(enc->enc_pic.vui.cpb_size_value_minus); 636 RVCE_CS(enc->enc_pic.vui.cbr_flag); 637 } 638 RVCE_CS(enc->enc_pic.vui.initial_cpb_removal_delay_length_minus1); 639 RVCE_CS(enc->enc_pic.vui.cpb_removal_delay_length_minus1); 640 RVCE_CS(enc->enc_pic.vui.dpb_output_delay_length_minus1); 641 RVCE_CS(enc->enc_pic.vui.time_offset_length); 642 RVCE_CS(enc->enc_pic.vui.low_delay_hrd_flag); 643 RVCE_CS(enc->enc_pic.vui.pic_struct_present_flag); 644 RVCE_CS(enc->enc_pic.vui.bitstream_restriction_present_flag); 645 RVCE_CS(enc->enc_pic.vui.motion_vectors_over_pic_boundaries_flag); 646 RVCE_CS(enc->enc_pic.vui.max_bytes_per_pic_denom); 647 RVCE_CS(enc->enc_pic.vui.max_bits_per_mb_denom); 648 RVCE_CS(enc->enc_pic.vui.log2_max_mv_length_hori); 649 RVCE_CS(enc->enc_pic.vui.log2_max_mv_length_vert); 650 RVCE_CS(enc->enc_pic.vui.num_reorder_frames); 651 RVCE_CS(enc->enc_pic.vui.max_dec_frame_buffering); 652 RVCE_END(); 653} 654 655void si_vce_52_init(struct rvce_encoder *enc) 656{ 657 enc->session = session; 658 enc->task_info = task_info; 659 enc->create = create; 660 enc->feedback = feedback; 661 enc->rate_control = rate_control; 662 enc->config_extension = config_extension; 663 enc->pic_control = pic_control; 664 enc->motion_estimation = motion_estimation; 665 enc->rdo = rdo; 666 enc->vui = vui; 667 enc->config = config; 668 enc->encode = encode; 669 enc->destroy = destroy; 670} 671