• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 
21 /**
22 ******************************************************************************
23 *
24 * @file ihevce_rc_structs.h
25 *
26 * @brief
27 *  This file contains rc interface structures and prototypes
28 *
29 * @author
30 *  Ittiam
31 *
32 ******************************************************************************
33 */
34 
35 #ifndef _IHEVCE_RC_STRUCTS_H_
36 #define _IHEVCE_RC_STRUCTS_H_
37 
38 /*****************************************************************************/
39 /* Constant Macros                                                           */
40 /*****************************************************************************/
41 
42 #define MAX_NUM_TEMPORAL_LAYERS 4
43 #define HALF_MAX_SCENE_ARRAY_QP MAX_SCENE_NUM / 2
44 
45 /*moderate value of fsim to be passed when LAP is not enabled*/
46 #define MODERATE_FSIM_VALUE 110
47 #define MODERATE_LAP2_COMPLEXITY_Q7 25
48 
49 /*also present in RATE CONTROL HEADER FILE with same name*/
50 #define MAX_LAP_COMPLEXITY_Q7 90
51 
52 /*value of maximum variance in content used to generate offline model.*/
53 #define MAX_LAP_VAR 1000
54 #define AVG_LAP_VAR 400
55 
56 /*buffer to store bit consumption between rdopt and entropy to calculate correction in entropy thread*/
57 #define NUM_BUF_RDOPT_ENT_CORRECT (NUM_FRMPROC_ENTCOD_BUFS + 1)  //+(1<<FRAME_PARALLEL_LVL))
58 
59 /*****************************************************************************/
60 /* Enums                                                                     */
61 /*****************************************************************************/
62 /**
63 ******************************************************************************
64  *  @brief      Enumeration for memory records requested by entropy module
65 ******************************************************************************
66  */
67 typedef enum
68 {
69     RC_CTXT = 0,
70     RC_QSCALE_TO_QP,
71     RC_QP_TO_QSCALE,
72     RC_QP_TO_QSCALE_Q_FACTOR,
73     RC_MULTI_PASS_GOP_STAT,
74 
75     /* should always be the last entry */
76     NUM_RC_MEM_RECS
77 
78 } IHEVCE_RC_MEM_TABS_T;
79 
80 /*****************************************************************************/
81 /* Structures                                                                */
82 /*****************************************************************************/
83 
84 /**
85 ******************************************************************************
86  *  @brief  pre enc qp queue struct
87 ******************************************************************************
88  */
89 typedef struct
90 {
91     WORD32 ai4_quant[NUM_RC_PIC_TYPE];
92     WORD32 i4_scd_qp;
93     WORD32 i4_is_qp_valid;
94 } pre_enc_qp_queue;
95 
96 typedef struct
97 {
98     LWORD64 ai8_L1_prev_I_intra_raw_satd[MAX_PIC_TYPE];
99     LWORD64 ai8_L1_prev_pic_coarse_me_cost[MAX_PIC_TYPE];
100     LWORD64 ai8_L1_prev_pic_coarse_me_sad[MAX_PIC_TYPE];
101     UWORD32 au4_prev_scene_num[MAX_PIC_TYPE];
102 } rc_L1_state_t;
103 
104 /**
105 ******************************************************************************
106  * vbv compliance testing struct
107 ******************************************************************************
108 */
109 typedef struct vbv_compliance_t
110 {
111     /** frame rate  */
112     float f_frame_rate;
113 
114     /** bit rate    */
115     float f_bit_rate;
116 
117     /** current buffer level */
118     float f_curr_buffer_level;
119 
120     /*current buffer level unclipped for current frame*/
121     float f_curr_buffer_level_unclip;
122 
123     /** total buffer size */
124     float f_buffer_size;
125 
126     /** drain rate */
127     float f_drain_rate;
128     /** previous cbp_removal_removal_delay minus 1**/
129     UWORD32 u4_prev_cpb_removal_delay_minus1;
130 
131 } vbv_compliance_t;
132 
133 /* structure defined to maintain the qp's of Non reference b pictures based on reference */
134 /* b pictures of next layer  to handle in steadystate,SCD and Non_I_SCD's. The offset is */
135 /* based on the temporeal complexities of the sub GOP                                    */
136 typedef struct
137 {
138     WORD32 i4_enc_order_num_rc;
139 
140     WORD32 i4_non_ref_B_pic_qp;
141 
142     UWORD32 u4_scene_num_rc;
143 
144 } non_ref_b_qp_store_t;
145 /* structure to get high level stat from rc to adjust clip QP in case
146 if it causes encoder buffer  overflow*/
147 typedef struct
148 {
149     /*online model valid flag*/
150     WORD32 i4_is_model_valid;
151 
152     /*model given QP if model is valid either offline or online
153     else set it to INVALID_QP*/
154     WORD32 i4_modelQP;
155 
156     /*final RC QP,must be always valid*/
157     WORD32 i4_finalQP;
158 
159     /* QP to reach maxEbf if model is valid*/
160     WORD32 i4_maxEbfQP;
161 
162     /* bits for final QP if model is valid*/
163     LWORD64 i8_bits_from_finalQP;
164 
165     /*offline model flag for I scd, non i scd, I only scd*/
166     WORD32 i4_is_offline_model_used;
167 
168 } rc_high_level_stat_t;
169 
170 typedef struct
171 {
172     /* START of static parameters*/
173     rate_control_handle rc_hdl;
174     rc_type_e e_rate_control_type;
175     UWORD8 u1_is_mb_level_rc_on;
176     /* bit rate to achieved across the entire file size */
177     UWORD32 u4_avg_bit_rate;
178     /* max possible drain rate */
179     UWORD32 au4_peak_bit_rate[MAX_PIC_TYPE];
180     UWORD32 u4_min_bit_rate;
181     /* frames per 1000 seconds */
182     UWORD32 u4_max_frame_rate;
183     /* Buffer delay for CBR */
184     UWORD32 u4_max_delay;
185     /* Intraframe interval equal to GOP size */
186     UWORD32 u4_intra_frame_interval;
187     /* IDR period which indicates occurance of open GOP */
188     UWORD32 u4_idr_period;
189     /* Initial Qp array for I and P frames */
190     WORD32 ai4_init_qp[MAX_PIC_TYPE];
191     //0x3fffffff; /* Max VBV buffer size */
192     UWORD32 u4_max_vbv_buff_size;
193     /* MAx interval between I and P frame */
194     WORD32 i4_max_inter_frm_int;
195     /* Whether GOP is open or closed */
196     WORD32 i4_is_gop_closed;
197     WORD32 ai4_min_max_qp[MAX_PIC_TYPE * 2];
198     /* Whether to use estimated SAD or Previous I frame SAD */
199     WORD32 i4_use_est_intra_sad;
200     UWORD32 u4_src_ticks;
201     UWORD32 u4_tgt_ticks;
202 
203     WORD32 i4_auto_generate_init_qp;
204 
205     WORD32 i4_frame_width;
206     WORD32 i4_frame_height;
207 
208     WORD32 i4_min_frame_qp;
209     WORD32 i4_max_frame_qp;
210 
211     WORD32 i4_init_vbv_fullness;
212     /* Num frames in lap window*/
213     WORD32 i4_num_frame_in_lap_window;
214     /** Max temporal layer the configured at init time*/
215     WORD32 i4_max_temporal_lyr;
216     /*Number of active picture type. Depends on max temporal reference*/
217     WORD32 i4_num_active_pic_type;
218     /* User defined constant qp or init qp to be used during scene cut*/
219     WORD32 i4_init_frame_qp_user;
220     /* To remember whether the pic type is field:1 or not:0*/
221     WORD32 i4_field_pic;
222     /*To convey whether top field is encoded first:1 or bottom field :0*/
223     WORD32 i4_top_field_first;
224     /** Quality preset to choose offline model coeff*/
225     WORD32 i4_quality_preset;
226     /*populate init pre enc qp based on bpp for all pictype*/
227     WORD32 ai4_init_pre_enc_qp[MAX_PIC_TYPE];
228     WORD32 i4_initial_decoder_delay_frames;
229 
230     float f_vbr_max_peak_sustain_dur;
231     LWORD64 i8_num_frms_to_encode;
232 
233     WORD32 i4_min_scd_hevc_qp;
234 
235     UWORD8 u1_bit_depth;
236 
237     rc_quant_t *ps_rc_quant_ctxt;
238 
239     WORD32 i4_rc_pass;
240     /*Memory allocated for storing GOP level stat*/
241     void *pv_gop_stat;
242 
243     LWORD64 i8_num_gop_mem_alloc;
244 
245     WORD32 i4_is_infinite_gop;
246 
247     WORD32 ai4_offsets[5];
248     /*End of static parameters */
249 
250     /* Start of parameters updated and accessed during pre-enc*/
251     rc_L1_state_t s_l1_state_metric;
252     /*estimate of pre-enc header bits*/
253     LWORD64 i8_est_I_pic_header_bits;
254     /** previous frame estimated L0 SATD/act predicted using pre-enc intra SAD*/
255     LWORD64 ai8_prev_frame_est_L0_satd[MAX_PIC_TYPE];
256 
257     LWORD64 ai8_prev_frame_pre_intra_sad[MAX_PIC_TYPE];
258 
259     LWORD64 ai8_prev_frame_hme_sad[MAX_PIC_TYPE];
260 
261     /** Is previous frame intra sad available. set = 1 when atleast one frame of each picture type has been encoded*/
262     WORD32 i4_is_est_L0_intra_sad_available;
263 
264     FILE *pf_stat_file;
265 
266     /* END of parameters updated and accessed during pre-enc */
267 
268     /* START of parameters updated during update call and accessed in other threads (pre enc/entropy)*/
269 
270     /*variables related to creation of pre enc qp queue*/
271     pre_enc_qp_queue as_pre_enc_qp_queue[MAX_PRE_ENC_RC_DELAY];
272     /*Remember RDOPT opt concumption, and corresponding time stamp*/
273     WORD32 ai4_rdopt_bit_consumption_estimate[NUM_BUF_RDOPT_ENT_CORRECT];
274 
275     WORD32 ai4_rdopt_bit_consumption_buf_id[NUM_BUF_RDOPT_ENT_CORRECT];
276 
277     WORD32 i4_rdopt_bit_count;
278 
279     /*Remember entropy bit consumption and corresponding time stamp*/
280     WORD32 ai4_entropy_bit_consumption[NUM_BUF_RDOPT_ENT_CORRECT];
281 
282     WORD32 ai4_entropy_bit_consumption_buf_id[NUM_BUF_RDOPT_ENT_CORRECT];
283 
284     WORD32 i4_entropy_bit_count;
285 
286     WORD32 i4_pre_enc_qp_read_index;
287 
288     WORD32 i4_pre_enc_qp_write_index;
289 
290     WORD32 i4_use_qp_offset_pre_enc;
291 
292     WORD32 i4_num_frms_from_reset;
293     /*CAll back functions for print/write operations*/
294     ihevce_sys_api_t *ps_sys_rc_api;
295 
296     LWORD64 i8_num_frame_read;
297 
298     LWORD64 i8_num_bit_alloc_period;
299 
300     vbv_compliance_t s_vbv_compliance;
301 
302     WORD32 i4_next_sc_i_in_rc_look_ahead;
303 
304     LWORD64 i8_new_bitrate;
305         /*Set to -1 when no request. Positive value indicates pending change in bitrate request*/  //FRAME
306 
307     LWORD64 i8_new_peak_bitrate;
308 
309     WORD32 i4_num_frames_subgop;
310 
311     WORD32 i4_is_last_frame_scan;
312 
313     LWORD64 i8_total_acc_coarse_me_sad;
314 
315     WORD32 i4_L0_frame_qp;
316 
317     /** prev pic scene num of same temporal id*/
318     UWORD32 au4_scene_num_temp_id[MAX_NUM_TEMPORAL_LAYERS];
319 
320     /* END of parameters updated during update call and accessed in other threads (pre enc/entropy)*/
321 
322     /* START of parameters to be updated at the query QP level(updation) */
323 
324     /** Intra frame cost exported by pre-enc IPE for current frame*/
325     ULWORD64 ai8_cur_frm_intra_cost[MAX_NUM_ENC_LOOP_PARALLEL];
326     /** remember prev frame intra cost*/
327     ULWORD64 i8_prev_i_frm_cost;
328     /* Current frame inter cost from coarse ME*/
329     LWORD64 ai8_cur_frame_coarse_ME_cost[MAX_NUM_ENC_LOOP_PARALLEL];
330     /** Flag for first frame so that same logic as scd can be used(offline data)*/
331     WORD32 i4_is_first_frame_encoded;
332     /*Flag to remember to reset I model only based on SCD detecton based on open loop SATD
333       of two consecutive I pic*/
334     WORD32 ai4_I_model_only_reset[MAX_NUM_ENC_LOOP_PARALLEL];
335     /** prev pic intra cost for I pic and coarse ME cost for rest of picture types
336         For intra L0 cost is availbale and HME cost is on L1 layer*/
337     LWORD64 ai8_prev_frm_pre_enc_cost[MAX_PIC_TYPE];
338     /*previous qp used encoded*/
339     WORD32 ai4_prev_pic_hevc_qp[MAX_SCENE_NUM][MAX_PIC_TYPE];
340 
341     WORD32 ai4_scene_numbers[MAX_SCENE_NUM];
342 
343     /* END of parameters to be updated at the query QP lecvel */
344 
345     /* START of parameters to be maintained array for Enc loop parallelism */
346 
347     /** is scene cut frame at base layer*/
348     WORD32 ai4_is_frame_scd[MAX_NUM_ENC_LOOP_PARALLEL];  //ELP_RC
349     /*Flag to remember frames that are detected as scene cut but not made I due to another SCD following it immediately*/
350     WORD32 ai4_is_non_I_scd_pic[MAX_NUM_ENC_LOOP_PARALLEL];  //ELP_RC
351     /*Flag to remember pause to resume so that only P and B models can be reset*/
352     WORD32 ai4_is_pause_to_resume[MAX_NUM_ENC_LOOP_PARALLEL];  //ELP_RC
353     /*Frame similarity over look ahead window*/
354     WORD32 ai4_lap_f_sim[MAX_NUM_ENC_LOOP_PARALLEL];  //ELP_RC
355     /*Overall lap complexity including inter and intra in q7 format*/
356     WORD32 ai4_lap_complexity_q7[MAX_NUM_ENC_LOOP_PARALLEL];  //ELP_RC
357 
358     float af_sum_weigh[MAX_NUM_ENC_LOOP_PARALLEL][MAX_PIC_TYPE][3];
359 
360     WORD32 ai4_is_cmplx_change_reset_model[MAX_NUM_ENC_LOOP_PARALLEL];
361 
362     WORD32 ai4_is_cmplx_change_reset_bits[MAX_NUM_ENC_LOOP_PARALLEL];
363 
364     float ai_to_avg_bit_ratio[MAX_NUM_ENC_LOOP_PARALLEL];
365 
366     WORD32 ai4_num_scd_in_lap_window[MAX_NUM_ENC_LOOP_PARALLEL];
367 
368     WORD32 ai4_num_frames_b4_scd[MAX_NUM_ENC_LOOP_PARALLEL];
369 
370     /* END of parameters to be maintained array for Enc loop parallelism */
371 
372     UWORD32 u4_prev_scene_num;
373 
374     WORD32 ai4_qp_for_previous_scene[MAX_PIC_TYPE];
375 
376     UWORD32 au4_prev_scene_num_pre_enc[MAX_PIC_TYPE];
377 
378     WORD32 ai4_qp_for_previous_scene_pre_enc[MAX_PIC_TYPE];
379 
380     UWORD32 u4_scene_num_est_L0_intra_sad_available;
381 
382     non_ref_b_qp_store_t as_non_ref_b_qp[MAX_NON_REF_B_PICS_IN_QUEUE_SGI];
383 
384     UWORD32 au4_prev_scene_num_multi_scene[MAX_NON_REF_B_PICS_IN_QUEUE_SGI];
385 
386     WORD32 ai4_qp_for_previous_scene_multi_scene[MAX_NON_REF_B_PICS_IN_QUEUE_SGI][MAX_PIC_TYPE];
387 
388     WORD32 i4_prev_qp_ctr;
389 
390     WORD32 i4_cur_scene_num;
391 
392     WORD32 i4_non_ref_B_ctr;
393 
394     float af_sum_weigh_2_pass[MAX_PIC_TYPE][3];
395 
396     rc_bits_sad_t as_rc_frame_stat_store[MAX_NUM_ENC_LOOP_PARALLEL]
397                                         [IHEVCE_MAX_NUM_BITRATES];  //ELP_RC
398 
399     WORD32 out_buf_id[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];  //ELP_RC
400 
401     WORD32 i4_pic_type[MAX_NUM_ENC_LOOP_PARALLEL];  //ELP_RC
402 
403     WORD32 cur_qp[MAX_NUM_ENC_LOOP_PARALLEL][IHEVCE_MAX_NUM_BITRATES];  //ELP_RC
404 
405     ihevce_lap_output_params_t as_lap_out[MAX_NUM_ENC_LOOP_PARALLEL];  //ELP_RC
406 
407     rc_lap_out_params_t as_rc_lap_out[MAX_NUM_ENC_LOOP_PARALLEL];  //ELP_RC
408 
409     WORD32 i4_complexity_bin;
410 
411     WORD32 i4_last_p_or_i_frame_gop;
412 
413     WORD32 i4_qp_at_I_frame_for_skip_sad;
414 
415     WORD32 i4_denominator_i_to_avg;
416 
417     WORD32 i4_no_more_set_rbip_for_cur_gop;
418 
419     WORD32 i4_num_frm_scnd_fr_alloc;
420 
421     WORD32 i4_last_disp_num_scanned;
422 
423     LWORD64 i8_l1_analysis_lap_comp;
424 
425     WORD32 i4_est_text_bits_ctr_get_qp;  //ELP_RC
426 
427     WORD32 i4_est_text_bits_ctr_update_qp;  //ELP_RC
428 
429     WORD32 i4_num_frame_parallel;  //ELP_RC
430 
431     WORD32 i4_scene_num_latest;
432 
433     WORD32 i4_pre_enc_rc_delay;
434 
435     /*Enable this falg to do bit allocation within a gop in
436     in second pass based on first pass data*/
437     WORD32 i4_fp_bit_alloc_in_sp;
438 
439     WORD32 i4_bitrate_changed;
440 
441     /* Flag which shows that capped vbr mode is enabled */
442     WORD32 i4_capped_vbr_flag;
443 
444     rc_high_level_stat_t s_rc_high_lvl_stat;
445 
446     WORD32 i4_normal_inter_pic;
447 
448     WORD32 i4_br_id_for_2pass;
449 
450     WORD32 ai4_scene_num_last_pic[MAX_PIC_TYPE];
451 
452     WORD32 ai4_last_tw0_lyr0_pic_qp[2];
453 } rc_context_t;
454 
455 /* NOTE:: Please add any new parameters accordin to the categorization as specified in the comments of */
456 /* the structure definition. strat and end of the category are present in the defifnition*/
457 
458 #endif
459