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