/******************************************************************************
 *
 * Copyright (C) 2015 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 Name         : ih264d.h                                             */
/*                                                                           */
/*  Description       : This file contains all the necessary structure and   */
/*                      enumeration definitions needed for the Application   */
/*                      Program Interface(API) of the Ittiam H264 ASP       */
/*                      Decoder on Cortex A8 - Neon platform                 */
/*                                                                           */
/*  List of Functions : ih264d_api_function                              */
/*                                                                           */
/*  Issues / Problems : None                                                 */
/*                                                                           */
/*  Revision History  :                                                      */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         26 08 2010   100239(RCY)     Draft                                */
/*                                                                           */
/*****************************************************************************/

#ifndef _IH264D_H_
#define _IH264D_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 ih264d_api_function(iv_obj_t *ps_handle, void *pv_api_ip,void *pv_api_op);

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

typedef enum {

    IH264D_VID_HDR_DEC_NUM_FRM_BUF_NOT_SUFFICIENT   = IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS + 1,
    IH264D_FRAME_INFO_OP_BUF_NULL,
    IH264D_INSUFFICIENT_METADATA_BUFFER,

}IH264D_ERROR_CODES_T;

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


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


typedef struct {
    ivd_delete_ip_t               s_ivd_delete_ip_t;
}ih264d_delete_ip_t;


typedef struct{
    ivd_delete_op_t               s_ivd_delete_op_t;
}ih264d_delete_op_t;


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


typedef struct {
    ivd_create_ip_t                         s_ivd_create_ip_t;

    /**
     * enable_frm_info
     */
    UWORD32                                 u4_enable_frame_info;

    /**
     * enable_threads
     */
    UWORD32                                  u4_keep_threads_active;
}ih264d_create_ip_t;


typedef struct{
    ivd_create_op_t                         s_ivd_create_op_t;
}ih264d_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;
}ih264d_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;
}ih264d_video_decode_op_t;


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


typedef struct
{
    ivd_get_display_frame_ip_t              s_ivd_get_display_frame_ip_t;
}ih264d_get_display_frame_ip_t;


typedef struct
{
    ivd_get_display_frame_op_t              s_ivd_get_display_frame_op_t;
}ih264d_get_display_frame_op_t;

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


typedef struct
{
    ivd_set_display_frame_ip_t              s_ivd_set_display_frame_ip_t;
}ih264d_set_display_frame_ip_t;


typedef struct
{
    ivd_set_display_frame_op_t              s_ivd_set_display_frame_op_t;
}ih264d_set_display_frame_op_t;

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


typedef struct
{
    ivd_rel_display_frame_ip_t                  s_ivd_rel_display_frame_ip_t;
}ih264d_rel_display_frame_ip_t;


typedef struct
{
    ivd_rel_display_frame_op_t                  s_ivd_rel_display_frame_op_t;
}ih264d_rel_display_frame_op_t;

typedef enum {
    /** Set number of cores/threads to be used */
    IH264D_CMD_CTL_SET_NUM_CORES         = IVD_CMD_CTL_CODEC_SUBCMD_START,

    /** Set processor details */
    IH264D_CMD_CTL_SET_PROCESSOR         = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x001,

    /** Get display buffer dimensions */
    IH264D_CMD_CTL_GET_BUFFER_DIMENSIONS = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x100,

    /** Get VUI parameters */
    IH264D_CMD_CTL_GET_VUI_PARAMS        = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x101,

    /** Enable/disable GPU, supported on select platforms */
    IH264D_CMD_CTL_GPU_ENABLE_DISABLE    = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x200,

    /** Set degrade level */
    IH264D_CMD_CTL_DEGRADE               = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x300,

    /** Get SEI MDCV parameters */
    IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS   = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x301,

    /** Get SEI CLL parameters */
    IH264D_CMD_CTL_GET_SEI_CLL_PARAMS    = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x302,

    /** Get SEI AVE parameters */
    IH264D_CMD_CTL_GET_SEI_AVE_PARAMS    = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x303,

    /** Get SEI CCV parameters */
    IH264D_CMD_CTL_GET_SEI_CCV_PARAMS    = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x304,

    /** Get SEI SII parameters */
    IH264D_CMD_CTL_GET_SEI_SII_PARAMS = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x305,

    /** Get SEI FGC parameters */
    IH264D_CMD_CTL_GET_SEI_FGC_PARAMS = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x306

}IH264D_CMD_CTL_SUB_CMDS;
/*****************************************************************************/
/*   Video control  Flush                                                    */
/*****************************************************************************/


