/******************************************************************************
*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/**
******************************************************************************
*
* @file ihevce_rc_structs.h
*
* @brief
* This file contains rc interface structures and prototypes
*
* @author
* Ittiam
*
******************************************************************************
*/
#ifndef _IHEVCE_RC_STRUCTS_H_
#define _IHEVCE_RC_STRUCTS_H_
/*****************************************************************************/
/* Constant Macros */
/*****************************************************************************/
#define MAX_NUM_TEMPORAL_LAYERS 4
#define HALF_MAX_SCENE_ARRAY_QP MAX_SCENE_NUM / 2
/*moderate value of fsim to be passed when LAP is not enabled*/
#define MODERATE_FSIM_VALUE 110
#define MODERATE_LAP2_COMPLEXITY_Q7 25
/*also present in RATE CONTROL HEADER FILE with same name*/
#define MAX_LAP_COMPLEXITY_Q7 90
/*value of maximum variance in content used to generate offline model.*/
#define MAX_LAP_VAR 1000
#define AVG_LAP_VAR 400
/*buffer to store bit consumption between rdopt and entropy to calculate correction in entropy thread*/
#define NUM_BUF_RDOPT_ENT_CORRECT (NUM_FRMPROC_ENTCOD_BUFS + 1) //+(1<<FRAME_PARALLEL_LVL))
/*****************************************************************************/
/* Enums */
/*****************************************************************************/
/**
******************************************************************************
* @brief Enumeration for memory records requested by entropy module
******************************************************************************
*/
typedef enum
{
RC_CTXT = 0,
RC_QSCALE_TO_QP,
RC_QP_TO_QSCALE,
RC_QP_TO_QSCALE_Q_FACTOR,
RC_MULTI_PASS_GOP_STAT,
/* should always be the last entry */
NUM_RC_MEM_RECS
} IHEVCE_RC_MEM_TABS_T;
/*****************************************************************************/
/* Structures */
/*****************************************************************************/
/**
******************************************************************************
* @brief pre enc qp queue struct
******************************************************************************
*/
typedef struct
{
WORD32 ai4_quant[NUM_RC_PIC_TYPE];
WORD32 i4_scd_qp;
WORD32 i4_is_qp_valid;
} pre_enc_qp_queue;
typedef struct
{
LWORD64 ai8_L1_prev_I_intra_raw_satd[MAX_PIC_TYPE];
LWORD64 ai8_L1_prev_pic_coarse_me_cost[MAX_PIC_TYPE];
LWORD64 ai8_L1_prev_pic_coarse_me_sad[MAX_PIC_TYPE];
UWORD32 au4_prev_scene_num[MAX_PIC_TYPE];
} rc_L1_state_t;
/**
******************************************************************************
* vbv compliance testing struct
******************************************************************************
*/
typedef struct vbv_compliance_t
{
/** frame rate */
float f_frame_rate;
/** bit rate */
float f_bit_rate;
/** current buffer level */
float f_curr_buffer_level;
/*current buffer level unclipped for current frame*/
float f_curr_buffer_level_unclip;
/** total buffer size */
float f_buffer_size;
/** drain rate */
float f_drain_rate;
/** previous cbp_removal_removal_delay minus 1**/
UWORD32 u4_prev_cpb_removal_delay_minus1;
} vbv_compliance_t;
/* structure defined to maintain the qp's of Non reference b pictures based on reference */
/* b pictures of next layer to handle in steadystate,SCD and Non_I_SCD's. The offset is */
/* based on the temporeal complexities of the sub GOP */
typedef struct
{
WORD32 i4_enc_order_num_rc;
WORD32 i4_non_ref_B_pic_qp;
UWORD32 u4_scene_num_rc;
} non_ref_b_qp_store_t;
/* structure to get high level stat from rc to adjust clip QP in case
if it causes encoder buffer overflow*/
typedef struct
{
/*online model valid flag*/
WORD32 i4_is_model_valid;
/*model given QP if model is valid either offline or online
else set it to INVALID_QP*/
WORD32 i4_modelQP;
/*final RC QP,must be always valid*/
WORD32 i4_finalQP;
/* QP to reach maxEbf if model is valid*/
WORD32 i4_maxEbfQP;
/* bits for final QP if model is valid*/
LWORD64 i8_bits_from_finalQP;
/*offline model flag for I scd, non i scd, I only scd*/
WORD32 i4_is_offline_model_used;
} rc_high_level_stat_t;
typedef struct
{
/* START of static parameters*/
rate_control_handle rc_hdl;
rc_type_e e_rate_control_type;
UWORD8 u1_is_mb_level_rc_on;
/* bit rate to achieved across the entire file size */
UWORD32 u4_avg_bit_rate;
/* max possible drain rate */
UWORD32 au4_peak_bit_rate[MAX_PIC_TYPE];
UWORD32 u4_min_bit_rate;
/* frames per 1000 seconds */
UWORD32 u4_max_frame_rate;
/* Buffer delay for CBR */
UWORD32 u4_max_delay;
/* Intraframe interval equal to GOP size */
UWORD32 u4_intra_frame_interval;
/* IDR period which indicates occurance of open GOP */
UWORD32 u4_idr_period;
/* Initial Qp array for I and P frames */
WORD32 ai4_init_qp[MAX_PIC_TYPE];
//0x3fffffff; /* Max VBV buffer size */
UWORD32 u4_max_vbv_buff_size;
/* MAx interval between I and P frame */
WORD32 i4_max_inter_frm_int;
/* Whether GOP is open or closed */
WORD32 i4_is_gop_closed;
WORD32 ai4_min_max_qp[MAX_PIC_TYPE * 2];
/* Whether to use estimated SAD or Previous I frame SAD */
WORD32 i4_use_est_intra_sad;
UWORD32 u4_src_ticks;
UWORD32 u4_tgt_ticks;
WORD32 i4_auto_generate_init_qp;
WORD32 i4_frame_width;
WORD32 i4_frame_height;
WORD32 i4_min_frame_qp;
WORD32 i4_max_frame_qp;
WORD32 i4_init_vbv_fullness;
/* Num frames in lap window*/
WORD32 i4_num_frame_in_lap_window;
/** Max temporal layer the configured at init time*/
WORD32 i4_max_temporal_lyr;
/*Number of active picture type. Depends on max temporal reference*/
WORD32 i4_num_active_pic_type;
/* User defined constant qp or init qp to be used during scene cut*/
WORD32 i4_init_frame_qp_user;
/* To remember whether the pic type is field:1 or not:0*/
WORD32 i4_field_pic;
/*To convey whether top field is encoded first:1 or bottom field :0*/
WORD32 i4_top_field_first;
/** Quality preset to choose offline model coeff*/
WORD32 i4_quality_preset;
/*populate init pre enc qp based on bpp for all pictype*/
WORD32 ai4_init_pre_enc_qp[MAX_PIC_TYPE];
WORD32 i4_initial_decoder_delay_frames;
float f_vbr_max_peak_sustain_dur;
LWORD64 i8_num_frms_to_encode;
WORD32 i4_min_scd_hevc_qp;
UWORD8 u1_bit_depth;
rc_quant_t *ps_rc_quant_ctxt;
WORD32 i4_rc_pass;
/*Memory allocated for storing GOP level stat*/
void *pv_gop_stat;
LWORD64 i8_num_gop_mem_alloc;
WORD32 i4_is_infinite_gop;
WORD32 ai4_offsets[5];
/*End of static parameters */
/* Start of parameters updated and accessed during pre-enc*/
rc_L1_state_t s_l1_state_metric;
/*estimate of pre-enc header bits*/
LWORD64 i8_est_I_pic_header_bits;
/** previous frame estimated L0 SATD/act predicted using pre-enc intra SAD*/
LWORD64 ai8_prev_frame_est_L0_satd[MAX_PIC_TYPE];
LWORD64 ai8_prev_frame_pre_intra_sad[MAX_PIC_TYPE];
LWORD64 ai8_prev_frame_hme_sad[MAX_PIC_TYPE];
/** Is previous frame intra sad available. set = 1 when atleast one frame of each picture type has been encoded*/
WORD32 i4_is_est_L0_intra_sad_available;
FILE *pf_stat_file;
/* END of parameters updated and accessed during pre-enc */
/* START of parameters updated during update call and accessed in other threads (pre enc/entropy)*/
/*variables related to creation of pre enc qp queue*/
pre_enc_qp_queue as_pre_enc_qp_queue[MAX_PRE_ENC_RC_DELAY];
/*Remember RDOPT opt concumption, and corresponding time stamp*/
WORD32 ai4_rdopt_bit_consumption_estimate[NUM_BUF_RDOPT_ENT_CORRECT];
WORD32 ai4_rdopt_bit_consumption_buf_id[NUM_BUF_RDOPT_ENT_CORRECT];
WORD32 i4_rdopt_bit_count;
/*Remember entropy bit consumption and corresponding time stamp*/
WORD32 ai4_entropy_bit_consumption[NUM_BUF_RDOPT_ENT_CORRECT];
WORD32 ai4_entropy_bit_consumption_buf_id[NUM_BUF_RDOPT_ENT_CORRECT];
WORD32 i4_entropy_bit_count;
WORD32 i4_pre_enc_qp_read_index;
WORD32 i4_pre_enc_qp_write_index;
WORD32 i4_use_qp_offset_pre_enc;
WORD32 i4_num_frms_from_reset;
/*CAll back functions for print/write operations*/
ihevce_sys_api_t *ps_sys_rc_api;
LWORD64 i8_num_frame_read;
LWORD64 i8_num_bit_alloc_period;
vbv_compliance_t s_vbv_compliance;
WORD32 i4_next_sc_i_in_rc_look_ahead;
LWORD64 i8_new_bitrate;
/*Set to -1 when no request. Positive value indicates pending change in bitrate request*/ //FRAME
LWORD64 i8_new_peak_bitrate;
WORD32 i4_num_frames_subgop;
WORD32 i4_is_last_frame_scan;
LWORD64 i8_total_acc_coarse_me_sad;
WORD32 i4_L0_frame_qp;
/** prev pic scene num of same temporal id*/
UWORD32 au4_scene_num_temp_id[MAX_NUM_TEMPORAL_LAYERS];
/* END of parameters updated during update call and accessed in other threads (pre enc/entropy)*/
/* START of parameters to be updated at the query QP level(updation) */
/** Intra frame cost exported by pre-enc IPE for current frame*/
ULWORD64 ai8_cur_frm_intra_cost[MAX_NUM_ENC_LOOP_PARALLEL];
/** remember prev frame intra cost*/
ULWORD64 i8_prev_i_frm_cost;
/* Current frame inter cost from coarse ME*/
LWORD64 ai8_cur_frame_coarse_ME_cost[MAX_NUM_ENC_LOOP_PARALLEL];
/** Flag for first frame so that same logic as scd can be used(offline data)*/
WORD32 i4_is_first_frame_encoded;
/*Flag to remember to reset I model only based on SCD detecton based on open loop SATD
of two consecutive I pic*/
WORD32 ai4_I_model_only_reset[MAX_NUM_ENC_LOOP_PARALLEL];
/** prev pic intra cost for I pic and coarse ME cost for rest of picture types
For intra L0 cost is availbale and HME cost is on L1 layer*/
LWORD64 ai8_prev_frm_pre_enc_cost[MAX_PIC_TYPE];
/*previous qp used encoded*/
WORD32 ai4_prev_pic_hevc_qp[MAX_SCENE_NUM][MAX_PIC_TYPE];
WORD32 ai4_scene_numbers[MAX_SCENE_NUM];
/* END of parameters to be updated at the query QP lecvel */
/* START of parameters to be maintained array for Enc loop parallelism */
/** is scene cut frame at base layer*/
WORD32 ai4_is_frame_scd[MAX_NUM_ENC_LOOP_PARALLEL]; //ELP_RC
/*Flag to remember frames that are detected as scene cut but not made I due to another SCD following it immediately*/
WORD32 ai4_is_non_I_scd_pic[MAX_NUM_ENC_LOOP_PARALLEL]; //ELP_RC
/*Flag to remember pause to resume so that only P and B models can be reset*/
WORD32 ai4_is_pause_to_resume[MAX_NUM_ENC_LOOP_PARALLEL]; //ELP_RC
/*Frame similarity over look ahead window*/
WORD32 ai4_lap_f_sim[MAX_NUM_ENC_LOOP_PARALLEL]; //ELP_RC
/*Overall lap complexity including inter and intra in q7 format*/
WORD32 ai4_lap_complexity_q7[MAX_NUM_ENC_LOOP_PARALLEL]; //ELP_RC
float af_sum_weigh[MAX_NUM_ENC_LOOP_PARALLEL][MAX_PIC_TYPE][3];
WORD32 ai4_is_cmplx_change_reset_model[MAX_NUM_ENC_LOOP_PARALLEL];
WORD32 ai4_is_cmplx_change_reset_bits[MAX_NUM_ENC_LOOP_PARALLEL];
float ai_to_avg_bit_ratio[MAX_NUM_ENC_LOOP_PARALLEL];
WORD32 ai4_num_scd_in_lap_window[MAX_NUM_ENC_LOOP_PARALLEL];
WORD32 ai4_num_frames_b4_scd[MAX_NUM_ENC_LOOP_PARALLEL];
/* END of parameters to be maintained array for Enc loop parallelism */
UWORD32 u4_prev_scene_num;
WORD32 ai4_qp_for_previous_scene[MAX_PIC_TYPE];
UWORD32 au4_prev_scene_num_pre_enc[MAX_PIC_TYPE];
WORD32 ai4_qp_for_previous_scene_pre_enc[MAX_PIC_TYPE];
UWORD32 u4_scene_num_est_L0_intra_sad_available;
non_ref_b_qp_store_t as_non_ref_b_qp[MAX_NON_REF_B_PICS_IN_QUEUE_SGI];
UWORD32 au4_prev_scene_num_multi_scene[MAX_NON_REF_B_PICS_IN_QUEUE_SGI];
WORD32 ai4_qp_for_previous_scene_multi_scene[MAX_NON_REF_B_PICS_IN_QUEUE_SGI][MAX_PIC_TYPE];
WORD32 i4_prev_qp_ctr;
WORD32 i4_cur_scene_num;
WORD32 i4_non_ref_B_ctr;
float af_sum_weigh_2_pass[MAX_PIC_TYPE][3];
rc_bits_sad_t as_rc_frame_stat_store[MAX_NUM_ENC_LOOP_PARALLEL]
[IHEVCE_MAX_NUM_BITRATES]; //ELP_RC
WORD32 out_buf_id[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES]; //ELP_RC
WORD32 i4_pic_type[MAX_NUM_ENC_LOOP_PARALLEL]; //ELP_RC
WORD32 cur_qp[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES]; //ELP_RC
ihevce_lap_output_params_t as_lap_out[MAX_NUM_ENC_LOOP_PARALLEL]; //ELP_RC
rc_lap_out_params_t as_rc_lap_out[MAX_NUM_ENC_LOOP_PARALLEL]; //ELP_RC
WORD32 i4_complexity_bin;
WORD32 i4_last_p_or_i_frame_gop;
WORD32 i4_qp_at_I_frame_for_skip_sad;
WORD32 i4_denominator_i_to_avg;
WORD32 i4_no_more_set_rbip_for_cur_gop;
WORD32 i4_num_frm_scnd_fr_alloc;
WORD32 i4_last_disp_num_scanned;
LWORD64 i8_l1_analysis_lap_comp;
WORD32 i4_est_text_bits_ctr_get_qp; //ELP_RC
WORD32 i4_est_text_bits_ctr_update_qp; //ELP_RC
WORD32 i4_num_frame_parallel; //ELP_RC
WORD32 i4_scene_num_latest;
WORD32 i4_pre_enc_rc_delay;
/*Enable this falg to do bit allocation within a gop in
in second pass based on first pass data*/
WORD32 i4_fp_bit_alloc_in_sp;
WORD32 i4_bitrate_changed;
/* Flag which shows that capped vbr mode is enabled */
WORD32 i4_capped_vbr_flag;
rc_high_level_stat_t s_rc_high_lvl_stat;
WORD32 i4_normal_inter_pic;
WORD32 i4_br_id_for_2pass;
WORD32 ai4_scene_num_last_pic[MAX_PIC_TYPE];
WORD32 ai4_last_tw0_lyr0_pic_qp[2];
} rc_context_t;
/* NOTE:: Please add any new parameters accordin to the categorization as specified in the comments of */
/* the structure definition. strat and end of the category are present in the defifnition*/
#endif