libavc/encoder/ih264e_structs.h
Hamsalekha S a24d3cf61f libavcenc: Fixed bug in the case of IDR frame being skipped.
When IDR frame is skipped due to VBV constraints, the frame
number should not be reset. Since it was reset earlier, it
was leading to bistream being not decodable in such a case.
Restore frame_num during idr skip.
2023-09-28 07:24:09 -07:00

2870 lines
72 KiB
C

/******************************************************************************
*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/**
*******************************************************************************
* @file
* ih264e_structs.h
*
* @brief
* Structure definitions used in the encoder
*
* @author
* Harish
*
* @remarks
* None
*
*******************************************************************************
*/
#ifndef IH264E_STRUCTS_H_
#define IH264E_STRUCTS_H_
/*****************************************************************************/
/* Structure definitions */
/*****************************************************************************/
/* Early declaration of structs */
typedef struct _codec_t codec_t;
typedef struct _proc_t process_ctxt_t;
/*****************************************************************************/
/* Extern Function type definitions */
/*****************************************************************************/
/**
******************************************************************************
* @brief intra prediction filters leaf level
******************************************************************************
*/
typedef void (*pf_intra_pred)(UWORD8 *pu1_src, UWORD8 *pu1_dst,
WORD32 src_strd, WORD32 dst_strd,
WORD32 ui_neighboravailability);
/**
******************************************************************************
* @brief inter prediction filters leaf level
******************************************************************************
*/
typedef void (*pf_inter_pred_luma_bilinear)(UWORD8 *pu1_src1, UWORD8 *pu1_src2, UWORD8 *pu1_dst,
WORD32 src_strd1, WORD32 src_strd2, WORD32 dst_strd,
WORD32 height, WORD32 width);
/**
******************************************************************************
* @brief fwd transform leaf level
******************************************************************************
*/
typedef void (*pf_trans_quant)(UWORD8*pu1_src, UWORD8 *pu1_pred, WORD16 *pi2_out,
WORD32 i4_src_stride, UWORD32 u4_pred_stride, UWORD32 u4_dst_stride,
const UWORD16 *pu2_scale_mat, const UWORD16 *pu2_thresh_mat,
UWORD32 u4_qbit, UWORD32 u4_round_fact, UWORD8 *pu1_nnz);
typedef void (*pf_iquant_itrans)(WORD16 *pi2_src, UWORD8 *pu1_pred, UWORD8 *pu1_out,
WORD32 i4_src_stride, UWORD32 u4_pred_stride, UWORD32 u4_out_stride,
const UWORD16 *pu2_iscale_mat, const UWORD16 *pu2_weigh_mat,
UWORD32 qp_div, WORD32 *pi4_tmp);
/**
******************************************************************************
* @brief Padding leaf level
******************************************************************************
*/
typedef void (*pf_pad)(UWORD8 *pu1_src, WORD32 src_strd, WORD32 wd, WORD32 pad_size);
/**
******************************************************************************
* @brief memory handling leaf level
******************************************************************************
*/
typedef void (*pf_memcpy)(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes);
typedef void (*pf_memset)(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes);
typedef void (*pf_memcpy_mul8)(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes);
typedef void (*pf_memset_mul8)(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes);
/**
******************************************************************************
* @brief Sad computation
******************************************************************************
*/
typedef void (*pf_compute_sad)(UWORD8 *pu1_src, UWORD8 *pu1_est,
UWORD32 src_strd, UWORD32 est_strd,
WORD32 i4_max_sad, WORD32 *pi4_mb_distortion);
/**
******************************************************************************
* @brief Intra mode eval:encoder level
******************************************************************************
*/
typedef void (*pf_evaluate_intra_modes)(UWORD8 *pu1_src, UWORD8 *pu1_ngbr_pels_i16, UWORD8 *pu1_dst,
UWORD32 src_strd, UWORD32 dst_strd,
WORD32 u4_n_avblty, UWORD32 *u4_intra_mode,
WORD32 *pu4_sadmin,
UWORD32 u4_valid_intra_modes);
typedef void (*pf_evaluate_intra_4x4_modes)(UWORD8 *pu1_src, UWORD8 *pu1_ngbr_pels, UWORD8 *pu1_dst,
UWORD32 src_strd, UWORD32 dst_strd,
WORD32 u4_n_avblty, UWORD32 *u4_intra_mode,
WORD32 *pu4_sadmin,
UWORD32 u4_valid_intra_modes, UWORD32 u4_lambda,
UWORD32 u4_predictd_mode);
/**
******************************************************************************
* @brief half_pel generation :encoder level
******************************************************************************
*/
typedef void (*pf_sixtapfilter_horz)(UWORD8 *pu1_src, UWORD8 *pu1_dst,
WORD32 src_strd, WORD32 dst_strd);
typedef void (*pf_sixtap_filter_2dvh_vert)(UWORD8 *pu1_src, UWORD8 *pu1_dst1, UWORD8 *pu1_dst2,
WORD32 src_strd, WORD32 dst_strd,
WORD32 *pi16_pred1,
WORD32 pi16_pred1_strd);
/**
******************************************************************************
* @brief color space conversion
******************************************************************************
*/
typedef void (*pf_fmt_conv_420p_to_420sp)(UWORD8 *pu1_y_src, UWORD8 *pu1_u_src, UWORD8 *pu1_v_src,
UWORD8 *pu1_y_dst, UWORD8 *pu1_uv_dst,
UWORD16 u2_height, UWORD16 u2_width,
UWORD16 src_y_strd, UWORD16 src_u_strd, UWORD16 src_v_strd,
UWORD16 dst_y_strd, UWORD16 dst_uv_strd,
UWORD32 convert_uv_only);
typedef void (*pf_fmt_conv_422ile_to_420sp)(UWORD8 *pu1_y_buf, UWORD8 *pu1_u_buf, UWORD8 *pu1_v_buf,
UWORD8 *pu1_422i_buf,
WORD32 u4_y_width, WORD32 u4_y_height, WORD32 u4_y_stride,
WORD32 u4_u_stride, WORD32 u4_v_stride,
WORD32 u4_422i_stride);
/**
******************************************************************************
* @brief ME evaluation
******************************************************************************
*/
typedef void ih264e_compute_me_ft(process_ctxt_t *);
/**
******************************************************************************
* @brief SKIP decision
******************************************************************************
*/
typedef WORD32 ih264e_skip_params_ft(process_ctxt_t *, WORD32);
/*****************************************************************************/
/* Enums */
/*****************************************************************************/
/**
******************************************************************************
* @enum CODEC_STATE_T
* @brief codec state
******************************************************************************
*/
typedef enum
{
INIT_DONE,
HEADER_DONE,
FIRST_FRAME_DONE,
} CODEC_STATE_T;
/**
******************************************************************************
* @enum JOBQ_CMD_T
* @brief list of job commands (used during job instantiation)
******************************************************************************
*/
typedef enum
{
CMD_PROCESS,
CMD_ENTROPY,
CMD_FMTCONV,
CMD_ME,
}JOBQ_CMD_T;
/*****************************************************************************/
/* Structures */
/*****************************************************************************/
/**
* PU information
*/
typedef struct
{
/**
* Motion Vector
*/
mv_t s_mv;
/**
* Ref index
*/
WORD8 i1_ref_idx;
} enc_pu_mv_t;
/*
* Total Pu info for an MB
*/
typedef struct
{
/* Array with ME info for all lists */
enc_pu_mv_t s_me_info[2];
/**
* PU X position in terms of min PU (4x4) units
*/
UWORD32 b4_pos_x : 4;
/**
* PU Y position in terms of min PU (4x4) units
*/
UWORD32 b4_pos_y : 4;
/**
* PU width in pixels = (b4_wd + 1) << 2
*/
UWORD32 b4_wd : 2;
/**
* PU height in pixels = (b4_ht + 1) << 2
*/
UWORD32 b4_ht : 2;
/**
* Intra or Inter flag for each partition - 0 or 1
*/
UWORD32 b1_intra_flag : 1;
/**
* PRED_L0, PRED_L1, PRED_BI
*/
UWORD32 b2_pred_mode : 2;
} enc_pu_t;
typedef struct
{
/** Descriptor of raw buffer */
iv_raw_buf_t s_raw_buf;
/** Lower 32bits of time stamp corresponding to the above buffer */
UWORD32 u4_timestamp_low;
/** Upper 32bits of time stamp corresponding to the above buffer */
UWORD32 u4_timestamp_high;
/** Flag to indicate if the current buffer is last buffer */
UWORD32 u4_is_last;
/** Flag to indicate if mb info is sent along with input buffer */
UWORD32 u4_mb_info_type;
/** Flag to indicate the size of mb info structure */
UWORD32 u4_mb_info_size;
/** Buffer containing mb info if mb_info_type is non-zero */
void *pv_mb_info;
/** Flag to indicate if pic info is sent along with input buffer */
UWORD32 u4_pic_info_type;
/** Buffer containing pic info if mb_info_type is non-zero */
void *pv_pic_info;
/** SEI CCV params flag */
UWORD8 u1_sei_ccv_params_present_flag;
/** SEI CCV params info */
sei_ccv_params_t s_sei_ccv;
/** SEI SII params flag */
UWORD8 u1_sei_sii_params_present_flag;
/** SEI SII params info */
sei_sii_params_t s_sei_sii;
}inp_buf_t;
typedef struct
{
/** Descriptor of bitstream buffer */
iv_bits_buf_t s_bits_buf;
/** Lower 32bits of time stamp corresponding to the above buffer */
UWORD32 u4_timestamp_low;
/** Upper 32bits of time stamp corresponding to the above buffer */
UWORD32 u4_timestamp_high;
/** Flag to indicate if the current buffer is last buffer */
UWORD32 u4_is_last;
}out_buf_t;
typedef struct
{
/** Descriptor of picture buffer */
pic_buf_t s_pic_buf;
/** Lower 32bits of time stamp corresponding to the above buffer */
UWORD32 u4_timestamp_low;
/** Upper 32bits of time stamp corresponding to the above buffer */
UWORD32 u4_timestamp_high;
/** Flag to indicate if the current buffer is last buffer */
UWORD32 u4_is_last;
/** Picture count corresponding to current picture */
WORD32 i4_pic_cnt;
}rec_buf_t;
typedef struct
{
/** 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 recon */
UWORD32 u4_enable_recon;
/** Flag to enable/disable quality metrics */
UWORD32 u4_enable_quality_metrics;
/** 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 u4_max_bitrate;
/** 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 u4_target_bitrate;
/** 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 u4_i_qp;
/** Set initial Qp for P pictures */
UWORD32 u4_p_qp;
/** Set initial Qp for B pictures */
UWORD32 u4_b_qp;
/** Set minimum Qp for I pictures */
UWORD32 u4_i_qp_min;
/** Set maximum Qp for I pictures */
UWORD32 u4_i_qp_max;
/** Set minimum Qp for P pictures */
UWORD32 u4_p_qp_min;
/** Set maximum Qp for P pictures */
UWORD32 u4_p_qp_max;
/** Set minimum Qp for B pictures */
UWORD32 u4_b_qp_min;
/** Set maximum Qp for B pictures */
UWORD32 u4_b_qp_max;
/** 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 u4_vbv_buffer_delay;
/** VBV buffer size */
UWORD32 u4_vbv_buf_size;
/** 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 */
IVE_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;
/** enable constrained intra prediction */
UWORD32 u4_constrained_intra_pred;
/** Pic info type */
UWORD32 u4_pic_info_type;
/**
* MB info type
*/
UWORD32 u4_mb_info_type;
/** VUI structure */
vui_t s_vui;
/** SEI structure */
sei_params_t s_sei;
}cfg_params_t;
/** Structure to hold format conversion context */
typedef struct
{
/** Current row for which format conversion should be done */
WORD32 i4_cur_row;
/** Number of rows for which format conversion should be done */
WORD32 i4_num_rows;
}fmt_conv_t;
/**
* Structure to represent a processing job entry
*/
typedef struct
{
/**
* Command
*/
WORD32 i4_cmd;
/**
* MB x of the starting MB
*/
WORD16 i2_mb_x;
/**
* MB y of the starting MB
*/
WORD16 i2_mb_y;
/**
* Number of MBs that need to be processed in this job
*/
WORD16 i2_mb_cnt;
/**
* Process contexts base index
* Will toggle between 0 and MAX_PROCESS_THREADS
*/
WORD16 i2_proc_base_idx;
} job_t;
/**
*****************************************************************************
* @brief Structure to store psnr of the sequence
*****************************************************************************
*/
typedef struct {
UWORD64 total_sse[3];
double global_psnr[3]; // total_sse / total_samples
double total_psnr[3]; // sum (per_frame_sse / per_frame_samples)
double avg_psnr[3]; // total_psnr / total_frames
UWORD32 total_samples[3];
WORD32 total_frames;
} quality_stats_t;
/**
* Structure to represent a MV Bank buffer
*/
typedef struct
{
/**
* Pointer to hold num PUs each MB in a picture
*/
UWORD32 *pu4_mb_pu_cnt;
/**
* Pointer to hold enc_pu_t for each PU in a picture
*/
enc_pu_t *ps_pic_pu;
/**
* Pointer to hold PU map for each MB in a picture
*/
UWORD8 *pu1_pic_pu_map;
/**
* Pointer to hold the Slice map
*/
UWORD16 *pu1_pic_slice_map;
/**
* Absolute POC for the current MV Bank
*/
WORD32 i4_abs_poc;
/**
* Buffer Id
*/
WORD32 i4_buf_id;
} mv_buf_t;
/**
* Reference set containing pointers to MV buf and pic buf
*/
typedef struct
{
/** Per pic PSNR */
quality_stats_t s_pic_quality_stats;
/** Picture count */
WORD32 i4_pic_cnt;
/** POC */
WORD32 i4_poc;
/** picture buffer */
pic_buf_t *ps_pic_buf;
/** mv buffer */
mv_buf_t *ps_mv_buf;
}ref_set_t;
typedef struct
{
/**
* Pointer to current PPS
*/
pps_t *ps_pps;
/**
* Pointer to current SPS
*/
sps_t *ps_sps;
/**
* Pointer to current slice header structure
*/
slice_header_t *ps_slice_hdr;
/**
* 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;
/**
* Current PU structure - set to MB enc_pu_t pointer at the start of MB processing and incremented
* for every TU
*/
enc_pu_t *ps_pu;
/**
* Pointer to frame level enc_pu_t for the current frame being parsed
* where MVs and Intra pred modes will be updated
*/
enc_pu_t *ps_pic_pu;
/**
* Pointer to hold num PUs each MB in a picture
*/
UWORD32 *pu4_mb_pu_cnt;
/** PU Index map per MB. The indices in this map are w.r.t picture pu array and not
* w.r.t MB pu array.
* This will be used during mv prediction and since neighbors will have different MB pu map
* it will be easier if they all have indices w.r.t picture level PU array rather than MB level
* PU array.
* pu1_pic_pu_map is map w.r.t MB's enc_pu_t array
*/
UWORD32 *pu4_pic_pu_idx_map;
/**
* Pointer to pu_map for the current frame being parsed
* where MVs and Intra pred modes will be updated
*/
UWORD8 *pu1_pic_pu_map;
/**
* PU count in current MB
*/
WORD32 i4_mb_pu_cnt;
/**
* PU count in current MB
*/
WORD32 i4_mb_start_pu_idx;
/**
* Top availability for current MB level
*/
UWORD8 u1_top_mb_avail;
/**
* Top right availability for current MB level
*/
UWORD8 u1_top_rt_mb_avail;
/**
* Top left availability for current MB level
*/
UWORD8 u1_top_lt_mb_avail;
/**
* left availability for current MB level
*/
UWORD8 u1_left_mb_avail;
}mv_ctxt_t;
typedef struct
{
/**
* 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;
/**
* Boundary strength, Two bits per edge.
* Stored in format. BS[15] | BS[14] | .. |BS[0]
*/
UWORD32 *pu4_pic_horz_bs;
/**
* Qp array stored for each mb
*/
UWORD8 *pu1_pic_qp;
}bs_ctxt_t;
typedef struct
{
/**
* 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
*/
bs_ctxt_t s_bs_ctxt;
/**
* Pointer to 0th luma pixel in current pic
*/
UWORD8 *pu1_cur_pic_luma;
/**
* Pointer to 0th chroma pixel in current pic
*/
UWORD8 *pu1_cur_pic_chroma;
/**
* 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;
}deblk_ctxt_t;
/**
******************************************************************************
* @brief Structure to hold data and flags for 'n' mb processing for
* deblocking , padding and half pel generation.
******************************************************************************
*/
typedef struct
{
/**
* MB's x position last processed + 1
*/
WORD32 i4_mb_x;
/**
* MB's y position ,current processing.
*/
WORD32 i4_mb_y;
/**
* Number of MBs processed in a stretch
*/
WORD32 i4_n_mbs;
}n_mb_process_ctxt_t;
/**
******************************************************************************
* @brief Structure to hold coefficient info for a 4x4 subblock.
* The following can be used to type-cast coefficient data that is stored
* per subblock. Note that though i2_level is shown as an array that
* holds 16 coefficients, only the first few entries will be valid. Next
* subblocks data starts after the valid number of coefficients. Number
* of non-zero coefficients will be derived using number of non-zero bits
* in sig coeff map
******************************************************************************
*/
typedef struct
{
/**
* significant coefficient map and nnz are packed in
* to msb (2 bytes) and lsb (2 bytes) respectively
*/
WORD32 i4_sig_map_nnz;
/**
* array of non zero residue coefficients
*/
WORD16 ai2_residue[16];
}tu_sblk_coeff_data_t;
/**
******************************************************************************
* @brief Structure contains few common state variables such as MB indices,
* current SPS, PPS etc which are to be used in the entropy thread. By keeping
* it a different structure it is being explicitly signaled that these
* variables are specific to entropy threads context and other threads should
* not update these elements
******************************************************************************
*/
typedef struct
{
/**
* Pointer to the cabac context
*/
cabac_ctxt_t *ps_cabac;
/**
* 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;
/**
* seq_parameter_set_id
*/
UWORD32 u4_sps_id;
/**
* Pointer to base of sequence parameter set structure array
*/
sps_t *ps_sps_base;
/**
* pic_parameter_set_id
*/
UWORD32 u4_pps_id;
/**
* 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 slice header structure array
*/
slice_header_t *ps_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;
/**
* 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];
} entropy_ctxt_t;
/**
******************************************************************************
* @brief macro block info.
******************************************************************************
*/
typedef struct
{
/**
* mb type
*/
UWORD16 u2_is_intra;
/**
* mb type
*/
UWORD16 u2_mb_type;
/**
* csbp
*/
UWORD32 u4_csbp;
/**
* mb distortion
*/
WORD32 i4_mb_distortion;
}mb_info_t;
/**
******************************************************************************
* @brief mb_hdr structures to access first few common elements of above
* structures
******************************************************************************
*/
typedef struct
{
/**
* mb type and mode
*/
UWORD8 u1_mb_type_mode;
/**
* CBP
*/
UWORD8 u1_cbp;
/**
* MB qp delta
*/
UWORD8 u1_mb_qp_delta;
/**
* Element to align structure to 2 byte boundary
*/
UWORD8 u1_pad;
}mb_hdr_common_t;
/**
******************************************************************************
* @brief macro block info for I4x4 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
/**
* Sub block modes, 2 modes per byte
*/
UWORD8 au1_sub_blk_modes[8];
}mb_hdr_i4x4_t;
/**
******************************************************************************
* @brief macro block info for I8x8 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
/**
* Sub block modes, 2 modes per byte
*/
UWORD8 au1_sub_blk_modes[2];
}mb_hdr_i8x8_t;
/**
******************************************************************************
* @brief macro block info for I16x16 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
}mb_hdr_i16x16_t;
/**
******************************************************************************
* @brief macro block info for P16x16 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
/**
* MV
*/
WORD16 ai2_mv[2];
}mb_hdr_p16x16_t;
/**
******************************************************************************
* @brief macro block info for PSKIP MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
}mb_hdr_pskip_t;
/**
******************************************************************************
* @brief macro block info for B16x16 MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
/**
* MV
*/
WORD16 ai2_mv[2][2];
}mb_hdr_b16x16_t;
/**
******************************************************************************
* @brief macro block info for BDIRECT MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
}mb_hdr_bdirect_t;
/**
******************************************************************************
* @brief macro block info for PSKIP MB
******************************************************************************
*/
typedef struct
{
/**
* Common MB header params
*/
mb_hdr_common_t common;
}mb_hdr_bskip_t;
/**
******************************************************************************
* @brief Union of mb_hdr structures for size calculation
* and to access first few common elements
******************************************************************************
*/
typedef union
{
mb_hdr_i4x4_t mb_hdr_i4x4;
mb_hdr_i8x8_t mb_hdr_i8x8;
mb_hdr_i16x16_t mb_hdr_i16x16;
mb_hdr_p16x16_t mb_hdr_p16x16;
mb_hdr_pskip_t mb_hdr_pskip;
mb_hdr_b16x16_t mb_hdr_b16x16;
mb_hdr_bdirect_t mb_hdr_bdirect;
mb_hdr_bskip_t mb_hdr_bskip;
}mb_hdr_t;
/**
******************************************************************************
* @brief structure presenting the neighbor availability of a mb
* or subblk or any other partition
******************************************************************************
*/
typedef struct
{
/**
* left blk/subblk/partition
*/
UWORD8 u1_mb_a;
/**
* top blk/subblk/partition
*/
UWORD8 u1_mb_b;
/**
* topright blk/subblk/partition
*/
UWORD8 u1_mb_c;
/**
* topleft blk/subblk/partition
*/
UWORD8 u1_mb_d;
}block_neighbors_t;
/**
******************************************************************************
* @brief MB info related variables used during NMB processing
******************************************************************************
*/
typedef struct
{
UWORD32 u4_mb_type;
UWORD32 u4_min_sad;
UWORD32 u4_min_sad_reached;
WORD32 i4_mb_cost;
WORD32 i4_mb_distortion;
enc_pu_mv_t as_skip_mv[4];
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;
}mb_info_nmb_t;
/**
******************************************************************************
* @brief Pixel processing thread context
******************************************************************************
*/
struct _proc_t
{
/**
* entropy context
*/
entropy_ctxt_t s_entropy;
/**
* me context
*/
me_ctxt_t s_me_ctxt;
/**
* Pointer to codec context
*/
codec_t *ps_codec;
/**
* N mb process contest
*/
n_mb_process_ctxt_t s_n_mb_ctxt;
/**
* Source pointer to current MB luma
*/
UWORD8 *pu1_src_buf_luma;
/**
* Source pointer to current MB chroma
*/
UWORD8 *pu1_src_buf_chroma;
/**
* Recon pointer to current MB luma
*/
UWORD8 *pu1_rec_buf_luma;
/**
* Recon pointer to current MB chroma
*/
UWORD8 *pu1_rec_buf_chroma;
/**
* Ref pointer to current MB luma
*/
UWORD8 *apu1_ref_buf_luma[MAX_REF_PIC_CNT];
/**
* Ref pointer to current MB chroma
*/
UWORD8 *apu1_ref_buf_chroma[MAX_REF_PIC_CNT];
/**
* pointer to luma plane of input buffer (base :: mb (0,0))
*/
UWORD8 *pu1_src_buf_luma_base;
/**
* pointer to luma plane of reconstructed buffer (base :: mb (0,0))
*/
UWORD8 *pu1_rec_buf_luma_base;
/**
* pointer to luma plane of ref buffer (base :: mb (0,0))
*/
UWORD8 *apu1_ref_buf_luma_base[MAX_REF_PIC_CNT];
/**
* pointer to chroma plane of input buffer (base :: mb (0,0))
*/
UWORD8 *pu1_src_buf_chroma_base;
/*
* Buffer for color space conversion of luma
*/
UWORD8 *pu1_y_csc_buf;
/*
* Buffer for color space conversion of luma
*/
UWORD8 *pu1_uv_csc_buf;
/**
* pointer to chroma plane of reconstructed buffer (base :: mb (0,0))
*/
UWORD8 *pu1_rec_buf_chroma_base;
/**
* pointer to chroma plane of reconstructed buffer (base :: mb (0,0))
*/
UWORD8 *apu1_ref_buf_chroma_base[MAX_REF_PIC_CNT];
/**
* Pointer to ME NMB info
*/
mb_info_nmb_t *ps_nmb_info;
mb_info_nmb_t *ps_cur_mb;
/**
* source luma stride
*/
WORD32 i4_src_strd;
/**
* source chroma stride
*/
WORD32 i4_src_chroma_strd;
/**
* recon stride & ref stride
* (strides for luma and chroma are the same)
*/
WORD32 i4_rec_strd;
/**
* 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 type
*/
UWORD32 u4_mb_type;
/**
* is intra
*/
UWORD32 u4_is_intra;
/**
* 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
*/
enc_pu_t *ps_pu;
/**
* Pointer to the pu of current co-located MB in list 1
*/
enc_pu_t *ps_colpu;
/**
* predicted motion vector
*/
enc_pu_mv_t *ps_skip_mv;
/**
* predicted motion vector
*/
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.
*/
mb_info_t *ps_top_row_mb_syntax_ele_base;
/**
* top row mb syntax information
*/
mb_info_t *ps_top_row_mb_syntax_ele;
/**
* left mb syntax information
*/
mb_info_t s_left_mb_syntax_ele;
/**
* top left mb syntax information
*/
mb_info_t s_top_left_mb_syntax_ele;
/**
* top left mb syntax information
*/
mb_info_t s_top_left_mb_syntax_ME;
/**
* left mb motion vector
*/
enc_pu_t s_left_mb_pu_ME;
/**
* top left mb motion vector
*/
enc_pu_t s_top_left_mb_pu_ME;
/**
* mb neighbor availability pointer
*/
block_neighbors_t s_ngbr_avbl;
/**
* In case the macroblock type is intra, the intra modes of all
* partitions for the left mb are stored in the array below
*/
UWORD8 au1_left_mb_intra_modes[16];
/**
* In case the macroblock type is intra, the intra modes of all
* partitions for the top mb are stored in the array below
*
* 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.
*/
UWORD8 *pu1_top_mb_intra_modes_base;
/**
* In case the macroblock type is intra, the intra modes of all
* partitions for the top mb are stored in the array below
*/
UWORD8 *pu1_top_mb_intra_modes;
/**
* left mb motion vector
*/
enc_pu_t s_left_mb_pu;
/**
* top left mb motion vector
*/
enc_pu_t s_top_left_mb_pu;
/**
* top row motion vector info
*
* In normal working scenarios, for a given context set,
* the top row pu 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.
*/
enc_pu_t *ps_top_row_pu_base;
/**
* top row motion vector info
*/
enc_pu_t *ps_top_row_pu;
enc_pu_t *ps_top_row_pu_ME;
/**
* coded block pattern
*/
UWORD32 u4_cbp;
/**
* csbp
*/
UWORD32 u4_csbp;
/**
* number of non zero coeffs
*/
UWORD32 au4_nnz[5];
/**
* number of non zero coeffs for intra 4x4 when rdopt is on
*/
UWORD32 au4_nnz_intra_4x4[4];
/**
* frame qp & mb qp
*/
UWORD32 u4_frame_qp, u4_mb_qp;
/**
* mb qp previous
*/
UWORD32 u4_mb_qp_prev;
/**
* 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
*/
pic_buf_t *ps_cur_pic;
/**
* Pointer to current picture's mv buffer structure
*/
mv_buf_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
*/
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 slice header structure array
*/
slice_header_t *ps_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
*/
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
*/
pic_buf_t *aps_ref_pic[MAX_REF_PIC_CNT];
/**
* Reference MV buff for the current picture
*/
mv_buf_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;
};
/**
******************************************************************************
* @brief Rate control related variables
******************************************************************************
*/
typedef struct
{
void *pps_rate_control_api;
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;
/**
* intra cnt in previous frame
*/
WORD32 num_intra_in_prev_frame;
/**
* avg activity of prev frame
*/
WORD32 i4_avg_activity;
}rate_control_ctxt_t;
/**
* Codec context
*/
struct _codec_t
{
/**
* 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
*/
cfg_params_t s_cfg;
/**
* Array containing the config parameter sets
*/
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 i4_disable_deblk_pic;
/**
* Number of continuous frames where deblocking was disabled
*/
WORD32 i4_disable_deblk_pic_cnt;
/**
* frame type
*/
PIC_TYPE_T pic_type;
/**
* frame qp
*/
UWORD32 u4_frame_qp;
/**
* frame num
*/
WORD32 i4_frame_num;
/**
* frame num backup (used in post enc skip case)
*/
WORD32 i4_restore_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 MV Bank buffer manager
*/
void *pv_mv_buf_mgr_base;
/**
* MV Bank buffer manager
*/
void *pv_mv_buf_mgr;
/**
* Pointer to MV Buf structure array
*/
void *ps_mv_buf;
/**
* Base address for Motion Vector bank buffer
*/
void *pv_mv_bank_buf_base;
/**
* MV Bank size allocated
*/
WORD32 i4_total_mv_bank_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
*/
void *ps_pic_buf;
/**
* Base address for Picture buffer
*/
void *pv_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;
/**
* Current input buffer
*/
pic_buf_t *ps_inp_buf;
/**
* 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;
/**
* seq_parameter_set_id
*/
WORD32 i4_sps_id;
/**
* pic_parameter_set_id
*/
WORD32 i4_pps_id;
/**
* Pointer to base of slice header structure array
*/
slice_header_t *ps_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
*/
process_ctxt_t as_process[MAX_PROCESS_CTXT];
/**
* Thread handle for each of the processing threads
*/
void *apv_proc_thread_handle[MAX_PROCESS_THREADS];
/**
* Structure for global PSNR
*/
quality_stats_t s_global_quality_stats;
/**
* 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
*/
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];
/**
* luma core coding function pointer
*/
UWORD8 (*luma_energy_compaction[4])(process_ctxt_t *ps_proc);
/**
* chroma core coding function pointer
*/
UWORD8 (*chroma_energy_compaction[2])(process_ctxt_t *ps_proc);
/**
* forward transform for intra blk of mb type 16x16
*/
ih264_luma_16x16_resi_trans_dctrans_quant_ft *pf_resi_trans_dctrans_quant_16x16;
/**
* inverse transform for intra blk of mb type 16x16
*/
ih264_luma_16x16_idctrans_iquant_itrans_recon_ft *pf_idctrans_iquant_itrans_recon_16x16;
/**
* forward transform for 4x4 blk luma
*/
ih264_resi_trans_quant_ft *pf_resi_trans_quant_4x4;
/**
* forward transform for 4x4 blk luma
*/
ih264_resi_trans_quant_ft *pf_resi_trans_quant_chroma_4x4;
/*
* hadamard transform and quant for a 4x4 block
*/
ih264_hadamard_quant_ft *pf_hadamard_quant_4x4;
/*
* hadamard transform and quant for a 4x4 block
*/
ih264_hadamard_quant_ft *pf_hadamard_quant_2x2_uv;
/**
* inverse transform for 4x4 blk
*/
ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_4x4;
/**
* inverse transform for chroma 4x4 blk
*/
ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4;
/**
* inverse transform for 4x4 blk with only single dc coeff
*/
ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_4x4_dc;
/**
* inverse transform for chroma 4x4 blk with only single dc coeff
*/
ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4_dc;
/*
* Inverse hadamard transform and iquant for a 4x4 block
*/
ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_4x4;
/*
* Inverse hadamard transform and iquant for a 4x4 block
*/
ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_2x2_uv;
/*
* Function for interleave copy*
*/
ih264_interleave_copy_ft *pf_interleave_copy;
/**
* forward transform for 8x8 blk
*/
ih264_resi_trans_quant_ft *pf_resi_trans_quant_8x8;
/**
* inverse transform for 8x8 blk
*/
/**
* inverse transform for 4x4 blk
*/
ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_8x8;
/**
* forward transform for chroma MB
*/
ih264_chroma_8x8_resi_trans_dctrans_quant_ft *pf_resi_trans_dctrans_quant_8x8_chroma;
/**
* inverse transform for chroma MB
*/
ih264_idctrans_iquant_itrans_recon_ft *pf_idctrans_iquant_itrans_recon_8x8_chroma;
/**
* 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;
/**
* Inter pred leaf level functions
*/
ih264_inter_pred_luma_ft *pf_inter_pred_luma_copy;
ih264_inter_pred_luma_ft *pf_inter_pred_luma_horz;
ih264_inter_pred_luma_ft *pf_inter_pred_luma_vert;
pf_inter_pred_luma_bilinear pf_inter_pred_luma_bilinear;
ih264_inter_pred_chroma_ft *pf_inter_pred_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
*/
ih264e_compute_me_ft *apf_compute_me[2];
/**
* Function pointers for computing SKIP parameters
*/
ih264e_skip_params_ft *apf_find_skip_params_me[2];
/**
* fn ptrs for memory handling operations
*/
pf_memcpy pf_mem_cpy;
pf_memset pf_mem_set;
pf_memcpy_mul8 pf_mem_cpy_mul8;
pf_memset_mul8 pf_mem_set_mul8;
/**
* 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]) ( entropy_ctxt_t *ps_ent_ctxt );
/**
* Output buffer
*/
out_buf_t as_out_buf[MAX_CTXT_SETS];
/**
* recon buffer
*/
rec_buf_t as_rec_buf[MAX_CTXT_SETS];
/**
* rate control context
*/
rate_control_ctxt_t s_rate_control;
/**
* input buffer queue
*/
inp_buf_t as_inp_list[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;
/**
* backup sei params for comparison
*/
sei_params_t s_sei;
};
#endif /* IH264E_STRUCTS_H_ */