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

#ifndef _IH264E_H_
#define _IH264E_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "iv2.h"
#include "ive2.h"
/*****************************************************************************/
/* Constant Macros                                                           */
/*****************************************************************************/


/*****************************************************************************/
/* API Function Prototype                                                    */
/*****************************************************************************/
IV_STATUS_T ih264e_api_function(iv_obj_t *ps_handle, void *pv_api_ip,void *pv_api_op);

/*****************************************************************************/
/* Enums                                                                     */
/*****************************************************************************/
typedef enum
{
    IH264E_CMD_CTL_SET_ME_INFO_ENABLE,
}IH264E_CMD_CTL_SUB_CMDS;


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

/*****************************************************************************/
/*  Get Number of Memory Records                                             */
/*****************************************************************************/


typedef struct
{
    iv_num_mem_rec_ip_t                    s_ive_ip;
}ih264e_num_mem_rec_ip_t;


typedef struct
{
    iv_num_mem_rec_op_t                    s_ive_op;
}ih264e_num_mem_rec_op_t;


/*****************************************************************************/
/*  Fill Memory Records                                                      */
/*****************************************************************************/


typedef struct
{
    iv_fill_mem_rec_ip_t                   s_ive_ip;
}ih264e_fill_mem_rec_ip_t;


typedef struct
{
    iv_fill_mem_rec_op_t                   s_ive_op;
}ih264e_fill_mem_rec_op_t;

/*****************************************************************************/
/*  Retrieve Memory Records                                                  */
/*****************************************************************************/


typedef struct
{
    iv_retrieve_mem_rec_ip_t               s_ive_ip;
}ih264e_retrieve_mem_rec_ip_t;


typedef struct
{
    iv_retrieve_mem_rec_op_t               s_ive_op;
}ih264e_retrieve_mem_rec_op_t;


/*****************************************************************************/
/*   Initialize encoder                                                      */
/*****************************************************************************/

typedef struct
{
    ive_init_ip_t                           s_ive_ip;
}ih264e_init_ip_t;


typedef struct
{
    ive_init_op_t                           s_ive_op;
}ih264e_init_op_t;


/*****************************************************************************/
/*   Queue Input raw buffer - Send the YUV buffer to be encoded              */
/*****************************************************************************/
typedef struct
{
    ive_queue_inp_ip_t                      s_ive_ip;
}ih264e_queue_inp_ip_t;

typedef struct
{
    ive_queue_inp_op_t                      s_ive_op;
}ih264e_queue_inp_op_t;

/*****************************************************************************/
/*   Dequeue Input raw buffer - Get free YUV buffer from the encoder         */
/*****************************************************************************/
typedef struct
{
    ive_dequeue_inp_ip_t                      s_ive_ip;
}ih264e_dequeue_inp_ip_t;

typedef struct
{
    ive_dequeue_inp_op_t                      s_ive_op;
}ih264e_dequeue_inp_op_t;


/*****************************************************************************/
/*   Queue Output bitstream buffer - Send the bistream buffer to be filled   */
/*****************************************************************************/
typedef struct
{
    ive_queue_out_ip_t                      s_ive_ip;
}ih264e_queue_out_ip_t;

typedef struct
{
    ive_queue_out_op_t                      s_ive_op;
}ih264e_queue_out_op_t;

/*****************************************************************************/
/* Dequeue Output bitstream buffer - Get the bistream buffer filled          */
/*****************************************************************************/
typedef struct
{
    ive_dequeue_out_ip_t                      s_ive_ip;
}ih264e_dequeue_out_ip_t;

typedef struct
{
    ive_dequeue_out_op_t                      s_ive_op;
}ih264e_dequeue_out_op_t;


/*****************************************************************************/
/* Get Recon data - Get the reconstructed data from encoder                  */
/*****************************************************************************/
typedef struct
{
    ive_get_recon_ip_t                        s_ive_ip;
}ih264e_get_recon_ip_t;

typedef struct
{
    ive_get_recon_op_t                        s_ive_op;
}ih264e_get_recon_op_t;
/*****************************************************************************/
/*   Video control  Flush                                                    */
/*****************************************************************************/


typedef struct
{
    ive_ctl_flush_ip_t                      s_ive_ip;
}ih264e_ctl_flush_ip_t;


typedef struct
{
    ive_ctl_flush_op_t                      s_ive_op;
}ih264e_ctl_flush_op_t;

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


typedef struct
{
    ive_ctl_reset_ip_t                      s_ive_ip;
}ih264e_ctl_reset_ip_t;


