1 /****************************************************************************** 2 * 3 * Copyright (C) 2018 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 /*! 21 ****************************************************************************** 22 * \file ihevce_hle_interface.h 23 * 24 * \brief 25 * This file contains infertace prototypes of High level enocder interafce 26 * structure and interface functions. 27 * 28 * \date 29 * 18/09/2012 30 * 31 * \author 32 * Ittiam 33 * 34 ****************************************************************************** 35 */ 36 37 #ifndef _IHEVCE_HLE_INTERFACE_H_ 38 #define _IHEVCE_HLE_INTERFACE_H_ 39 40 #include "ihevce_profile.h" 41 42 /*****************************************************************************/ 43 /* Constant Macros */ 44 /*****************************************************************************/ 45 #define IHEVCE_DLL 46 47 #define DUMP_MBR_MULTI_RES_INFO 0 48 49 #define DUMP_RC_2_PASS_DATA_BINARY_APP 1 50 /*print attributes */ 51 52 /*print everything on console */ 53 #define PRINTF(v, x, y, ...) ps_sys_api->ihevce_printf(v, __VA_ARGS__) 54 55 #define FPRINTF(v, fp, x, y, ...) \ 56 if(NULL != fp) \ 57 { \ 58 ps_sys_api->s_file_io_api.ihevce_fprintf(v, fp, __VA_ARGS__); \ 59 } 60 61 /* Semaphore attribute */ 62 #define SEM_START_VALUE 1 63 #define THREAD_STACK_SIZE 0x80000 64 65 /*****************************************************************************/ 66 /* Function Macros */ 67 /*****************************************************************************/ 68 69 /*****************************************************************************/ 70 /* Typedefs */ 71 /*****************************************************************************/ 72 73 /*****************************************************************************/ 74 /* Enums */ 75 /*****************************************************************************/ 76 typedef enum 77 { 78 BUFF_QUE_NON_BLOCKING_MODE = 0, 79 80 BUFF_QUE_BLOCKING_MODE 81 82 } BUFF_QUE_MODES_T; 83 84 /*****************************************************************************/ 85 /* Structure */ 86 /*****************************************************************************/ 87 /** 88 * @brief Structure to describe Process interface parameters of Encoder 89 */ 90 typedef struct 91 { 92 /** 93 * Size for version tracking purpose 94 */ 95 WORD32 i4_size; 96 97 /** 98 * Flag to communicate that HLE thread int are done 99 */ 100 WORD32 i4_hle_init_done; 101 102 /** 103 * Error code communciate any error during create stage 104 */ 105 WORD32 i4_error_code; 106 107 /** 108 * GPU memory accumalator 109 */ 110 WORD32 i4_gpu_mem_size; 111 112 /** 113 * OSAL handle 114 */ 115 void *pv_osal_handle; 116 117 /** 118 * Encoder Handle 119 */ 120 void *apv_enc_hdl[IHEVCE_MAX_NUM_RESOLUTIONS]; 121 122 /** 123 * Static parameters structure 124 */ 125 ihevce_static_cfg_params_t *ps_static_cfg_prms; 126 127 /** 128 * Memory Manager handle 129 */ 130 void *pv_mem_mgr_hdl; 131 132 /** 133 * Input Buffer callback handle 134 */ 135 void *pv_inp_cb_handle; 136 137 /** 138 * Ouput Buffer callback handle 139 */ 140 void *pv_out_cb_handle; 141 142 /** 143 * Ouput Recon Buffer callback handle 144 */ 145 void *pv_recon_cb_handle; 146 147 /** 148 * Call back API to be called while the buffer for bitstream filling is done 149 */ 150 IV_API_CALL_STATUS_T (*ihevce_output_strm_fill_done) 151 (void *pv_out_cb_handle, void *pv_curr_out, WORD32 i4_bitrate_instance, WORD32 i4_res_instance); 152 153 /** 154 * Call back API to be called while the buffer for recon filling is done 155 */ 156 IV_API_CALL_STATUS_T (*ihevce_output_recon_fill_done) 157 (void *pv_recon_cb_handle, 158 void *pv_curr_out, 159 WORD32 i4_bitrate_instance, 160 WORD32 i4_res_instance); 161 162 /** 163 * Call back API to be called while freeing the input buffer 164 */ 165 IV_API_CALL_STATUS_T (*ihevce_set_free_input_buff) 166 (void *pv_inp_cb_handle, iv_input_data_ctrl_buffs_t *ps_input_buf); 167 168 /** 169 * Call back API to be called during allocation using memory manager 170 */ 171 void (*ihevce_mem_alloc)( 172 void *pv_mem_mgr_hdl, ihevce_sys_api_t *ps_sys_api, iv_mem_rec_t *ps_memtab); 173 174 /** 175 * Call back API for freeing using memory manager 176 */ 177 void (*ihevce_mem_free)(void *pv_mem_mgr_hdl, iv_mem_rec_t *ps_memtab); 178 179 /* create or run time input buffer allocation, 1: create time 0: run time*/ 180 WORD32 i4_create_time_input_allocation; 181 182 /* create or run time output buffer allocation, 1: create time 0: run time*/ 183 WORD32 i4_create_time_output_allocation; 184 185 /*Cores per resolution*/ 186 WORD32 ai4_num_core_per_res[IHEVCE_MAX_NUM_RESOLUTIONS]; 187 188 /** 189 * Error Handling callback handle 190 */ 191 void *pv_cmd_err_cb_handle; 192 193 /** 194 * Call back API to be called when errors need to be reported 195 */ 196 IV_API_CALL_STATUS_T (*ihevce_cmds_error_report) 197 (void *pv_cmd_err_cb_handle, WORD32 i4_error_code, WORD32 i4_cmd_type, WORD32 i4_buf_id); 198 199 /** 200 * Flag to indicate if ECU is enabled/disabled 201 */ 202 WORD32 i4_p6_opt_enabled; 203 204 /** 205 * profile stats 206 */ 207 profile_database_t profile_hle; 208 profile_database_t profile_pre_enc[IHEVCE_MAX_NUM_RESOLUTIONS]; 209 profile_database_t profile_enc[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]; 210 profile_database_t profile_entropy[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]; 211 212 } ihevce_hle_ctxt_t; 213 214 /** 215 ****************************************************************************** 216 * @brief Indivisual Thread context structure 217 ****************************************************************************** 218 */ 219 typedef struct 220 { 221 /** Unique Id associated with every frame processing thread */ 222 WORD32 i4_thrd_id; 223 224 /** pointer to encoder context structure */ 225 void *pv_enc_ctxt; 226 227 /** pointer to the hle context structure */ 228 ihevce_hle_ctxt_t *ps_hle_ctxt; 229 230 } frm_proc_thrd_ctxt_t; 231 232 /*****************************************************************************/ 233 /* Extern Variable Declarations */ 234 /*****************************************************************************/ 235 236 /*****************************************************************************/ 237 /* Extern Function Declarations */ 238 /*****************************************************************************/ 239 240 /** Create API 241 * 242 * ps_hle_ctxt : Pointer to high level encoder context. 243 * It is assumed that application before calling this API 244 * has initialized with correct pointers for following 245 * - pv_osal_handle 246 * - pv_app_sem_handle 247 * - ps_static_cfg_prms 248 * - ihevce_mem_alloc 249 * - ihevce_mem_free 250 * 251 * Encoder after initilaization would store the encoder handle in 252 * - pv_enc_hdl 253 * 254 * Create Return status (success or fail) is returned 255 */ 256 IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_hle_interface_create(ihevce_hle_ctxt_t *ps_hle_ctxt); 257 258 /** Query IO buffers requirements API 259 * 260 * ps_hle_ctxt : Pointer to high level encoder context. 261 * ps_input_bufs_req : memory to store input buffer requirements 262 * ps_output_bufs_req : memory to store output buffer requirements 263 * 264 * Should be called only after a sucessfull create of codec instance 265 * 266 * Return status (success or fail) is returned 267 */ 268 IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_query_io_buf_req( 269 ihevce_hle_ctxt_t *ps_hle_ctxt, 270 iv_input_bufs_req_t *ps_input_bufs_req, 271 iv_res_layer_output_bufs_req_t *ps_res_layer_output_bufs_req, 272 iv_res_layer_recon_bufs_req_t *ps_res_layer_recon_bufs_req); 273 274 /** Create buffer ports for procesing API 275 * 276 * ps_hle_ctxt : Pointer to high level encoder context. 277 * ps_input_data_ctrl_buffs_desc : 278 * Pointer to Input (data/control) buffers details memory 279 * ps_input_asynch_ctrl_buffs_desc : 280 * Pointer to Input async control buffers details memory 281 * ps_output_data_buffs_desc : 282 * Pointer to output data buffers details memory 283 * ps_output_status_buffs_desc: 284 * Pointer to outtput async control buffers details memory 285 * 286 * Return status (success or fail) is returned 287 */ 288 IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_create_ports( 289 ihevce_hle_ctxt_t *ps_hle_ctxt, 290 iv_input_data_ctrl_buffs_desc_t *ps_input_data_ctrl_buffs_desc, 291 iv_input_asynch_ctrl_buffs_desc_t *ps_input_asynch_ctrl_buffs_desc, 292 iv_res_layer_output_data_buffs_desc_t *ps_mres_output_data_buffs_desc, 293 iv_res_layer_recon_data_buffs_desc_t *ps_mres_recon_data_buffs_desc); 294 295 /** Processing interface layer thread API 296 * 297 * This is the entry point for this thread 298 * pointer to ihevce_hle_ctxt_t has to be passed 299 * to this function as the argument 300 * 301 * return should be a exit code (0) 302 */ 303 IHEVCE_DLL WORD32 ihevce_hle_interface_thrd(void *pv_proc_intf_ctxt); 304 305 /** Get version API 306 * 307 * This is API to return the version number of the encoder 308 * 309 * returns the version number string 310 */ 311 IHEVCE_DLL const char *ihevce_get_encoder_version(void); 312 313 /** Validate Encoder parameters 314 * 315 * This is API to return the version number of the encoder 316 * 317 * returns the version number string 318 */ 319 IHEVCE_DLL WORD32 ihevce_validate_encoder_parameters(ihevce_static_cfg_params_t *ps_static_cfg_prms); 320 321 /** Get free input frame data buffer API 322 * 323 * ps_hle_ctxt : Pointer to high level encoder context. 324 * pi4_buff_id : pointer to store the buffer id of the buffer returned. 325 * i4_blocking_mode : Blocking mode to control if the the API should wait 326 * for a free buffer to be available and then 327 * return with a valid buffer @sa BUFF_QUE_MODES_T 328 * returns NULL if no free buffer is present in queue (if non blocking mode) 329 */ 330 IHEVCE_DLL void *ihevce_q_get_free_inp_data_buff( 331 ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 *pi4_buff_id, WORD32 i4_blocking_mode); 332 333 /** Get free input control data buffer API 334 * 335 * ps_hle_ctxt : Pointer to high level encoder context. 336 * pi4_buff_id : pointer to store the buffer id of the buffer returned. 337 * i4_blocking_mode : Blocking mode to control if the the API should wait 338 * for a free buffer to be available and then 339 * return with a valid buffer @sa BUFF_QUE_MODES_T 340 * returns NULL if no free buffer is present in queue (if non blocking mode) 341 */ 342 IHEVCE_DLL void *ihevce_q_get_free_inp_ctrl_buff( 343 ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 *pi4_buff_id, WORD32 i4_blocking_mode); 344 345 IHEVCE_DLL void *ihevce_q_get_free_out_strm_buff( 346 ihevce_hle_ctxt_t *ps_hle_ctxt, 347 WORD32 *pi4_buff_id, 348 WORD32 i4_blocking_mode, 349 WORD32 i4_bitrate_instance, 350 WORD32 i4_res_instance); 351 352 IHEVCE_DLL void *ihevce_q_get_free_out_recon_buff( 353 ihevce_hle_ctxt_t *ps_hle_ctxt, 354 WORD32 *pi4_buff_id, 355 WORD32 i4_blocking_mode, 356 WORD32 i4_bitrate_instance, 357 WORD32 i4_res_instance); 358 359 /** Set Input frame data buffer as produced API 360 * 361 * ps_hle_ctxt : Pointer to high level encoder context. 362 * i4_buff_id : buffer id of the buffer returned during get free buf. 363 */ 364 IHEVCE_DLL IV_API_CALL_STATUS_T 365 ihevce_q_set_inp_data_buff_prod(ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 i4_buff_id); 366 367 /** Set Input control data buffer as produced API 368 * 369 * ps_hle_ctxt : Pointer to high level encoder context. 370 * i4_buff_id : buffer id of the buffer returned during get free buf. 371 */ 372 IHEVCE_DLL IV_API_CALL_STATUS_T 373 ihevce_q_set_inp_ctrl_buff_prod(ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 i4_buff_id); 374 375 IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_q_set_out_strm_buff_prod( 376 ihevce_hle_ctxt_t *ps_hle_ctxt, 377 WORD32 i4_buff_id, 378 WORD32 i4_bitrate_instance_id, 379 WORD32 i4_resolution_id); 380 381 IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_q_set_out_recon_buff_prod( 382 ihevce_hle_ctxt_t *ps_hle_ctxt, 383 WORD32 i4_buff_id, 384 WORD32 i4_bitrate_instance_id, 385 WORD32 i4_resolution_id); 386 387 /** Get next filled recon data buffer API 388 * 389 * ps_hle_ctxt : Pointer to high level encoder context. 390 * pi4_buff_id : pointer to store the buffer id of the buffer returned. 391 * i4_blocking_mode : Blocking mode to control if the the API should wait 392 * for a produced buffer to be available and then 393 * return with a valid buffer @sa BUFF_QUE_MODES_T 394 * returns NULL if no produced buffer is present in queue (if non blocking mode) 395 */ 396 IHEVCE_DLL void *ihevce_q_get_filled_recon_buff( 397 ihevce_hle_ctxt_t *ps_hle_ctxt, 398 WORD32 *pi4_buff_id, 399 WORD32 i4_blocking_mode, 400 WORD32 i4_bitrate_instance_id, 401 WORD32 i4_resolution_id); 402 403 /** Release/ Free recon buffer buffer API 404 * 405 * ps_hle_ctxt : Pointer to high level encoder context. 406 * i4_buff_id : buffer id of the buffer returned during get next buf. 407 */ 408 IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_q_rel_recon_buf( 409 ihevce_hle_ctxt_t *ps_hle_ctxt, 410 WORD32 i4_buff_id, 411 WORD32 i4_bitrate_instance_id, 412 WORD32 i4_resolution_id); 413 414 /** Delete API 415 * 416 * Should be called only after the high level encoder thread exits or returns 417 */ 418 IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_hle_interface_delete(ihevce_hle_ctxt_t *ps_hle_ctxt); 419 420 /** Trace API 421 * 422 * Open and Close trace file pointer. 423 */ 424 IHEVCE_DLL WORD32 ihevce_trace_init(UWORD8 *pu1_file_name); 425 426 IHEVCE_DLL WORD32 ihevce_trace_deinit(void); 427 428 /** Header API 429 * 430 * Get sequence headers asynchronously 431 */ 432 WORD32 ihevce_entropy_encode_header( 433 ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 i4_bitrate_instance_id, WORD32 i4_resolution_id); 434 435 #endif /* _IHEVCE_HLE_INTERFACE_H_ */ 436