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_plugin_priv.h 23 * 24 * \brief 25 * This file contains sample application definations and structures 26 * 27 * \date 28 * 15/04/2014 29 * 30 * \author 31 * Ittiam 32 * 33 * 34 * List of Functions 35 * 36 * 37 ****************************************************************************** 38 */ 39 #ifndef _IHEVCE_PLUGIN_PRIV_H_ 40 #define _IHEVCE_PLUGIN_PRIV_H_ 41 42 /*****************************************************************************/ 43 /* File Includes */ 44 /*****************************************************************************/ 45 46 /*****************************************************************************/ 47 /* Constant Macros */ 48 /*****************************************************************************/ 49 50 #define XTRA_INP_DATA_BUFS 0 51 #define MAX_NUM_INP_DATA_BUFS MAX_SUB_GOP_SIZE + NUM_LAP2_LOOK_AHEAD 52 #define MAX_NUM_INP_CTRL_SYNC_BUFS MAX_NUM_INP_DATA_BUFS 53 #define MAX_NUM_INP_CTRL_ASYNC_BUFS 5 54 55 #define XTRA_OUT_DATA_BUFS 0 56 #define MAX_NUM_OUT_DATA_BUFS (16 + XTRA_OUT_DATA_BUFS) 57 #define MAX_NUM_OUT_CTRL_ASYNC_BUFS 16 58 59 #define MAX_NUM_RECON_DATA_BUFS 64 60 61 /** Queue from Master to Slave for MBR/MRES cases **/ 62 #define MBR_M2S_QUEUE 200 63 64 /*****************************************************************************/ 65 /* Function Macros */ 66 /*****************************************************************************/ 67 #define SET_CTB_ALIGN(x, y) ((((x) & ((y)-1)) == 0) ? 0 : (y) - ((x) & ((y)-1))) 68 69 /*****************************************************************************/ 70 /* Typedefs */ 71 /*****************************************************************************/ 72 73 /*****************************************************************************/ 74 /* Enums */ 75 /*****************************************************************************/ 76 77 /*****************************************************************************/ 78 /* Structure */ 79 /*****************************************************************************/ 80 81 /** 82 * @brief Store output buffer parameters 83 */ 84 typedef struct 85 { 86 UWORD8 *pu1_bs_buffer; 87 WORD32 i4_bytes_generated; 88 WORD32 i4_is_key_frame; 89 ULWORD64 u8_pts; 90 LWORD64 i8_dts; 91 } bitstream_buf_t; 92 93 /** 94 * @brief Store buffer queue parameters 95 */ 96 typedef struct 97 { 98 /******* Buffer q indexes *******/ 99 WORD32 i4_q_rd_idx; 100 WORD32 i4_q_wr_idx; 101 WORD32 i4_quit; 102 WORD32 i4_q_size; 103 104 /******* Semaphore Handles ******/ 105 void *pv_q_deq_sem_handle; 106 void *pv_rel_free_sem_handle; 107 } queue_t; 108 109 /** 110 * @brief Datatype of global pointer used for data sharing 111 * across encoder nodes. 112 */ 113 114 typedef struct 115 { 116 queue_t s_queue_params; 117 bitstream_buf_t bs_buf_nodes[MBR_M2S_QUEUE]; 118 WORD32 i4_slave_inst_done; 119 120 } ihevce_mbr_mres_handle_t; 121 122 typedef struct 123 { 124 WORD32 i4_idx; 125 126 UWORD8 *pu1_buf; 127 128 WORD32 i4_is_free; 129 130 WORD32 i4_is_prod; 131 132 WORD32 i4_timestamp_low; 133 134 WORD32 i4_timestamp_high; 135 136 WORD32 i4_bytes_gen; 137 138 WORD32 i4_is_key_frame; 139 140 WORD32 i4_buf_size; 141 142 WORD32 i4_end_flag; 143 144 } out_buf_ctxt_t; 145 146 typedef struct 147 { 148 ULWORD64 u8_total_bits; 149 150 UWORD32 u4_num_frms_enc; 151 152 /* mutex controlling the out strm buf b/w appln and encoder */ 153 void *pv_app_out_strm_buf_mutex_hdl; 154 155 void *pv_app_out_strm_buf_cond_var_hdl; 156 157 } out_strm_prms_t; 158 159 typedef struct 160 { 161 void *pv_mem_mngr_handle; /*!< memory manager handle */ 162 163 WORD32 ai4_out_strm_end_flag[IHEVCE_MAX_NUM_RESOLUTIONS] 164 [IHEVCE_MAX_NUM_BITRATES]; /*!< end of strm processing */ 165 166 out_strm_prms_t as_out_strm_prms[IHEVCE_MAX_NUM_RESOLUTIONS] 167 [IHEVCE_MAX_NUM_BITRATES]; /*!< to store out strm related prms */ 168 169 } app_ctxt_t; 170 171 typedef struct 172 { 173 /*!< Static paramters same memory pointer will be passed to 174 processing interface layer */ 175 ihevce_static_cfg_params_t *ps_static_cfg_prms; 176 177 /*!< Osal Handle */ 178 void *pv_osal_handle; 179 180 /*!< Call back API for freeing */ 181 void (*ihevce_mem_free)(void *pv_handle, void *pv_mem); 182 183 /*!< Call back API to be called during allocation */ 184 void *(*ihevce_mem_alloc)(void *pv_handle, UWORD32 u4_size); 185 186 /** App context memory */ 187 app_ctxt_t s_app_ctxt; 188 189 /** semaphore handle for Input data proc thread */ 190 void *pv_app_inp_ctrl_sem_hdl; 191 192 /** semaphore handle for Output data proc thread */ 193 void *pv_app_out_sts_sem_hdl; 194 195 /** Pointer to HLE interface ctxt */ 196 void *pv_hle_interface_ctxt; 197 198 /** Memtab of input buffers */ 199 iv_mem_rec_t s_memtab_inp_data_buf; 200 201 /** Memtab of input command buffers */ 202 iv_mem_rec_t s_memtab_inp_sync_ctrl_buf; 203 204 /** Array of memtabs of outptu buffers */ 205 iv_mem_rec_t as_memtab_out_data_buf[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]; 206 207 /* pointer to async command input buffer */ 208 UWORD8 *pu1_inp_async_ctrl_buf; 209 210 /* pointer to async command output buffer*/ 211 UWORD8 *pu1_out_ctrl_buf; 212 213 /* HLE thread handle */ 214 void *pv_hle_thread_hdl; 215 216 /* flag to indicate that flush mode is ON */ 217 WORD32 i4_flush_mode_on; 218 219 /* field id for interlaced case */ 220 WORD32 i4_field_id; 221 222 /* frame stride of input buffers */ 223 WORD32 i4_frm_stride; 224 225 /* flag to indicate Output end status */ 226 WORD32 ai4_out_end_flag[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]; 227 228 /* output buffer context */ 229 out_buf_ctxt_t aaas_out_bufs[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES] 230 [MAX_NUM_OUT_DATA_BUFS + 1]; 231 232 /* Num Output buffers */ 233 WORD32 i4_num_out_bufs; 234 235 /* Free outbuf idx */ 236 WORD32 ai4_free_out_buf_idx[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]; 237 238 /* Out produced idx */ 239 WORD32 i4_prod_out_buf_idx; 240 241 /* DTS for output population */ 242 LWORD64 i8_dts; 243 244 /* Flag used for flushing in case of EVAL version */ 245 WORD32 i4_internal_flush; 246 247 ULWORD64 u8_num_frames_encoded; 248 249 /* Count no of frames queued */ 250 ULWORD64 u8_num_frames_queued; 251 252 /** Structure which contains params to be shared across different FFMPEG instances **/ 253 ihevce_mbr_mres_handle_t 254 *ps_mbr_mres_handle[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]; 255 256 /* Dynamic change in bitrate detecting mechnaism related vaiables */ 257 WORD32 ai4_old_bitrate[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]; 258 259 } plugin_ctxt_t; 260 261 /*****************************************************************************/ 262 /* Extern Variable Declarations */ 263 /*****************************************************************************/ 264 265 /*****************************************************************************/ 266 /* Extern Function Declarations */ 267 /*****************************************************************************/ 268 269 #endif /* _IHEVCE_PLUGIN_PRIV_H_ */ 270