Home | History | Annotate | Download | only in encoder
      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         50000000
     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