typedef struct{
    ivd_ctl_flush_ip_t                      s_ivd_ctl_flush_ip_t;
}ih264d_ctl_flush_ip_t;


typedef struct{
    ivd_ctl_flush_op_t                      s_ivd_ctl_flush_op_t;
}ih264d_ctl_flush_op_t;

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


typedef struct{
    ivd_ctl_reset_ip_t                      s_ivd_ctl_reset_ip_t;
}ih264d_ctl_reset_ip_t;


typedef struct{
    ivd_ctl_reset_op_t                      s_ivd_ctl_reset_op_t;
}ih264d_ctl_reset_op_t;


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


typedef struct {
    ivd_ctl_set_config_ip_t             s_ivd_ctl_set_config_ip_t;
}ih264d_ctl_set_config_ip_t;


typedef struct{
    ivd_ctl_set_config_op_t             s_ivd_ctl_set_config_op_t;
}ih264d_ctl_set_config_op_t;

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


typedef struct{
    ivd_ctl_getbufinfo_ip_t             s_ivd_ctl_getbufinfo_ip_t;
}ih264d_ctl_getbufinfo_ip_t;



typedef struct{
    ivd_ctl_getbufinfo_op_t             s_ivd_ctl_getbufinfo_op_t;
}ih264d_ctl_getbufinfo_op_t;


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


typedef struct{
    ivd_ctl_getstatus_ip_t                  s_ivd_ctl_getstatus_ip_t;
}ih264d_ctl_getstatus_ip_t;



typedef struct{
    ivd_ctl_getstatus_op_t                  s_ivd_ctl_getstatus_op_t;
}ih264d_ctl_getstatus_op_t;


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


typedef struct{
    ivd_ctl_getversioninfo_ip_t         s_ivd_ctl_getversioninfo_ip_t;
}ih264d_ctl_getversioninfo_ip_t;



typedef struct{
    ivd_ctl_getversioninfo_op_t         s_ivd_ctl_getversioninfo_op_t;
}ih264d_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;

}ih264d_ctl_degrade_ip_t;

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

    /**
     * error_code
     */
    UWORD32                                     u4_error_code;
}ih264d_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;
}ih264d_ctl_disable_deblock_ip_t;

typedef struct{
    UWORD32                                     u4_size;
    UWORD32                                     u4_error_code;
}ih264d_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;
}ih264d_ctl_set_num_cores_ip_t;

typedef struct{
    UWORD32                                     u4_size;
    UWORD32                                     u4_error_code;
}ih264d_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;

}ih264d_ctl_set_processor_ip_t;

