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_B_FRAMES            0
126 #define DEFAULT_DISABLE_DEBLK_LEVEL 0
127 #define DEFAULT_HPEL                1
128 #define DEFAULT_QPEL                1
129 #define DEFAULT_I4                  1
130 #define DEFAULT_EPROFILE            IV_PROFILE_BASE
131 #define DEFAULT_SLICE_MODE          0
132 #define DEFAULT_SLICE_PARAM         256
133 #define DEFAULT_ENTROPY_CODING_MODE 0
134 
135 #define STRLENGTH               500
136 
137 
138 /*****************************************************************************/
139 /*  profile Macros                                                           */
140 /*****************************************************************************/
141 #ifdef PROFILE_ENABLE
142     #ifdef WINDOWS_TIMER
143         typedef  LARGE_INTEGER TIMER;
144     #else
145         //#ifdef X86_MINGW
146         typedef struct timeval TIMER;
147         //#endif
148     #endif
149 #endif
150 
151 #ifdef PROFILE_ENABLE
152     #ifdef WINDOWS_TIMER
153         #define GETTIME(timer) QueryPerformanceCounter(timer);
154     #else
155     //#ifdef X86_MINGW
156         #define GETTIME(timer) gettimeofday(timer,NULL);
157     //#endif
158     #endif
159 
160     #ifdef WINDOWS_TIMER
161         #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency) \
162                   { \
163                    TIMER s_temp_time;   \
164                    s_temp_time.LowPart = s_end_timer.LowPart - s_start_timer.LowPart ; \
165                    s_elapsed_time = (UWORD32) ( ((DOUBLE)s_temp_time.LowPart / (DOUBLE)frequency.LowPart )  * 1000000); \
166                 }
167     #else
168     //#ifdef X86_MINGW
169         #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency) \
170                    s_elapsed_time = ((s_end_timer.tv_sec - s_start_timer.tv_sec) * 1000000) + (s_end_timer.tv_usec - s_start_timer.tv_usec);
171     //#endif
172     #endif
173 
174 #else
175     #define GETTIME(timer)
176     #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency)
177 #endif
178 
179 
180 /*****************************************************************************/
181 /*  Structure definitions                                                    */
182 /*****************************************************************************/
183 typedef struct
184 {
185     UWORD8 *pu1_buf;
186     UWORD32 u4_buf_size;
187     UWORD32 u4_timestamp_low;
188     UWORD32 u4_timestamp_high;
189     UWORD32 u4_is_free;
190     void    *pv_mb_info;
191     void    *pv_pic_info;
192 }input_buf_t;
193 
194 typedef struct
195 {
196     UWORD8 *pu1_buf;
197     UWORD32 u4_buf_size;
198     UWORD32 u4_timestamp_low;
199     UWORD32 u4_timestamp_high;
200     UWORD32 u4_is_free;
201 }output_buf_t;
202 
203 typedef struct
204 {
205     UWORD8 *pu1_buf;
206     UWORD32 u4_buf_size;
207     UWORD32 u4_timestamp_low;
208     UWORD32 u4_timestamp_high;
209     UWORD32 u4_is_free;
210 }recon_buf_t;
211 
212 typedef struct
213 {
214     iv_obj_t *ps_enc;
215     iv_mem_rec_t *ps_mem_rec;
216     UWORD32 u4_num_mem_rec;
217     UWORD32 u4_recon_enable;
218     UWORD32 u4_chksum_enable;
219     UWORD32 u4_mb_info_type;
220     UWORD32 u4_pic_info_type;
221     UWORD32 u4_mb_info_size;
222     UWORD32 u4_pic_info_size;
223     UWORD32 u4_start_frm;
224     UWORD32 u4_max_num_frms;
225     UWORD32 u4_total_bytes;
226     UWORD32 u4_pics_cnt;
227     IV_COLOR_FORMAT_T e_inp_color_fmt;
228     IV_COLOR_FORMAT_T e_recon_color_fmt;
229     IV_ARCH_T e_arch;
230     IV_SOC_T e_soc;
231 
232     WORD32  header_generated;
233     void *pv_codec_obj;
234 
235     UWORD32 u4_num_cores;
236     UWORD32 u4_pre_enc_me;
237     UWORD32 u4_pre_enc_ipe;
238     CHAR ac_ip_fname[STRLENGTH];
239     CHAR ac_op_fname[STRLENGTH];
240     CHAR ac_recon_fname[STRLENGTH];
241     CHAR ac_chksum_fname[STRLENGTH];
242     CHAR ac_mb_info_fname[STRLENGTH];
243     CHAR ac_pic_info_fname[STRLENGTH];
244 
245 
246     FILE *fp_ip;
247     FILE *fp_op;
248     FILE *fp_recon;
249     FILE *fp_chksum;
250     FILE *fp_psnr_ip;
251     FILE *fp_mb_info;
252     FILE *fp_pic_info;
253     FILE *fp_dump_op;
254 
255 
256     UWORD32 u4_loopback;
257     UWORD32 u4_max_frame_rate;
258     UWORD32 u4_src_frame_rate;
259     UWORD32 u4_tgt_frame_rate;
260     UWORD32 u4_max_wd;
261     UWORD32 u4_max_ht;
262     UWORD32 u4_max_level;
263 
264     UWORD32 u4_strd;
265 
266     UWORD32 u4_wd;
267     UWORD32 u4_ht;
268 
269     UWORD32 u4_psnr_enable;
270 
271 
272     UWORD32 u4_enc_speed;
273     UWORD32 u4_me_speed;
274     UWORD32 u4_enable_fast_sad;
275     UWORD32 u4_enable_alt_ref;
276     UWORD32 u4_rc;
277     UWORD32 u4_max_bitrate;
278     UWORD32 u4_bitrate;
279     UWORD32 u4_i_qp,u4_i_qp_max,u4_i_qp_min;
280     UWORD32 u4_p_qp,u4_p_qp_max,u4_p_qp_min;
281     UWORD32 u4_b_qp,u4_b_qp_max,u4_b_qp_min;
282     UWORD32 u4_air;
283     UWORD32 u4_air_refresh_period;
284     UWORD32 u4_srch_rng_x;
285     UWORD32 u4_srch_rng_y;
286     UWORD32 u4_i_interval;
287     UWORD32 u4_idr_interval;
288     UWORD32 u4_b_frames;
289     UWORD32 u4_num_bframes;
290     UWORD32 u4_disable_deblk_level;
291     UWORD32 u4_hpel;
292     UWORD32 u4_qpel;
293     UWORD32 u4_enable_intra_4x4;
294     IV_PROFILE_T e_profile;
295 
296     UWORD32 u4_slice_mode;
297     UWORD32 u4_slice_param;
298     UWORD32 u4_entropy_coding_mode;
299 
300     void *pv_input_thread_handle;
301     void *pv_output_thread_handle;
302     void *pv_recon_thread_handle;
303 
304     ih264e_ctl_getbufinfo_op_t s_get_buf_info_op;
305     input_buf_t as_input_buf[DEFAULT_MAX_INPUT_BUFS];
306     output_buf_t as_output_buf[DEFAULT_MAX_OUTPUT_BUFS];
307     recon_buf_t as_recon_buf[DEFAULT_MAX_RECON_BUFS];
308 
309     DOUBLE  adbl_psnr[3];
310     UWORD32 u4_psnr_cnt;
311     UWORD8  *pu1_psnr_buf;
312     UWORD8  u4_psnr_buf_size;
313 
314     UWORD32 u4_vbv_buffer_delay;
315     UWORD32 u4_vbv_buf_size;
316 
317     TIMER   enc_start_time;
318     TIMER   enc_last_time;
319     WORD32  avg_time;
320 
321 
322 } app_ctxt_t;
323 
324 /*****************************************************************************/
325 /*  Function Declarations                                                    */
326 /*****************************************************************************/
327 void codec_exit(CHAR *pc_err_message);
328 void allocate_input(app_ctxt_t *ps_app_ctxt);
329 void allocate_output(app_ctxt_t *ps_app_ctxt);
330 void allocate_recon(app_ctxt_t *ps_app_ctxt);
331 
332 IV_STATUS_T read_input(FILE *fp, iv_raw_buf_t *ps_raw_buf);
333 IV_STATUS_T write_recon(FILE *fp, iv_raw_buf_t *ps_raw_buf);
334 IV_STATUS_T write_output(FILE *fp, UWORD8 *pu1_buf, WORD32 num_bytes);
335 
336 IV_STATUS_T read_mb_info(app_ctxt_t *ps_app_ctxt, void *pv_mb_info);
337 IV_STATUS_T read_pic_info(app_ctxt_t *ps_app_ctxt, void *pv_pic_info);
338 
339 void * ih264a_aligned_malloc(WORD32 alignment, WORD32 size);
340 void ih264a_aligned_free(void *pv_buf);
341 
342 void free_input(app_ctxt_t *ps_app_ctxt);
343 void free_recon(app_ctxt_t *ps_app_ctxt);
344 void free_output(app_ctxt_t *ps_app_ctxt);
345 
346 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);
347 
348 #ifndef MD5_DISABLE
349 void calc_md5_cksum(UWORD8 *pu1_inbuf,UWORD32 u4_stride,UWORD32 u4_width,UWORD32 u4_height,UWORD8 *pu1_cksum_p );
350 #else
351 #define calc_md5_cksum(a, b, c, d, e)
352 #endif
353 
354 #endif /* _APP_H_ */
355