/******************************************************************************
 *
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/

/**
*******************************************************************************
* @file
*  app.h
*
* @brief
*  This file contains all the necessary structure and enumeration definitions
*  needed for the Application
*
* @author
*  ittiam
*
* @remarks
*  none
*
*******************************************************************************
*/

#ifndef _APP_H_
#define _APP_H_

/*****************************************************************************/
/* Function Macros                                                           */
/*****************************************************************************/
#define MAX(a, b) ((a) > (b)) ? (a) : (b)
#define MIN(a, b) ((a) < (b)) ? (a) : (b)

#define STR_LEN 512

/*****************************************************************************/
/* Enums                                                                     */
/*****************************************************************************/
typedef enum
{
    INVALID,
    HELP,
    VERSION,
    INPUT_YUV,
    OUTPUT,
    STAT_FILE,
    STAT_FILE_BLK,
    SAVE_RECON,
    RECON_YUV,
    NUM_FRAMES_TO_ENCODE,
    START_FRM_OFFSET,
    LOG_DUMP_LEVEL,
    PERF_MODE,
    ENABLE_CSV_DUMP,
    CSV_FILE_PATH,
    ENABLE_LOOPBACK,
    ENABLE_LOGO,
    RES_CHNG_INTRVL,
    SRC_WIDTH,
    SRC_HEIGHT,
    SRC_FRAME_RATE_NUM,
    SRC_FRAME_RATE_DENOM,
    SRC_INTERLACED,
    INPUT_CHROMA_FORMAT,
    INPUT_BIT_DEPTH,
    TOPFIELD_FIRST,
    NUM_RESOLUTIONS,
    MRES_SINGLE_OUT,
    START_RES_ID,
    MBR_QUALITY_SETTING,
    TGT_WIDTH,
    TGT_HEIGHT,
    CODEC_LEVEL,
    NUM_BITRATES,
    TGT_BITRATE,
    FRAME_QP,
    OUTPUT_BIT_DEPTH,
    ENABLE_TEMPORAL_SCALABILITY,
    MAX_CLOSED_GOP_PERIOD,
    MIN_CLOSED_GOP_PERIOD,
    MAX_CRA_OPEN_GOP_PERIOD,
    MAX_I_OPEN_GOP_PERIOD,
    MAX_TEMPORAL_LAYERS,
    QUALITY_PRESET,
    DEBLOCKING_TYPE,
    USE_DEFAULT_SC_MTX,
    ENABLE_ENTROPY_SYNC,
    MAX_TR_TREE_DEPTH_I,
    MAX_TR_TREE_DEPTH_NI,
    MAX_SEARCH_RANGE_HORZ,
    MAX_SEARCH_RANGE_VERT,
    VISUAL_QUALITY_ENHANCEMENTS_TOGGLER,
    ARCH_TYPE,
    NUM_CORES,
    ENABLE_THREAD_AFFINITY,
    RATE_CONTROL_MODE,
    CU_LEVEL_RC,
    PASS,
    MAX_VBV_BUFFER_SIZE,
    PEAK_BITRATE,
    RATE_FACTOR,
    VBR_MAX_PEAK_RATE_DUR,
    MAX_FRAME_QP,
    MIN_FRAME_QP,
    ENABLE_LOOK_AHEAD,
    RC_LOOK_AHEAD_PICS,
    ENABLE_WEIGHTED_PREDICTION,
    CODEC_TYPE,
    CODEC_PROFILE,
    CODEC_TIER,
    AUD_ENABLE_FLAGS,
    INTEROP_FLAGS,
    SPS_AT_CDR_ENABLE,
    SEI_VUI_INFO_CFG,
    VUI_ENABLE,
    SEI_ENABLE_FLAGS,
    SEI_PAYLOAD_ENABLE_FLAGS,
    SEI_PAYLOAD_PATH,
    FORCE_IDR_LOCS_ENABLE,
    FORCE_IDR_LOCS_FILENAME,
    SEI_BUFFER_PERIOD_FLAGS,
    SEI_PIC_TIMING_FLAGS,
    SEI_RECOVERY_POINT_FLAGS,
    SEI_HASH_FLAGS,
    SEI_MASTERING_DISP_COLOUR_VOL_FLAGS,
    DISPLAY_PRIMARIES_X,
    DISPLAY_PRIMARIES_Y,
    WHITE_POINT_X,
    WHITE_POINT_Y,
    MAX_DISPLAY_MASTERING_LUMINANCE,
    MIN_DISPLAY_MASTERING_LUMINANCE,
    SEI_CLL_INFO_ENABLE,
    SEI_MAX_CLL,
    SEI_AVG_CLL,
    TILES_ENABLED_FLAG,
    UNIFORM_SPACING_FLAG,
    NUM_TILE_COLS,
    NUM_TILE_ROWS,
    COLUMN_WIDTH_ARRAY,
    ROW_HEIGHT_ARRAY,
    SLICE_SEGMENT_MODE,
    SLICE_SEGMENT_ARGUMENT,
    ASPECT_RATIO_INFO_PRESENT_FLAG,
    ASPECT_RATIO_IDC,
    SAR_WIDTH,
    SAR_HEIGHT,
    OVERSCAN_INFO_PRESENT_FLAG,
    OVERSCAN_APPROPRIATE_FLAG,
    VIDEO_SIGNAL_TYPE_PRESENT_FLAG,
    VIDEO_FORMAT,
    VIDEO_FULL_RANGE_FLAG,
    COLOUR_DESCRIPTION_PRESENT_FLAG,
    COLOUR_PRIMARIES,
    TRANSFER_CHARACTERISTICS,
    MATRIX_COEFFICIENTS,
    CHROMA_LOC_INFO_PRESENT_FLAG,
    CHROMA_SAMPLE_LOC_TYPE_TOP_FIELD,
    CHROMA_SAMPLE_LOC_TYPE_BOTTOM_FIELD,
    TIMING_INFO_PRESENT_FLAG,
    VUI_HRD_PARAMETERS_PRESENT_FLAG,
    NAL_HRD_PARAMETERS_PRESENT_FLAG,
    CONFIG,
    GRPINFO
} ARGUMENT_T;

/*****************************************************************************/
/*  Structure definitions                                                    */
/*****************************************************************************/

typedef struct
{
    void *ihevceHdl;

    char au1_in_file[STR_LEN]; /*!< input yuv file name
                                    */
    char au1_out_file[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]
                     [STR_LEN]; /*!< output bitstream filename
                                    */
    char au1_recon_file[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]
                       [STR_LEN]; /*!< Recon yuv filename
                                    */
    char au1_stat_file[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]
                      [STR_LEN]; /*!< stat filename from pass1
                                    */
    char au1_stat_blk_file[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]
                          [STR_LEN]; /*!< stat filename from pass1
                                    */
    char au1_csv_file[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES][STR_LEN];

    ihevce_static_cfg_params_t s_static_cfg_prms;

    char ai1_sei_payload_path[STR_LEN];

} appl_ctxt_t;

typedef struct
{
    /** App context pointer */
    appl_ctxt_t s_app_ctxt;
} main_ctxt_t;

typedef struct
{
    char argument_shortname[25];
    char argument_name[128];
    ARGUMENT_T argument;
    char description[512];
} argument_t;

/*****************************************************************************/
/*  Function Declarations                                                    */
/*****************************************************************************/
void codec_exit(CHAR *pc_err_message);

#endif /* _APP_H_ */