/******************************************************************************
 *
 * Copyright (C) 2022 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
 *  isvcd.h
 *
 * @brief
 *  This file contains all the necessary structure and enumeration definitions
 *    needed for the Application.
 *  Program Interface(API) of the Ittiam SVC ASP
 *  Decoder on Cortex A8 - Neon platform
 *
 * @author
 *  Kishore
 *
 * @remarks
 *  None
 *
 *******************************************************************************
 */

#ifndef _ISVCD_H_
#define _ISVCD_H_
#ifdef __cplusplus
extern "C"
{
#endif

#include "iv.h"
#include "ivd.h"

/*****************************************************************************/
/* Constant Macros                                                           */
/*****************************************************************************/
#define IVD_ERROR_MASK 0xFF

/*****************************************************************************/
/* Function Macros                                                           */
/*****************************************************************************/
#define IS_IVD_CONCEALMENT_APPLIED(x) (x & (1 << IVD_APPLIEDCONCEALMENT))
#define IS_IVD_INSUFFICIENTDATA_ERROR(x) (x & (1 << IVD_INSUFFICIENTDATA))
#define IS_IVD_CORRUPTEDDATA_ERROR(x) (x & (1 << IVD_CORRUPTEDDATA))
#define IS_IVD_CORRUPTEDHEADER_ERROR(x) (x & (1 << IVD_CORRUPTEDHEADER))
#define IS_IVD_UNSUPPORTEDINPUT_ERROR(x) (x & (1 << IVD_UNSUPPORTEDINPUT))
#define IS_IVD_UNSUPPORTEDPARAM_ERROR(x) (x & (1 << IVD_UNSUPPORTEDPARAM))
#define IS_IVD_FATAL_ERROR(x) (x & (1 << IVD_FATALERROR))
#define IS_IVD_INVALID_BITSTREAM_ERROR(x) (x & (1 << IVD_INVALID_BITSTREAM))
#define IS_IVD_INCOMPLETE_BITSTREAM_ERROR(x) (x & (1 << IVD_INCOMPLETE_BITSTREAM))

    /*****************************************************************************/
    /* API Function Prototype                                                    */
    /*****************************************************************************/
    IV_API_CALL_STATUS_T isvcd_api_function(iv_obj_t *ps_handle, void *pv_api_ip, void *pv_api_op);

    /*****************************************************************************/
    /* Enums                                                                     */
    /*****************************************************************************/
    /* Codec Error codes for SVC ASP Decoder                                   */

    typedef enum
    {

        ISVCD_VID_HDR_DEC_NUM_FRM_BUF_NOT_SUFFICIENT = IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS + 1,
        ISVCD_FRAME_INFO_OP_BUF_NULL,
        ISVCD_INSUFFICIENT_METADATA_BUFFER,

    } ISVCD_ERROR_CODES_T;

    /*****************************************************************************/
    /* Extended Structures                                                       */
    /*****************************************************************************/

    /*****************************************************************************/
    /*  Delete Codec                                                             */
    /*****************************************************************************/

    typedef struct
    {
        ivd_delete_ip_t s_ivd_delete_ip_t;
    } isvcd_delete_ip_t;

    typedef struct
    {
        ivd_delete_op_t s_ivd_delete_op_t;
    } isvcd_delete_op_t;

    /*****************************************************************************/
    /*   Initialize decoder                                                      */
    /*****************************************************************************/

    typedef struct
    {
        ivd_create_ip_t s_ivd_create_ip_t;
        /**
         * enable_frm_info
         */
        UWORD32 u4_enable_frame_info;
    } isvcd_create_ip_t;

    typedef struct
    {
        ivd_create_op_t s_ivd_create_op_t;
    } isvcd_create_op_t;

    /*****************************************************************************/
    /*   Video Decode                                                            */
    /*****************************************************************************/

    typedef struct
    {
        ivd_video_decode_ip_t s_ivd_video_decode_ip_t;
        /**
         * 8x8 block QP map size
         */
        UWORD32 u4_8x8_blk_qp_map_size;

        /**
         * 8x8 block QP map
         */
        UWORD8 *pu1_8x8_blk_qp_map;

        /**
         * 8x8 block type map size
         */
        UWORD32 u4_8x8_blk_type_map_size;

        /**
         * 8x8 block type map
         */
        UWORD8 *pu1_8x8_blk_type_map;
    } isvcd_video_decode_ip_t;

    /*****************************************************************************/
    /* QP and block type maps are defined for each 8x8 MB sub-block.             */
    /* QP can range from <0, 51> and block type can be INTER/INTRA/SKIP.         */
    /*                                                                           */
    /* Let’s say, a frame has a total of ‘m’ MBs (each 16x16). Since the QP      */
    /* and block type are defined for each 8x8 block, hence each MB has          */
    /* 4 entries giving m x 4 total entires for QP and block type map each.      */
    /*                                                                           */
    /* For example, for a frame of size 60x60 shown in the figure down, both     */
    /* maps (QP and MB type) have the same layout.                               */
    /* Each block represents an 8x8 sub-block. Both width and height are aligned */
    /* to next largest multiple of 8, 64 in this case.                           */
    /*                                                                           */
    /*     0     8     16    24    32    40    48    56   64                     */
    /*  0   ------------------------------------------------                     */
    /*     | 0th | 1st | 2nd | 3rd | 4th | 5th | 6th | 7th |                     */
    /*  8   ------------------------------------------------                     */
    /*     | 8th | 9th | 10th | -  |  -  | -   | -   |  -  |                     */
    /* 16   ------------------------------------------------                     */
    /*     |  -  |  -  |  -   | -  |  -  |  -  |  -  |  -  |                     */
    /* 24   ------------------------------------------------                     */
    /*     |  -  |  -  |  -   | -  |  -  |  -  |  -  |  -  |                     */
    /* 32   ------------------------------------------------                     */
    /*     |  -  |  -  |  -   | -  |  -  |  -  |  -  |  -  |                     */
    /* 40   ------------------------------------------------                     */
    /*     |  -  |  -  |  -   | -  |  -  |  -  |  -  |  -  |                     */
    /* 48   ------------------------------------------------                     */
    /*     |  -  |  -  |  -   | -  |  -  |  -  |  -  |  -  |                     */
    /* 56   ------------------------------------------------                     */
    /*     |  -  |  -  |  -   | -  |  -  |  -  |  -  |  -  |                     */
    /* 64   ------------------------------------------------                     */
    /*                                                                           */
    /*****************************************************************************/

    typedef struct
    {
        ivd_video_decode_op_t s_ivd_video_decode_op_t;

        /**
         * 8x8 block QP map size
         */
        UWORD32 u4_8x8_blk_qp_map_size;

        /**
         * 8x8 block QP map
         */
        UWORD8 *pu1_8x8_blk_qp_map;

        /**
         * 8x8 block type map size
         */
        UWORD32 u4_8x8_blk_type_map_size;

        /**
         * 8x8 block type map
         */
        UWORD8 *pu1_8x8_blk_type_map;

    } isvcd_video_decode_op_t;

    /*****************************************************************************/
    /*   Get Display Frame                                                       */
    /*****************************************************************************/

    typedef struct
    {
        ivd_get_display_frame_ip_t s_ivd_get_display_frame_ip_t;
    } isvcd_get_display_frame_ip_t;

    typedef struct
    {
        ivd_get_display_frame_op_t s_ivd_get_display_frame_op_t;
    } isvcd_get_display_frame_op_t;

    /*****************************************************************************/
    /*   Set Display Frame                                                       */
    /*****************************************************************************/

    typedef struct
    {
        ivd_set_display_frame_ip_t s_ivd_set_display_frame_ip_t;
    } isvcd_set_display_frame_ip_t;

    typedef struct
    {
        ivd_set_display_frame_op_t s_ivd_set_display_frame_op_t;
    } isvcd_set_display_frame_op_t;

    /*****************************************************************************/
    /*   Release Display Buffers                                                 */
    /*****************************************************************************/

    typedef struct
    {
        ivd_rel_display_frame_ip_t s_ivd_rel_display_frame_ip_t;
    } isvcd_rel_display_frame_ip_t;

    typedef struct
    {
        ivd_rel_display_frame_op_t s_ivd_rel_display_frame_op_t;
    } isvcd_rel_display_frame_op_t;

    /*****************************************************************************/
    /*   Set Target Layer for SVC                                                */
    /*****************************************************************************/

    /* IVD_API_COMMAND_TYPE_T::e_cmd = ISVCD_CMD_CTL_SET_TGT_LAYER */

    typedef struct
    {
        /**
         * u4_size of the structure
         */
        UWORD32 u4_size;

        /**
         * e_cmd
         */
        IVD_API_COMMAND_TYPE_T e_cmd;

        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;

        /**
         * set the tgt dependency id
         */
        UWORD8 u1_tgt_dep_id;

        /**
         * set the tgt quality id
         */
        UWORD8 u1_tgt_quality_id;

        /**
         * set the tgt temporal id
         */
        UWORD8 u1_tgt_temp_id;

        /**
         * set the tgt priority id
         */
        UWORD8 u1_tgt_priority_id;

    } isvcd_set_target_layer_ip_t;

    typedef struct
    {
        /**
         * u4_size of the structure
         */
        UWORD32 u4_size;

        /**
         * error code
         */
        UWORD32 u4_error_code;

    } isvcd_set_target_layer_op_t;

    typedef enum
    {

        /* Set TGT Layer for SVC */
        ISVCD_CMD_CTL_SET_TGT_LAYER = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x305

    } ISVCD_CMD_CTL_SUB_CMDS;
    /*****************************************************************************/
    /*   Video control  Flush                                                    */
    /*****************************************************************************/

    typedef struct
    {
        ivd_ctl_flush_ip_t s_ivd_ctl_flush_ip_t;
    } isvcd_ctl_flush_ip_t;

    typedef struct
    {
        ivd_ctl_flush_op_t s_ivd_ctl_flush_op_t;
    } isvcd_ctl_flush_op_t;

    /*****************************************************************************/
    /*   Video control reset                                                     */
    /*****************************************************************************/

    typedef struct
    {
        ivd_ctl_reset_ip_t s_ivd_ctl_reset_ip_t;
    } isvcd_ctl_reset_ip_t;

    typedef struct
    {
        ivd_ctl_reset_op_t s_ivd_ctl_reset_op_t;
    } isvcd_ctl_reset_op_t;

    /*****************************************************************************/
    /*   Video control  Set Params                                               */
    /*****************************************************************************/

    typedef struct
    {
        ivd_ctl_set_config_ip_t s_ivd_ctl_set_config_ip_t;
    } isvcd_ctl_set_config_ip_t;

    typedef struct
    {
        ivd_ctl_set_config_op_t s_ivd_ctl_set_config_op_t;
    } isvcd_ctl_set_config_op_t;

    /*****************************************************************************/
    /*   Video control:Get Buf Info                                              */
    /*****************************************************************************/

    typedef struct
    {
        ivd_ctl_getbufinfo_ip_t s_ivd_ctl_getbufinfo_ip_t;
    } isvcd_ctl_getbufinfo_ip_t;

    typedef struct
    {
        ivd_ctl_getbufinfo_op_t s_ivd_ctl_getbufinfo_op_t;
    } isvcd_ctl_getbufinfo_op_t;

    /*****************************************************************************/
    /*   Video control:Getstatus Call                                            */
    /*****************************************************************************/

    typedef struct
    {
        ivd_ctl_getstatus_ip_t s_ivd_ctl_getstatus_ip_t;
    } isvcd_ctl_getstatus_ip_t;

    typedef struct
    {
        ivd_ctl_getstatus_op_t s_ivd_ctl_getstatus_op_t;
    } isvcd_ctl_getstatus_op_t;

    /*****************************************************************************/
    /*   Video control:Get Version Info                                          */
    /*****************************************************************************/

    typedef struct
    {
        ivd_ctl_getversioninfo_ip_t s_ivd_ctl_getversioninfo_ip_t;
    } isvcd_ctl_getversioninfo_ip_t;

    typedef struct
    {
        ivd_ctl_getversioninfo_op_t s_ivd_ctl_getversioninfo_op_t;
    } isvcd_ctl_getversioninfo_op_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * cmd
         */
        IVD_API_COMMAND_TYPE_T e_cmd;

        /**
         * sub_cmd
         */
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;

        /**
         * Pictures that are are degraded
         * 0 : No degrade
         * 1 : Only on non-reference frames
         * 2 : Use interval specified by u4_nondegrade_interval
         * 3 : All non-key frames
         * 4 : All frames
         */
        WORD32 i4_degrade_pics;

        /**
         * Interval for pictures which are completely decoded without any degradation
         */
        WORD32 i4_nondegrade_interval;

        /**
         * bit position (lsb is zero): Type of degradation
         * 1 : Disable deblocking
         * 2 : Faster inter prediction filters
         * 3 : Fastest inter prediction filters
         */
        WORD32 i4_degrade_type;

    } isvcd_ctl_degrade_ip_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * error_code
         */
        UWORD32 u4_error_code;
    } isvcd_ctl_degrade_op_t;

    typedef struct
    {
        UWORD32 u4_size;
        IVD_API_COMMAND_TYPE_T e_cmd;
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
        UWORD32 u4_disable_deblk_level;
    } isvcd_ctl_disable_deblock_ip_t;

    typedef struct
    {
        UWORD32 u4_size;
        UWORD32 u4_error_code;
    } isvcd_ctl_disable_deblock_op_t;

    typedef struct
    {
        UWORD32 u4_size;
        IVD_API_COMMAND_TYPE_T e_cmd;
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
        UWORD32 u4_num_cores;
    } isvcd_ctl_set_num_cores_ip_t;

    typedef struct
    {
        UWORD32 u4_size;
        UWORD32 u4_error_code;
    } isvcd_ctl_set_num_cores_op_t;

    typedef struct
    {
        /**
         * i4_size
         */
        UWORD32 u4_size;
        /**
         * cmd
         */
        IVD_API_COMMAND_TYPE_T e_cmd;
        /**
         * sub cmd
         */
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
        /**
         * Processor type
         */
        UWORD32 u4_arch;
        /**
         * SOC type
         */
        UWORD32 u4_soc;

        /**
         * num_cores
         */
        UWORD32 u4_num_cores;

    } isvcd_ctl_set_processor_ip_t;

    typedef struct
    {
        /**
         * i4_size
         */
        UWORD32 u4_size;
        /**
         * error_code
         */
        UWORD32 u4_error_code;
    } isvcd_ctl_set_processor_op_t;

    typedef struct
    {
        UWORD32 u4_size;
        IVD_API_COMMAND_TYPE_T e_cmd;
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
    } isvcd_ctl_get_frame_dimensions_ip_t;

    typedef struct
    {
        UWORD32 u4_size;
        UWORD32 u4_error_code;
        UWORD32 u4_x_offset[3];
        UWORD32 u4_y_offset[3];
        UWORD32 u4_disp_wd[3];
        UWORD32 u4_disp_ht[3];
        UWORD32 u4_buffer_wd[3];
        UWORD32 u4_buffer_ht[3];
    } isvcd_ctl_get_frame_dimensions_op_t;

    typedef struct
    {
        UWORD32 u4_size;
        IVD_API_COMMAND_TYPE_T e_cmd;
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
    } isvcd_ctl_get_vui_params_ip_t;

    typedef struct
    {
        UWORD32 u4_size;
        UWORD32 u4_error_code;
        UWORD8 u1_aspect_ratio_idc;
        UWORD16 u2_sar_width;
        UWORD16 u2_sar_height;
        UWORD8 u1_overscan_appropriate_flag;
        UWORD8 u1_video_format;
        UWORD8 u1_video_full_range_flag;
        UWORD8 u1_colour_primaries;
        UWORD8 u1_tfr_chars;
        UWORD8 u1_matrix_coeffs;
        UWORD8 u1_cr_top_field;
        UWORD8 u1_cr_bottom_field;
        UWORD32 u4_num_units_in_tick;
        UWORD32 u4_time_scale;
        UWORD8 u1_fixed_frame_rate_flag;
        UWORD8 u1_nal_hrd_params_present;
        UWORD8 u1_vcl_hrd_params_present;
        UWORD8 u1_low_delay_hrd_flag;
        UWORD8 u1_pic_struct_present_flag;
        UWORD8 u1_bitstream_restriction_flag;
        UWORD8 u1_mv_over_pic_boundaries_flag;
        UWORD32 u4_max_bytes_per_pic_denom;
        UWORD32 u4_max_bits_per_mb_denom;
        UWORD32 u4_log2_max_mv_length_horz;
        UWORD32 u4_log2_max_mv_length_vert;
        UWORD32 u4_num_reorder_frames;
        UWORD32 u4_max_dec_frame_buffering;
    } isvcd_ctl_get_vui_params_op_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * cmd
         */
        IVD_API_COMMAND_TYPE_T e_cmd;

        /**
         * sub_cmd
         */
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
    } isvcd_ctl_get_sei_mdcv_params_ip_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * error_code
         */
        UWORD32 u4_error_code;

        /**
         * Array to store the display_primaries_x values
         */
        UWORD16 au2_display_primaries_x[NUM_SEI_MDCV_PRIMARIES];

        /**
         * Array to store the display_primaries_y values
         */
        UWORD16 au2_display_primaries_y[NUM_SEI_MDCV_PRIMARIES];

        /**
         * Variable to store the white point x value
         */
        UWORD16 u2_white_point_x;

        /**
         * Variable to store the white point y value
         */
        UWORD16 u2_white_point_y;

        /**
         * Variable to store the max display mastering luminance value
         */
        UWORD32 u4_max_display_mastering_luminance;

        /**
         * Variable to store the min display mastering luminance value
         */
        UWORD32 u4_min_display_mastering_luminance;
    } isvcd_ctl_get_sei_mdcv_params_op_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * cmd
         */
        IVD_API_COMMAND_TYPE_T e_cmd;

        /**
         * sub_cmd
         */
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
    } isvcd_ctl_get_sei_cll_params_ip_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * error_code
         */
        UWORD32 u4_error_code;

        /**
         * The maximum pixel intensity of all samples
         */
        UWORD16 u2_max_content_light_level;

        /**
         * The average pixel intensity of all samples
         */
        UWORD16 u2_max_pic_average_light_level;
    } isvcd_ctl_get_sei_cll_params_op_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * cmd
         */
        IVD_API_COMMAND_TYPE_T e_cmd;

        /**
         * sub_cmd
         */
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
    } isvcd_ctl_get_sei_ave_params_ip_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * error_code
         */
        UWORD32 u4_error_code;

        /**
         * specifies the environmental illluminance of the ambient viewing environment
         */
        UWORD32 u4_ambient_illuminance;

        /*
         * specify the normalized x chromaticity coordinates of the
         * environmental ambient light in the nominal viewing environment
         */
        UWORD16 u2_ambient_light_x;

        /*
         * specify the normalized y chromaticity coordinates of the
         * environmental ambient light in the nominal viewing environment
         */
        UWORD16 u2_ambient_light_y;
    } isvcd_ctl_get_sei_ave_params_op_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * cmd
         */
        IVD_API_COMMAND_TYPE_T e_cmd;

        /**
         * sub_cmd
         */
        IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
    } isvcd_ctl_get_sei_ccv_params_ip_t;

    typedef struct
    {
        /**
         * u4_size
         */
        UWORD32 u4_size;

        /**
         * error_code
         */
        UWORD32 u4_error_code;

        /*
         * Flag used to control persistence of CCV SEI messages
         */
        UWORD8 u1_ccv_cancel_flag;

        /*
         * specifies the persistence of the CCV SEI message for the current layer
         */
        UWORD8 u1_ccv_persistence_flag;

        /*
         * specifies the presence of syntax elements ccv_primaries_x and
         * ccv_primaries_y
         */
        UWORD8 u1_ccv_primaries_present_flag;

        /*
         * specifies that the syntax element ccv_min_luminance_value is present
         */
        UWORD8 u1_ccv_min_luminance_value_present_flag;

        /*
         * specifies that the syntax element ccv_max_luminance_value is present
         */
        UWORD8 u1_ccv_max_luminance_value_present_flag;

        /*
         * specifies that the syntax element ccv_avg_luminance_value is present
         */
        UWORD8 u1_ccv_avg_luminance_value_present_flag;

        /*
         * shall be equal to 0 in bitstreams conforming to this version. Other values
         * for reserved_zero_2bits are reserved for future use
         */
        UWORD8 u1_ccv_reserved_zero_2bits;

        /*
         * specify the normalized x chromaticity coordinates of the colour
         * primary component c of the nominal content colour volume
         */
        WORD32 ai4_ccv_primaries_x[NUM_SEI_CCV_PRIMARIES];

        /*
         * specify the normalized y chromaticity coordinates of the colour
         * primary component c of the nominal content colour volume
         */
        WORD32 ai4_ccv_primaries_y[NUM_SEI_CCV_PRIMARIES];

        /*
         * specifies the normalized minimum luminance value
         */
        UWORD32 u4_ccv_min_luminance_value;

        /*
         * specifies the normalized maximum luminance value
         */
        UWORD32 u4_ccv_max_luminance_value;

        /*
         * specifies the normalized average luminance value
         */
        UWORD32 u4_ccv_avg_luminance_value;
    } isvcd_ctl_get_sei_ccv_params_op_t;

#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif
#endif /* _ISVCD_H_ */
