blob: a8b4e25fdc1b18dc3d8ea399d0bb62f6ae123885 [file] [log] [blame]
/******************************************************************************
*
* 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_api.h
*
* \brief
* This file contains definitions and structures which are shared between
* application and HEVC Encoder Processing interface layer
*
* \date
* 18/09/2012
*
* \author
* Ittiam
*
******************************************************************************
*/
#ifndef _IHEVCE_API_H_
#define _IHEVCE_API_H_
/*****************************************************************************/
/* Constant Macros */
/*****************************************************************************/
#define IHEVCE_MAX_IO_BUFFERS 3
#define IHEVCE_EXTENDED_SAR 255
#define IHEVCE_MBR_CORE_WEIGHTAGE 0.25f
/** Maximum number of resolutions encoder can run */
#define IHEVCE_MAX_NUM_RESOLUTIONS 1 //10
/** Maximum number of bit-rate instances encoder can run */
#define IHEVCE_MAX_NUM_BITRATES 1 //5
#define MAX_NUM_CORES 8 // Supports upto 160 logical cores.
/* Max length of filenames */
#define MAX_LEN_FILENAME 200
/* max number of tiles per row/cols */
//Main/Main10 profile (=4096/256) //Don't change this
#define MAX_TILE_COLUMNS 16
//Main/Main10 profile (=2160/64) //Don't change this
#define MAX_TILE_ROWS 34
#define IHEVCE_ASYNCH_ERROR_START 0x0000E600
#define IHEVCE_SYNCH_ERROR_START 0x0000E700
#define MAX_NUM_DYN_BITRATE_CMDS (IHEVCE_MAX_NUM_RESOLUTIONS * IHEVCE_MAX_NUM_BITRATES)
/* NAL units related definations */
#define MAX_NUM_PREFIX_NALS_PER_AU 20
#define MAX_NUM_SUFFIX_NALS_PER_AU 20
#define MAX_NUM_VCL_NALS_PER_AU 200 /* as per level 5.1 from spec */
/* Maximum number of processor groups supported */
#define MAX_NUMBER_PROC_GRPS 4
/** @brief maximum length of CC User Data in a single frame */
#define MAX_SEI_PAYLOAD_PER_TLV (0x200)
#define MAX_NUMBER_OF_SEI_PAYLOAD (10)
#define IHEVCE_COMMANDS_TAG_MASK (0x0000FFFF)
// Upper 16 bits are used to communicate payload type
#define IHEVCE_PAYLOAD_TYPE_MASK (0xFFFF0000)
#define IHEVCE_PAYLOAD_TYPE_SHIFT (16)
#define MAX_FRAME_RATE 120.0
#define MIN_FRAME_RATE 1.0
/*****************************************************************************/
/* Enums */
/*****************************************************************************/
/**
* @brief Enumerations for Quality config.
*/
typedef enum
{
IHEVCE_QUALITY_DUMMY = 0xFFFFFFFF,
IHEVCE_QUALITY_P0 = 0,
IHEVCE_QUALITY_P2 = 2,
IHEVCE_QUALITY_P3,
IHEVCE_QUALITY_P4,
IHEVCE_QUALITY_P5,
IHEVCE_QUALITY_P6,
IHEVCE_QUALITY_P7,
IHEVCE_NUM_QUALITY_PRESET
} IHEVCE_QUALITY_CONFIG_T;
/*****************************************************************************/
/* Enums */
/*****************************************************************************/
/**
* @brief Enumerations for Quality config for auxilary bitrate in case of MBR.
*/
typedef enum
{
IHEVCE_MBR_DUMMY = -1,
IHEVCE_MBR_HIGH_QUALITY = 0,
IHEVCE_MBR_MEDIUM_SPEED,
IHEVCE_MBR_HIGH_SPEED,
IHEVCE_MBR_EXTREME_SPEED
} IHEVCE_QUALITY_CONFIG_MBR_T;
/**
* @brief Enumerations for Rate Control config.
*/
typedef enum
{
IHEVCE_RC_DUMMY = 0xFFFFFFFF,
IHEVCE_RC_LOW_DELAY = 1,
IHEVCE_RC_STORAGE = 2,
IHEVCE_RC_TWOPASS = 3,
IHEVCE_RC_NONE = 4,
IHEVCE_RC_USER_DEFINED = 5,
IHEVCE_RC_RATECONTROLPRESET_DEFAULT = IHEVCE_RC_LOW_DELAY
} IHEVCE_RATE_CONTROL_CONFIG_T;
/**
* @brief Enumerations for Intra Refresh config.
*/
typedef enum
{
IHEVCE_REFRESH_DUMMY = 0,
IHEVCE_I_SILICE = 1,
IHEVCE_COLUMN_BASED = 2,
IHEVCE_DBR = 3,
IHEVCE_GDR = 4
} IHEVCE_REFRESH_CONFIG_T;
/**
* @brief Enumerations for ASYNCH Control Commands Tags.
*/
typedef enum
{
IHEVCE_ASYNCH_API_END_TAG = 0xFFFF,
IHEVCE_ASYNCH_API_SETBITRATE_TAG = 0x01,
IHEVCE_ASYNCH_API_SET_RF_TAG = 0x02,
IHEVCE_ASYNCH_API_FORCE_CLOSE_TAG = 0x03
} IHEVCE_ASYNCH_API_COMMAND_TAG_T;
typedef enum
{
IHEVCE_ASYNCH_ERR_NO_END_TAG = IHEVCE_ASYNCH_ERROR_START + 0x01,
IHEVCE_ASYNCH_ERR_TLV_ERROR = IHEVCE_ASYNCH_ERROR_START + 0x02,
IHEVCE_ASYNCH_ERR_LENGTH_NOT_ZERO = IHEVCE_ASYNCH_ERROR_START + 0x03,
IHEVCE_ASYNCH_ERR_BR_NOT_BYTE = IHEVCE_ASYNCH_ERROR_START + 0x04,
IHEVCE_ASYNCH_FORCE_CLOSE_NOT_SUPPORTED = IHEVCE_ASYNCH_ERROR_START + 0x05
} IHEVCE_ASYNCH_ERROR_TAG_T;
/**
* @brief Enumerations for SYNCH Control Commands Tags.
*/
typedef enum
{
IHEVCE_SYNCH_API_END_TAG = 0xFFFF,
IHEVCE_SYNCH_API_FLUSH_TAG = 0x21,
IHEVCE_SYNCH_API_FORCE_IDR_TAG = 0x22,
IHEVCE_SYNCH_API_REG_KEYFRAME_SEI_TAG = 0x23,
IHEVCE_SYNCH_API_REG_ALLFRAME_SEI_TAG = 0x24,
IHEVCE_SYNCH_API_SET_RES_TAG = 0x25
} IHEVCE_SYNCH_API_COMMAND_TAG_T;
typedef enum
{
IHEVCE_SYNCH_ERR_NO_END_TAG = IHEVCE_SYNCH_ERROR_START + 0x11,
IHEVCE_SYNCH_ERR_TLV_ERROR = IHEVCE_SYNCH_ERROR_START + 0x12,
IHEVCE_SYNCH_ERR_LENGTH_NOT_ZERO = IHEVCE_SYNCH_ERROR_START + 0x13,
IHEVCE_SYNCH_ERR_NO_PADDING = IHEVCE_SYNCH_ERROR_START + 0x14,
IHEVCE_SYNCH_ERR_WRONG_LENGTH = IHEVCE_SYNCH_ERROR_START + 0x15,
IHEVCE_SYNCH_ERR_FREQ_FORCE_IDR_RECEIVED = IHEVCE_SYNCH_ERROR_START + 0x16,
IHEVCE_SYNCH_ERR_TOO_MANY_SEI_MSG = IHEVCE_SYNCH_ERROR_START + 0x17,
IHEVCE_SYNCH_ERR_SET_RES_NOT_SUPPORTED = IHEVCE_SYNCH_ERROR_START + 0x18
} IHEVCE_SYNCH_ERROR_TAG_T;
/**
* @brief Enumerations for output status identifier
*/
typedef enum
{
IHEVCE_PROCESS = 0,
IHEVCE_CONTROL_STS,
IHEVCE_CREATE_STS,
} IHEVCE_OUT_STS_ID_T;
/**
* Scenetype enums
*/
typedef enum
{
IHEVCE_SCENE_TYPE_NORMAL = 0,
IHEVCE_SCENE_TYPE_SCENE_CUT,
IHEVCE_SCENE_TYPE_FLASH,
IHEVCE_SCENE_TYPE_FADE_IN,
IHEVCE_SCENE_TYPE_FADE_OUT,
IHEVCE_SCENE_TYPE_DISSOLVE,
IHEVCE_MAX_NUM_SCENE_TYPES
} IHEVCE_SCENE_TYPE;
/**
* Type of data. Used for scanning the config file
*/
typedef enum
{
IHEVCE_STRING = 0,
IHEVCE_INT,
IHEVCE_FLOAT
} IHEVCE_DATA_TYPE;
/*****************************************************************************/
/* Structure */
/*****************************************************************************/
/**
* @brief Structure to describe the properties of Source of encoder.
*/
typedef struct
{
/** Used for checking version compatibility */
WORD32 i4_size;
/** Input chroma format
* @sa : IV_COLOR_FORMAT_T
*/
WORD32 inp_chr_format;
/** Internal chroma format
* @sa : IV_COLOR_FORMAT_T
*/
WORD32 i4_chr_format;
/** Width of input luma */
WORD32 i4_width;
/** Height of input luma */
WORD32 i4_height;
/** Configured Width of input luma */
WORD32 i4_orig_width;
/** Configured Height of input luma */
WORD32 i4_orig_height;
/** Width of each pixel in bits */
WORD32 i4_input_bit_depth;
/** Input Content Type
* @sa : IV_CONTENT_TYPE_T
*/
WORD32 i4_field_pic;
/** Frame/Field rate numerator
* (final fps = frame_rate_num/frame_rate_denom)
*/
WORD32 i4_frm_rate_num;
/** Can be 1000 or 1001 to allow proper representation
* of fractional frame-rates
*/
WORD32 i4_frm_rate_denom;
/**
* Whether Top field is encoded first or bottom
*/
WORD32 i4_topfield_first;
} ihevce_src_params_t;
/*****************************************************************************/
/* Structure */
/*****************************************************************************/
/**
* @brief Structure to describe attributes of a layer.
*/
typedef struct
{
/** Used for checking version compatibility */
WORD32 i4_size;
/** Width of input luma */
WORD32 i4_width;
/** Height of input luma */
WORD32 i4_height;
/** Frame/Field rate
* (final fps = src frame_rate_num/src frame_rate_denom/i4_frm_rate_scale_factor)
*/
WORD32 i4_frm_rate_scale_factor;
/** Quality vs. complexity
* @sa : IHEVCE_QUALITY_CONFIG_T
*/
IHEVCE_QUALITY_CONFIG_T i4_quality_preset;
/** 0 : Level 4, any level above this not supported */
WORD32 i4_codec_level;
/** Number of bit-rate instances for the current layer
*/
WORD32 i4_num_bitrate_instances;
/** Target Bit-rate in bits for Constant bitrate cases */
WORD32 ai4_tgt_bitrate[IHEVCE_MAX_NUM_BITRATES];
/** Peak Bit-rate in bits for each bitrate */
WORD32 ai4_peak_bitrate[IHEVCE_MAX_NUM_BITRATES];
/** Maximum VBV buffer size in bits for each and each bitrate */
WORD32 ai4_max_vbv_buffer_size[IHEVCE_MAX_NUM_BITRATES];
/** Frame level Qp for Constant Qp mode */
WORD32 ai4_frame_qp[IHEVCE_MAX_NUM_BITRATES];
} ihevce_tgt_params_t;
/*****************************************************************************/
/* Structure */
/*****************************************************************************/
/**
* @brief Structure to describe the properties of target
resolution of encoder.
*/
typedef struct
{
/** Used for checking version compatibility */
WORD32 i4_size;
/** Number of resolution layers
*/
WORD32 i4_num_res_layers;
/* Applicable only for multi res cases.
Output of only one resolution to be dumped */
WORD32 i4_mres_single_out;
/* Specify starting resolution id for mres single out case.
This is only valid in mres_single out mode */
WORD32 i4_start_res_id;
/** To enable reuse across layers
*/
WORD32 i4_multi_res_layer_reuse;
/** Quality vs. complexity for auxilary bitrates
* @sa : IHEVCE_QUALITY_CONFIG_MBR_T
*/
IHEVCE_QUALITY_CONFIG_MBR_T i4_mbr_quality_setting;
/**
*Bit depth used by encoder
*/
WORD32 i4_internal_bit_depth;
/**
*Temporal scalability enable Flag
*/
WORD32 i4_enable_temporal_scalability;
/** Resolution and frame rate scaling factors for
* each layer
*/
ihevce_tgt_params_t as_tgt_params[IHEVCE_MAX_NUM_RESOLUTIONS];
/*Scaler handle */
void *pv_scaler_handle;
/*Function pointer for scaling luma data*/
void (*pf_scale_luma)(
void *pv_scaler_handle,
UWORD8 *pu1_in_buf,
WORD32 i4_inp_width,
WORD32 i4_inp_height,
WORD32 i4_inp_stride,
UWORD8 *pu1_out_buf,
WORD32 i4_out_width,
WORD32 i4_out_height,
WORD32 i4_out_stride);
/*Function pointer for scaling chroma data*/
void (*pf_scale_chroma)(
void *pv_scaler_handle,
UWORD8 *pu1_in_buf,
WORD32 i4_inp_width,
WORD32 i4_inp_height,
WORD32 i4_inp_stride,
UWORD8 *pu1_out_buf,
WORD32 i4_out_width,
WORD32 i4_out_height,
WORD32 i4_out_stride);
} ihevce_tgt_layer_params_t;
/**
* @brief Structure to describe the stream level
* properties encoder should adhere to
*/
typedef struct
{
/** Used for checking version compatibility */
WORD32 i4_size;
/** 0 - HEVC , no other value supported */
WORD32 i4_codec_type;
/**1 : Main Profile ,2: Main 10 Profile. no other value supported */
WORD32 i4_codec_profile;
/** 0: Main Tier ,1: High Tier. no other value supported */
WORD32 i4_codec_tier;
/** Enable VUI output 1: enable 0 : disable */
WORD32 i4_vui_enable;
/** Enable specific SEI messages in the stream
* 1: enable 0 : disable
*/
WORD32 i4_sei_enable_flag;
/** Enable specific SEI payload (other than pic timing and buffering period) messages in the stream
* 1: enable 0 : disable
*/
WORD32 i4_sei_payload_enable_flag;
/** Enable specific SEI buffering period messages in the stream
* 1: enable 0 : disable
*/
WORD32 i4_sei_buffer_period_flags;
/** Enable specific SEI Picture timing messages in the stream
* 1: enable 0 : disable
*/
WORD32 i4_sei_pic_timing_flags;
/** Enable specific SEI recovery point messages in the stream
* 1: enable 0 : disable
*/
WORD32 i4_sei_recovery_point_flags;
/** Enable specific SEI mastering display colour volume in the stream
* 1: enable 0 : disable
*/
WORD32 i4_sei_mastering_disp_colour_vol_flags;
/**
* Array to store the display_primaries_x values
*/
UWORD16 au2_display_primaries_x[3];
/**
* Array to store the display_primaries_y values
*/
UWORD16 au2_display_primaries_y[3];
/**
* 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;
/**
* Enable Content Level Light Info
*/
WORD32 i4_sei_cll_enable;
/**
* 16bit unsigned number which indicates the maximum pixel intensity of all samples in bit-stream in units of 1 candela per square metre
*/
UWORD16 u2_sei_max_cll;
/**
* 16bit unsigned number which indicates the average pixel intensity of all samples in bit-stream in units of 1 candela per square metre
*/
UWORD16 u2_sei_avg_cll;
/** Enable/Disable SEI Hash on the Decoded picture & Hash type
* 3 : Checksum, 2 : CRC, 1 : MD5, 0 : disable
*/
WORD32 i4_decoded_pic_hash_sei_flag;
/** Enable specific AUD messages in the stream
* 1: enable 0 : disable
*/
WORD32 i4_aud_enable_flags;
/** Enable EOS messages in the stream
* 1: enable 0 : disable
*/
WORD32 i4_eos_enable_flags;
/** Enable automatic insertion of SPS at each CDR
* 1: enable 0 : disable
*/
WORD32 i4_sps_at_cdr_enable;
WORD32 i4_interop_flags;
} ihevce_out_strm_params_t;
/**
* @brief Structure to describe the Encoding Coding tools
* to be used by the Encoder
*/
typedef struct
{
/** Used for checking version compatibility*/
WORD32 i4_size;
/** Max spacing between IDR frames -
* 0 indicates only at the beginning
*/
WORD32 i4_max_closed_gop_period;
/** Min spacing between IDR frames -
* Max = Min provides fixed segment length
*/
WORD32 i4_min_closed_gop_period;
/** Max spacing between CRA frames -
*
*/
WORD32 i4_max_cra_open_gop_period;
/** Max spacing between I frames -
*
*/
WORD32 i4_max_i_open_gop_period;
/** Maximum number of dyadic temporal layers */
WORD32 i4_max_temporal_layers;
/** Maximum number of reference frames */
WORD32 i4_max_reference_frames;
/** Enable weighted prediction
* 0 - disabled (default); 1 -enabled
*/
WORD32 i4_weighted_pred_enable;
/** Deblocking type 0 - no deblocking;
* 1 - default; 2 - disable across slices
*/
WORD32 i4_deblocking_type;
/** Use default scaling matrices
* 0 - disabled; 1 - enabled (default)
*/
WORD32 i4_use_default_sc_mtx;
/** Cropping mode for cases where frame dimensions
* are not multiple of MIN CU size
* 1 - enable padding to min_cu multiple and generate cropping flags;
* 0 - report error
*/
WORD32 i4_cropping_mode;
/** 0 - no slices; 1 - packet based; 2 - CU based */
WORD32 i4_slice_type;
/** Use default scaling matrices
* 0 - disabled; 1 - enabled (default)
*/
WORD32 i4_enable_entropy_sync;
/** VQET control parameter */
WORD32 i4_vqet;
} ihevce_coding_params_t;
/**
* @brief Structure to describe the Configurable parameters of Encoder
*/
typedef struct
{
/** Used for checking version compatibility */
WORD32 i4_size;
/* ---------- Tiles related parameters ------------ */
/* ----------- CU related parameters -------------- */
/** 4 - 16x16; 5 - 32x32 (default); 6 - 64x64 */
WORD32 i4_max_log2_cu_size;
/** 3 - 8x8; 4 - 16x16 (default); 5 - 32x32 ; 6 - 64x64 */
WORD32 i4_min_log2_cu_size;
/** 2 - 4x4 (default) ; 3 - 8x8; 4 - 16x16; 5 - 32x32 */
WORD32 i4_min_log2_tu_size;
/** 2 - 4x4; 3 - 8x8 (default); 4 - 16x16; 5 - 32x32 */
WORD32 i4_max_log2_tu_size;
/** Max transform tree depth for intra */
WORD32 i4_max_tr_tree_depth_I;
/** Max transform tree depth for inter */
WORD32 i4_max_tr_tree_depth_nI;
/* ---------- Rate Control related parameters ------ */
/** Rate control mode 0 - constant qp (default); 1- CBR */
WORD32 i4_rate_control_mode;
/** CU level Qp modulation
0 - No Qp modulation at CU level;
1 - QP modulation level 1
2 - QP modulation level 2
3 - QP modulation level 3*/
WORD32 i4_cu_level_rc;
/* Factor used in capped VBR mode to fine tune for quality */
WORD32 i4_rate_factor;
/** Enable stuffing 0 - disabled (default); 1 -enabled */
WORD32 i4_stuffing_enable;
/*The max deivaiton allowed from file size (used only in VBR, in CBR vbv buffer size dictates the deviaiton allowed)*/
WORD32 i4_vbr_max_peak_rate_dur;
/*Number of frames to encode. required to control allowed bit deviation at any point of time*/
WORD32 i4_num_frms_to_encode;
/** Initial buffer fullness when decoding starts */
WORD32 i4_init_vbv_fullness;
/** Frame level I frame max qp in rate control mode */
WORD32 i4_max_frame_qp;
/** Frame level I frame min qp in rate control mode */
WORD32 i4_min_frame_qp;
/* --------- ME related parameters ---------------- */
/** Maximum search range in full pel units. horizontal direction */
WORD32 i4_max_search_range_horz;
/** Maximum search range in full pel units. vertical direction */
WORD32 i4_max_search_range_vert;
/* Variable used to save old rate factor */
/* Used only for plugin */
WORD32 i4_old_rate_factor;
} ihevce_config_prms_t;
/**
* @brief Structure to describe Dynamic configuralbe
* parameters of encoder
*
* these new params can be passed as async commands
* to the enocder by sending a IHEVCE_CMD_CTL_SETPARAMS command
*/
typedef struct
{
/** Used for checking version compatibility */
WORD32 i4_size;
/** Resolution ID of the stream for which bitrate change needs to be applied */
WORD32 i4_tgt_res_id;
/** Bitrate ID in the Resolution ID of the stream for which bitrate change needs to be applied */
WORD32 i4_tgt_br_id;
/** New Target Bit-rate for on the fly change */
WORD32 i4_new_tgt_bitrate;
/** New Peak Bit-rate for on the fly change */
WORD32 i4_new_peak_bitrate;
/** New Rate Factor for on the fly change */
WORD32 i4_new_rate_factor;
} ihevce_dyn_config_prms_t;
/**
* @brief Structure to describe Dynamic configuralbe
* parameters of encoder for dynamic resolution change
*
* these new params can be passed as synchromous commands
* to the enocder by sending a IHEVCE_SYNCH_API_SET_RES_TAG command
*/
typedef struct
{
/** Resolution ID of the stream for which bitrate change needs to be applied */
WORD32 i4_new_res_id;
/** New Target Bit-rate for on the fly change */
WORD32 i4_new_tgt_bitrate;
} ihevce_dyn_res_prms_t;
/**
* @brief Structure to describe the Look Ahead
* Processing Parameters of Encoder
*/
typedef struct
{
/** Used for checking version compatibility */
WORD32 i4_size;
/** Number of frames to look-ahead for RC and adaptive quant -
* counts each fields as one frame for interlaced
*/
WORD32 i4_rc_look_ahead_pics;
/** Enable computation of weights & offsets for weighted prediction */
WORD32 i4_enable_wts_ofsts;
/* Enables denoiser as a part of video preprocessing. */
WORD32 i4_denoise_enable;
/* Enable this flag if input is interlaced and output is progressive */
WORD32 i4_deinterlacer_enable;
} ihevce_lap_params_t;
/**
* @brief Structure to describe the parameters
* related to multi-bitrate encoding
*/
typedef struct
{
/** Number of bit-rate instances */
WORD32 i4_num_bitrate_instances;
/* Number of intra modes to be evaluated for derived instance */
WORD32 i4_num_modes_intra;
/* Number of inter modes to be evaluated for derived instance */
WORD32 i4_num_modes_inter;
} ihevce_mbr_params_t;
/**
* @brief Vui/Sei parameters of Encoder
*/
typedef struct
{
/**
* indicates the presence of aspect_ratio
*/
UWORD8 u1_aspect_ratio_info_present_flag;
/**
* specifies the aspect ratio of the luma samples
*/
UWORD8 au1_aspect_ratio_idc[IHEVCE_MAX_NUM_RESOLUTIONS];
/**
* width of the luma samples. user dependent
*/
UWORD16 au2_sar_width[IHEVCE_MAX_NUM_RESOLUTIONS];
/**
* height of the luma samples. user dependent
*/
UWORD16 au2_sar_height[IHEVCE_MAX_NUM_RESOLUTIONS];
/**
* if 1, specifies that the overscan_appropriate_flag is present
* if 0, the preferred display method for the video signal is unspecified
*/
UWORD8 u1_overscan_info_present_flag;
/**
* if 1,indicates that the cropped decoded pictures output
* are suitable for display using overscan
*/
UWORD8 u1_overscan_appropriate_flag;
/**
* if 1 specifies that video_format, video_full_range_flag and
* colour_description_present_flag are present
*/
UWORD8 u1_video_signal_type_present_flag;
/**
*
*/
UWORD8 u1_video_format;
/**
* indicates the black level and range of the luma and chroma signals
*/
UWORD8 u1_video_full_range_flag;
/**
* if 1,to 1 specifies that colour_primaries, transfer_characteristics
* and matrix_coefficients are present
*/
UWORD8 u1_colour_description_present_flag;
/**
* indicates the chromaticity coordinates of the source primaries
*/
UWORD8 u1_colour_primaries;
/**
* indicates the opto-electronic transfer characteristic of the source picture
*/
UWORD8 u1_transfer_characteristics;
/**
* the matrix coefficients used in deriving luma and chroma signals
* from the green, blue, and red primaries
*/
UWORD8 u1_matrix_coefficients;
/**
* if 1, specifies that chroma_sample_loc_type_top_field and
* chroma_sample_loc_type_bottom_field are present
*/
UWORD8 u1_chroma_loc_info_present_flag;
/**
* location of chroma samples
*/
UWORD8 u1_chroma_sample_loc_type_top_field;
UWORD8 u1_chroma_sample_loc_type_bottom_field;
/**
* to 1 specifies that the syntax structure hrd_parameters is present in the vui_parameters syntax structue
*/
UWORD8 u1_vui_hrd_parameters_present_flag;
/**
* VUI level HRD parameters
*/
//hrd_params_t s_vui_hrd_parameters;
/**
* HRD parameter Indicates the presence of the
* num_units_in_ticks, time_scale flag
*/
UWORD8 u1_timing_info_present_flag;
/**
* Nal- hrd parameters flag
*/
UWORD8 u1_nal_hrd_parameters_present_flag;
} ihevce_vui_sei_params_t;
/**
* @brief Multi thread related parameters passed to the encoder during create
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/** Total number of logical cores, which are assigned to be used by the encoder
*/
WORD32 i4_max_num_cores;
/** Total number of groups in the machine on which encoder is run.
*/
WORD32 i4_num_proc_groups;
/** Total number of logical cores present per processor group of the machine.
*/
WORD32 ai4_num_cores_per_grp[MAX_NUMBER_PROC_GRPS];
/** Flag to enableUse thread affintiy feature
* 0: Thread affinity disabled
* 1: Thread affinity enabled
*/
WORD32 i4_use_thrd_affinity;
/**
* Memory allocation control flag: Reserved (to be used later)
*/
WORD32 i4_memory_alloc_ctrl_flag;
/**
* Array of thread affinity masks for frame processing threads
* PRE Enc Group
*/
ULWORD64 au8_core_aff_mask[MAX_NUM_CORES];
} ihevce_static_multi_thread_params_t;
/**
* @brief File IO APIs
*/
typedef struct
{
FILE *(*ihevce_fopen)(void *pv_cb_handle, const char *pi1_filename, const char *pi1_mode);
int (*ihevce_fclose)(void *pv_cb_handle, FILE *pf_stream);
int (*ihevce_fflush)(void *pv_cb_handle, FILE *pf_stream);
int (*ihevce_fseek)(void *pv_cb_handle, FILE *pf_stream, long i4_offset, int i4_origin);
size_t (*ihevce_fread)(
void *pv_cb_handle, void *pv_ptr, size_t u4_size, size_t u4_count, FILE *pf_stream);
int (*ihevce_fscanf)(
void *pv_cb_handle,
IHEVCE_DATA_TYPE e_data_type,
FILE *file_ptr,
const char *format,
void *pv_dst);
int (*ihevce_fprintf)(void *pv_cb_handle, FILE *pf_stream, const char *pi1_format, ...);
size_t (*ihevce_fwrite)(
void *pv_cb_handle, const void *pv_ptr, size_t i4_size, size_t i4_count, FILE *pf_stream);
char *(*ihevce_fgets)(void *pv_cb_handle, char *pi1_str, int i4_size, FILE *pf_stream);
} ihevce_file_io_api_t;
/**
* @brief System APIs to implement call back functions in encoder
*/
typedef struct
{
/*Call back handle for all system api*/
void *pv_cb_handle;
/* Console APIs */
int (*ihevce_printf)(void *pv_cb_handle, const char *i1_str, ...);
//int (*ihevce_scanf) (void *pv_handle, const char *i1_str, ...);
int (*ihevce_sscanf)(void *pv_cb_handle, const char *pv_src, const char *format, int *p_dst_int);
int (*ihevce_sprintf)(void *pv_cb_handle, char *pi1_str, const char *format, ...);
int (*ihevce_sprintf_s)(
void *pv_cb_handle, char *pi1_str, size_t i4_size, const char *format, ...);
/* File I/O APIs */
ihevce_file_io_api_t s_file_io_api;
} ihevce_sys_api_t;
/**
* @brief Structure to describe multipass related params
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/* 0:Normal mode 1: only dumps stat 2: 2nd pass reads from stat file and rewrites the same file*/
WORD32 i4_pass;
/* Flag to specify the algorithm used for bit-distribution
in second pass */
WORD32 i4_multi_pass_algo_mode;
/* Stat file to read or write data of frame statistics */
WORD8 *pi1_frame_stats_filename;
/* stat file to read or write data of gop level statstics*/
WORD8 *pi1_gop_stats_filename;
/* Stat file to read or write CTB level data*/
WORD8 *pi1_sub_frames_stats_filename;
} ihevce_pass_prms_t;
/**
* @brief Structure to describe tile params
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/* flag to indicate tile encoding enabled/disabled */
WORD32 i4_tiles_enabled_flag;
/* flag to indicate unifrom spacing of tiles */
WORD32 i4_uniform_spacing_flag;
/* num syntactical tiles in a frame */
WORD32 i4_num_tile_cols;
WORD32 i4_num_tile_rows;
/* Column width array to store width of each tile column */
WORD32 ai4_column_width[MAX_TILE_COLUMNS];
/* Row height array to store height of each tile row */
WORD32 ai4_row_height[MAX_TILE_ROWS];
} ihevce_app_tile_params_t;
/**
* @brief Structure to describe slice params
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/** Flag to control dependent slices.
0: Disable all slice segment limits
1: Enforce max number of CTBs
2: Enforce max number of bytes **/
WORD32 i4_slice_segment_mode;
/** Depending on i4_slice_segment_mode being:
1: max number of CTBs per slice segment
2: max number of bytes per slice segment **/
WORD32 i4_slice_segment_argument;
} ihevce_slice_params_t;
/**
* @brief Static configuration parameters of Encoder
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/** Structure describing the input parameters - Applciatiopn should populate
* maximum values in this structure . Run time values
* should always be lessthan create time values
*/
ihevce_src_params_t s_src_prms;
/** Parmeters for target use-case */
ihevce_tgt_layer_params_t s_tgt_lyr_prms;
/** Output stream parameters */
ihevce_out_strm_params_t s_out_strm_prms;
/** Coding parameters for the encoder */
ihevce_coding_params_t s_coding_tools_prms;
/** Configurable parameters for Encoder */
ihevce_config_prms_t s_config_prms;
/** VUI SEI app parameters*/
ihevce_vui_sei_params_t s_vui_sei_prms;
/** Multi threads specific pamrameters */
ihevce_static_multi_thread_params_t s_multi_thrd_prms;
/** Look-ahead processor related parameters */
ihevce_lap_params_t s_lap_prms;
/** Save Recon flag */
WORD32 i4_save_recon;
/** Compute PSNR Flag */
/* 0: No logs
1: (Frame level:Bits generation + POC) + (summary level: BitRate)
2: (Frame level:Bits generation + POC + Qp + Pic-type) + (summary level: BitRate + PSNR)
*/
WORD32 i4_log_dump_level;
WORD32 i4_enable_csv_dump;
FILE *apF_csv_file[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
/** Enable Logo for Eval versions */
WORD32 i4_enable_logo;
/* API structure for exporting console and file I/O operation */
ihevce_sys_api_t s_sys_api;
/* Structure to describe multipass related params */
ihevce_pass_prms_t s_pass_prms;
/* Structure to describe tile params */
ihevce_app_tile_params_t s_app_tile_params;
/** Structure to describe slice segment params */
ihevce_slice_params_t s_slice_params;
/** Resolution ID of the current encoder context **/
WORD32 i4_res_id;
/** Bitrate ID of the current encoder context **/
WORD32 i4_br_id;
/* Architecture type */
IV_ARCH_T e_arch_type;
/* Control to free the entropy output buffers */
/* 1 for non_blocking mode */
/* and 0 for blocking mode */
WORD32 i4_outbuf_buf_free_control;
} ihevce_static_cfg_params_t;
/**
* @brief Input structure in which input data and
* other parameters are sent to Encoder
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/** Buffer id for the current buffer */
WORD32 i4_buf_id;
/** is bottom field 0 = top field, 1 = bottom field */
WORD32 i4_bottom_field;
/** top field first input in case of interlaced case */
WORD32 i4_topfield_first;
/** input time stamp in terms of ticks: lower 32 */
WORD32 i4_inp_timestamp_low;
/** input time stamp in terms of ticks: higher 32 */
WORD32 i4_inp_timestamp_high;
/** colour format of input,
* should be same as create time value
*/
WORD32 u1_colour_format;
/**
* Input frame buffer valid flag
* 1 : valid data is present in the s_input_buf
* 0 : Only command buffer is valid input buffer is a non valid input (dumy input)
*/
WORD32 i4_inp_frm_data_valid_flag;
/** Synchronous control commands buffer
* this will an Tag Length Value (TLV) buffer.
* All commands must be terminated with a tag
* Tag should be set to IHEVCE_SYNCH_API_END_TAG
*/
void *pv_synch_ctrl_bufs;
/**
* Synchronous control commands buffer
* size in number of bytes
*/
WORD32 i4_cmd_buf_size;
/** for system use if run time buffer allocation is used*/
void *pv_metadata;
/** for system to pass frame context from Input to Output
Same pointer will be returned on the output buffer of this frame */
void *pv_app_frm_ctxt;
/** Input YUV buffers pointers and related parameters
* are set in this structure
*/
iv_yuv_buf_t s_input_buf;
} iv_input_data_ctrl_buffs_t;
/**
* @brief Input structure in which input async control
* commands are sent to Encoder
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/** Buffer id for the current buffer */
WORD32 i4_buf_id;
/** Asynchronous control commands buffer
* this will an Tag Length Value (TLV) buffer.
* The buffer must be ended with a IHEVCE_ASYNCH_API_END_TAG
*/
void *pv_asynch_ctrl_bufs;
/**
* Asynchronous control commands buffer
* size in number of bytes
*/
WORD32 i4_cmd_buf_size;
} iv_input_ctrl_buffs_t;
/**
* @brief Ouput structure in which ouput data
* and related parameters are sent from Encoder
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/** Buffer id for the current buffer */
WORD32 i4_buf_id;
/** processing status of the current output returned */
WORD32 i4_process_ret_sts;
/** if error encountered the error code */
WORD32 i4_process_error_code;
/** picture type of the current encoded output */
IV_PICTURE_CODING_TYPE_T i4_encoded_frame_type;
/** output time stamp of curr encoded buffer : lower 32 */
WORD32 i4_out_timestamp_low;
/** output time stamp of curr encoded buffer : higher 32 */
WORD32 i4_out_timestamp_high;
/** skip status of the current encoded output */
WORD32 i4_frame_skipped;
/** bytes generated in the output buffer */
WORD32 i4_bytes_generated;
/** End flag to communicate this is last frame output from encoder */
WORD32 i4_end_flag;
/** End flag to communicate encoder that this is the last buffer from application
1 - Last buf, 0 - Not last buffer. No other values are supported.
Application has to set the appropriate value before queing in encoder queue */
WORD32 i4_is_last_buf;
/** DBF level after the dynamic bitrate change
-1 - Value not set by codec
Encoder sets to positive value when bitrate change control call is done*/
LWORD64 i8_cur_vbv_level;
/** Output buffer pointer */
void *pv_bitstream_bufs;
/** Output buffer size */
WORD32 i4_bitstream_buf_size;
/** Can be used for tracking purpose if run time buffer allocation is used*/
void *pv_metadata;
/** for system to retrive frame context from Input to Output */
void *pv_app_frm_ctxt;
/** Can be used for tracking the buffer that is sent back during callback */
WORD32 i4_cb_buf_id;
/** Number of Prefix Non-VCL NAL units in the output buffer */
WORD32 i4_num_non_vcl_prefix_nals;
/** Number of Suffix Non-VCL NAL units in the output buffer */
WORD32 i4_num_non_vcl_suffix_nals;
/** Number of VCL NAL units in the output buffer */
WORD32 i4_num_vcl_nals;
/************************************************************************/
/* Size of each NAL based on type: Non-VCL Prefix/ VCL / Non-VCL Suffix */
/* */
/* Ordering of NALS in output buffer is as follows: */
/* Non-VCL Prefix NALs -> VCL NALs -> Non-VCL Suffix NALs */
/* */
/* As there are no holes between adjacent NALs, these sizes can be used */
/* to compute the offsets w.r.t start of the output buffer */
/************************************************************************/
/** Array to the store the size in bytes of Prefix Non-VCL NAL units */
WORD32 ai4_size_non_vcl_prefix_nals[MAX_NUM_PREFIX_NALS_PER_AU];
/* Array to the store the size in bytes of Suffix Non-VCL NAL units */
WORD32 ai4_size_non_vcl_suffix_nals[MAX_NUM_SUFFIX_NALS_PER_AU];
/** Array to the store the size in bytes of VCL NAL units */
WORD32 ai4_size_vcl_nals[MAX_NUM_VCL_NALS_PER_AU];
} iv_output_data_buffs_t;
/**
* @brief Output structure in which output async control
* acknowledgement are sent from Encoder
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/** Buffer id for the current buffer */
WORD32 i4_buf_id;
/** Asynchronous control commands ack buffer
* this will an Tag Length Value (TLV) buffer.
*/
void *pv_status_bufs;
} iv_output_status_buffs_t;
/**
* @brief structure in which recon data
* and related parameters are sent from Encoder
*/
typedef struct
{
/** Kept for maintaining backwards compatibility in future */
WORD32 i4_size;
/** Buffer id for the current buffer */
WORD32 i4_buf_id;
/** POC of the current buffer */
WORD32 i4_poc;
/** End flag to communicate this is last frame output from encoder */
WORD32 i4_end_flag;
/** End flag to communicate encoder that this is the last buffer from application
1 - Last buf, 0 - Not last buffer. No other values are supported.
Application has to set the appropriate value before queing in encoder queue */
WORD32 i4_is_last_buf;
/** Recon luma buffer pointer */
void *pv_y_buf;
/** Recon cb buffer pointer */
void *pv_cb_buf;
/** Recon cr buffer pointer */
void *pv_cr_buf;
/** Luma size **/
WORD32 i4_y_pixels;
/** Chroma size **/
WORD32 i4_uv_pixels;
} iv_recon_data_buffs_t;
/* @brief iv_res_layer_output_bufs_req_t: This structure contains the parameters
* related to output (data and control) buffer requirements of the codec for all
* target resolution layers
* Application can call the memory query API to get these requirements
*/
typedef struct
{
/** i4_size of the structure : used for verison tracking */
WORD32 i4_size;
/*Memory requirements for each of target resolutions*/
iv_output_bufs_req_t s_output_buf_req[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
} iv_res_layer_output_bufs_req_t;
/* @brief iv_res_layer_recon_bufs_req_t: This structure contains the parameters
* related to recon buffer requirements of the codec for all target resolution layers
* Application can call the memory query API to get these requirements
*/
typedef struct
{
/** i4_size of the structure : used for verison tracking */
WORD32 i4_size;
/*Memory requirements for each of target resolutions*/
iv_recon_bufs_req_t s_recon_buf_req[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
} iv_res_layer_recon_bufs_req_t;
/* @brief iv_res_layer_output_data_buffs_desc_t: This structure contains
* the parameters related to output data buffers for all target resolution layers
*/
typedef struct
{
/** i4_size of the structure : used for verison tracking */
WORD32 i4_size;
/*Output buffer requirements of each taregt resolution layer*/
iv_output_data_buffs_desc_t s_output_data_buffs[IHEVCE_MAX_NUM_RESOLUTIONS]
[IHEVCE_MAX_NUM_BITRATES];
} iv_res_layer_output_data_buffs_desc_t;
/* @brief iv_res_layer_output_status_buffs_desc_t: This structure contains
* the parameters related to recon data buffers for all target resolution layers
*/
typedef struct
{
/** i4_size of the structure : used for verison tracking */
WORD32 i4_size;
/*Output buffer requirements of each taregt resolution layer*/
iv_recon_data_buffs_desc_t s_recon_data_buffs[IHEVCE_MAX_NUM_RESOLUTIONS]
[IHEVCE_MAX_NUM_BITRATES];
} iv_res_layer_recon_data_buffs_desc_t;
#endif // _IHEVCE_API_H_