459 lines
15 KiB
C
459 lines
15 KiB
C
/******************************************************************************
|
|
*
|
|
* 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
|