typedef struct
{
    /**
     * i4_size
     */
    UWORD32                                     u4_size;
    /**
     * error_code
     */
    UWORD32                                     u4_error_code;
}ih264d_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;
}ih264d_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];
}ih264d_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;
}ih264d_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;
}ih264d_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;
}ih264d_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;
}ih264d_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;
}ih264d_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;
} ih264d_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;
}ih264d_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;
} ih264d_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;
}ih264d_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;
} ih264d_ctl_get_sei_ccv_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;
} ih264d_ctl_get_sei_sii_params_ip_t;

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

    /**
     * error_code
     */
    UWORD32 u4_error_code;

    /**
     * specifies if the sei sii is enabled
     */
    UWORD8 u1_shutter_interval_info_present_flag;

    /**
     * specifies the shutter interval temporal sub-layer index
     * of the current picture
     */
    UWORD32 u4_sii_sub_layer_idx;

    /**
     * specify the number of time units that pass in one second
     */
    UWORD32 u4_sii_time_scale;

    /**
     * specifies that the indicated shutter interval is the same for all
     * pictures in the coded video sequence
     */
    UWORD8 u1_fixed_shutter_interval_within_cvs_flag;

    /**
     * specifies the the number of time units of a clock operating at the
     * frequency sii_time_scale Hz that corresponds to the indicated shutter
     * interval of each picture in the coded video sequence
     */
    UWORD32 u4_sii_num_units_in_shutter_interval;

    /**
     * sii_max_sub_layers_minus1 plus 1 specifies the maximum number of
     * shutter interval temporal sub-layers indexes that may be present
     * in the coded video sequence
     */
    UWORD8 u1_sii_max_sub_layers_minus1;

    /**
     * specifies the number of time units of a clock operating at the
     * frequency sii_time_scale Hz that corresponds to the shutter
     * interval of each picture in the coded video sequence
     */
    UWORD32 au4_sub_layer_num_units_in_shutter_interval[SII_MAX_SUB_LAYERS];

} ih264d_ctl_get_sei_sii_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;
} ih264d_ctl_get_sei_fgc_params_ip_t;

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

    /**
     * error_code
     */
    UWORD32 u4_error_code;

    /**
     * Flag to control the presence of FGC SEI params
     */
    UWORD8 u1_film_grain_characteristics_cancel_flag;

    /**
     * Specifies the pic order count
     */
    WORD32 i4_poc;

    /**
     * Specifies IDR pic ID
     */
    UWORD32 u4_idr_pic_id;

    /**
     * Specifies film grain model for simulation
     */
    UWORD8 u1_film_grain_model_id;

    /**
     * Specifies separate color format for decoded samples and grain
     */
    UWORD8 u1_separate_colour_description_present_flag;

    /**
     * Specifies the bit depth used for the luma component
     */
    UWORD8 u1_film_grain_bit_depth_luma_minus8;

    /**
     * Specifies the bit depth used for the Cb and Cr components
     */
    UWORD8 u1_film_grain_bit_depth_chroma_minus8;

    /**
     * Specifies the colour space of the FGC in SEI
     */
    UWORD8 u1_film_grain_full_range_flag;

    /**
     * Specifies the colour space of the FGC in SEI
     */
    UWORD8 u1_film_grain_colour_primaries;

    /**
     * Specifies the colour space of the FGC in SEI
     */
    UWORD8 u1_film_grain_transfer_characteristics;

    /**
     * Specifies the colour space of the FGC in SEI
     */
    UWORD8 u1_film_grain_matrix_coefficients;

    /**
     * identifies the blending mode used to blend the simulated film grain with the decoded images
     */
    UWORD8 u1_blending_mode_id;

    /**
     * Specifies a scale factor used in the film grain characterization equations
     */
    UWORD8 u1_log2_scale_factor;

    /**
     * Indicates whether film grain is modelled or not on the colour component
     */
    UWORD8 au1_comp_model_present_flag[SEI_FGC_NUM_COLOUR_COMPONENTS];

    /**
     * Specifies the number of intensity intervals for which
     * a specific set of model values has been estimated
     */
    UWORD8 au1_num_intensity_intervals_minus1[SEI_FGC_NUM_COLOUR_COMPONENTS];

    /**
     * Specifies the number of model values present for each intensity interval in which
     * the film grain has been modelled
     */
    UWORD8 au1_num_model_values_minus1[SEI_FGC_NUM_COLOUR_COMPONENTS];

    /**
     * Specifies the lower bound of the interval of intensity levels for which
     * the set of model values applies
     */
    UWORD8 au1_intensity_interval_lower_bound[SEI_FGC_NUM_COLOUR_COMPONENTS]
                                             [SEI_FGC_MAX_NUM_INTENSITY_INTERVALS];

    /**
     * Specifies the upper bound of the interval of intensity levels for which
     * the set of model values applies
     */
    UWORD8 au1_intensity_interval_upper_bound[SEI_FGC_NUM_COLOUR_COMPONENTS]
                                             [SEI_FGC_MAX_NUM_INTENSITY_INTERVALS];

    /**
     * Represents each one of the model values present for
     * the colour component and intensity interval
     */
    WORD32 ai4_comp_model_value[SEI_FGC_NUM_COLOUR_COMPONENTS][SEI_FGC_MAX_NUM_INTENSITY_INTERVALS]
                               [SEI_FGC_MAX_NUM_MODEL_VALUES];

    /**
     * Specifies the persistence of the film grain characteristics SEI message
     */
    UWORD32 u4_film_grain_characteristics_repetition_period;
} ih264d_ctl_get_sei_fgc_params_op_t;

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