/****************************************************************************** * * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ /** ******************************************************************************* * @file * isvce_structs.h * * @brief * Contains struct definition used for SVC encoding * * @author * ittiam * * @remarks * None * ******************************************************************************* */ #ifndef _ISVCE_STRUCTS_H_ #define _ISVCE_STRUCTS_H_ #include "ih264_typedefs.h" #include "iv2.h" #include "ive2.h" #include "ih264_defs.h" #include "ih264_deblk_edge_filters.h" #include "isvc_inter_pred_filters.h" #include "ithread.h" #include "isvc_defs.h" #include "isvc_mem_fns.h" #include "isvc_cabac_tables.h" #include "isvc_trans_quant_itrans_iquant.h" /* Dependencies of ime_structs.h */ #include "ime_defs.h" #include "ime_distortion_metrics.h" /* Dependencies of ih264e_cabac_structs.h */ #include "ih264_cabac_tables.h" /* Dependencies of ih264e_structs.h */ #include "ih264e_error.h" #include "ih264_trans_quant_itrans_iquant.h" #include "ih264_inter_pred_filters.h" #include "ih264e_bitstream.h" #include "ih264e_cabac_structs.h" #include "ih264e_defs.h" #include "ime_structs.h" #include "irc_cntrl_param.h" #include "irc_frame_info_collector.h" #include "ih264e_structs.h" #include "isvce_cabac_structs.h" #include "isvce_defs.h" #include "isvce_downscaler.h" #include "isvce_interface_structs.h" #include "isvce_nalu_stat_aggregator.h" #include "isvce_pred_structs.h" #include "isvce_rc_utils.h" #include "irc_cntrl_param.h" #include "irc_frame_info_collector.h" typedef struct svc_params_t { /** * Num Temporal Layers */ UWORD8 u1_num_temporal_layers; /** * Num Spatial Layers */ UWORD8 u1_num_spatial_layers; /** * Resolution ration b/w spatial layers */ DOUBLE d_spatial_res_ratio; } svc_params_t; typedef struct svc_layer_data_t { /** * Array of structs that contain mode_info per MB for every MB per layer */ isvce_mb_info_t *ps_mb_info; UWORD32 *pu4_num_pus_in_mb; } svc_layer_data_t; typedef struct svc_au_data_t { /** * Array of structs that contain layer-wise data used for svc prediction */ svc_layer_data_t *ps_svc_layer_data; /** * Absolute POC for the current MV Bank */ WORD32 i4_abs_poc; /** * Buffer Id */ WORD32 i4_buf_id; } svc_au_data_t; typedef struct isvce_inp_buf_t { /* App's buffer */ isvce_raw_inp_buf_t s_inp_props; /* A copy of SVC parameters */ svc_params_t s_svc_params; /** * Array of structs that contain properties of the buffers used for storing * layer-wise YUV data */ yuv_buf_props_t as_layer_yuv_buf_props[MAX_NUM_SPATIAL_LAYERS]; } isvce_inp_buf_t; typedef struct mb_intra_modes_t { UWORD8 au1_intra_modes[MAX_PU_IN_MB]; } mb_intra_modes_t; typedef struct nbr_info_t { isvce_mb_info_t *ps_top_row_mb_info; isvce_mb_info_t *ps_left_mb_info; mb_intra_modes_t *ps_top_mb_intra_modes; mb_intra_modes_t *ps_left_mb_intra_modes; } nbr_info_t; typedef struct svc_nbr_info_t { /** * Array of structs that contain properties of the buffers used for storing * layer-wise neighbour info */ nbr_info_t *ps_layer_nbr_info; } svc_nbr_info_t; typedef struct layer_resampler_props_t { UWORD32 u4_shift_x; UWORD32 u4_shift_y; UWORD32 u4_scale_x; UWORD32 u4_scale_y; WORD32 i4_offset_x; WORD32 i4_offset_y; WORD32 i4_add_x; WORD32 i4_add_y; WORD32 i4_delta_x; WORD32 i4_delta_y; WORD32 i4_refphase_x; WORD32 i4_refphase_y; WORD32 i4_phase_x; WORD32 i4_phase_y; UWORD32 u4_sub_wd; UWORD32 u4_sub_ht; UWORD32 u4_mb_wd; UWORD32 u4_mb_ht; } layer_resampler_props_t; typedef struct svc_ilp_data_t { /* Pointer to current AU buf */ svc_au_data_t *ps_svc_au_data; /* Array of bufs corresponding to numSpatialLayers */ layer_resampler_props_t *aps_layer_resampler_props[NUM_SP_COMPONENTS]; /* Array of bufs corresponding to numSpatialLayers */ yuv_buf_props_t *ps_intra_recon_bufs; /* Array of bufs corresponding to numSpatialLayers */ yuv_buf_props_t *ps_residual_bufs; } svc_ilp_data_t; typedef struct ilp_mv_t { isvce_enc_pu_mv_t as_mv[ENC_MAX_PU_IN_MB][NUM_PRED_DIRS]; MBTYPES_T e_mb_type; PRED_MODE_T ae_pred_mode[ENC_MAX_PU_IN_MB]; } ilp_mv_t; typedef struct ilp_me_cands_t { isvce_enc_pu_mv_t as_mv[MAX_PU_IN_MB + MAX_ILP_MV_IN_NBR_RGN][NUM_PRED_DIRS]; MBTYPES_T e_mb_type[MAX_PU_IN_MB + MAX_ILP_MV_IN_NBR_RGN]; PRED_MODE_T ae_pred_mode[MAX_PU_IN_MB + MAX_ILP_MV_IN_NBR_RGN]; UWORD32 u4_num_ilp_mvs; UWORD32 u4_num_ilp_mvs_incl_nbrs; } ilp_me_cands_t; typedef struct isvce_cfg_params_t { /** maximum width for which codec should request memory requirements */ UWORD32 u4_max_wd; /** maximum height for which codec should request memory requirements */ UWORD32 u4_max_ht; /** Maximum number of reference frames */ UWORD32 u4_max_ref_cnt; /** Maximum number of reorder frames */ UWORD32 u4_max_reorder_cnt; /** Maximum level supported */ UWORD32 u4_max_level; /** Input color format */ IV_COLOR_FORMAT_T e_inp_color_fmt; /** Flag to enable/disable - To be used only for debugging/testing */ UWORD32 u4_enable_recon; /** Recon color format */ IV_COLOR_FORMAT_T e_recon_color_fmt; /** Encoder Speed preset - Value between 0 (slowest) and 100 (fastest) */ IVE_SPEED_CONFIG u4_enc_speed_preset; /** Rate control mode */ IVE_RC_MODE_T e_rc_mode; /** Maximum frame rate to be supported */ UWORD32 u4_max_framerate; /** Maximum bitrate to be supported */ UWORD32 au4_max_bitrate[MAX_NUM_SPATIAL_LAYERS]; /** Maximum number of consecutive B frames */ UWORD32 u4_num_bframes; /** Content type Interlaced/Progressive */ IV_CONTENT_TYPE_T e_content_type; /** Maximum search range to be used in X direction */ UWORD32 u4_max_srch_rng_x; /** Maximum search range to be used in Y direction */ UWORD32 u4_max_srch_rng_y; /** Slice Mode */ IVE_SLICE_MODE_T e_slice_mode; /** Slice parameter */ UWORD32 u4_slice_param; /** Processor architecture */ IV_ARCH_T e_arch; /** SOC details */ IV_SOC_T e_soc; /** Input width to be sent in bitstream */ UWORD32 u4_disp_wd; /** Input height to be sent in bitstream */ UWORD32 u4_disp_ht; /** Input width */ UWORD32 u4_wd; /** Input height */ UWORD32 u4_ht; /** Input stride */ UWORD32 u4_strd; /** Source frame rate */ UWORD32 u4_src_frame_rate; /** Target frame rate */ UWORD32 u4_tgt_frame_rate; /** Target bitrate in kilobits per second */ UWORD32 au4_target_bitrate[MAX_NUM_SPATIAL_LAYERS]; /** Force current frame type */ IV_PICTURE_CODING_TYPE_T e_frame_type; /** Encoder mode */ IVE_ENC_MODE_T e_enc_mode; /** Set initial Qp for I pictures */ UWORD32 au4_i_qp[MAX_NUM_SPATIAL_LAYERS]; /** Set initial Qp for P pictures */ UWORD32 au4_p_qp[MAX_NUM_SPATIAL_LAYERS]; /** Set initial Qp for B pictures */ UWORD32 au4_b_qp[MAX_NUM_SPATIAL_LAYERS]; /** Set minimum Qp for I pictures */ UWORD32 au4_i_qp_min[MAX_NUM_SPATIAL_LAYERS]; /** Set maximum Qp for I pictures */ UWORD32 au4_i_qp_max[MAX_NUM_SPATIAL_LAYERS]; /** Set minimum Qp for P pictures */ UWORD32 au4_p_qp_min[MAX_NUM_SPATIAL_LAYERS]; /** Set maximum Qp for P pictures */ UWORD32 au4_p_qp_max[MAX_NUM_SPATIAL_LAYERS]; /** Set minimum Qp for B pictures */ UWORD32 au4_b_qp_min[MAX_NUM_SPATIAL_LAYERS]; /** Set maximum Qp for B pictures */ UWORD32 au4_b_qp_max[MAX_NUM_SPATIAL_LAYERS]; /** Adaptive intra refresh mode */ IVE_AIR_MODE_T e_air_mode; /** Adaptive intra refresh period in frames */ UWORD32 u4_air_refresh_period; /** VBV buffer delay */ UWORD32 au4_vbv_buffer_delay[MAX_NUM_SPATIAL_LAYERS]; /** Number of cores to be used */ UWORD32 u4_num_cores; /** ME speed preset - Value between 0 (slowest) and 100 (fastest) */ UWORD32 u4_me_speed_preset; /** Flag to enable/disable half pel motion estimation */ UWORD32 u4_enable_hpel; /** Flag to enable/disable quarter pel motion estimation */ UWORD32 u4_enable_qpel; /** Flag to enable/disable intra 4x4 analysis */ UWORD32 u4_enable_intra_4x4; /** Flag to enable/disable intra 8x8 analysis */ UWORD32 u4_enable_intra_8x8; /** Flag to enable/disable intra 16x16 analysis */ UWORD32 u4_enable_intra_16x16; /** Flag to enable/disable fast SAD approximation */ UWORD32 u4_enable_fast_sad; /*flag to enable/disable alternate reference frames */ UWORD32 u4_enable_alt_ref; /*Flag to enable/disable computation of SATDQ in ME*/ UWORD32 u4_enable_satqd; /*Minimum SAD to search for*/ WORD32 i4_min_sad; /** Maximum search range in X direction for farthest reference */ UWORD32 u4_srch_rng_x; /** Maximum search range in Y direction for farthest reference */ UWORD32 u4_srch_rng_y; /** I frame interval */ UWORD32 u4_i_frm_interval; /** IDR frame interval */ UWORD32 u4_idr_frm_interval; /** Disable deblock level (0: Enable completely, 3: Disable completely */ UWORD32 u4_disable_deblock_level; /** Profile */ IV_PROFILE_T e_profile; /** Lower 32bits of time stamp corresponding to input buffer, * from which this command takes effect */ UWORD32 u4_timestamp_low; /** Upper 32bits of time stamp corresponding to input buffer, * from which this command takes effect */ UWORD32 u4_timestamp_high; /** Flag to say if the current config parameter set is valid * Will be zero to start with and will be set to 1, when configured * Once encoder uses the parameter set, this will be set to zero */ UWORD32 u4_is_valid; /** Command associated with this config param set */ ISVCE_CONTROL_API_COMMAND_TYPE_T e_cmd; /** Input width in mbs */ UWORD32 i4_wd_mbs; /** Input height in mbs */ UWORD32 i4_ht_mbs; /** entropy coding mode flag */ UWORD32 u4_entropy_coding_mode; /** enable weighted prediction */ UWORD32 u4_weighted_prediction; /** Pic info type */ UWORD32 u4_pic_info_type; /** * MB info type */ UWORD32 u4_isvce_mb_info_type; /** VUI structure */ vui_t s_vui; /** SEI structure */ sei_params_t s_sei; /** Flag to enable/disable VUI from header */ UWORD32 u4_disable_vui; /** SVC params */ svc_params_t s_svc_params; bool b_nalu_info_export_enable; } isvce_cfg_params_t; typedef struct mb_qp_ctxt_t { UWORD8 u1_cur_mb_qp; } mb_qp_ctxt_t; typedef struct isvce_entropy_ctxt_t { /** * Pointer to the cabac context */ isvce_cabac_ctxt_t *ps_cabac; mb_qp_ctxt_t *ps_mb_qp_ctxt; /** * start of frame / start of slice flag */ WORD32 i4_sof; /** * end of frame / end of slice flag */ WORD32 i4_eof; /** * generate header upon request */ WORD32 i4_gen_header; WORD32 i4_gen_subset_sps; /** * Pointer to base of sequence parameter set structure array */ sps_t *ps_sps_base; /** * Pointer to base of Picture parameter set structure array */ pps_t *ps_pps_base; /** * Current slice idx */ WORD32 i4_cur_slice_idx; /** * Points to the array of slice indices which is used to identify the * independent slice to which each MB in a frame belongs. */ UWORD8 *pu1_slice_idx; /** * Pointer to base of svc_nalu_ext structure array */ svc_nalu_ext_t *ps_svc_nalu_ext_base; /** * Pointer to base of subset sequence parameter set structure array */ subset_sps_t *ps_subset_sps_base; /** * Pointer to base of slice header structure array */ slice_header_t *ps_slice_hdr_base; /** * Pointer to base of SVC slice header structure array */ svc_slice_header_t *ps_svc_slice_hdr_base; /** * entropy status */ UWORD8 *pu1_entropy_map; /** * MB's x position within a picture in raster scan in MB units */ WORD32 i4_mb_x; /** * MB's y position within a picture in raster scan in MB units */ WORD32 i4_mb_y; /** * MB start address */ WORD32 i4_mb_cnt; /** * MB start address */ WORD32 i4_mb_start_add; /** * MB end address */ WORD32 i4_mb_end_add; /** * Input width in mbs */ WORD32 i4_wd_mbs; /** * Input height in mbs */ WORD32 i4_ht_mbs; /** * Bitstream structure */ bitstrm_t *ps_bitstrm; #if ENABLE_RE_ENC_AS_SKIP bitstrm_t *ps_bitstrm_after_slice_hdr; #endif /** * transform_8x8_mode_flag */ WORD8 i1_transform_8x8_mode_flag; /** * entropy_coding_mode_flag */ WORD8 u1_entropy_coding_mode_flag; /** * Pointer to the top row nnz for luma */ UWORD8 (*pu1_top_nnz_luma)[4]; /** * left nnz for luma */ UWORD32 u4_left_nnz_luma; /** * Pointer to zero runs before for the mb */ UWORD8 au1_zero_run[16]; /** * Pointer to the top row nnz for chroma */ UWORD8 (*pu1_top_nnz_cbcr)[4]; /** * left nnz for chroma */ UWORD8 u4_left_nnz_cbcr; /** * Pointer frame level mb subblock coeff data */ void *pv_pic_mb_coeff_data; /** * Pointer to mb subblock coeff data and number of subblocks and scan idx * Incremented each time a coded subblock is processed */ void *pv_mb_coeff_data; /** * Pointer frame level mb header data */ void *pv_pic_mb_header_data; /** * Pointer to mb header data and * incremented each time a coded mb is encoded */ void *pv_mb_header_data; /** * Error code during parse stage */ IH264E_ERROR_T i4_error_code; /** * Void pointer to job context */ void *pv_proc_jobq, *pv_entropy_jobq; /** * Flag to signal end of frame */ WORD32 i4_end_of_frame; /** * Abs POC count of the frame */ WORD32 i4_abs_pic_order_cnt; /** * mb skip run */ WORD32 *pi4_mb_skip_run; /** * Flag to signal end of sequence */ UWORD32 u4_is_last; /** * Lower 32bits of time-stamp corresponding to the buffer being encoded */ UWORD32 u4_timestamp_low; /** * Upper 32bits of time-stamp corresponding to the buffer being encoded */ UWORD32 u4_timestamp_high; /** * Current Picture count - used for synchronization */ WORD32 i4_pic_cnt; /** * Number of bits consumed by header for I and P mb types */ UWORD32 u4_header_bits[MAX_MB_TYPE]; /** * Number of bits consumed by residue for I and P mb types */ UWORD32 u4_residue_bits[MAX_MB_TYPE]; UWORD8 u1_spatial_layer_id; } isvce_entropy_ctxt_t; /** ****************************************************************************** * @brief Rate control related variables ****************************************************************************** */ typedef struct isvce_rate_control_ctxt_t { void *apps_rate_control_api[MAX_NUM_SPATIAL_LAYERS]; void *pps_frame_time; void *pps_time_stamp; void *pps_pd_frm_rate; /** * frame rate pull down */ WORD32 pre_encode_skip[MAX_CTXT_SETS]; /** * skip frame (cbr) */ WORD32 post_encode_skip[MAX_CTXT_SETS]; /** * rate control type */ rc_type_e e_rc_type; /** * pic type */ picture_type_e e_pic_type; /** * rc utils context */ svc_rc_utils_ctxt_t s_rc_utils; /** * intra cnt in previous frame */ WORD32 ai4_num_intra_in_prev_frame[MAX_NUM_SPATIAL_LAYERS]; /** * avg activity of prev frame */ WORD32 ai4_avg_activity[MAX_NUM_SPATIAL_LAYERS]; } isvce_rate_control_ctxt_t; typedef struct { /** * mb type and mode */ UWORD8 u1_mb_type_mode; /** * CBP */ UWORD8 u1_cbp; /** * MB qp delta */ UWORD8 u1_mb_qp; /** * Element to align structure to 2 byte boundary */ UWORD8 u1_pad; UWORD8 u1_base_mode_flag; UWORD8 u1_residual_prediction_flag; } isvce_mb_hdr_common_t; /** ****************************************************************************** * @brief macro block info for I4x4 MB ****************************************************************************** */ typedef struct { /** * Common MB header params */ isvce_mb_hdr_common_t common; /** * Sub block modes, 2 modes per byte */ UWORD8 au1_sub_blk_modes[8]; } isvce_mb_hdr_i4x4_t; /** ****************************************************************************** * @brief macro block info for I8x8 MB ****************************************************************************** */ typedef struct { /** * Common MB header params */ isvce_mb_hdr_common_t common; /** * Sub block modes, 2 modes per byte */ UWORD8 au1_sub_blk_modes[2]; } isvce_mb_hdr_i8x8_t; /** ****************************************************************************** * @brief macro block info for I16x16 MB ****************************************************************************** */ typedef struct { /** * Common MB header params */ isvce_mb_hdr_common_t common; } isvce_mb_hdr_i16x16_t; /** ****************************************************************************** * @brief macro block info for P16x16 MB ****************************************************************************** */ typedef struct { /** * Common MB header params */ isvce_mb_hdr_common_t common; /** * MV */ WORD16 ai2_mvd[2]; UWORD8 u1_mvp_idx; } isvce_mb_hdr_p16x16_t; /** ****************************************************************************** * @brief macro block info for PSKIP MB ****************************************************************************** */ typedef struct { /** * Common MB header params */ isvce_mb_hdr_common_t common; } isvce_mb_hdr_pskip_t; /** ****************************************************************************** * @brief macro block info for B16x16 MB ****************************************************************************** */ typedef struct { /** * Common MB header params */ isvce_mb_hdr_common_t common; /** * MV */ WORD16 ai2_mvd[NUM_PRED_DIRS][2]; UWORD8 au1_mvp_idx[NUM_PRED_DIRS]; } isvce_mb_hdr_b16x16_t; /** ****************************************************************************** * @brief macro block info for BDIRECT MB ****************************************************************************** */ typedef struct { /** * Common MB header params */ isvce_mb_hdr_common_t common; } isvce_mb_hdr_bdirect_t; /** ****************************************************************************** * @brief macro block info for PSKIP MB ****************************************************************************** */ typedef struct { /** * Common MB header params */ isvce_mb_hdr_common_t common; } isvce_mb_hdr_bskip_t; /** ****************************************************************************** * @brief macro block info for IBL MB ****************************************************************************** */ typedef struct isvce_mb_hdr_base_mode_t { /** * Common MB header params */ isvce_mb_hdr_common_t common; } isvce_mb_hdr_base_mode_t; /** ****************************************************************************** * @brief Union of mb_hdr structures for size calculation * and to access first few common elements ****************************************************************************** */ typedef union isvce_mb_hdr_t { isvce_mb_hdr_i4x4_t mb_hdr_i4x4; isvce_mb_hdr_i8x8_t mb_hdr_i8x8; isvce_mb_hdr_i16x16_t mb_hdr_i16x16; isvce_mb_hdr_p16x16_t mb_hdr_p16x16; isvce_mb_hdr_pskip_t mb_hdr_pskip; isvce_mb_hdr_b16x16_t mb_hdr_b16x16; isvce_mb_hdr_bdirect_t mb_hdr_bdirect; isvce_mb_hdr_bskip_t mb_hdr_bskip; isvce_mb_hdr_base_mode_t mb_hdr_base_mode; } isvce_mb_hdr_t; typedef struct isvce_bs_ctxt_t { /** * MB's x position within a picture in raster scan in MB units */ WORD32 i4_mb_x; /** * MB's y position within a picture in raster scan in MB units */ WORD32 i4_mb_y; /** * MB's x position within a Slice in raster scan in MB units */ WORD32 i4_mb_slice_x; /** * MB's y position within a Slice in raster scan in MB units */ WORD32 i4_mb_slice_y; /** * Vertical strength, Two bits per edge. * Stored in format. BS[15] | BS[14] | .. |BS[0] */ UWORD32 *pu4_pic_vert_bs; UWORD32 *pu4_intra_base_vert_bs; /** * Boundary strength, Two bits per edge. * Stored in format. BS[15] | BS[14] | .. |BS[0] */ UWORD32 *pu4_pic_horz_bs; UWORD32 *pu4_intra_base_horz_bs; /** * Qp array stored for each mb */ UWORD8 *pu1_pic_qp; } isvce_bs_ctxt_t; typedef struct isvce_deblk_ctxt_t { /** * MB's x position within a picture in raster scan in MB units */ WORD32 i4_mb_x; /** * MB's y position within a picture in raster scan in MB units */ WORD32 i4_mb_y; /** * structure that contains BS and QP frame level arrays */ isvce_bs_ctxt_t s_bs_ctxt; /* * Recon Buffers */ yuv_buf_props_t s_rec_pic_buf_props; /** * Points to the array of slice indices which is used to identify the slice * to which each MB in a frame belongs. */ UWORD8 *pu1_slice_idx; } isvce_deblk_ctxt_t; /** ************************************************************************** * @brief isvce_me_ctxt_t * * Structure encapsulating the parameters used in the motion estimation * context ************************************************************************** */ typedef struct isvce_me_ctxt_t { /** * Ref pointer to current MB luma for each ref list */ UWORD8 *apu1_ref_buf_luma[MAX_NUM_REFLIST]; /** * Src pointer to current MB luma */ UWORD8 *pu1_src_buf_luma; /** * source stride * (strides for luma and chroma are the same) */ WORD32 i4_src_strd; /** * recon stride * (strides for luma and chroma are the same) */ WORD32 ai4_rec_strd[MAX_NUM_REFLIST]; /** * Offset for half pel x plane from the pic buf */ UWORD32 u4_half_x_offset; /** * Offset for half pel y plane from half x plane */ UWORD32 u4_half_y_offset; /** * Offset for half pel xy plane from half y plane */ UWORD32 u4_half_xy_offset; /** * Search range in the X, Y axis in terms of pixels */ WORD32 ai2_srch_boundaries[2]; /** * Search range in the north direction in terms of pixels */ WORD32 i4_srch_range_n; /** * Search range in the south direction in terms of pixels */ WORD32 i4_srch_range_s; /** * Search range in the east direction in terms of pixels */ WORD32 i4_srch_range_e; /** * Search range in the west direction in terms of pixels */ WORD32 i4_srch_range_w; /** * left mb motion vector */ ime_mv_t s_left_mv; /** * top left mb motion vector */ ime_mv_t s_top_left_mv; /* * ilp MVs for ME candidates * */ ilp_me_cands_t *ps_ilp_me_cands; /** * Number of valid candidates for the Initial search position */ UWORD32 u4_num_candidates[MAX_NUM_REFLIST + 1]; /** * Motion vector predictors derived from neighboring * blocks for each of the six block partitions */ ime_mv_t as_mv_init_search[MAX_NUM_REFLIST + 1][MAX_FPEL_SEARCH_CANDIDATES]; /** * mv bits */ UWORD8 *pu1_mv_bits; /** * lambda (lagrange multiplier for cost computation) */ UWORD32 u4_lambda_motion; /** * enabled fast sad computation */ UWORD32 u4_enable_fast_sad; /* * Enable SKIP block prediction based on SATQD */ UWORD32 u4_enable_stat_sad; /* * Minimum distortion to search for * */ WORD32 i4_min_sad; /* * Signal that minimum sad has been reached in ME * */ UWORD32 u4_min_sad_reached; /** * Flag to enable/disbale half pel motion estimation */ UWORD32 u4_enable_hpel; /** * Diamond search Iteration Max Cnt */ UWORD32 u4_num_layers; /** * encoder me speed */ UWORD32 u4_me_speed_preset; UWORD32 u4_left_is_intra; UWORD32 u4_left_is_skip; /* skip_type can be PREDL0, PREDL1 or BIPRED */ WORD32 i4_skip_type; /* Biasing given for skip prediction */ WORD32 i4_skip_bias[2]; /** * Structure to store the MB partition info * We need 1(L0)+1(L1)+1(bi) */ mb_part_ctxt as_mb_part[MAX_NUM_REFLIST + 1]; /* * Threshold to compare the sad with */ UWORD16 *pu2_sad_thrsh; /** * fn ptrs for compute sad routines */ ime_compute_sad_ft *pf_ime_compute_sad_16x16[2]; ime_compute_sad_ft *pf_ime_compute_sad_16x8; ime_compute_sad4_diamond *pf_ime_compute_sad4_diamond; ime_compute_sad3_diamond *pf_ime_compute_sad3_diamond; ime_compute_sad2_diamond *pf_ime_compute_sad2_diamond; ime_sub_pel_compute_sad_16x16_ft *pf_ime_sub_pel_compute_sad_16x16; /* * Function poitners for SATQD */ ime_compute_sad_stat *pf_ime_compute_sad_stat_luma_16x16; /** * Qp */ UWORD8 u1_mb_qp; /* * Buffers for holding subpel and bipred temp buffers */ UWORD8 *apu1_subpel_buffs[SUBPEL_BUFF_CNT]; WORD32 u4_subpel_buf_strd; /* * Buffers to store the best halfpel plane* */ UWORD8 *pu1_hpel_buf; } isvce_me_ctxt_t; typedef struct isvce_mb_info_nmb_t { UWORD32 u4_mb_type; UWORD32 u4_min_sad; UWORD32 u4_min_sad_reached; WORD32 i4_mb_cost; WORD32 i4_mb_distortion; isvce_enc_pu_mv_t as_skip_mv[4]; isvce_enc_pu_mv_t as_pred_mv[2]; block_neighbors_t s_ngbr_avbl; /* * Buffer to hold best subpel buffer in each MB of NMB */ UWORD8 *pu1_best_sub_pel_buf; /* * Stride for subpel buffer */ UWORD32 u4_bst_spel_buf_strd; } isvce_mb_info_nmb_t; typedef struct isvce_process_ctxt_t { svc_params_t s_svc_params; /* Resolves circular dependency with svc_ilp_mv_ctxt_t */ void *ps_svc_ilp_mv_ctxt; /* Resolves circular dependency with svc_res_pred_ctxt_t */ void *ps_res_pred_ctxt; /* Resolves circular dependency with svc_intra_pred_ctxt_t */ void *ps_intra_pred_ctxt; /* Resolves circular dependency with svc_sub_pic_rc_ctxt_t */ void *ps_sub_pic_rc_ctxt; yuv_buf_props_t *ps_mb_pred_buf; yuv_buf_props_t *ps_mb_res_buf; ilp_mv_t *ps_ilp_mv; /** * entropy context */ isvce_entropy_ctxt_t s_entropy; /** * me context */ isvce_me_ctxt_t s_me_ctxt; /* Resolves circular dependency with isvce_codec_t */ void *ps_codec; /** * N mb process contest */ n_mb_process_ctxt_t s_n_mb_ctxt; /* * Src Buffers */ yuv_buf_props_t s_src_buf_props; /* * Recon Buffers */ yuv_buf_props_t s_rec_buf_props; /* * Reference Frame Buffers */ yuv_buf_props_t as_ref_buf_props[MAX_REF_PIC_CNT]; /* * Src Buffers */ yuv_buf_props_t s_src_pic_buf_props; /* * Recon Buffers */ yuv_buf_props_t s_rec_pic_buf_props; /* * Reference Frame Buffers */ yuv_buf_props_t as_ref_pic_buf_props[MAX_REF_PIC_CNT]; /** * Pointer to ME NMB info */ isvce_mb_info_nmb_t *ps_nmb_info; isvce_mb_info_nmb_t *ps_cur_mb; /** * Offset for half pel x plane from the pic buf */ UWORD32 u4_half_x_offset; /** * Offset for half pel y plane from half x plane */ UWORD32 u4_half_y_offset; /** * Offset for half pel xy plane from half y plane */ UWORD32 u4_half_xy_offset; /** * pred buffer pointer (temp buffer 1) */ UWORD8 *pu1_pred_mb; /** * pred buffer pointer (prediction buffer for intra 16x16 */ UWORD8 *pu1_pred_mb_intra_16x16; /** * pred buffer pointer (prediction buffer for intra 16x16_plane */ UWORD8 *pu1_pred_mb_intra_16x16_plane; /** * pred buffer pointer (prediction buffer for intra chroma */ UWORD8 *pu1_pred_mb_intra_chroma; /** * pred buffer pointer (prediction buffer for intra chroma plane */ UWORD8 *pu1_pred_mb_intra_chroma_plane; /** * temp. reference buffer ptr for intra 4x4 when rdopt is on */ UWORD8 *pu1_ref_mb_intra_4x4; /** * prediction buffer stride */ WORD32 i4_pred_strd; /** * transform buffer pointer (temp buffer 2) */ WORD16 *pi2_res_buf; /** * temp. transform buffer ptr for intra 4x4 when rdopt is on */ WORD16 *pi2_res_buf_intra_4x4; /** * transform buffer stride */ WORD32 i4_res_strd; /** * scratch buffer for inverse transform (temp buffer 3) */ void *pv_scratch_buff; /** * frame num */ WORD32 i4_frame_num; /** * start address of frame / sub-frame */ WORD32 i4_frame_strt_add; /** * IDR pic */ UWORD32 u4_is_idr; /** * idr_pic_id */ UWORD32 u4_idr_pic_id; /** * Input width in mbs */ WORD32 i4_wd_mbs; /** * Input height in mbs */ WORD32 i4_ht_mbs; /** * slice_type */ WORD32 i4_slice_type; /** * Current slice idx */ WORD32 i4_cur_slice_idx; /** * MB's x position within a picture in raster scan in MB units */ WORD32 i4_mb_x; /** * MB's y position within a picture in raster scan in MB units */ WORD32 i4_mb_y; /** * MB's x position within a Slice in raster scan in MB units */ WORD32 i4_mb_slice_x; /** * MB's y position within a Slice in raster scan in MB units */ WORD32 i4_mb_slice_y; /** * mb neighbor availability pointer */ block_neighbors_t *ps_ngbr_avbl; /** * lambda (lagrange multiplier for cost computation) */ UWORD32 u4_lambda; /** * mb distortion */ WORD32 i4_mb_distortion; /** * mb cost */ WORD32 i4_mb_cost; /********************************************************************/ /* i4_ngbr_avbl_mb_16 - ngbr avbl of curr mb */ /* i4_ngbr_avbl_sb_8 - ngbr avbl of all 8x8 sub blocks of curr mb */ /* i4_ngbr_avbl_sb_4 - ngbr avbl of all 4x4 sub blocks of curr mb */ /* i4_ngbr_avbl_mb_c - chroma ngbr avbl of curr mb */ /********************************************************************/ WORD32 i4_ngbr_avbl_16x16_mb; WORD32 ai4_neighbor_avail_8x8_subblks[4]; UWORD8 au1_ngbr_avbl_4x4_subblks[16]; WORD32 i4_chroma_neighbor_avail_8x8_mb; /** * array to store the mode of mb sub blocks */ UWORD8 au1_intra_luma_mb_4x4_modes[16]; /** * array to store the predicted mode of mb sub blks */ UWORD8 au1_predicted_intra_luma_mb_4x4_modes[16]; /** * macro block intra 16x16 mode */ UWORD8 u1_l_i16_mode; /** * array to store the mode of the macro block intra 8x8 4 modes */ UWORD8 au1_intra_luma_mb_8x8_modes[4]; /** * intra chroma mb mode */ UWORD8 u1_c_i8_mode; /********************************************************************/ /* array to store pixels from the neighborhood for intra prediction */ /* i16 - 16 left pels + 1 top left pel + 16 top pels = 33 pels */ /* i8 - 8 lpels + 1 tlpels + 8 tpels + 8 tr pels = 25 pels */ /* i4 - 4 lpels + 1 tlpels + 4 tpels + 4 tr pels = 13 pels */ /* ic - 8 left pels + 1 top left pel + 8 top pels )*2 */ /********************************************************************/ UWORD8 au1_ngbr_pels[34]; /** * array for 8x8 intra pels filtering (temp buff 4) */ UWORD8 au1_neighbor_pels_i8x8_unfiltered[25]; /** * Number of sub partitons in the inter pred MB */ UWORD32 u4_num_sub_partitions; /** * Pointer to hold num PUs each MB in a picture */ UWORD32 *pu4_mb_pu_cnt; /** * Pointer to the array of structures having motion vectors, size * and position of sub partitions */ isvce_mb_info_t *ps_mb_info; /** * Pointer to the pu of current co-located MB in list 1 */ isvce_mb_info_t *ps_col_mb; /** * predicted motion vector */ isvce_enc_pu_mv_t *ps_skip_mv; /** * predicted motion vector */ isvce_enc_pu_mv_t *ps_pred_mv; /** * top row mb syntax information base * In normal working scenarios, for a given context set, * the mb syntax info pointer is identical across all process threads. * But when the hard bound on slices are enabled, in multi core, frame * is partitioned in to sections equal to set number of cores and each * partition is run independently. In this scenario, a ctxt set will alone * appear to run multiple frames at a time. For this to occur, the common * pointers across the proc ctxt should disappear. * * This is done by allocating MAX_PROCESS_THREADS memory and distributing * across individual ctxts when byte bnd per slice is enabled. */ svc_nbr_info_t s_nbr_info_base; nbr_info_t s_nbr_info; /** * mb neighbor availability pointer */ block_neighbors_t s_ngbr_avbl; /** * coded block pattern */ UWORD32 u4_cbp; /** * number of non zero coeffs */ UWORD32 au4_nnz[5]; UWORD8 au1_chroma_nnz[2 * (NUM_4x4_IN_8x8 + 1)]; /** * number of non zero coeffs for intra 4x4 when rdopt is on */ UWORD32 au4_nnz_intra_4x4[4]; /** * frame qp & mb qp */ UWORD8 u1_frame_qp; UWORD8 u1_mb_qp; /** * quantization parameters for luma & chroma planes */ quant_params_t *ps_qp_params[3]; /** * Pointer frame level mb subblock coeff data */ void *pv_pic_mb_coeff_data; /** * Pointer to mb subblock coeff data and number of subblocks and scan idx * Incremented each time a coded subblock is processed */ void *pv_mb_coeff_data; /** * Pointer frame level mb header data */ void *pv_pic_mb_header_data; /** * Pointer to mb header data and * incremented each time a coded mb is encoded */ void *pv_mb_header_data; /** * Signal that pic_init is called first time */ WORD32 i4_first_pic_init; /** * Current MV Bank's buffer ID */ WORD32 i4_cur_mv_bank_buf_id; /** * Void pointer to job context */ void *pv_proc_jobq, *pv_entropy_jobq; /** * Number of MBs to be processed in the current Job */ WORD32 i4_mb_cnt; /** * ID for the current context - Used for debugging */ WORD32 i4_id; /** * Pointer to current picture buffer structure */ svc_au_buf_t *ps_cur_pic; /** * Pointer to current picture's mv buffer structure */ svc_au_data_t *ps_cur_mv_buf; /** * Flag to indicate if ps_proc was initialized at least once in a frame. * This is needed to handle cases where a core starts to handle format * conversion jobs directly */ WORD32 i4_init_done; /** * Process status: one byte per MB */ UWORD8 *pu1_proc_map; /** * Deblk status: one byte per MB */ UWORD8 *pu1_deblk_map; /** * Process status: one byte per MB */ UWORD8 *pu1_me_map; /* * Intra refresh mask. * Indicates if an Mb is coded in intra mode within the current AIR interval * NOTE Refreshes after each AIR period * NOTE The map is shared between process */ UWORD8 *pu1_is_intra_coded; /** * Disable deblock level (0: Enable completely, 3: Disable completely */ UWORD32 u4_disable_deblock_level; /** * Pointer to the structure that contains deblock context */ isvce_deblk_ctxt_t s_deblk_ctxt; /** * Points to the array of slice indices which is used to identify the * independent slice to which each MB in a frame belongs. */ UWORD8 *pu1_slice_idx; /** * Pointer to base of svc_nalu_ext structure array */ svc_nalu_ext_t *ps_svc_nalu_ext_base; /** * Pointer to base of subset sequence parameter set structure array */ subset_sps_t *ps_subset_sps_base; /** * Pointer to base of slice header structure array */ slice_header_t *ps_slice_hdr_base; /** * Pointer to base of SVC slice header structure array */ svc_slice_header_t *ps_svc_slice_hdr_base; /** * Number of mb's to process in one loop */ WORD32 i4_nmb_ntrpy; /** * Number of mb's to process in one loop */ UWORD32 u4_nmb_me; /** * Structure for current input buffer */ isvce_inp_buf_t s_inp_buf; /** * api call cnt */ WORD32 i4_encode_api_call_cnt; /** * Current Picture count - used for synchronization */ WORD32 i4_pic_cnt; /** * Intermediate buffer for interpred leaf level functions */ WORD32 ai16_pred1[HP_BUFF_WD * HP_BUFF_HT]; /** * Reference picture for the current picture * TODO: Only 2 reference assumed currently */ svc_au_buf_t *aps_ref_pic[MAX_REF_PIC_CNT]; /** * Reference MV buff for the current picture */ svc_au_data_t *aps_mv_buf[MAX_REF_PIC_CNT]; /** * frame info used by RC */ frame_info_t s_frame_info; /* * NOTE NOT PERSISTANT INSIDE FUNCTIONS * Min sad for current MB * will be populated initially * Once a sad less than eq to u4_min_sad is reached, the value will be copied * to the cariable */ UWORD32 u4_min_sad; /* * indicates weather we have rached minimum sa or not */ UWORD32 u4_min_sad_reached; /** * Current error code */ WORD32 i4_error_code; /* * Enables or disables computation of recon */ UWORD32 u4_compute_recon; /* * Temporary buffers to be used for subpel computation */ UWORD8 *apu1_subpel_buffs[SUBPEL_BUFF_CNT]; /* * Buffer holding best sub pel values */ UWORD8 *pu1_best_subpel_buf; /* * Stride for buffer holding best sub pel */ UWORD32 u4_bst_spel_buf_strd; /* * SVC spatial layer ID */ UWORD8 u1_spatial_layer_id; } isvce_process_ctxt_t; typedef UWORD8 FT_CORE_CODING(isvce_process_ctxt_t *ps_proc); typedef WORD32 FT_FIND_SKIP_PARAMS(isvce_process_ctxt_t *, WORD32); typedef void FT_ME_ALGORITHM(isvce_process_ctxt_t *); typedef struct enc_loop_fxns_t { /** * luma core coding function pointer */ FT_CORE_CODING *apf_luma_energy_compaction[MAX_MBTYPES]; /** * chroma core coding function pointer */ FT_CORE_CODING *apf_chroma_energy_compaction[2]; /** * forward transform for intra blk of mb type 16x16 */ FT_LUMA_16X16_RESI_TRANS_DCTRANS_QUANT *pf_resi_trans_dctrans_quant_16x16; /** * inverse transform for intra blk of mb type 16x16 */ FT_LUMA_16X16_IDCTRANS_IQUANT_ITRANS_RECON *pf_idctrans_iquant_itrans_recon_16x16; /** * forward transform for 4x4 blk luma */ FT_RESI_TRANS_QUANT *apf_resi_trans_quant_4x4[NUM_RESI_TRANS_QUANT_VARIANTS]; /** * forward transform for 4x4 blk luma */ FT_RESI_TRANS_QUANT *apf_resi_trans_quant_chroma_4x4[NUM_RESI_TRANS_QUANT_VARIANTS]; /* * hadamard transform and quant for a 4x4 block */ FT_HADAMARD_QUANT *pf_hadamard_quant_4x4; /* * hadamard transform and quant for a 4x4 block */ FT_HADAMARD_QUANT *pf_hadamard_quant_2x2_uv; /** * inverse transform for 4x4 blk */ FT_IQ_IT_RECON *apf_iquant_itrans_recon_4x4[NUM_IQ_IT_RECON_VARIANTS]; /** * inverse transform for chroma 4x4 blk */ FT_IQ_IT_RECON *apf_iquant_itrans_recon_chroma_4x4[NUM_IQ_IT_RECON_VARIANTS]; /** * inverse transform for 4x4 blk with only single dc coeff */ FT_IQ_IT_RECON *apf_iquant_itrans_recon_4x4_dc[NUM_IQ_IT_RECON_VARIANTS]; /** * inverse transform for chroma 4x4 blk with only single dc coeff */ FT_IQ_IT_RECON *apf_iquant_itrans_recon_chroma_4x4_dc[NUM_IQ_IT_RECON_VARIANTS]; /* * Inverse hadamard transform and iquant for a 4x4 block */ FT_IHADAMARD_SCALING *pf_ihadamard_scaling_4x4; /* * Inverse hadamard transform and iquant for a 4x4 block */ FT_IHADAMARD_SCALING *pf_ihadamard_scaling_2x2_uv; /** * forward transform for 8x8 blk */ FT_RESI_TRANS_QUANT *apf_resi_trans_quant_8x8[NUM_RESI_TRANS_QUANT_VARIANTS]; /** * inverse transform for 8x8 blk */ FT_IQ_IT_RECON *apf_iquant_itrans_recon_8x8[NUM_IQ_IT_RECON_VARIANTS]; FT_IQ_IT_RECON *pf_zcbf_iquant_itrans_recon_4x4; FT_IQ_IT_RECON *pf_chroma_zcbf_iquant_itrans_recon_4x4; } enc_loop_fxns_t; typedef struct inter_pred_fxns_t { FT_INTER_PRED_LUMA *pf_inter_pred_luma_copy; FT_INTER_PRED_LUMA *pf_inter_pred_luma_horz; FT_INTER_PRED_LUMA *pf_inter_pred_luma_vert; FT_INTER_PRED_LUMA_BILINEAR *pf_inter_pred_luma_bilinear; FT_INTER_PRED_CHROMA *pf_inter_pred_chroma; } inter_pred_fxns_t; typedef struct mem_fxns_t { FT_MEMCPY *pf_mem_cpy; FT_MEMSET *pf_mem_set; FT_MEMCPY *pf_mem_cpy_mul8; FT_MEMSET *pf_mem_set_mul8; FT_COPY_2D *pf_copy_2d; FT_MEMSET_2D *pf_memset_2d; FT_16BIT_INTERLEAVED_COPY *pf_16bit_interleaved_copy; FT_16BIT_INTERLEAVED_MEMSET *pf_16bit_interleaved_memset; FT_NONZERO_CHECKER *pf_nonzero_checker; } mem_fxns_t; typedef struct isa_dependent_fxns_t { enc_loop_fxns_t s_enc_loop_fxns; inter_pred_fxns_t s_inter_pred_fxns; mem_fxns_t s_mem_fxns; } isa_dependent_fxns_t; /** * Reference set containing pointers to MV buf and pic buf */ typedef struct { /** Picture count */ WORD32 i4_pic_cnt; /** POC */ WORD32 i4_poc; /** picture buffer */ svc_au_buf_t *ps_pic_buf; /** mv buffer */ svc_au_data_t *ps_svc_au_data; } isvce_ref_set_t; typedef struct isvce_codec_t { /** * downscaler context */ downscaler_ctxt_t s_scaler; svc_ilp_data_t s_svc_ilp_data; nalu_descriptors_t as_nalu_descriptors[MAX_NUM_SPATIAL_LAYERS]; isa_dependent_fxns_t s_isa_dependent_fxns; #if ENABLE_MODE_STAT_VISUALISER /* Resolves circular dependency with mode_stat_visualiser_t */ void *ps_mode_stat_visualiser; #endif /** enable constrained intra prediction */ UWORD32 au4_constrained_intra_pred[MAX_NUM_SPATIAL_LAYERS]; /** * Id of current pic (input order) */ WORD32 i4_poc; /** * Number of encode frame API calls made * This variable must only be used for context selection [Read only] */ WORD32 i4_encode_api_call_cnt; /** * Number of pictures encoded */ WORD32 i4_pic_cnt; /** * Number of threads created */ WORD32 i4_proc_thread_cnt; /** * Mutex used to keep the control calls thread-safe */ void *pv_ctl_mutex; /** * Current active config parameters */ isvce_cfg_params_t s_cfg; /** * Array containing the config parameter sets */ isvce_cfg_params_t as_cfg[MAX_ACTIVE_CONFIG_PARAMS]; /** * Color format used by encoder internally */ IV_COLOR_FORMAT_T e_codec_color_format; /** * recon stride * (strides for luma and chroma are the same) */ WORD32 i4_rec_strd; /** * Flag to enable/disable deblocking of a frame */ WORD32 u4_disable_deblock_level; /** * Number of continuous frames where deblocking was disabled */ WORD32 u4_disable_deblock_level_cnt; /** * frame type */ PIC_TYPE_T pic_type; /** * frame qp */ UWORD32 au4_frame_qp[MAX_NUM_SPATIAL_LAYERS]; /** * Enable inital QP calculation based on BPP and GPP */ UWORD8 u1_enable_init_qp; /** * frame num */ WORD32 i4_frame_num; /** * slice_type */ WORD32 i4_slice_type; /* * Force current frame to specific type */ IV_PICTURE_CODING_TYPE_T force_curr_frame_type; /** * IDR pic */ UWORD32 u4_is_idr; /** * idr_pic_id */ WORD32 i4_idr_pic_id; /** * Flush mode */ WORD32 i4_flush_mode; /** * Encode header mode */ WORD32 i4_header_mode; /** * Flag to indicate if header has already * been generated when i4_api_call_cnt 0 */ UWORD32 u4_header_generated; /** * Encode generate header */ WORD32 i4_gen_header; /** * To signal successful completion of init */ WORD32 i4_init_done; /** * To signal that at least one picture was decoded */ WORD32 i4_first_pic_done; /** * Reset flag - Codec is reset if this flag is set */ WORD32 i4_reset_flag; /** * Current error code */ WORD32 i4_error_code; /** * threshold residue */ WORD32 u4_thres_resi; /** * disable intra inter gating */ UWORD32 u4_inter_gate; /** * Holds mem records passed during init. * This will be used to return the mem records during retrieve call */ iv_mem_rec_t *ps_mem_rec_backup; /** * Flag to determine if the entropy thread is active */ volatile UWORD32 au4_entropy_thread_active[MAX_CTXT_SETS]; /** * Mutex used to keep the entropy calls thread-safe */ void *pv_entropy_mutex; /** * Job queue buffer base */ void *pv_proc_jobq_buf, *pv_entropy_jobq_buf; /** * Job Queue mem tab size */ WORD32 i4_proc_jobq_buf_size, i4_entropy_jobq_buf_size; /** * Memory for svc_au_data buffer manager */ void *pv_svc_au_data_store_mgr_base; /** * svc_au_data buffer manager */ void *pv_svc_au_data_store_mgr; /** * Pointer to svc_au_data structure array */ svc_au_data_t *ps_svc_au_data; /** * Base address for svc_au_data */ svc_au_data_t *ps_svc_au_data_base; /** * svc_au_data size */ WORD32 i4_svc_au_data_size; /** * Memory for Picture buffer manager for reference pictures */ void *pv_ref_buf_mgr_base; /** * Picture buffer manager for reference pictures */ void *pv_ref_buf_mgr; /** * Number of reference buffers added to the buffer manager */ WORD32 i4_ref_buf_cnt; /** * Pointer to Pic Buf structure array */ svc_au_buf_t *ps_pic_buf; /** * Base address for Picture buffer */ svc_au_buf_t *ps_pic_buf_base; /** * Total pic buffer size allocated */ WORD32 i4_total_pic_buf_size; /** * Memory for Buffer manager for output buffers */ void *pv_out_buf_mgr_base; /** * Buffer manager for output buffers */ void *pv_out_buf_mgr; /** * Current output buffer's buffer ID */ WORD32 i4_out_buf_id; /** * Number of output buffers added to the buffer manager */ WORD32 i4_out_buf_cnt; /** * Memory for Picture buffer manager for input buffers */ void *pv_inp_buf_mgr_base; /** * Picture buffer manager for input buffers */ void *pv_inp_buf_mgr; /** * Current input buffer's buffer ID */ WORD32 i4_inp_buf_id; /** * Number of input buffers added to the buffer manager */ WORD32 i4_inp_buf_cnt; /** * Pointer to dpb manager structure */ void *pv_dpb_mgr; /** * Pointer to base of Sequence parameter set structure array */ sps_t *ps_sps_base; /** * Pointer to base of Picture parameter set structure array */ pps_t *ps_pps_base; /** * Pointer to base of svc_nalu_ext structure array */ svc_nalu_ext_t *ps_svc_nalu_ext_base; /** * Pointer to base of subset sequence parameter set structure array */ subset_sps_t *ps_subset_sps_base; /** * Pointer to base of slice header structure array */ slice_header_t *ps_slice_hdr_base; /** * Pointer to base of SVC slice header structure array */ svc_slice_header_t *ps_svc_slice_hdr_base; /** * packed residue coeff data size for 1 row of mbs */ UWORD32 u4_size_coeff_data; /** * packed header data size for 1 row of mbs */ UWORD32 u4_size_header_data; /** * Processing context - One for each processing thread * Create two sets, each set used for alternate frames */ isvce_process_ctxt_t as_process[MAX_PROCESS_CTXT]; /** * Thread handle for each of the processing threads */ void *apv_proc_thread_handle[MAX_PROCESS_THREADS]; /** * Thread created flag for each of the processing threads */ WORD32 ai4_process_thread_created[MAX_PROCESS_THREADS]; /** * Void pointer to process job context */ void *pv_proc_jobq, *pv_entropy_jobq; /** * Number of MBs processed together for better instruction cache handling */ WORD32 i4_proc_nmb; /** * Previous POC lsb */ WORD32 i4_prev_poc_lsb; /** * Previous POC msb */ WORD32 i4_prev_poc_msb; /** * Max POC lsb that has arrived till now */ WORD32 i4_max_prev_poc_lsb; /** * Context for format conversion */ fmt_conv_t s_fmt_conv; /** * Absolute pic order count */ WORD32 i4_abs_pic_order_cnt; /** * Pic order count of lsb */ WORD32 i4_pic_order_cnt_lsb; /** * Array giving current picture being processed in each context set */ WORD32 ai4_pic_cnt[MAX_CTXT_SETS]; /* * Min sad to search for */ UWORD32 u4_min_sad; /** * Reference picture set */ isvce_ref_set_t as_ref_set[MAX_DPB_SIZE + MAX_CTXT_SETS]; /* * Air pic cnt * Contains the number of pictures that have been encoded with air * This value is moudulo air refresh period */ WORD32 i4_air_pic_cnt; /* * Intra refresh map * Stores the frames at which intra refresh should occur for a MB */ UWORD16 *pu2_intr_rfrsh_map; /* * Indicates if the current frame is used as a reference frame */ UWORD32 u4_is_curr_frm_ref; /* * Indicates if there can be non reference frames in the stream */ WORD32 i4_non_ref_frames_in_stream; /* * Memory for color space conversion for luma plane */ UWORD8 *pu1_y_csc_buf_base; /* * Memory for color space conversion foe chroma plane */ UWORD8 *pu1_uv_csc_buf_base; /** * Function pointers for intra pred leaf level functions luma */ pf_intra_pred apf_intra_pred_16_l[MAX_I16x16]; pf_intra_pred apf_intra_pred_8_l[MAX_I8x8]; pf_intra_pred apf_intra_pred_4_l[MAX_I4x4]; /** * Function pointers for intra pred leaf level functions chroma */ pf_intra_pred apf_intra_pred_c[MAX_CH_I8x8]; /** * deblock vertical luma edge with blocking strength 4 */ ih264_deblk_edge_bs4_ft *pf_deblk_luma_vert_bs4; /** * deblock vertical chroma edge with blocking strength 4 */ ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_vert_bs4; /** * deblock vertical luma edge with blocking strength less than 4 */ ih264_deblk_edge_bslt4_ft *pf_deblk_luma_vert_bslt4; /** * deblock vertical chroma edge with blocking strength less than 4 */ ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_vert_bslt4; /** * deblock horizontal luma edge with blocking strength 4 */ ih264_deblk_edge_bs4_ft *pf_deblk_luma_horz_bs4; /** * deblock horizontal chroma edge with blocking strength 4 */ ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_horz_bs4; /** * deblock horizontal luma edge with blocking strength less than 4 */ ih264_deblk_edge_bslt4_ft *pf_deblk_luma_horz_bslt4; /** * deblock horizontal chroma edge with blocking strength less than 4 */ ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_horz_bslt4; /** * functions for padding */ pf_pad pf_pad_top; pf_pad pf_pad_bottom; pf_pad pf_pad_left_luma; pf_pad pf_pad_left_chroma; pf_pad pf_pad_right_luma; pf_pad pf_pad_right_chroma; /** * fn ptrs for compute sad routines */ ime_compute_sad_ft *apf_compute_sad_16x16[2]; ime_compute_sad_ft *pf_compute_sad_16x8; /** * Function pointer for computing ME * 1 for PSLICE and 1 for BSLICE */ FT_ME_ALGORITHM *apf_compute_me[2]; /** * Function pointers for computing SKIP parameters */ FT_FIND_SKIP_PARAMS *apf_find_skip_params_me[2]; /** * intra mode eval -encoder level function */ pf_evaluate_intra_modes pf_ih264e_evaluate_intra16x16_modes; pf_evaluate_intra_modes pf_ih264e_evaluate_intra_chroma_modes; pf_evaluate_intra_4x4_modes pf_ih264e_evaluate_intra_4x4_modes; /* Half pel generation function - encoder level * */ pf_sixtapfilter_horz pf_ih264e_sixtapfilter_horz; pf_sixtap_filter_2dvh_vert pf_ih264e_sixtap_filter_2dvh_vert; /** * color space conversion from YUV 420P to YUV 420Sp */ pf_fmt_conv_420p_to_420sp pf_ih264e_conv_420p_to_420sp; /** * color space conversion from YUV 420P to YUV 420Sp */ pf_fmt_conv_422ile_to_420sp pf_ih264e_fmt_conv_422i_to_420sp; /** * write mb layer for a given slice I, P, B */ IH264E_ERROR_T (*pf_write_mb_syntax_layer[2][3])(isvce_entropy_ctxt_t *ps_ent_ctxt); /** * Output buffer */ isvce_out_buf_t as_out_buf[MAX_CTXT_SETS]; /** * recon buffer */ isvce_rec_buf_t as_rec_buf[MAX_CTXT_SETS]; /** * rate control context */ isvce_rate_control_ctxt_t s_rate_control; /** * input buffer queue */ isvce_inp_buf_t as_inp_list[SVC_MAX_NUM_INP_FRAMES]; /** * Flag to indicate if any IDR requests are pending */ WORD32 i4_pending_idr_flag; /** *Flag to indicate if we have recived the last input frame */ WORD32 i4_last_inp_buff_received; /* * Max num reference frames to be signaled in SPS */ WORD32 i4_max_num_reference_frames; /** * backup sei params for comparison */ sei_params_t s_sei; } isvce_codec_t; #endif