typedef struct
{
    ive_ctl_reset_op_t                      s_ive_op;
}ih264e_ctl_reset_op_t;


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


typedef struct
{
    ive_ctl_getbufinfo_ip_t             s_ive_ip;
}ih264e_ctl_getbufinfo_ip_t;



typedef struct
{
    ive_ctl_getbufinfo_op_t             s_ive_op;
}ih264e_ctl_getbufinfo_op_t;



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


typedef struct
{
    ive_ctl_getversioninfo_ip_t         s_ive_ip;
}ih264e_ctl_getversioninfo_ip_t;



typedef struct
{
    ive_ctl_getversioninfo_op_t         s_ive_op;
}ih264e_ctl_getversioninfo_op_t;

/*****************************************************************************/
/*   Video control:Set default params                                       */
/*****************************************************************************/


typedef struct
{
    ive_ctl_setdefault_ip_t         s_ive_ip;
}ih264e_ctl_setdefault_ip_t;



typedef struct
{
    ive_ctl_setdefault_op_t         s_ive_op;
}ih264e_ctl_setdefault_op_t;

/*****************************************************************************/
/*   Video control  Set IPE params                                           */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_ipe_params_ip_t     s_ive_ip;
}ih264e_ctl_set_ipe_params_ip_t;

typedef struct
{
    ive_ctl_set_ipe_params_op_t     s_ive_op;
}ih264e_ctl_set_ipe_params_op_t;

/*****************************************************************************/
/*   Video control  Set Frame dimensions                                     */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_dimensions_ip_t     s_ive_ip;
}ih264e_ctl_set_dimensions_ip_t;

typedef struct
{
    ive_ctl_set_dimensions_op_t     s_ive_op;
}ih264e_ctl_set_dimensions_op_t;

/*****************************************************************************/
/*   Video control  Set Frame rates                                          */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_frame_rate_ip_t     s_ive_ip;
}ih264e_ctl_set_frame_rate_ip_t;
typedef struct
{
    ive_ctl_set_frame_rate_op_t     s_ive_op;
}ih264e_ctl_set_frame_rate_op_t;


/*****************************************************************************/
/*   Video control  Set Bitrate                                              */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_bitrate_ip_t        s_ive_ip;
}ih264e_ctl_set_bitrate_ip_t;

typedef struct
{
    ive_ctl_set_bitrate_op_t        s_ive_op;
}ih264e_ctl_set_bitrate_op_t;


/*****************************************************************************/
/*   Video control  Set Frame type                                           */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_frame_type_ip_t     s_ive_ip;
}ih264e_ctl_set_frame_type_ip_t;

typedef struct
{
    ive_ctl_set_frame_type_op_t     s_ive_op;
}ih264e_ctl_set_frame_type_op_t;

/*****************************************************************************/
/*   Video control  Set Encode mode                                          */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_enc_mode_ip_t       s_ive_ip;
}ih264e_ctl_set_enc_mode_ip_t;

typedef struct
{
    ive_ctl_set_enc_mode_op_t       s_ive_op;
}ih264e_ctl_set_enc_mode_op_t;

/*****************************************************************************/
/*   Video control  Set QP                                                   */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_qp_ip_t             s_ive_ip;
}ih264e_ctl_set_qp_ip_t;

typedef struct
{
    ive_ctl_set_qp_op_t             s_ive_op;
}ih264e_ctl_set_qp_op_t;

/*****************************************************************************/
/*   Video control  Set AIR params                                           */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_air_params_ip_t     s_ive_ip;
}ih264e_ctl_set_air_params_ip_t;

typedef struct
{
    ive_ctl_set_air_params_op_t     s_ive_op;
}ih264e_ctl_set_air_params_op_t;

/*****************************************************************************/
/*   Video control  Set VBV params                                           */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_vbv_params_ip_t     s_ive_ip;
}ih264e_ctl_set_vbv_params_ip_t;

typedef struct
{
    ive_ctl_set_vbv_params_op_t     s_ive_op;
}ih264e_ctl_set_vbv_params_op_t;

/*****************************************************************************/
/*   Video control  Set Processor Details                                    */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_num_cores_ip_t      s_ive_ip;
}ih264e_ctl_set_num_cores_ip_t;

typedef struct
{
    ive_ctl_set_num_cores_op_t      s_ive_op;
}ih264e_ctl_set_num_cores_op_t;

/*****************************************************************************/
/*   Video control  Set Motion estimation params                             */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_me_params_ip_t      s_ive_ip;
}ih264e_ctl_set_me_params_ip_t;

