/******************************************************************************
*
* 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 ihevce_hle_interface.h
*
* \brief
* This file contains infertace prototypes of High level enocder interafce
* structure and interface functions.
*
* \date
* 18/09/2012
*
* \author
* Ittiam
*
******************************************************************************
*/
#ifndef _IHEVCE_HLE_INTERFACE_H_
#define _IHEVCE_HLE_INTERFACE_H_
#include "ihevce_profile.h"
/*****************************************************************************/
/* Constant Macros */
/*****************************************************************************/
#define IHEVCE_DLL
#define DUMP_MBR_MULTI_RES_INFO 0
#define DUMP_RC_2_PASS_DATA_BINARY_APP 1
/*print attributes */
/*print everything on console */
#define PRINTF(v, x, y, ...) ps_sys_api->ihevce_printf(v, __VA_ARGS__)
#define FPRINTF(v, fp, x, y, ...) \
if(NULL != fp) \
{ \
ps_sys_api->s_file_io_api.ihevce_fprintf(v, fp, __VA_ARGS__); \
}
/* Semaphore attribute */
#define SEM_START_VALUE 1
#define THREAD_STACK_SIZE 0x80000
/*****************************************************************************/
/* Function Macros */
/*****************************************************************************/
/*****************************************************************************/
/* Typedefs */
/*****************************************************************************/
/*****************************************************************************/
/* Enums */
/*****************************************************************************/
typedef enum
{
BUFF_QUE_NON_BLOCKING_MODE = 0,
BUFF_QUE_BLOCKING_MODE
} BUFF_QUE_MODES_T;
/*****************************************************************************/
/* Structure */
/*****************************************************************************/
/**
* @brief Structure to describe Process interface parameters of Encoder
*/
typedef struct
{
/**
* Size for version tracking purpose
*/
WORD32 i4_size;
/**
* Flag to communicate that HLE thread int are done
*/
WORD32 i4_hle_init_done;
/**
* Error code communciate any error during create stage
*/
WORD32 i4_error_code;
/**
* GPU memory accumalator
*/
WORD32 i4_gpu_mem_size;
/**
* OSAL handle
*/
void *pv_osal_handle;
/**
* Encoder Handle
*/
void *apv_enc_hdl[IHEVCE_MAX_NUM_RESOLUTIONS];
/**
* Static parameters structure
*/
ihevce_static_cfg_params_t *ps_static_cfg_prms;
/**
* Memory Manager handle
*/
void *pv_mem_mgr_hdl;
/**
* Input Buffer callback handle
*/
void *pv_inp_cb_handle;
/**
* Ouput Buffer callback handle
*/
void *pv_out_cb_handle;
/**
* Ouput Recon Buffer callback handle
*/
void *pv_recon_cb_handle;
/**
* Call back API to be called while the buffer for bitstream filling is done
*/
IV_API_CALL_STATUS_T (*ihevce_output_strm_fill_done)
(void *pv_out_cb_handle, void *pv_curr_out, WORD32 i4_bitrate_instance, WORD32 i4_res_instance);
/**
* Call back API to be called while the buffer for recon filling is done
*/
IV_API_CALL_STATUS_T (*ihevce_output_recon_fill_done)
(void *pv_recon_cb_handle,
void *pv_curr_out,
WORD32 i4_bitrate_instance,
WORD32 i4_res_instance);
/**
* Call back API to be called while freeing the input buffer
*/
IV_API_CALL_STATUS_T (*ihevce_set_free_input_buff)
(void *pv_inp_cb_handle, iv_input_data_ctrl_buffs_t *ps_input_buf);
/**
* Call back API to be called during allocation using memory manager
*/
void (*ihevce_mem_alloc)(
void *pv_mem_mgr_hdl, ihevce_sys_api_t *ps_sys_api, iv_mem_rec_t *ps_memtab);
/**
* Call back API for freeing using memory manager
*/
void (*ihevce_mem_free)(void *pv_mem_mgr_hdl, iv_mem_rec_t *ps_memtab);
/* create or run time input buffer allocation, 1: create time 0: run time*/
WORD32 i4_create_time_input_allocation;
/* create or run time output buffer allocation, 1: create time 0: run time*/
WORD32 i4_create_time_output_allocation;
/*Cores per resolution*/
WORD32 ai4_num_core_per_res[IHEVCE_MAX_NUM_RESOLUTIONS];
/**
* Error Handling callback handle
*/
void *pv_cmd_err_cb_handle;
/**
* Call back API to be called when errors need to be reported
*/
IV_API_CALL_STATUS_T (*ihevce_cmds_error_report)
(void *pv_cmd_err_cb_handle, WORD32 i4_error_code, WORD32 i4_cmd_type, WORD32 i4_buf_id);
/**
* Flag to indicate if ECU is enabled/disabled
*/
WORD32 i4_p6_opt_enabled;
/**
* profile stats
*/
profile_database_t profile_hle;
profile_database_t profile_pre_enc[IHEVCE_MAX_NUM_RESOLUTIONS];
profile_database_t profile_enc[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
profile_database_t profile_entropy[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
} ihevce_hle_ctxt_t;
/**
******************************************************************************
* @brief Indivisual Thread context structure
******************************************************************************
*/
typedef struct
{
/** Unique Id associated with every frame processing thread */
WORD32 i4_thrd_id;
/** pointer to encoder context structure */
void *pv_enc_ctxt;
/** pointer to the hle context structure */
ihevce_hle_ctxt_t *ps_hle_ctxt;
} frm_proc_thrd_ctxt_t;
/*****************************************************************************/
/* Extern Variable Declarations */
/*****************************************************************************/
/*****************************************************************************/
/* Extern Function Declarations */
/*****************************************************************************/
/** Create API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* It is assumed that application before calling this API
* has initialized with correct pointers for following
* - pv_osal_handle
* - pv_app_sem_handle
* - ps_static_cfg_prms
* - ihevce_mem_alloc
* - ihevce_mem_free
*
* Encoder after initilaization would store the encoder handle in
* - pv_enc_hdl
*
* Create Return status (success or fail) is returned
*/
IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_hle_interface_create(ihevce_hle_ctxt_t *ps_hle_ctxt);
/** Query IO buffers requirements API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* ps_input_bufs_req : memory to store input buffer requirements
* ps_output_bufs_req : memory to store output buffer requirements
*
* Should be called only after a sucessfull create of codec instance
*
* Return status (success or fail) is returned
*/
IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_query_io_buf_req(
ihevce_hle_ctxt_t *ps_hle_ctxt,
iv_input_bufs_req_t *ps_input_bufs_req,
iv_res_layer_output_bufs_req_t *ps_res_layer_output_bufs_req,
iv_res_layer_recon_bufs_req_t *ps_res_layer_recon_bufs_req);
/** Create buffer ports for procesing API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* ps_input_data_ctrl_buffs_desc :
* Pointer to Input (data/control) buffers details memory
* ps_input_asynch_ctrl_buffs_desc :
* Pointer to Input async control buffers details memory
* ps_output_data_buffs_desc :
* Pointer to output data buffers details memory
* ps_output_status_buffs_desc:
* Pointer to outtput async control buffers details memory
*
* Return status (success or fail) is returned
*/
IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_create_ports(
ihevce_hle_ctxt_t *ps_hle_ctxt,
iv_input_data_ctrl_buffs_desc_t *ps_input_data_ctrl_buffs_desc,
iv_input_asynch_ctrl_buffs_desc_t *ps_input_asynch_ctrl_buffs_desc,
iv_res_layer_output_data_buffs_desc_t *ps_mres_output_data_buffs_desc,
iv_res_layer_recon_data_buffs_desc_t *ps_mres_recon_data_buffs_desc);
/** Processing interface layer thread API
*
* This is the entry point for this thread
* pointer to ihevce_hle_ctxt_t has to be passed
* to this function as the argument
*
* return should be a exit code (0)
*/
IHEVCE_DLL WORD32 ihevce_hle_interface_thrd(void *pv_proc_intf_ctxt);
/** Get version API
*
* This is API to return the version number of the encoder
*
* returns the version number string
*/
IHEVCE_DLL const char *ihevce_get_encoder_version(void);
/** Validate Encoder parameters
*
* This is API to return the version number of the encoder
*
* returns the version number string
*/
IHEVCE_DLL WORD32 ihevce_validate_encoder_parameters(ihevce_static_cfg_params_t *ps_static_cfg_prms);
/** Get free input frame data buffer API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* pi4_buff_id : pointer to store the buffer id of the buffer returned.
* i4_blocking_mode : Blocking mode to control if the the API should wait
* for a free buffer to be available and then
* return with a valid buffer @sa BUFF_QUE_MODES_T
* returns NULL if no free buffer is present in queue (if non blocking mode)
*/
IHEVCE_DLL void *ihevce_q_get_free_inp_data_buff(
ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 *pi4_buff_id, WORD32 i4_blocking_mode);
/** Get free input control data buffer API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* pi4_buff_id : pointer to store the buffer id of the buffer returned.
* i4_blocking_mode : Blocking mode to control if the the API should wait
* for a free buffer to be available and then
* return with a valid buffer @sa BUFF_QUE_MODES_T
* returns NULL if no free buffer is present in queue (if non blocking mode)
*/
IHEVCE_DLL void *ihevce_q_get_free_inp_ctrl_buff(
ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 *pi4_buff_id, WORD32 i4_blocking_mode);
IHEVCE_DLL void *ihevce_q_get_free_out_strm_buff(
ihevce_hle_ctxt_t *ps_hle_ctxt,
WORD32 *pi4_buff_id,
WORD32 i4_blocking_mode,
WORD32 i4_bitrate_instance,
WORD32 i4_res_instance);
IHEVCE_DLL void *ihevce_q_get_free_out_recon_buff(
ihevce_hle_ctxt_t *ps_hle_ctxt,
WORD32 *pi4_buff_id,
WORD32 i4_blocking_mode,
WORD32 i4_bitrate_instance,
WORD32 i4_res_instance);
/** Set Input frame data buffer as produced API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* i4_buff_id : buffer id of the buffer returned during get free buf.
*/
IHEVCE_DLL IV_API_CALL_STATUS_T
ihevce_q_set_inp_data_buff_prod(ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 i4_buff_id);
/** Set Input control data buffer as produced API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* i4_buff_id : buffer id of the buffer returned during get free buf.
*/
IHEVCE_DLL IV_API_CALL_STATUS_T
ihevce_q_set_inp_ctrl_buff_prod(ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 i4_buff_id);
IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_q_set_out_strm_buff_prod(
ihevce_hle_ctxt_t *ps_hle_ctxt,
WORD32 i4_buff_id,
WORD32 i4_bitrate_instance_id,
WORD32 i4_resolution_id);
IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_q_set_out_recon_buff_prod(
ihevce_hle_ctxt_t *ps_hle_ctxt,
WORD32 i4_buff_id,
WORD32 i4_bitrate_instance_id,
WORD32 i4_resolution_id);
/** Get next filled recon data buffer API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* pi4_buff_id : pointer to store the buffer id of the buffer returned.
* i4_blocking_mode : Blocking mode to control if the the API should wait
* for a produced buffer to be available and then
* return with a valid buffer @sa BUFF_QUE_MODES_T
* returns NULL if no produced buffer is present in queue (if non blocking mode)
*/
IHEVCE_DLL void *ihevce_q_get_filled_recon_buff(
ihevce_hle_ctxt_t *ps_hle_ctxt,
WORD32 *pi4_buff_id,
WORD32 i4_blocking_mode,
WORD32 i4_bitrate_instance_id,
WORD32 i4_resolution_id);
/** Release/ Free recon buffer buffer API
*
* ps_hle_ctxt : Pointer to high level encoder context.
* i4_buff_id : buffer id of the buffer returned during get next buf.
*/
IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_q_rel_recon_buf(
ihevce_hle_ctxt_t *ps_hle_ctxt,
WORD32 i4_buff_id,
WORD32 i4_bitrate_instance_id,
WORD32 i4_resolution_id);
/** Delete API
*
* Should be called only after the high level encoder thread exits or returns
*/
IHEVCE_DLL IV_API_CALL_STATUS_T ihevce_hle_interface_delete(ihevce_hle_ctxt_t *ps_hle_ctxt);
/** Trace API
*
* Open and Close trace file pointer.
*/
IHEVCE_DLL WORD32 ihevce_trace_init(UWORD8 *pu1_file_name);
IHEVCE_DLL WORD32 ihevce_trace_deinit(void);
/** Header API
*
* Get sequence headers asynchronously
*/
WORD32 ihevce_entropy_encode_header(
ihevce_hle_ctxt_t *ps_hle_ctxt, WORD32 i4_bitrate_instance_id, WORD32 i4_resolution_id);
#endif /* _IHEVCE_HLE_INTERFACE_H_ */