1 /****************************************************************************** 2 * 3 * Copyright (C) 2015 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 Name : app.h */ 23 /* */ 24 /* Description : This file contains all the necessary structure and */ 25 /* enumeration definitions needed for the Application */ 26 /* */ 27 /* List of Functions : */ 28 /* */ 29 /* Issues / Problems : None */ 30 /* */ 31 /* Revision History : */ 32 /* */ 33 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 34 /* 26 08 2010 Ittiam Draft */ 35 /* */ 36 /*****************************************************************************/ 37 38 #ifndef _APP_H_ 39 #define _APP_H_ 40 41 #include "iv2.h" 42 #include "ive2.h" 43 #ifdef WINDOWS_TIMER 44 #include <windows.h> 45 #else 46 #include <sys/time.h> 47 #endif 48 /*****************************************************************************/ 49 /* Function Macros */ 50 /*****************************************************************************/ 51 #define MAX(a, b) ((a) > (b))? (a) : (b) 52 #define MIN(a, b) ((a) < (b))? (a) : (b) 53 54 #define ALIGN16(x) ((((x) + 15) >> 4) << 4) 55 56 /*****************************************************************************/ 57 /* Constant Macros */ 58 /*****************************************************************************/ 59 60 #define DEFAULT_NUM_INPUT_BUFS 32 61 #define DEFAULT_MAX_INPUT_BUFS 32 62 63 #define DEFAULT_NUM_OUTPUT_BUFS 32 64 #define DEFAULT_MAX_OUTPUT_BUFS 32 65 66 #define DEFAULT_NUM_RECON_BUFS 32 67 #define DEFAULT_MAX_RECON_BUFS DEFAULT_NUM_RECON_BUFS 68 69 70 #define LEN_STATUS_BUFFER (10 * 1024) 71 #define MAX_VBV_BUFF_SIZE (120 * 16384) 72 #define MAX_NUM_IO_BUFS 3 73 74 #define DEFAULT_MAX_REF_FRM 2 75 #define DEFAULT_MAX_REORDER_FRM 0 76 #define DEFAULT_QP_MIN 4 77 #define DEFAULT_QP_MAX 51 78 #define DEFAULT_MAX_BITRATE 20000000 79 #define DEFAULT_NUM_BFRAMES 0 80 #define DEFAULT_MAX_SRCH_RANGE_X 256 81 #define DEFAULT_MAX_SRCH_RANGE_Y 256 82 #define DEFAULT_MAX_FRAMERATE 120000 83 #define DEFAULT_NUM_CORES 1 84 #define DEFAULT_NUM_CORES_PRE_ENC 0 85 #define DEFAULT_FPS 30 86 #define DEFAULT_ENC_SPEED 100 87 88 #define DEFAULT_MEM_REC_CNT 0 89 #define DEFAULT_RECON_ENABLE 0 90 #define DEFAULT_CHKSUM_ENABLE 0 91 #define DEFAULT_START_FRM 0 92 #define DEFAULT_NUM_FRMS 0xFFFFFFFF 93 #define DEFAULT_INP_COLOR_FMT IV_YUV_420SP_UV 94 #define DEFAULT_RECON_COLOR_FMT IV_YUV_420P 95 #define DEFAULT_LOOPBACK 0 96 #define DEFAULT_SRC_FRAME_RATE 30 97 #define DEFAULT_TGT_FRAME_RATE 30 98 #define DEFAULT_MAX_WD 1920 99 #define DEFAULT_MAX_HT 1920 100 #define DEFAULT_MAX_LEVEL 40 101 #define DEFAULT_STRIDE 0 102 #define DEFAULT_WD 0 103 #define DEFAULT_HT 0 104 #define DEFAULT_PSNR_ENABLE 0 105 #define DEFAULT_ME_SPEED 100 106 #define DEFAULT_ENABLE_FAST_SAD 0 107 #define DEFAULT_ENABLE_ALT_REF 0 108 #define DEFAULT_RC 1 109 #define DEFAULT_BITRATE 6000000 110 #define DEFAULT_I_QP 25 111 #define DEFAULT_I_QP_MAX DEFAULT_QP_MAX 112 #define DEFAULT_I_QP_MIN 0 113 #define DEFAULT_P_QP 28 114 #define DEFAULT_P_QP_MAX DEFAULT_QP_MAX 115 #define DEFAULT_P_QP_MIN 0 116 #define DEFAULT_B_QP 28 117 #define DEFAULT_B_QP_MAX DEFAULT_QP_MAX 118 #define DEFAULT_B_QP_MIN 0 119 #define DEFAULT_AIR 0 120 #define DEFAULT_AIR_REFRESH_PERIOD 30 121 #define DEFAULT_SRCH_RNG_X 64 122 #define DEFAULT_SRCH_RNG_Y 48 123 #define DEFAULT_I_INTERVAL 30 124 #define DEFAULT_IDR_INTERVAL 1000 125 #define DEFAULT_CONSTRAINED_INTRAPRED 0 126 #define DEFAULT_B_FRAMES 0 127 #define DEFAULT_DISABLE_DEBLK_LEVEL 0 128 #define DEFAULT_HPEL 1 129 #define DEFAULT_QPEL 1 130 #define DEFAULT_I4 1 131 #define DEFAULT_EPROFILE IV_PROFILE_BASE 132 #define DEFAULT_SLICE_MODE 0 133 #define DEFAULT_SLICE_PARAM 256 134 #define DEFAULT_ENTROPY_CODING_MODE 0 135 136 #define STRLENGTH 500 137 138 139 /*****************************************************************************/ 140 /* profile Macros */ 141 /*****************************************************************************/ 142 #ifdef PROFILE_ENABLE 143 #ifdef WINDOWS_TIMER 144 typedef LARGE_INTEGER TIMER; 145 #else 146 //#ifdef X86_MINGW 147 typedef struct timeval TIMER; 148 //#endif 149 #endif 150 #endif 151 152 #ifdef PROFILE_ENABLE 153 #ifdef WINDOWS_TIMER 154 #define GETTIME(timer) QueryPerformanceCounter(timer); 155 #else 156 //#ifdef X86_MINGW 157 #define GETTIME(timer) gettimeofday(timer,NULL); 158 //#endif 159 #endif 160 161 #ifdef WINDOWS_TIMER 162 #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency) \ 163 { \ 164 TIMER s_temp_time; \ 165 s_temp_time.LowPart = s_end_timer.LowPart - s_start_timer.LowPart ; \ 166 s_elapsed_time = (UWORD32) ( ((DOUBLE)s_temp_time.LowPart / (DOUBLE)frequency.LowPart ) * 1000000); \ 167 } 168 #else 169 //#ifdef X86_MINGW 170 #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency) \ 171 s_elapsed_time = ((s_end_timer.tv_sec - s_start_timer.tv_sec) * 1000000) + (s_end_timer.tv_usec - s_start_timer.tv_usec); 172 //#endif 173 #endif 174 175 #else 176 #define GETTIME(timer) 177 #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency) 178 #endif 179 180 181 /*****************************************************************************/ 182 /* Structure definitions */ 183 /*****************************************************************************/ 184 typedef struct 185 { 186 UWORD8 *pu1_buf; 187 UWORD32 u4_buf_size; 188 UWORD32 u4_timestamp_low; 189 UWORD32 u4_timestamp_high; 190 UWORD32 u4_is_free; 191 void *pv_mb_info; 192 void *pv_pic_info; 193 }input_buf_t; 194 195 typedef struct 196 { 197 UWORD8 *pu1_buf; 198 UWORD32 u4_buf_size; 199 UWORD32 u4_timestamp_low; 200 UWORD32 u4_timestamp_high; 201 UWORD32 u4_is_free; 202 }output_buf_t; 203 204 typedef struct 205 { 206 UWORD8 *pu1_buf; 207 UWORD32 u4_buf_size; 208 UWORD32 u4_timestamp_low; 209 UWORD32 u4_timestamp_high; 210 UWORD32 u4_is_free; 211 }recon_buf_t; 212 213 typedef struct 214 { 215 iv_obj_t *ps_enc; 216 iv_mem_rec_t *ps_mem_rec; 217 UWORD32 u4_num_mem_rec; 218 UWORD32 u4_recon_enable; 219 UWORD32 u4_chksum_enable; 220 UWORD32 u4_mb_info_type; 221 UWORD32 u4_pic_info_type; 222 UWORD32 u4_mb_info_size; 223 UWORD32 u4_pic_info_size; 224 UWORD32 u4_start_frm; 225 UWORD32 u4_max_num_frms; 226 UWORD32 u4_total_bytes; 227 UWORD32 u4_pics_cnt; 228 IV_COLOR_FORMAT_T e_inp_color_fmt; 229 IV_COLOR_FORMAT_T e_recon_color_fmt; 230 IV_ARCH_T e_arch; 231 IV_SOC_T e_soc; 232 233 WORD32 header_generated; 234 void *pv_codec_obj; 235 236 UWORD32 u4_num_cores; 237 UWORD32 u4_pre_enc_me; 238 UWORD32 u4_pre_enc_ipe; 239 CHAR ac_ip_fname[STRLENGTH]; 240 CHAR ac_op_fname[STRLENGTH]; 241 CHAR ac_recon_fname[STRLENGTH]; 242 CHAR ac_chksum_fname[STRLENGTH]; 243 CHAR ac_mb_info_fname[STRLENGTH]; 244 CHAR ac_pic_info_fname[STRLENGTH]; 245 246 247 FILE *fp_ip; 248 FILE *fp_op; 249 FILE *fp_recon; 250 FILE *fp_chksum; 251 FILE *fp_psnr_ip; 252 FILE *fp_mb_info; 253 FILE *fp_pic_info; 254 FILE *fp_dump_op; 255 256 257 UWORD32 u4_loopback; 258 UWORD32 u4_max_frame_rate; 259 UWORD32 u4_src_frame_rate; 260 UWORD32 u4_tgt_frame_rate; 261 UWORD32 u4_max_wd; 262 UWORD32 u4_max_ht; 263 UWORD32 u4_max_level; 264 265 UWORD32 u4_strd; 266 267 UWORD32 u4_wd; 268 UWORD32 u4_ht; 269 270 UWORD32 u4_psnr_enable; 271 272 273 UWORD32 u4_enc_speed; 274 UWORD32 u4_me_speed; 275 UWORD32 u4_enable_fast_sad; 276 UWORD32 u4_enable_alt_ref; 277 UWORD32 u4_rc; 278 UWORD32 u4_max_bitrate; 279 UWORD32 u4_bitrate; 280 UWORD32 u4_i_qp,u4_i_qp_max,u4_i_qp_min; 281 UWORD32 u4_p_qp,u4_p_qp_max,u4_p_qp_min; 282 UWORD32 u4_b_qp,u4_b_qp_max,u4_b_qp_min; 283 UWORD32 u4_air; 284 UWORD32 u4_air_refresh_period; 285 UWORD32 u4_srch_rng_x; 286 UWORD32 u4_srch_rng_y; 287 UWORD32 u4_i_interval; 288 UWORD32 u4_idr_interval; 289 UWORD32 u4_constrained_intra_pred; 290 UWORD32 u4_b_frames; 291 UWORD32 u4_num_bframes; 292 UWORD32 u4_disable_deblk_level; 293 UWORD32 u4_hpel; 294 UWORD32 u4_qpel; 295 UWORD32 u4_enable_intra_4x4; 296 IV_PROFILE_T e_profile; 297 298 UWORD32 u4_slice_mode; 299 UWORD32 u4_slice_param; 300 UWORD32 u4_entropy_coding_mode; 301 302 void *pv_input_thread_handle; 303 void *pv_output_thread_handle; 304 void *pv_recon_thread_handle; 305 306 ih264e_ctl_getbufinfo_op_t s_get_buf_info_op; 307 input_buf_t as_input_buf[DEFAULT_MAX_INPUT_BUFS]; 308 output_buf_t as_output_buf[DEFAULT_MAX_OUTPUT_BUFS]; 309 recon_buf_t as_recon_buf[DEFAULT_MAX_RECON_BUFS]; 310 311 DOUBLE adbl_psnr[3]; 312 UWORD32 u4_psnr_cnt; 313 UWORD8 *pu1_psnr_buf; 314 UWORD8 u4_psnr_buf_size; 315 316 UWORD32 u4_vbv_buffer_delay; 317 UWORD32 u4_vbv_buf_size; 318 319 TIMER enc_start_time; 320 TIMER enc_last_time; 321 WORD32 avg_time; 322 323 324 } app_ctxt_t; 325 326 /*****************************************************************************/ 327 /* Function Declarations */ 328 /*****************************************************************************/ 329 void codec_exit(CHAR *pc_err_message); 330 void allocate_input(app_ctxt_t *ps_app_ctxt); 331 void allocate_output(app_ctxt_t *ps_app_ctxt); 332 void allocate_recon(app_ctxt_t *ps_app_ctxt); 333 334 IV_STATUS_T read_input(FILE *fp, iv_raw_buf_t *ps_raw_buf); 335 IV_STATUS_T write_recon(FILE *fp, iv_raw_buf_t *ps_raw_buf); 336 IV_STATUS_T write_output(FILE *fp, UWORD8 *pu1_buf, WORD32 num_bytes); 337 338 IV_STATUS_T read_mb_info(app_ctxt_t *ps_app_ctxt, void *pv_mb_info); 339 IV_STATUS_T read_pic_info(app_ctxt_t *ps_app_ctxt, void *pv_pic_info); 340 341 void * ih264a_aligned_malloc(WORD32 alignment, WORD32 size); 342 void ih264a_aligned_free(void *pv_buf); 343 344 void free_input(app_ctxt_t *ps_app_ctxt); 345 void free_recon(app_ctxt_t *ps_app_ctxt); 346 void free_output(app_ctxt_t *ps_app_ctxt); 347 348 void init_raw_buf_descr(app_ctxt_t *ps_app_ctxt, iv_raw_buf_t *ps_raw_buf, UWORD8 *pu1_buf, IV_COLOR_FORMAT_T e_color_fmt); 349 350 #ifndef MD5_DISABLE 351 void calc_md5_cksum(UWORD8 *pu1_inbuf,UWORD32 u4_stride,UWORD32 u4_width,UWORD32 u4_height,UWORD8 *pu1_cksum_p ); 352 #else 353 #define calc_md5_cksum(a, b, c, d, e) 354 #endif 355 356 #endif /* _APP_H_ */ 357