typedef struct
{
    ive_ctl_set_me_params_op_t      s_ive_op;
}ih264e_ctl_set_me_params_op_t;

/*****************************************************************************/
/*   Video control  Set GOP params                                           */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_gop_params_ip_t     s_ive_ip;
}ih264e_ctl_set_gop_params_ip_t;

typedef struct
{
    ive_ctl_set_gop_params_op_t     s_ive_op;
}ih264e_ctl_set_gop_params_op_t;

/*****************************************************************************/
/*   Video control  Set Deblock params                                       */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_deblock_params_ip_t s_ive_ip;
}ih264e_ctl_set_deblock_params_ip_t;

typedef struct
{
    ive_ctl_set_deblock_params_op_t s_ive_op;
}ih264e_ctl_set_deblock_params_op_t;

/*****************************************************************************/
/*   Video control  Set Profile params                                       */
/*****************************************************************************/
typedef struct
{
    ive_ctl_set_profile_params_ip_t s_ive_ip;
}ih264e_ctl_set_profile_params_ip_t;

typedef struct
{
    ive_ctl_set_profile_params_op_t s_ive_op;
}ih264e_ctl_set_profile_params_op_t;

/*****************************************************************************/
/*   Synchronous video encode call                                           */
/*****************************************************************************/
typedef struct
{
    ive_video_encode_ip_t s_ive_ip;
}ih264e_video_encode_ip_t;

typedef struct
{
    ive_video_encode_op_t s_ive_op;
}ih264e_video_encode_op_t;


/* The enum values should not have greater than 8 bits as this is assigned to WORD8 */
typedef enum
{
    INTRA16x16 = 0,
    INTRA4x4,
    INTER16x16
}IV_MB_TYPE_T;

/*****************************************************************************/
/*   Pic info structures                                                     */
/*****************************************************************************/
typedef struct
{
    /** Qp  */
    UWORD32                                     u4_qp;

    /** Pic Type */
    IV_PICTURE_CODING_TYPE_T                    e_frame_type;

}ih264e_pic_info1_t;

typedef struct
{
    /** Qp  */
    UWORD32                                     u4_qp;

    /** Pic Type */
    IV_PICTURE_CODING_TYPE_T                    e_frame_type;

    /** Disable deblock level (0: Enable completely, 3: Disable completely */
    UWORD32                                     u4_disable_deblock_level;

}ih264e_pic_info2_t;


/*****************************************************************************/
/*   MB info structures                                                     */
/*****************************************************************************/
typedef struct
{
    /** MV X    */
    WORD16                                  i2_mv_x;

    /** MV Y    */
    WORD16                                  i2_mv_y;
}ih264e_mv_t;

typedef struct
{
    /** Intra / Inter    */
    WORD8                                       i1_mb_type;
    union
    {
        ih264e_mv_t                                 as_mv[1];

        /** Intra mode */
        WORD8                                       ai1_intra_mode[1];
    };
}ih264e_mb_info1_t;

typedef struct
{
    /** Intra / Inter    */
    WORD8                                       i1_mb_type;


    /** SAD     */
    UWORD16                                     u2_sad;

    union
    {
        ih264e_mv_t                                 as_mv[1];

        /** Intra mode */
        WORD8                                       ai1_intra_mode[1];
    };


}ih264e_mb_info2_t;

typedef struct
{
    /** Intra / Inter    */
    WORD8                                       i1_mb_type;

    union
    {
        ih264e_mv_t                                 as_mv[4];

        /** Intra mode */
        WORD8                                       ai1_intra_mode[16];
    };

}ih264e_mb_info3_t;

typedef struct
{
    /** Intra / Inter    */
    WORD8                                       i1_mb_type;

    /** Intra Mode      */
    WORD8                                       i1_intra_mode;

    /** SAD     */
    UWORD16                                     u2_sad;

    union
    {
        ih264e_mv_t                                 as_mv[16];

        /** Intra mode */
        WORD8                                       ai1_intra_mode[16];
    };



}ih264e_mb_info4_t;

/* Add any new structures to the following union. It is used to calculate the max size needed for allocation of memory */
typedef struct
{
    union
    {
        ih264e_mb_info1_t               s_mb_info1;
        ih264e_mb_info2_t               s_mb_info2;
        ih264e_mb_info3_t               s_mb_info3;
        ih264e_mb_info4_t               s_mb_info4;
    };
}ih264e_mb_info_t;

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