/src/libhevc/encoder/bit_allocation.c
Line | Count | Source (jump to first uncovered line) |
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 | | * \file bit_allocation.c |
23 | | * |
24 | | * \brief |
25 | | * This file contain bit processing functions |
26 | | * |
27 | | * \date |
28 | | * |
29 | | * \author |
30 | | * ittiam |
31 | | * |
32 | | ****************************************************************************** |
33 | | */ |
34 | | /*****************************************************************************/ |
35 | | /* File Includes */ |
36 | | /*****************************************************************************/ |
37 | | /* System include files */ |
38 | | #include <stdio.h> |
39 | | #include <string.h> |
40 | | #include <stdlib.h> |
41 | | #include <assert.h> |
42 | | #include <stdarg.h> |
43 | | #include <math.h> |
44 | | |
45 | | /* User include files */ |
46 | | #include "ittiam_datatypes.h" |
47 | | #include "mem_req_and_acq.h" |
48 | | #include "rc_common.h" |
49 | | #include "rc_cntrl_param.h" |
50 | | #include "var_q_operator.h" |
51 | | #include "fixed_point_error_bits.h" |
52 | | #include "cbr_buffer_control.h" |
53 | | #include "rc_rd_model.h" |
54 | | #include "est_sad.h" |
55 | | #include "cbr_buffer_control.h" |
56 | | #include "picture_type.h" |
57 | | #include "bit_allocation.h" |
58 | | #include "trace_support.h" |
59 | | #include "rc_frame_info_collector.h" |
60 | | #include "rate_control_api.h" |
61 | | |
62 | | /** Macros **/ |
63 | 810k | #define MIN(x, y) ((x) < (y)) ? (x) : (y) |
64 | 0 | #define MAX(x, y) ((x) < (y)) ? (y) : (x) |
65 | | |
66 | | /* State structure for bit allocation */ |
67 | | typedef struct |
68 | | { |
69 | | WORD32 i4_rem_bits_in_period; |
70 | | /* Storing inputs */ |
71 | | WORD32 i4_tot_frms_in_gop; |
72 | | WORD32 i4_num_intra_frm_interval; |
73 | | WORD32 i4_bits_per_frm; |
74 | | } rem_bit_in_prd_t; |
75 | | |
76 | | typedef struct bit_allocation_t |
77 | | { |
78 | | rem_bit_in_prd_t s_rbip; |
79 | | WORD32 |
80 | | i2_K[MAX_PIC_TYPE]; /* A universal constant giving the relative complexity between pictures */ |
81 | | WORD32 i4_prev_frm_header_bits[MAX_PIC_TYPE]; /* To get a estimate of the header bits consumed */ |
82 | | WORD32 ai4_prev_frm_tot_bits[MAX_PIC_TYPE]; |
83 | | WORD32 ai4_prev_frm_tot_est_bits[MAX_PIC_TYPE]; |
84 | | WORD32 i4_bits_per_frm; |
85 | | WORD32 i4_num_gops_in_period; |
86 | | WORD32 |
87 | | i4_actual_num_gops_in_period; /* Num gops as set by rate control module */ |
88 | | WORD32 i4_saved_bits; |
89 | | WORD32 i4_max_bits_per_frm[MAX_NUM_DRAIN_RATES]; |
90 | | WORD32 i4_min_bits_per_frm; |
91 | | /* Error bits module */ |
92 | | error_bits_handle ps_error_bits; |
93 | | /* Storing frame rate */ |
94 | | WORD32 i4_frame_rate; |
95 | | WORD32 i4_bit_rate; |
96 | | WORD32 ai4_peak_bit_rate[MAX_NUM_DRAIN_RATES]; |
97 | | WORD32 i4_max_tex_bits_for_i; |
98 | | WORD32 i4_pels_in_frame; |
99 | | /* Errors within GOP and across GOP */ |
100 | | WORD32 i4_gop_level_bit_error; |
101 | | WORD32 i4_frame_level_bit_error; |
102 | | WORD32 ai4_cur_frm_est_tex_bits[MAX_NUM_FRAME_PARALLEL]; |
103 | | WORD32 ai4_cur_frm_est_hdr_bits[MAX_NUM_FRAME_PARALLEL]; |
104 | | WORD32 i4_buffer_based_bit_error; |
105 | | WORD32 i4_bits_from_buffer_in_cur_gop; |
106 | | WORD32 i4_excess_bits_from_buffer; |
107 | | |
108 | | WORD32 i4_is_hbr; |
109 | | WORD32 i4_rem_frame_in_period; |
110 | | /*HEVC_RC : this will be updated by rc_interface.c to have number of SCD in lap window. |
111 | | Ni will be incremented using this to bring down buffer level and also back to back scd within lap window*/ |
112 | | WORD32 i4_num_scd_in_lap_window; |
113 | | WORD32 i4_num_frm_b4_scd; |
114 | | WORD32 i4_num_active_pic_type; |
115 | | WORD32 i4_lap_window; |
116 | | WORD32 i4_field_pic; |
117 | | WORD32 i4_ba_rc_pass; |
118 | | void *pv_gop_stat; |
119 | | LWORD64 i8_cur_gop_num; |
120 | | LWORD64 |
121 | | i8_frm_num_in_gop; /*TBD: For enc loop parallel this variable needs to maintained outside rate control since qp will not be queried in actual bitstream order*/ |
122 | | float af_sum_weigh[MAX_PIC_TYPE][3]; |
123 | | LWORD64 i8_cur_gop_bit_consumption; /*To calculate the deviaiton in 2 pass*/ |
124 | | //LWORD64 i8_2pass_gop_error_accum; |
125 | | LWORD64 |
126 | | i8_2pass_alloc_per_frm_bits; /*Per frame bits allocated to GOP in 2 pass*/ |
127 | | //LWORD64 i8_2pass_alloc_per_frm_bits_next_gop; |
128 | | |
129 | | float f_min_complexity_cross_peak_rate; /*complexity of gop beyond which it is clipped to peak rate in 2ns pass*/ |
130 | | WORD32 i4_next_sc_i_in_rc_look_ahead; |
131 | | /*The peak factor is multiplied to get the total bits for a gop based on squashing function*/ |
132 | | float f_cur_peak_factor_2pass; |
133 | | LWORD64 i8_total_bits_allocated; |
134 | | WORD32 i4_luma_pels; |
135 | | WORD32 i4_num_gop; |
136 | | /*The bitrate will keep changing in 2 pass due to error*/ |
137 | | LWORD64 i8_current_bitrate_2_pass; |
138 | | /*i4_flag_no_more_set_rbip - once we have reached the end of total number of frames to be encoded in |
139 | | 2nd pass sliding window bit allocation there is no need to set rbip again*/ |
140 | | WORD32 i4_flag_no_more_set_rbip; |
141 | | /*i8_vbv_based_excess_for_segment will be distributed across the complex segments depending on the |
142 | | ratio of current complexity to f_sum_complexity_segment_cross_peak*/ |
143 | | float f_sum_complexity_segment_cross_peak; |
144 | | /*(i8_vbv_based_excess_for_segment)Buffer play excess is calculated for the entire segment of complex |
145 | | content which may consist of multiple gop's*/ |
146 | | //LWORD64 i8_vbv_based_excess_for_segment; |
147 | | /*I frame bit allocation during scene cuts is dependent on f_curr_i_to_sum which will signal |
148 | | the complexity difference between current i to future i's if present in the same default gop*/ |
149 | | float f_curr_i_to_sum; |
150 | | float f_curr_by_sum_subgop; |
151 | | WORD32 ai4_pic_types_in_subgop[MAX_PIC_TYPE]; |
152 | | WORD32 i4_use_subgop_bit_alloc_flag; |
153 | | WORD32 i4_num_frames_since_last_I_frame; |
154 | | LWORD64 i8_first_pic_bits_pictype[MAX_PIC_TYPE]; |
155 | | LWORD64 i8_avg_bits_pictype[MAX_PIC_TYPE]; |
156 | | WORD32 i4_avg_qscale_gop_first_pass; |
157 | | WORD32 i4_fp_bit_alloc_in_sp; |
158 | | WORD32 i4_frame_level_error_ctr_update_rc; |
159 | | float f_qscale_max_clip_in_second_pass; |
160 | | float f_average_qscale_1st_pass; |
161 | | float f_max_average_qscale_1st_pass; |
162 | | LWORD64 i8_bit_consumption_so_far; |
163 | | WORD32 i4_total_2pass_frames; |
164 | | LWORD64 i8_2pass_avg_bit_rate; |
165 | | WORD32 i4_br_id; |
166 | | } bit_allocation_t; |
167 | | |
168 | | static WORD32 get_actual_num_frames_in_gop(pic_handling_handle ps_pic_handling) |
169 | 558k | { |
170 | 558k | WORD32 i4_tot_frms_in_gop = 0, i; |
171 | 558k | WORD32 ai4_actual_frms_in_gop[MAX_PIC_TYPE]; |
172 | 558k | memset(ai4_actual_frms_in_gop, 0, MAX_PIC_TYPE * sizeof(WORD32)); |
173 | 558k | pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_actual_frms_in_gop); |
174 | 5.58M | for(i = 0; i < MAX_PIC_TYPE; i++) |
175 | 5.02M | { |
176 | 5.02M | i4_tot_frms_in_gop += ai4_actual_frms_in_gop[i]; |
177 | 5.02M | } |
178 | 558k | return (i4_tot_frms_in_gop); |
179 | 558k | } |
180 | | |
181 | | float get_cur_peak_factor_2pass(bit_allocation_t *ps_bit_allocation) |
182 | 0 | { |
183 | 0 | return (ps_bit_allocation->f_cur_peak_factor_2pass); |
184 | 0 | } |
185 | | float get_cur_min_complexity_factor_2pass(bit_allocation_t *ps_bit_allocation) |
186 | 0 | { |
187 | 0 | return (ps_bit_allocation->f_min_complexity_cross_peak_rate); |
188 | 0 | } |
189 | | void set_2pass_total_gops(bit_allocation_t *ps_bit_allocation, WORD32 i4_num_gop) |
190 | 0 | { |
191 | 0 | ps_bit_allocation->i4_num_gop = i4_num_gop; |
192 | 0 | } |
193 | | #if NON_STEADSTATE_CODE |
194 | | /* Module for accessing remaining bits in period */ |
195 | | /***************************************************************************** |
196 | | Function Name : init_rbip |
197 | | Description : Initalises the remaining bits in period structure. |
198 | | Inputs : ps_rbip -remaining bits in period structure |
199 | | ps_pic_handling - Pic handling structure |
200 | | num_intra_frm_interval - num of I frm intervals in this period |
201 | | i4_bits_per_frm - num bits per frm |
202 | | Revision History: |
203 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
204 | | *****************************************************************************/ |
205 | | static void init_rbip( |
206 | | rem_bit_in_prd_t *ps_rbip, |
207 | | pic_handling_handle ps_pic_handling, |
208 | | WORD32 i4_bits_per_frm, |
209 | | WORD32 i4_num_intra_frm_interval) |
210 | 5.03k | { |
211 | 5.03k | WORD32 i4_tot_frms_in_gop = get_actual_num_frames_in_gop(ps_pic_handling); |
212 | | /* WORD32 i4_frm_correction_for_open_gop = 0; */ |
213 | | /* If the GOP is open, then we need to subtract the num_b_frames for the first gop */ |
214 | | /*if(!pic_type_is_gop_closed(ps_pic_handling)) |
215 | | { |
216 | | i4_frm_correction_for_open_gop = pic_type_get_inter_frame_interval(ps_pic_handling)-1; |
217 | | }*/ |
218 | 5.03k | ps_rbip->i4_rem_bits_in_period = |
219 | 5.03k | i4_bits_per_frm * |
220 | 5.03k | (i4_tot_frms_in_gop * i4_num_intra_frm_interval /*- i4_frm_correction_for_open_gop*/); |
221 | | |
222 | | /* Store the total number of frames in GOP value which is |
223 | | * used from module A */ |
224 | 5.03k | ps_rbip->i4_tot_frms_in_gop = i4_tot_frms_in_gop; |
225 | 5.03k | ps_rbip->i4_num_intra_frm_interval = i4_num_intra_frm_interval; |
226 | 5.03k | ps_rbip->i4_bits_per_frm = i4_bits_per_frm; |
227 | 5.03k | } |
228 | | #endif /* #if NON_STEADSTATE_CODE */ |
229 | | |
230 | | /***************************************************************************** |
231 | | Function Name : check_update_rbip |
232 | | Description : Function for updating rbip. |
233 | | Inputs : ps_rbip -remaining bits in period structure |
234 | | ps_pic_handling - Pic handling structure |
235 | | Revision History: |
236 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
237 | | *****************************************************************************/ |
238 | | static void check_update_rbip(rem_bit_in_prd_t *ps_rbip, pic_handling_handle ps_pic_handling) |
239 | 553k | { |
240 | | /* NOTE: Intra frame interval changes aafter the first I frame that is encoded in a GOP */ |
241 | 553k | WORD32 i4_new_tot_frms_in_gop = get_actual_num_frames_in_gop(ps_pic_handling); |
242 | 553k | if(i4_new_tot_frms_in_gop != ps_rbip->i4_tot_frms_in_gop) |
243 | 0 | { |
244 | 0 | WORD32 i4_num_frames_in_period = ps_rbip->i4_num_intra_frm_interval * |
245 | 0 | (i4_new_tot_frms_in_gop - ps_rbip->i4_tot_frms_in_gop); |
246 | 0 | overflow_avoided_summation( |
247 | 0 | &ps_rbip->i4_rem_bits_in_period, (ps_rbip->i4_bits_per_frm * i4_num_frames_in_period)); |
248 | 0 | } |
249 | | /* Updated the new values */ |
250 | 553k | ps_rbip->i4_tot_frms_in_gop = i4_new_tot_frms_in_gop; |
251 | 553k | } |
252 | | /***************************************************************************** |
253 | | Function Name : ret_rbip_default_preenc |
254 | | Description : Function for calculating bits in period. |
255 | | Inputs : ps_rbip -remaining bits in period structure |
256 | | ps_pic_handling - Pic handling structure |
257 | | Revision History: |
258 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
259 | | *****************************************************************************/ |
260 | | static WORD32 |
261 | | ret_rbip_default_preenc(rem_bit_in_prd_t *ps_rbip, pic_handling_handle ps_pic_handling) |
262 | 858k | { |
263 | 858k | WORD32 i4_bits_in_period = |
264 | 858k | pic_type_get_intra_frame_interval(ps_pic_handling) * ps_rbip->i4_bits_per_frm; |
265 | 858k | return (i4_bits_in_period); |
266 | 858k | } |
267 | | /***************************************************************************** |
268 | | Function Name : update_rbip |
269 | | Description : Function for updating rbip. |
270 | | Inputs : ps_rbip -remaining bits in period structure |
271 | | ps_pic_handling - Pic handling structure |
272 | | Revision History: |
273 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
274 | | *****************************************************************************/ |
275 | | static WORD32 update_rbip( |
276 | | rem_bit_in_prd_t *ps_rbip, pic_handling_handle ps_pic_handling, WORD32 i4_num_of_bits) |
277 | 553k | { |
278 | 553k | check_update_rbip(ps_rbip, ps_pic_handling); |
279 | 553k | overflow_avoided_summation(&ps_rbip->i4_rem_bits_in_period, i4_num_of_bits); |
280 | 553k | return (ps_rbip->i4_rem_bits_in_period); |
281 | 553k | } |
282 | | /***************************************************************************** |
283 | | Function Name : get_rbip_and_num_frames |
284 | | Description : Update rbip and get number of frames. |
285 | | Inputs : ps_rbip -remaining bits in period structure |
286 | | ps_pic_handling - Pic handling structure |
287 | | pi4_num_frames - pointer to update number of frmes |
288 | | Revision History: |
289 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
290 | | *****************************************************************************/ |
291 | | static LWORD64 get_rbip_and_num_frames( |
292 | | rem_bit_in_prd_t *ps_rbip, |
293 | | pic_handling_handle ps_pic_handling, |
294 | | WORD32 i4_num_of_bits, |
295 | | WORD32 *pi4_num_frames) |
296 | 0 | { |
297 | 0 | check_update_rbip(ps_rbip, ps_pic_handling); |
298 | 0 | overflow_avoided_summation(&ps_rbip->i4_rem_bits_in_period, i4_num_of_bits); |
299 | 0 | *pi4_num_frames = ps_rbip->i4_tot_frms_in_gop; |
300 | 0 | return (ps_rbip->i4_rem_bits_in_period); |
301 | 0 | } |
302 | | /***************************************************************************** |
303 | | Function Name : set_rbip |
304 | | Description : Set rbip |
305 | | Inputs : ps_rbip -remaining bits in period structure |
306 | | i4_error_bits - Error bits |
307 | | Revision History: |
308 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
309 | | *****************************************************************************/ |
310 | | static WORD32 set_rbip(rem_bit_in_prd_t *ps_rbip, WORD32 i4_error_bits) |
311 | 0 | { |
312 | 0 | ps_rbip->i4_rem_bits_in_period = (ps_rbip->i4_bits_per_frm * ps_rbip->i4_tot_frms_in_gop * |
313 | 0 | ps_rbip->i4_num_intra_frm_interval) + |
314 | 0 | i4_error_bits; |
315 | |
|
316 | 0 | return ps_rbip->i4_rem_bits_in_period; |
317 | 0 | } |
318 | | |
319 | | /***************************************************************************** |
320 | | Function Name : multi_pass_set_rbip |
321 | | Description : 2 pass set RBIP, since the gop bits shall not depend on bitrate or framerate, |
322 | | GOP bits is directly obtained from first pass data |
323 | | Inputs : ps_rbip -remaining bits in period structure |
324 | | ps_pic_handling - Pic handling structure |
325 | | i4_cur_gop_bits - bits allocated for the curr gop |
326 | | i4_tot_frm_in_cur_gop - frames in the gop |
327 | | Revision History: |
328 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
329 | | *****************************************************************************/ |
330 | | static void multi_pass_set_rbip( |
331 | | rem_bit_in_prd_t *ps_rbip, |
332 | | pic_handling_handle ps_pic_handling, |
333 | | WORD32 i4_cur_gop_bits, |
334 | | WORD32 i4_tot_frm_in_cur_gop) |
335 | 0 | { |
336 | 0 | WORD32 i4_num_frames_in_gop = get_actual_num_frames_in_gop(ps_pic_handling); |
337 | 0 | ps_rbip->i4_rem_bits_in_period = |
338 | 0 | (WORD32)((LWORD64)i4_cur_gop_bits * i4_num_frames_in_gop / i4_tot_frm_in_cur_gop); |
339 | 0 | ps_rbip->i4_tot_frms_in_gop = i4_num_frames_in_gop; |
340 | 0 | ps_rbip->i4_bits_per_frm = ps_rbip->i4_rem_bits_in_period / i4_num_frames_in_gop; |
341 | 0 | } |
342 | | static void change_rbip( |
343 | | rem_bit_in_prd_t *ps_rbip, WORD32 i4_new_bits_per_frm, WORD32 i4_new_num_intra_frm_interval) |
344 | 5.66k | { |
345 | 5.66k | if(i4_new_bits_per_frm != ps_rbip->i4_bits_per_frm) |
346 | 5.66k | { |
347 | 5.66k | WORD32 i4_rem_frms_in_period = |
348 | 5.66k | (ps_rbip->i4_num_intra_frm_interval) * ps_rbip->i4_tot_frms_in_gop; |
349 | 5.66k | overflow_avoided_summation( |
350 | 5.66k | &ps_rbip->i4_rem_bits_in_period, |
351 | 5.66k | ((i4_new_bits_per_frm - ps_rbip->i4_bits_per_frm) * i4_rem_frms_in_period)); |
352 | 5.66k | } |
353 | 5.66k | if(i4_new_num_intra_frm_interval != ps_rbip->i4_num_intra_frm_interval) |
354 | 0 | { |
355 | 0 | overflow_avoided_summation( |
356 | 0 | &ps_rbip->i4_rem_bits_in_period, |
357 | 0 | (i4_new_bits_per_frm * ps_rbip->i4_tot_frms_in_gop * |
358 | 0 | (i4_new_num_intra_frm_interval - ps_rbip->i4_num_intra_frm_interval))); |
359 | 0 | } |
360 | | /* Update the new value */ |
361 | 5.66k | ps_rbip->i4_num_intra_frm_interval = i4_new_num_intra_frm_interval; |
362 | 5.66k | ps_rbip->i4_bits_per_frm = i4_new_bits_per_frm; |
363 | 5.66k | } |
364 | | |
365 | | #if NON_STEADSTATE_CODE |
366 | | WORD32 bit_allocation_num_fill_use_free_memtab( |
367 | | bit_allocation_t **pps_bit_allocation, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type) |
368 | 62.4k | { |
369 | 62.4k | WORD32 i4_mem_tab_idx = 0; |
370 | 62.4k | static bit_allocation_t s_bit_allocation_temp; |
371 | | |
372 | | /* Hack for al alloc, during which we dont have any state memory. |
373 | | Dereferencing can cause issues */ |
374 | 62.4k | if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB) |
375 | 53.5k | (*pps_bit_allocation) = &s_bit_allocation_temp; |
376 | | |
377 | | /*for src rate control state structure*/ |
378 | 62.4k | if(e_func_type != GET_NUM_MEMTAB) |
379 | 26.7k | { |
380 | 26.7k | fill_memtab( |
381 | 26.7k | &ps_memtab[i4_mem_tab_idx], |
382 | 26.7k | sizeof(bit_allocation_t), |
383 | 26.7k | MEM_TAB_ALIGNMENT, |
384 | 26.7k | PERSISTENT, |
385 | 26.7k | DDR); |
386 | 26.7k | use_or_fill_base(&ps_memtab[0], (void **)pps_bit_allocation, e_func_type); |
387 | 26.7k | } |
388 | 62.4k | i4_mem_tab_idx++; |
389 | | |
390 | 62.4k | i4_mem_tab_idx += error_bits_num_fill_use_free_memtab( |
391 | 62.4k | &pps_bit_allocation[0]->ps_error_bits, &ps_memtab[i4_mem_tab_idx], e_func_type); |
392 | | |
393 | 62.4k | return (i4_mem_tab_idx); |
394 | 62.4k | } |
395 | | #endif /* #if NON_STEADSTATE_CODE */ |
396 | | |
397 | | /***************************************************************************** |
398 | | Function Name : get_bits_based_on_complexity |
399 | | Description : function calculates the bits to be allocated for the current |
400 | | picture type given the relative complexity between different |
401 | | picture types |
402 | | Inputs : i4_bits_in_period |
403 | | pi4_frms_in_period - num frames of each pictype in the period |
404 | | pvq_complexity_estimate - complexity for each pictype |
405 | | e_pic_type - current picture type |
406 | | i4_call_type |
407 | | Revision History: |
408 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
409 | | *****************************************************************************/ |
410 | | static WORD32 get_bits_based_on_complexity( |
411 | | bit_allocation_t *ps_bit_allocation, |
412 | | WORD32 i4_bits_in_period, |
413 | | WORD32 *pi4_frms_in_period, |
414 | | number_t *pvq_complexity_estimate, |
415 | | picture_type_e e_pic_type, |
416 | | WORD32 i4_call_type) |
417 | 411k | { |
418 | 411k | WORD32 i, i4_estimated_bits; |
419 | 411k | number_t vq_bits_in_period, vq_frms_in_period[MAX_PIC_TYPE], vq_comp_coeff, |
420 | 411k | vq_est_texture_bits_for_frm; |
421 | 411k | WORD32 i4_num_scd_in_LAP_window = ps_bit_allocation->i4_num_scd_in_lap_window; |
422 | 411k | WORD32 i4_active_pic_types = ps_bit_allocation->i4_num_active_pic_type, |
423 | 411k | i4_field_pic = ps_bit_allocation->i4_field_pic; |
424 | 411k | float af_sum_weigh[MAX_PIC_TYPE][3]; |
425 | | |
426 | 411k | memmove(af_sum_weigh, ps_bit_allocation->af_sum_weigh, ((sizeof(float)) * MAX_PIC_TYPE * 3)); |
427 | | |
428 | | /** Increment I frame count if there is scene cut in LAP window*/ |
429 | 411k | i4_num_scd_in_LAP_window = 0; |
430 | 411k | pi4_frms_in_period[I_PIC] += i4_num_scd_in_LAP_window; |
431 | | /* Converting inputs to var_q format */ |
432 | 411k | SET_VAR_Q(vq_bits_in_period, i4_bits_in_period, 0); |
433 | 4.11M | for(i = 0; i < MAX_PIC_TYPE; i++) |
434 | 3.70M | { |
435 | 3.70M | SET_VAR_Q(vq_frms_in_period[i], pi4_frms_in_period[i], 0); |
436 | 3.70M | } |
437 | | /****************************************************************** |
438 | | Estimated texture bits = |
439 | | (remaining bits) * (cur frm complexity) |
440 | | --------------------------------------- |
441 | | (num_i_frm*i_frm_complexity) + (num_p_frm*pfrm_complexity) + (b_frm * b_frm_cm) |
442 | | *******************************************************************/ |
443 | | /*Taking the numerator weight into account*/ |
444 | 411k | if(i4_call_type == 1) |
445 | 97.8k | { |
446 | 97.8k | trace_printf("1 CUrr / avg %f", af_sum_weigh[e_pic_type][0]); |
447 | 97.8k | } |
448 | 411k | if(af_sum_weigh[e_pic_type][0] > 4.0f) |
449 | 0 | af_sum_weigh[e_pic_type][0] = 4.0f; |
450 | 411k | if(af_sum_weigh[e_pic_type][0] < 0.3f) |
451 | 0 | af_sum_weigh[e_pic_type][0] = 0.3f; |
452 | 411k | if(i4_call_type == 1) |
453 | 97.8k | { |
454 | 97.8k | trace_printf("2 CUrr / avg %f", af_sum_weigh[e_pic_type][0]); |
455 | 97.8k | } |
456 | | |
457 | 411k | if((ps_bit_allocation->i4_ba_rc_pass != 2) || (i4_call_type == 0) || |
458 | 411k | (ps_bit_allocation->i4_fp_bit_alloc_in_sp == 0)) |
459 | 411k | { |
460 | 411k | convert_float_to_fix(af_sum_weigh[e_pic_type][0], &vq_comp_coeff); |
461 | 411k | mult32_var_q(vq_bits_in_period, vq_comp_coeff, &vq_bits_in_period); |
462 | 411k | mult32_var_q(vq_bits_in_period, pvq_complexity_estimate[e_pic_type], &vq_bits_in_period); |
463 | 411k | } |
464 | 0 | else |
465 | 0 | { |
466 | 0 | WORD32 i4_frame_num = (WORD32)ps_bit_allocation->i8_frm_num_in_gop, i4_offset; |
467 | 0 | gop_level_stat_t *ps_gop; |
468 | 0 | LWORD64 i8_firs_pass_tot_bits; |
469 | 0 | float f_bits_cur_pic, f_offset; |
470 | 0 | ps_gop = |
471 | 0 | (gop_level_stat_t *)ps_bit_allocation->pv_gop_stat + ps_bit_allocation->i8_cur_gop_num; |
472 | 0 | i8_firs_pass_tot_bits = ps_gop->ai8_tex_bits_consumed[i4_frame_num] + |
473 | 0 | ps_gop->ai8_head_bits_consumed[i4_frame_num]; |
474 | 0 | i4_offset = (ps_gop->ai4_q6_frame_offsets[i4_frame_num] * 1000) >> QSCALE_Q_FAC; |
475 | 0 | f_offset = ((float)i4_offset) / 1000; |
476 | 0 | f_bits_cur_pic = |
477 | 0 | (float)(i8_firs_pass_tot_bits * ps_gop->ai4_first_pass_qscale[i4_frame_num]) / |
478 | 0 | (ps_bit_allocation->i4_avg_qscale_gop_first_pass * f_offset); |
479 | 0 | convert_float_to_fix(f_bits_cur_pic, &vq_comp_coeff); |
480 | 0 | mult32_var_q(vq_bits_in_period, vq_comp_coeff, &vq_bits_in_period); |
481 | |
|
482 | 0 | for(i = 0; i < MAX_PIC_TYPE; i++) |
483 | 0 | { |
484 | 0 | number_t temp; |
485 | 0 | convert_float_to_fix((float)ps_bit_allocation->i8_avg_bits_pictype[i], &temp); |
486 | 0 | pvq_complexity_estimate[i] = temp; |
487 | 0 | } |
488 | 0 | } |
489 | | |
490 | 4.11M | for(i = 0; i < MAX_PIC_TYPE; i++) |
491 | 3.70M | { |
492 | | /*For 2nd pass we will be reducing the num of pictures as they are coded so we dont want to replace 0's*/ |
493 | 3.70M | if(af_sum_weigh[i][1] == 0.0 && |
494 | 3.70M | !((i4_call_type == 1) && (ps_bit_allocation->i4_ba_rc_pass == 2))) |
495 | 3.70M | af_sum_weigh[i][1] = (float)pi4_frms_in_period[i]; |
496 | | |
497 | 3.70M | convert_float_to_fix(af_sum_weigh[i][1], &vq_comp_coeff); |
498 | 3.70M | mult32_var_q(vq_comp_coeff, pvq_complexity_estimate[i], &vq_frms_in_period[i]); |
499 | 3.70M | } |
500 | | |
501 | | /* changed the index range from active_pic to max_pic*/ |
502 | 411k | if(i4_field_pic) |
503 | 0 | { |
504 | 0 | for(i = 1; i < i4_active_pic_types; i++) |
505 | 0 | { |
506 | 0 | add32_var_q(vq_frms_in_period[I_PIC], vq_frms_in_period[i], &vq_frms_in_period[I_PIC]); |
507 | 0 | add32_var_q( |
508 | 0 | vq_frms_in_period[I_PIC], |
509 | 0 | vq_frms_in_period[i + FIELD_OFFSET], |
510 | 0 | &vq_frms_in_period[I_PIC]); |
511 | 0 | } |
512 | 0 | } |
513 | 411k | else /*field case*/ |
514 | 411k | { |
515 | 1.10M | for(i = 1; i < i4_active_pic_types; i++) |
516 | 689k | { |
517 | 689k | add32_var_q(vq_frms_in_period[I_PIC], vq_frms_in_period[i], &vq_frms_in_period[I_PIC]); |
518 | 689k | } |
519 | 411k | } |
520 | | |
521 | 411k | div32_var_q(vq_bits_in_period, vq_frms_in_period[I_PIC], &vq_est_texture_bits_for_frm); |
522 | 411k | number_t_to_word32(vq_est_texture_bits_for_frm, &i4_estimated_bits); |
523 | | |
524 | | /* If the number of frames are zero then return zero */ |
525 | 411k | if(!pi4_frms_in_period[e_pic_type]) |
526 | 40.8k | i4_estimated_bits = 0; |
527 | 411k | return (i4_estimated_bits); |
528 | 411k | } |
529 | | /***************************************************************************** |
530 | | Function Name : assign_complexity_coeffs |
531 | | Description : |
532 | | Inputs : af_sum_weigh |
533 | | Revision History: |
534 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
535 | | *****************************************************************************/ |
536 | | void assign_complexity_coeffs( |
537 | | bit_allocation_t *ps_bit_allocation, float af_sum_weigh[MAX_PIC_TYPE][3]) |
538 | 1.17M | { |
539 | 1.17M | WORD32 i; |
540 | 11.7M | for(i = 0; i < MAX_PIC_TYPE; i++) |
541 | 10.5M | { |
542 | 10.5M | ps_bit_allocation->af_sum_weigh[i][0] = af_sum_weigh[i][0]; |
543 | 10.5M | ps_bit_allocation->af_sum_weigh[i][1] = af_sum_weigh[i][1]; |
544 | 10.5M | ps_bit_allocation->af_sum_weigh[i][2] = af_sum_weigh[i][2]; |
545 | 10.5M | } |
546 | 1.17M | } |
547 | | /***************************************************************************** |
548 | | Function Name : ba_get_rbip_and_num_frames |
549 | | Description : |
550 | | Inputs : pi4_num_frames |
551 | | Revision History: |
552 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
553 | | *****************************************************************************/ |
554 | | LWORD64 ba_get_rbip_and_num_frames( |
555 | | bit_allocation_t *ps_bit_allocation, |
556 | | pic_handling_handle ps_pic_handling, |
557 | | WORD32 *pi4_num_frames) |
558 | 0 | { |
559 | 0 | return ( |
560 | 0 | get_rbip_and_num_frames(&ps_bit_allocation->s_rbip, ps_pic_handling, 0, pi4_num_frames)); |
561 | 0 | } |
562 | | /***************************************************************************** |
563 | | Function Name : init_prev_header_bits |
564 | | Description : Intialise header bits for each pic type |
565 | | Inputs : ps_bit_allocation |
566 | | ps_pic_handling |
567 | | Revision History: |
568 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
569 | | *****************************************************************************/ |
570 | | void init_prev_header_bits(bit_allocation_t *ps_bit_allocation, pic_handling_handle ps_pic_handling) |
571 | 5.39k | { |
572 | 5.39k | WORD32 i4_rem_bits_in_period, /* ai4_rem_frms_in_period[MAX_PIC_TYPE], */ |
573 | 5.39k | ai4_frms_in_period[MAX_PIC_TYPE], i, j; |
574 | 5.39k | number_t avq_complexity_estimate[MAX_PIC_TYPE]; |
575 | 5.39k | WORD32 i4_field_pic; |
576 | 5.39k | i4_field_pic = pic_type_get_field_pic(ps_pic_handling); |
577 | | /* Assigning Percentages of I, P and B frame header bits based on actual bits allocated for I, P and B frames */ |
578 | | /* Getting the remaining bits in period */ |
579 | 5.39k | i4_rem_bits_in_period = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0); |
580 | | |
581 | | /* Hardcoding the bit ratios between I, P and B */ |
582 | 5.39k | SET_VAR_Q( |
583 | 5.39k | avq_complexity_estimate[I_PIC], |
584 | 5.39k | (I_TO_P_BIT_RATIO * P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), |
585 | 5.39k | 0); |
586 | 5.39k | SET_VAR_Q( |
587 | 5.39k | avq_complexity_estimate[P_PIC], |
588 | 5.39k | (P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), |
589 | 5.39k | 0); |
590 | 5.39k | SET_VAR_Q( |
591 | 5.39k | avq_complexity_estimate[P1_PIC], |
592 | 5.39k | (P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), |
593 | 5.39k | 0); |
594 | 5.39k | SET_VAR_Q(avq_complexity_estimate[B_PIC], (B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), 0); |
595 | 5.39k | SET_VAR_Q(avq_complexity_estimate[BB_PIC], (B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), 0); |
596 | 5.39k | SET_VAR_Q(avq_complexity_estimate[B1_PIC], (B1_TO_B2_BIT_RATIO), 0); |
597 | 5.39k | SET_VAR_Q( |
598 | 5.39k | avq_complexity_estimate[B11_PIC], |
599 | 5.39k | (B1_TO_B2_BIT_RATIO), |
600 | 5.39k | 0); //temporarliy treat ref and non ref as same |
601 | 5.39k | SET_VAR_Q(avq_complexity_estimate[B2_PIC], 1, 0); |
602 | 5.39k | SET_VAR_Q(avq_complexity_estimate[B22_PIC], 1, 0); |
603 | | |
604 | | /* Get the rem_frms_in_gop & the frms_in_gop from the pic_type state struct */ |
605 | | /* pic_type_get_rem_frms_in_gop(ps_pic_handling, ai4_rem_frms_in_period); */ |
606 | 5.39k | pic_type_get_frms_in_gop(ps_pic_handling, ai4_frms_in_period); |
607 | | |
608 | | /* Depending on the number of gops in a period, find the num_frms_in_prd */ |
609 | 53.9k | for(j = 0; j < MAX_PIC_TYPE; j++) |
610 | 48.5k | { |
611 | 48.5k | ai4_frms_in_period[j] = (ai4_frms_in_period[j] * ps_bit_allocation->i4_num_gops_in_period); |
612 | 48.5k | } |
613 | | |
614 | | /* Percentage of header bits in teh overall bits allocated to I, P and B frames |
615 | | when the data is not known. Since this value is based on bitrate using a equation |
616 | | to fit the values. Ran the header bit ratio for [1080@30] carnival, ihits and |
617 | | football at 9, 12 and 16 mbps and based on that deriving a equation using bpp. |
618 | | Values obtained are: |
619 | | (bitrate/bpp) I P B |
620 | | 9/2.87 0.358617291155 0.549124350786 0.798772545232 |
621 | | 12/3.83 0.288633642796 0.444797334749 0.693933711801 |
622 | | 16/5.11 0.284241839623 0.330152764298 0.557999732549 |
623 | | Equation for I: |
624 | | if bpp > 3.83 hdr = 0.29 |
625 | | else hdr = -0.073*bpp + 0.569 |
626 | | Equation for P: hdr = -0.098*bpp + 0.825 |
627 | | Equation for B: hdr = -0.108*bpp + 1.108 |
628 | | */ |
629 | 5.39k | { |
630 | 60.2k | #define FRAME_HEADER_BITS_Q_FACTOR (10) |
631 | 5.39k | WORD32 ai4_header_bits_percentage[MAX_PIC_TYPE]; |
632 | | |
633 | 5.39k | WORD32 i4_bpp; |
634 | 5.39k | X_PROD_Y_DIV_Z( |
635 | 5.39k | ps_bit_allocation->i4_bits_per_frm, |
636 | 5.39k | (1 << FRAME_HEADER_BITS_Q_FACTOR), |
637 | 5.39k | ps_bit_allocation->i4_pels_in_frame, |
638 | 5.39k | i4_bpp); |
639 | | //ps_bit_allocation->i4_bits_per_frm*(1<<FRAME_HEADER_BITS_Q_FACTOR)/ps_bit_allocation->i4_pels_in_frame; |
640 | | |
641 | 5.39k | if(i4_bpp > 131) |
642 | 4.47k | ai4_header_bits_percentage[I_PIC] = 297; |
643 | 926 | else |
644 | 926 | ai4_header_bits_percentage[I_PIC] = |
645 | 926 | ((-2238 * i4_bpp) >> FRAME_HEADER_BITS_Q_FACTOR) + 583; |
646 | 5.39k | ai4_header_bits_percentage[P_PIC] = ((-2990 * i4_bpp) >> FRAME_HEADER_BITS_Q_FACTOR) + 845; |
647 | | |
648 | 5.39k | ai4_header_bits_percentage[B_PIC] = ((-3308 * i4_bpp) >> FRAME_HEADER_BITS_Q_FACTOR) + 1135; |
649 | | |
650 | | /* Changes for 2B subGOP */ |
651 | 5.39k | ai4_header_bits_percentage[P_PIC] = (ai4_header_bits_percentage[P_PIC] * 13) >> 4; |
652 | 5.39k | ai4_header_bits_percentage[P1_PIC] = (ai4_header_bits_percentage[P_PIC] * 13) >> 4; |
653 | 5.39k | ai4_header_bits_percentage[B_PIC] = (ai4_header_bits_percentage[B_PIC] * 12) >> 4; |
654 | 5.39k | ai4_header_bits_percentage[BB_PIC] = (ai4_header_bits_percentage[B_PIC] * 12) >> 4; |
655 | | /*HEVC_hierarchy: temp change consider same percentage because of insufficient data*/ |
656 | 5.39k | ai4_header_bits_percentage[B1_PIC] = ai4_header_bits_percentage[B_PIC]; |
657 | 5.39k | ai4_header_bits_percentage[B11_PIC] = ai4_header_bits_percentage[B_PIC]; |
658 | 5.39k | ai4_header_bits_percentage[B2_PIC] = ai4_header_bits_percentage[B_PIC]; |
659 | 5.39k | ai4_header_bits_percentage[B22_PIC] = ai4_header_bits_percentage[B_PIC]; |
660 | | |
661 | 53.9k | for(i = 0; i < MAX_PIC_TYPE; i++) |
662 | 48.5k | { |
663 | 48.5k | ps_bit_allocation->af_sum_weigh[i][0] = 1.0; |
664 | 48.5k | ps_bit_allocation->af_sum_weigh[i][1] = 0.0; |
665 | 48.5k | ps_bit_allocation->af_sum_weigh[i][2] = 0.0; |
666 | 48.5k | } |
667 | | |
668 | 53.9k | for(i = 0; i < MAX_PIC_TYPE; i++) |
669 | 48.5k | { |
670 | | /* Getting the total bits allocated for each picture type */ |
671 | 48.5k | WORD32 i4_num_bits_allocated = get_bits_based_on_complexity( |
672 | 48.5k | ps_bit_allocation, |
673 | 48.5k | i4_rem_bits_in_period, |
674 | 48.5k | ai4_frms_in_period, |
675 | 48.5k | avq_complexity_estimate, |
676 | 48.5k | (picture_type_e)i, |
677 | 48.5k | 0); |
678 | | |
679 | 48.5k | if(ai4_header_bits_percentage[i] < 0) |
680 | 33.3k | ai4_header_bits_percentage[i] = 0; |
681 | | |
682 | 48.5k | ps_bit_allocation->i4_prev_frm_header_bits[i] = (WORD32)( |
683 | 48.5k | ((LWORD64)ai4_header_bits_percentage[i] * i4_num_bits_allocated) >> |
684 | 48.5k | FRAME_HEADER_BITS_Q_FACTOR); |
685 | 48.5k | } |
686 | 5.39k | } |
687 | 5.39k | } |
688 | | |
689 | | /***************************************************************************** |
690 | | Function Name : init_bit_allocation |
691 | | Description : Initalises the bit_allocation structure. |
692 | | Inputs : intra_frm_interval - num frames between two I frames |
693 | | num_intra_frm_interval - num such intervals |
694 | | i4_bit_rate - num bits per second |
695 | | i4_frm_rate - num frms in 1000 seconds |
696 | | i4_num_active_pic_type |
697 | | Revision History: |
698 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
699 | | *****************************************************************************/ |
700 | | #if NON_STEADSTATE_CODE |
701 | | void init_bit_allocation( |
702 | | bit_allocation_t *ps_bit_allocation, |
703 | | pic_handling_handle ps_pic_handling, |
704 | | WORD32 i4_num_intra_frm_interval, /* num such intervals */ |
705 | | WORD32 i4_bit_rate, /* num bits per second */ |
706 | | WORD32 i4_frm_rate, /* num frms in 1000 seconds */ |
707 | | WORD32 *i4_peak_bit_rate, |
708 | | WORD32 i4_min_bitrate, /* The minimum bit rate that is to be satisfied for a gop */ |
709 | | WORD32 i4_pels_in_frame, |
710 | | WORD32 i4_is_hbr, |
711 | | WORD32 i4_num_active_pic_type, |
712 | | WORD32 i4_lap_window, |
713 | | WORD32 i4_field_pic, |
714 | | WORD32 rc_pass, |
715 | | WORD32 i4_luma_pels, |
716 | | WORD32 i4_fp_bit_alloc_in_sp) |
717 | 5.03k | { |
718 | 5.03k | WORD32 i; |
719 | 5.03k | WORD32 i4_bits_per_frm, i4_max_bits_per_frm[MAX_NUM_DRAIN_RATES]; |
720 | | /* Store the pels in frame value */ |
721 | 5.03k | ps_bit_allocation->i4_pels_in_frame = i4_pels_in_frame; |
722 | 5.03k | ps_bit_allocation->i4_num_scd_in_lap_window = 0; |
723 | 5.03k | ps_bit_allocation->i4_num_frm_b4_scd = 0; |
724 | 5.03k | ps_bit_allocation->i4_num_active_pic_type = i4_num_active_pic_type; |
725 | 5.03k | ps_bit_allocation->i4_field_pic = i4_field_pic; |
726 | 5.03k | ps_bit_allocation->i4_ba_rc_pass = rc_pass; |
727 | 5.03k | ps_bit_allocation->i4_br_id = 0; /* 0 - peak, 1 - average*/ |
728 | 5.03k | ps_bit_allocation->i8_cur_gop_num = |
729 | 5.03k | 0; /*Will be incremented after first frame allocation is done(during init itslef)*/ |
730 | 5.03k | ps_bit_allocation->i8_frm_num_in_gop = 0; |
731 | 5.03k | ps_bit_allocation->pv_gop_stat = |
732 | 5.03k | NULL; /*In 2 pass the gop stat pointer is set API parameter call*/ |
733 | 5.03k | ps_bit_allocation->f_min_complexity_cross_peak_rate = |
734 | 5.03k | 1.0; /*In single pass buffer based additional bits movement is disabled, hence set to max complexity |
735 | | Reset to lower value in case of two pass*/ |
736 | | |
737 | 5.03k | ps_bit_allocation->f_cur_peak_factor_2pass = -1.0; |
738 | 5.03k | ps_bit_allocation->i8_total_bits_allocated = -1; |
739 | 5.03k | ps_bit_allocation->i4_luma_pels = i4_luma_pels; |
740 | 5.03k | ps_bit_allocation->i4_num_gop = -1; |
741 | 5.03k | ps_bit_allocation->f_sum_complexity_segment_cross_peak = 0.0f; |
742 | | //ps_bit_allocation->i8_vbv_based_excess_for_segment = 0; |
743 | 5.03k | ps_bit_allocation->i4_flag_no_more_set_rbip = 0; |
744 | 5.03k | ps_bit_allocation->f_curr_i_to_sum = 1.0f; |
745 | 5.03k | ps_bit_allocation->i4_fp_bit_alloc_in_sp = i4_fp_bit_alloc_in_sp; |
746 | | |
747 | | /* Calculate the bits per frame */ |
748 | 5.03k | X_PROD_Y_DIV_Z(i4_bit_rate, 1000, i4_frm_rate, i4_bits_per_frm); |
749 | 15.0k | for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) |
750 | 10.0k | { |
751 | 10.0k | X_PROD_Y_DIV_Z(i4_peak_bit_rate[i], 1000, i4_frm_rate, i4_max_bits_per_frm[i]); |
752 | 10.0k | } |
753 | | /* Initialize the bits_per_frame */ |
754 | 5.03k | ps_bit_allocation->i4_bits_per_frm = i4_bits_per_frm; |
755 | 15.0k | for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) |
756 | 10.0k | { |
757 | 10.0k | ps_bit_allocation->i4_max_bits_per_frm[i] = i4_max_bits_per_frm[i]; |
758 | 10.0k | } |
759 | 5.03k | X_PROD_Y_DIV_Z(i4_min_bitrate, 1000, i4_frm_rate, ps_bit_allocation->i4_min_bits_per_frm); |
760 | | |
761 | | /* Initialise the rem_bits in period |
762 | | The first gop in case of an OPEN GOP may have fewer B_PICs, |
763 | | That condition is not taken care of */ |
764 | 5.03k | init_rbip( |
765 | 5.03k | &ps_bit_allocation->s_rbip, ps_pic_handling, i4_bits_per_frm, i4_num_intra_frm_interval); |
766 | | |
767 | | /* Initialize the num_gops_in_period */ |
768 | 5.03k | ps_bit_allocation->i4_num_gops_in_period = i4_num_intra_frm_interval; |
769 | 5.03k | ps_bit_allocation->i4_actual_num_gops_in_period = i4_num_intra_frm_interval; |
770 | | |
771 | | /* Relative complexity between I and P frames */ |
772 | 5.03k | ps_bit_allocation->i2_K[I_PIC] = (1 << K_Q); |
773 | 5.03k | ps_bit_allocation->i2_K[P_PIC] = I_TO_P_RATIO; |
774 | 5.03k | ps_bit_allocation->i2_K[P1_PIC] = I_TO_P_RATIO; |
775 | 5.03k | ps_bit_allocation->i2_K[B_PIC] = (P_TO_B_RATIO * I_TO_P_RATIO) >> K_Q; |
776 | 5.03k | ps_bit_allocation->i2_K[BB_PIC] = (P_TO_B_RATIO * I_TO_P_RATIO) >> K_Q; |
777 | | |
778 | | /*HEVC_hierarchy: force qp offset with one high level of hierarchy*/ |
779 | 5.03k | ps_bit_allocation->i2_K[B1_PIC] = (B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q); |
780 | 5.03k | ps_bit_allocation->i2_K[B11_PIC] = (B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q); |
781 | 5.03k | ps_bit_allocation->i2_K[B2_PIC] = |
782 | 5.03k | (B1_TO_B2_RATIO * B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q + K_Q); |
783 | 5.03k | ps_bit_allocation->i2_K[B22_PIC] = |
784 | 5.03k | (B1_TO_B2_RATIO * B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q + K_Q); |
785 | | |
786 | | /* Initialize the saved bits to 0*/ |
787 | 5.03k | ps_bit_allocation->i4_saved_bits = 0; |
788 | | |
789 | | /* Update the error bits module with average bits */ |
790 | 5.03k | init_error_bits(ps_bit_allocation->ps_error_bits, i4_frm_rate, i4_bit_rate); |
791 | | /* Store the input for implementing change in values */ |
792 | 5.03k | ps_bit_allocation->i4_frame_rate = i4_frm_rate; |
793 | 5.03k | ps_bit_allocation->i4_bit_rate = i4_bit_rate; |
794 | 15.0k | for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) |
795 | 10.0k | ps_bit_allocation->ai4_peak_bit_rate[i] = i4_peak_bit_rate[i]; |
796 | | |
797 | 5.03k | ps_bit_allocation->i4_is_hbr = i4_is_hbr; |
798 | | /* Initilising the header bits to be used for each picture type */ |
799 | 5.03k | init_prev_header_bits(ps_bit_allocation, ps_pic_handling); |
800 | | |
801 | | /*HEVC_RC*/ |
802 | | /*remember prev frames tot bit consumption. This is required to calcualte error after first sub gop where estimate is not known*/ |
803 | 50.3k | for(i = 0; i < MAX_PIC_TYPE; i++) |
804 | 45.2k | { |
805 | 45.2k | ps_bit_allocation->ai4_prev_frm_tot_bits[i] = |
806 | 45.2k | -1; //-1 indicates that pic type has not been encoded |
807 | 45.2k | ps_bit_allocation->ai4_prev_frm_tot_est_bits[i] = -1; |
808 | 45.2k | } |
809 | | |
810 | | /* #define STATIC_I_TO_P_RATIO ((STATIC_I_TO_B_RATIO)/(STATIC_P_TO_B_RATIO)) */ |
811 | | /* Calcualte the max i frame bits */ |
812 | 5.03k | { |
813 | 5.03k | WORD32 ai4_frms_in_period[MAX_PIC_TYPE]; |
814 | 5.03k | WORD32 ai4_actual_frms_in_period[MAX_PIC_TYPE], i4_actual_frms_in_period = 0; |
815 | 5.03k | WORD32 i4_rem_texture_bits, j, i4_tot_header_bits_est = 0; |
816 | 5.03k | number_t avq_complexity_estimate[MAX_PIC_TYPE]; |
817 | 5.03k | WORD32 i4_total_frms; |
818 | | |
819 | | /* Get the rem_frms_in_gop & the frms_in_gop from the pic_type state struct */ |
820 | 5.03k | pic_type_get_frms_in_gop(ps_pic_handling, ai4_frms_in_period); |
821 | 5.03k | pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_actual_frms_in_period); |
822 | | /* Depending on the number of gops in a period, find the num_frms_in_prd */ |
823 | 5.03k | i4_total_frms = 0; |
824 | 50.3k | for(j = 0; j < MAX_PIC_TYPE; j++) |
825 | 45.2k | { |
826 | 45.2k | ai4_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period; |
827 | 45.2k | ai4_actual_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period; |
828 | 45.2k | i4_total_frms += ai4_frms_in_period[j]; |
829 | 45.2k | i4_actual_frms_in_period += ai4_actual_frms_in_period[j]; |
830 | 45.2k | } |
831 | 5.03k | ps_bit_allocation->i4_rem_frame_in_period = i4_actual_frms_in_period; /*i_only*/ |
832 | | |
833 | 50.3k | for(j = 0; j < MAX_PIC_TYPE; j++) |
834 | 45.2k | { |
835 | 45.2k | i4_tot_header_bits_est += |
836 | 45.2k | ai4_frms_in_period[j] * ps_bit_allocation->i4_prev_frm_header_bits[j]; |
837 | 45.2k | } |
838 | | /* Remove the header bits from the remaining bits to find how many bits you |
839 | | can transfer.*/ |
840 | 5.03k | i4_rem_texture_bits = |
841 | 5.03k | ps_bit_allocation->i4_bits_per_frm * i4_actual_frms_in_period - i4_tot_header_bits_est; |
842 | | |
843 | | /* Set the complexities for static content */ |
844 | 5.03k | SET_VAR_Q(avq_complexity_estimate[I_PIC], STATIC_I_TO_B2_RATIO, 0); |
845 | 5.03k | SET_VAR_Q(avq_complexity_estimate[P_PIC], STATIC_P_TO_B2_RATIO, 0); |
846 | 5.03k | SET_VAR_Q(avq_complexity_estimate[P1_PIC], STATIC_P_TO_B2_RATIO, 0); |
847 | 5.03k | SET_VAR_Q(avq_complexity_estimate[B_PIC], STATIC_B_TO_B2_RATIO, 0); |
848 | 5.03k | SET_VAR_Q(avq_complexity_estimate[BB_PIC], STATIC_B_TO_B2_RATIO, 0); |
849 | 5.03k | SET_VAR_Q(avq_complexity_estimate[B1_PIC], STATIC_B1_TO_B2_RATIO, 0); |
850 | 5.03k | SET_VAR_Q(avq_complexity_estimate[B11_PIC], STATIC_B1_TO_B2_RATIO, 0); |
851 | 5.03k | SET_VAR_Q(avq_complexity_estimate[B2_PIC], 1, 0); |
852 | 5.03k | SET_VAR_Q(avq_complexity_estimate[B22_PIC], 1, 0); |
853 | | /* Get the texture bits required for the current frame */ |
854 | 5.03k | ps_bit_allocation->i4_max_tex_bits_for_i = get_bits_based_on_complexity( |
855 | 5.03k | ps_bit_allocation, |
856 | 5.03k | i4_rem_texture_bits, |
857 | 5.03k | ai4_frms_in_period, |
858 | 5.03k | avq_complexity_estimate, |
859 | 5.03k | I_PIC, |
860 | 5.03k | 0); |
861 | 5.03k | } |
862 | | /* initialise the GOP and bit errors to zero */ |
863 | 5.03k | ps_bit_allocation->i4_gop_level_bit_error = 0; |
864 | 5.03k | ps_bit_allocation->i4_frame_level_bit_error = 0; |
865 | 45.2k | for(i = 0; i < MAX_NUM_FRAME_PARALLEL; i++) |
866 | 40.2k | { |
867 | 40.2k | ps_bit_allocation->ai4_cur_frm_est_tex_bits[i] = 0; |
868 | 40.2k | ps_bit_allocation->ai4_cur_frm_est_hdr_bits[i] = 0; |
869 | 40.2k | } |
870 | 5.03k | ps_bit_allocation->i4_buffer_based_bit_error = 0; |
871 | 5.03k | ps_bit_allocation->i4_bits_from_buffer_in_cur_gop = 0; |
872 | 5.03k | ps_bit_allocation->i4_excess_bits_from_buffer = 0; |
873 | 5.03k | ps_bit_allocation->i4_lap_window = i4_lap_window; |
874 | 5.03k | ps_bit_allocation->i8_cur_gop_bit_consumption = 0; |
875 | | //ps_bit_allocation->i8_2pass_gop_error_accum = 0; |
876 | 5.03k | ps_bit_allocation->f_qscale_max_clip_in_second_pass = (float)0x7FFFFFFF; |
877 | | |
878 | | /*Buffer play for single pass*/ |
879 | 5.03k | if(rc_pass != 2) |
880 | 5.03k | { |
881 | | /*Find ps_bit_allocation->f_min_complexity_cross_peak_rate*/ |
882 | | /*Find the complexity which maps to peak bit-rate*/ |
883 | 5.03k | { |
884 | 5.03k | ps_bit_allocation->f_min_complexity_cross_peak_rate = ba_get_min_complexity_for_peak_br( |
885 | 5.03k | i4_peak_bit_rate[0], i4_bit_rate, 10.0f, 1.0f, 0.0f, rc_pass); |
886 | 5.03k | } |
887 | 5.03k | } |
888 | | |
889 | 5.03k | ps_bit_allocation->i4_total_2pass_frames = 0; |
890 | 5.03k | ps_bit_allocation->i8_2pass_avg_bit_rate = -1; |
891 | 5.03k | } |
892 | | |
893 | | /***************************************************************************** |
894 | | Function Name : ba_init_stat_data |
895 | | Description : The parsing of stat file is done at the end of init (by that time |
896 | | bit allocation init would have already happened,The memory for gop |
897 | | stat data is alocated inside the parse stat file code. Hence the |
898 | | pointer has to be updated again. |
899 | | Inputs : ps_bit_allocation |
900 | | ps_pic_handling |
901 | | pv_gop_stat - pointer to update |
902 | | Revision History: |
903 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
904 | | *****************************************************************************/ |
905 | | void ba_init_stat_data( |
906 | | bit_allocation_t *ps_bit_allocation, |
907 | | pic_handling_handle ps_pic_handling, |
908 | | void *pv_gop_stat, |
909 | | WORD32 *pi4_pic_dist_in_cur_gop, |
910 | | WORD32 i4_total_bits_in_period, |
911 | | WORD32 i4_excess_bits) |
912 | | |
913 | 0 | { |
914 | 0 | WORD32 i4_tot_frames_in_gop = 0, i; |
915 | |
|
916 | 0 | ps_bit_allocation->pv_gop_stat = pv_gop_stat; |
917 | | |
918 | | /*Init RBIP*/ |
919 | | /*Get the complexity*/ |
920 | 0 | ASSERT(ps_bit_allocation->i8_cur_gop_num == 0); |
921 | 0 | ASSERT(ps_bit_allocation->i8_frm_num_in_gop == 0); |
922 | | |
923 | | /*INit frames of each type*/ |
924 | 0 | for(i = 0; i < MAX_PIC_TYPE; i++) |
925 | 0 | { |
926 | 0 | i4_tot_frames_in_gop += pi4_pic_dist_in_cur_gop[i]; |
927 | 0 | } |
928 | | |
929 | | /*ASSERT(i4_tot_frames_in_gop == i4_intra_period);*/ |
930 | | /*Also allocate data for first GOP*/ |
931 | | /*Added for getting actual gop structure*/ |
932 | 0 | pic_type_update_frms_in_gop(ps_pic_handling, pi4_pic_dist_in_cur_gop); |
933 | |
|
934 | 0 | multi_pass_set_rbip( |
935 | 0 | &ps_bit_allocation->s_rbip, ps_pic_handling, i4_total_bits_in_period, i4_tot_frames_in_gop); |
936 | |
|
937 | 0 | ps_bit_allocation->i8_2pass_alloc_per_frm_bits = |
938 | 0 | (i4_total_bits_in_period + (i4_tot_frames_in_gop >> 1)) / i4_tot_frames_in_gop; |
939 | 0 | ps_bit_allocation->i8_bit_consumption_so_far = 0; |
940 | |
|
941 | 0 | ASSERT(ps_bit_allocation->i4_ba_rc_pass == 2); |
942 | 0 | } |
943 | | #endif /* #if NON_STEADSTATE_CODE */ |
944 | | |
945 | | /***************************************************************************** |
946 | | Function Name : bit_alloc_get_intra_bits |
947 | | Description : |
948 | | Inputs : ps_bit_allocation |
949 | | ps_pic_handling |
950 | | pvq_complexity_estimate |
951 | | I_to_avg_rest |
952 | | Revision History: |
953 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
954 | | *****************************************************************************/ |
955 | | WORD32 bit_alloc_get_intra_bits( |
956 | | bit_allocation_t *ps_bit_allocation, |
957 | | pic_handling_handle ps_pic_handling, |
958 | | cbr_buffer_handle ps_cbr_buf_handling, |
959 | | picture_type_e e_pic_type, |
960 | | number_t *pvq_complexity_estimate, |
961 | | WORD32 i4_is_scd, |
962 | | float I_to_avg_rest, |
963 | | WORD32 i4_call_type, |
964 | | WORD32 i4_non_I_scd, |
965 | | float f_percent_head_bits) |
966 | 943k | { |
967 | 943k | WORD32 ai4_frms_in_period[MAX_PIC_TYPE], ai4_frm_in_gop[MAX_PIC_TYPE], tot_frms_in_period = 0; |
968 | 943k | WORD32 i4_field_pic, |
969 | 943k | i4_safe_margin = 0, |
970 | 943k | i4_lap_window; //margin in buffer to handle I frames that can come immediately after encoding huge static I frame |
971 | | /*obtain buffer size*/ |
972 | 943k | WORD32 i4_buffer_size = |
973 | 943k | ((get_cbr_buffer_size(ps_cbr_buf_handling)) >> 4) * UPPER_THRESHOLD_EBF_Q4; |
974 | 943k | WORD32 i4_cur_buf_pos = get_cbr_ebf(ps_cbr_buf_handling), i4_max_buffer_based, |
975 | 943k | i4_max_buffer_based_I_pic, i, i4_num_scaled_frms = 1; |
976 | 943k | WORD32 i4_bit_alloc_window = |
977 | 943k | (ps_bit_allocation->s_rbip.i4_tot_frms_in_gop * |
978 | 943k | ps_bit_allocation->s_rbip.i4_num_intra_frm_interval); |
979 | 943k | WORD32 i4_num_buf_frms, |
980 | 943k | ai4_frms_in_baw[MAX_PIC_TYPE]; //window for which I frame bit allocation is done |
981 | 943k | WORD32 i4_bits_in_period, i4_frames_in_buf = 0, i4_default_bits_in_period = 0; |
982 | 943k | WORD32 i4_est_bits_for_I, i4_peak_drain_rate, i4_subgop_size; |
983 | 943k | rc_type_e rc_type = get_rc_type(ps_cbr_buf_handling); |
984 | 943k | pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_frm_in_gop); |
985 | | |
986 | 9.43M | for(i = 0; i < MAX_PIC_TYPE; i++) |
987 | 8.49M | { |
988 | 8.49M | ai4_frms_in_baw[i] = |
989 | 8.49M | ai4_frm_in_gop[i] * ps_bit_allocation->s_rbip.i4_num_intra_frm_interval; |
990 | 8.49M | ai4_frms_in_period[i] = |
991 | 8.49M | ai4_frm_in_gop[i] * ps_bit_allocation->s_rbip.i4_num_intra_frm_interval; |
992 | 8.49M | tot_frms_in_period += ai4_frm_in_gop[i]; |
993 | 8.49M | } |
994 | | |
995 | 943k | if(i4_call_type == 1) |
996 | 352k | { |
997 | 352k | i4_default_bits_in_period = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0); |
998 | 352k | if((i4_default_bits_in_period + ps_bit_allocation->i4_frame_level_bit_error) < |
999 | 352k | (i4_default_bits_in_period * 0.30)) |
1000 | 0 | { |
1001 | 0 | ps_bit_allocation->i4_frame_level_bit_error = 0; //-(i4_default_bits_in_period * 0.70); |
1002 | 0 | } |
1003 | 352k | i4_bits_in_period = i4_default_bits_in_period + ps_bit_allocation->i4_frame_level_bit_error; |
1004 | 352k | if(i4_non_I_scd == 0) |
1005 | 171k | { |
1006 | | /*For the first gop unnecessarily the QP is going high in order to prevent this bits corresponding to full gop instead of gop-subgop*/ |
1007 | | |
1008 | 171k | WORD32 i4_intra_int = pic_type_get_intra_frame_interval(ps_pic_handling); |
1009 | 171k | WORD32 i4_inter_int = pic_type_get_inter_frame_interval(ps_pic_handling); |
1010 | 171k | if((tot_frms_in_period == |
1011 | 171k | (i4_intra_int - i4_inter_int + (1 << ps_bit_allocation->i4_field_pic))) && |
1012 | 171k | (i4_intra_int != 1)) |
1013 | 92.4k | { |
1014 | 92.4k | i4_bits_in_period = |
1015 | 92.4k | (WORD32)(i4_bits_in_period * ((float)i4_intra_int / tot_frms_in_period)); |
1016 | 92.4k | } |
1017 | 171k | } |
1018 | 352k | trace_printf("\nBits in period %d", i4_bits_in_period); |
1019 | 352k | } |
1020 | 591k | else |
1021 | 591k | { |
1022 | 591k | i4_bits_in_period = ret_rbip_default_preenc(&ps_bit_allocation->s_rbip, ps_pic_handling); |
1023 | | |
1024 | 591k | if(ps_bit_allocation->i4_ba_rc_pass == 2) |
1025 | 0 | i4_default_bits_in_period = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0); |
1026 | 591k | } |
1027 | | |
1028 | 943k | i4_peak_drain_rate = get_buf_max_drain_rate(ps_cbr_buf_handling); |
1029 | 943k | i4_num_buf_frms = |
1030 | 943k | (get_cbr_buffer_size(ps_cbr_buf_handling) + (ps_bit_allocation->i4_bits_per_frm >> 1)) / |
1031 | 943k | ps_bit_allocation->i4_bits_per_frm; |
1032 | | /*In VBR encoder buffer will be drained faster, i4_num_buf_frms should correspond to maximum number of bits that can be drained |
1033 | | In CBR both peak and average must be same*/ |
1034 | 943k | i4_num_buf_frms = i4_num_buf_frms * i4_peak_drain_rate / ps_bit_allocation->i4_bits_per_frm; |
1035 | | |
1036 | 943k | i4_field_pic = pic_type_get_field_pic(ps_pic_handling); |
1037 | | |
1038 | 943k | i4_subgop_size = pic_type_get_inter_frame_interval(ps_pic_handling); |
1039 | 943k | if(pvq_complexity_estimate == NULL) |
1040 | 810k | i4_cur_buf_pos = 0; |
1041 | | |
1042 | 943k | i4_lap_window = ps_bit_allocation->i4_lap_window; |
1043 | | |
1044 | | /*assume minimum lap visibilty.A static I frame is given only the bits of duration for which we have visibility*/ |
1045 | 943k | if(ps_bit_allocation->i4_lap_window < MINIMUM_VISIBILITY_B4_STATIC_I) |
1046 | 943k | { |
1047 | 943k | i4_lap_window = MINIMUM_VISIBILITY_B4_STATIC_I; |
1048 | 943k | } |
1049 | 0 | else |
1050 | 0 | { |
1051 | 0 | i4_lap_window = ps_bit_allocation->i4_lap_window; |
1052 | | /*clip buffer window to max of lap window or buffer window*/ |
1053 | 0 | if((i4_lap_window < i4_num_buf_frms) && (i4_call_type == 1)) |
1054 | 0 | i4_num_buf_frms = i4_lap_window + i4_subgop_size; |
1055 | 0 | } |
1056 | | |
1057 | 943k | if(i4_lap_window < MINIMUM_FRM_I_TO_REST_LAP_ENABLED) |
1058 | 0 | i4_lap_window = MINIMUM_FRM_I_TO_REST_LAP_ENABLED; |
1059 | 943k | if(ps_bit_allocation->i4_ba_rc_pass != 2) |
1060 | 943k | { |
1061 | 943k | if(i4_lap_window < i4_num_buf_frms) |
1062 | 943k | i4_num_buf_frms = i4_lap_window; |
1063 | 943k | } |
1064 | | |
1065 | 943k | if(i4_num_buf_frms > tot_frms_in_period) |
1066 | 820k | { |
1067 | 820k | i4_num_buf_frms = tot_frms_in_period; |
1068 | 820k | i4_bit_alloc_window = i4_num_buf_frms; |
1069 | 820k | } |
1070 | | /*get picture type dist based on bit alloc window*/ |
1071 | 943k | if(i4_num_buf_frms < tot_frms_in_period) |
1072 | 123k | { |
1073 | 247k | for(i = 1; i < ps_bit_allocation->i4_num_active_pic_type; i++) |
1074 | 123k | { |
1075 | 123k | ai4_frms_in_baw[i] = |
1076 | 123k | (ai4_frms_in_period[i] * i4_num_buf_frms + (tot_frms_in_period >> 1)) / |
1077 | 123k | tot_frms_in_period; |
1078 | 123k | i4_num_scaled_frms += ai4_frms_in_baw[i]; |
1079 | 123k | if(ps_bit_allocation->i4_field_pic) |
1080 | 0 | { |
1081 | 0 | ai4_frms_in_baw[i + FIELD_OFFSET] = ai4_frms_in_baw[i]; |
1082 | 0 | i4_num_scaled_frms += ai4_frms_in_baw[i]; |
1083 | 0 | } |
1084 | 123k | } |
1085 | 123k | if(ps_bit_allocation->i4_field_pic) |
1086 | 0 | { |
1087 | 0 | ai4_frms_in_baw[5]++; |
1088 | 0 | i4_num_scaled_frms++; |
1089 | 0 | } |
1090 | | //if prorating is not exact account for diff with highest layer pic types |
1091 | 123k | if(!ps_bit_allocation->i4_field_pic) |
1092 | 123k | { |
1093 | 123k | ai4_frms_in_baw[ps_bit_allocation->i4_num_active_pic_type - 1] += |
1094 | 123k | (i4_num_buf_frms - i4_num_scaled_frms); |
1095 | 123k | } |
1096 | 0 | else |
1097 | 0 | { |
1098 | 0 | ai4_frms_in_baw[ps_bit_allocation->i4_num_active_pic_type - 1] += |
1099 | 0 | ((i4_num_buf_frms - i4_num_scaled_frms) >> 1); |
1100 | 0 | ai4_frms_in_baw[ps_bit_allocation->i4_num_active_pic_type - 1 + FIELD_OFFSET] += |
1101 | 0 | ((i4_num_buf_frms - i4_num_scaled_frms) >> 1); |
1102 | 0 | } |
1103 | 123k | i4_bits_in_period = |
1104 | 123k | ((LWORD64)i4_bits_in_period * i4_num_buf_frms + (tot_frms_in_period >> 1)) / |
1105 | 123k | tot_frms_in_period; |
1106 | 123k | i4_bit_alloc_window = i4_num_buf_frms; |
1107 | 123k | } |
1108 | | |
1109 | 943k | i4_safe_margin = (WORD32)(i4_buffer_size * 0.1); |
1110 | 943k | i4_max_buffer_based = ((LWORD64)i4_buffer_size - i4_cur_buf_pos) / |
1111 | 943k | ps_bit_allocation->i4_bits_per_frm * i4_peak_drain_rate; |
1112 | 943k | i4_max_buffer_based_I_pic = i4_buffer_size - i4_cur_buf_pos; |
1113 | | |
1114 | 9.43M | for(i = 0; i < MAX_PIC_TYPE; i++) |
1115 | 8.49M | { |
1116 | 8.49M | i4_frames_in_buf += ai4_frms_in_baw[i]; |
1117 | 8.49M | } |
1118 | | |
1119 | 943k | if((rc_type == VBR_STREAMING) && (i4_call_type == 1)) |
1120 | 183k | { |
1121 | 183k | WORD32 i4_delay_frames = cbr_get_delay_frames(ps_cbr_buf_handling); |
1122 | 183k | i4_max_buffer_based = |
1123 | 183k | (i4_peak_drain_rate * |
1124 | 183k | (ps_bit_allocation->s_rbip.i4_tot_frms_in_gop + (WORD32)(i4_delay_frames * 0.8f)) - |
1125 | 183k | i4_cur_buf_pos); |
1126 | | |
1127 | | /*RBIP is updated once it is restricted for an Intra period */ |
1128 | 183k | if(i4_default_bits_in_period > i4_max_buffer_based) |
1129 | 0 | update_rbip( |
1130 | 0 | &ps_bit_allocation->s_rbip, |
1131 | 0 | ps_pic_handling, |
1132 | 0 | i4_max_buffer_based - i4_default_bits_in_period); |
1133 | | |
1134 | 183k | i4_max_buffer_based = |
1135 | 183k | (i4_peak_drain_rate * (i4_frames_in_buf + (WORD32)(i4_delay_frames * 0.8f)) - |
1136 | 183k | i4_cur_buf_pos); |
1137 | 183k | } |
1138 | 760k | else |
1139 | 760k | { |
1140 | 760k | i4_max_buffer_based = |
1141 | 760k | ((((LWORD64)i4_buffer_size - i4_cur_buf_pos) / ps_bit_allocation->i4_bits_per_frm) + |
1142 | 760k | i4_frames_in_buf) * |
1143 | 760k | i4_peak_drain_rate; |
1144 | 760k | } |
1145 | | |
1146 | | /*the estimated bits for total period is clipped to buffer limits*/ |
1147 | 943k | if(i4_bits_in_period > i4_max_buffer_based) |
1148 | 0 | i4_bits_in_period = i4_max_buffer_based; |
1149 | | |
1150 | | /*get I pic bits with altered bits in period*/ |
1151 | 943k | if((!i4_is_scd) && |
1152 | 943k | (ps_bit_allocation->i4_num_frames_since_last_I_frame < |
1153 | 133k | (ps_bit_allocation->i4_frame_rate * 2) / 1000) && |
1154 | 943k | (ps_bit_allocation->i4_ba_rc_pass != 2)) |
1155 | 126k | { |
1156 | | /*returns texture bits*/ |
1157 | 126k | LWORD64 i8_header_bits_in_previous_period = 0, i8_total_bits_in_previous_period = 0, |
1158 | 126k | i4_frames_in_header = 0; |
1159 | 126k | WORD32 i4_texture_bits = 0; |
1160 | 126k | float f_percent_header_bits = 0.0f; |
1161 | | /* Remove the header bits from the remaining bits to find how many bits you |
1162 | | can transfer.*/ |
1163 | 1.26M | for(i = 0; i < MAX_PIC_TYPE; i++) |
1164 | 1.13M | { |
1165 | 1.13M | i8_header_bits_in_previous_period += |
1166 | 1.13M | (ps_bit_allocation->i4_prev_frm_header_bits[i] * ai4_frms_in_baw[i]); |
1167 | 1.13M | i8_total_bits_in_previous_period += |
1168 | 1.13M | (ps_bit_allocation->ai4_prev_frm_tot_bits[i] * ai4_frms_in_baw[i]); |
1169 | 1.13M | i4_frames_in_header += ai4_frms_in_baw[i]; |
1170 | 1.13M | } |
1171 | | |
1172 | 126k | if((i4_call_type == 1) && (ps_bit_allocation->i4_ba_rc_pass == 2)) |
1173 | 0 | { |
1174 | 0 | i4_texture_bits = (WORD32)(i4_bits_in_period * (1 - f_percent_head_bits)); |
1175 | 0 | } |
1176 | 126k | else |
1177 | 126k | { |
1178 | 126k | f_percent_header_bits = |
1179 | 126k | (float)i8_header_bits_in_previous_period / i8_total_bits_in_previous_period; |
1180 | 126k | i4_texture_bits = |
1181 | 126k | i4_bits_in_period - (WORD32)(f_percent_header_bits * i4_bits_in_period); |
1182 | 126k | } |
1183 | | |
1184 | 126k | if(i4_call_type == 1) |
1185 | 21.9k | { |
1186 | 21.9k | trace_printf( |
1187 | 21.9k | "\nHeader Bits in period %d, total_frames %d " |
1188 | 21.9k | "i4_max_buffer_based %d ", |
1189 | 21.9k | (WORD32)f_percent_header_bits * i4_bits_in_period, |
1190 | 21.9k | i4_frames_in_header, |
1191 | 21.9k | i4_max_buffer_based); |
1192 | 21.9k | } |
1193 | 126k | i4_est_bits_for_I = get_bits_based_on_complexity( |
1194 | 126k | ps_bit_allocation, |
1195 | 126k | i4_texture_bits, |
1196 | 126k | ai4_frms_in_baw, |
1197 | 126k | pvq_complexity_estimate, |
1198 | 126k | e_pic_type, |
1199 | 126k | i4_call_type); |
1200 | | /*twice the bitrate */ |
1201 | 126k | if(i4_est_bits_for_I > ((ps_bit_allocation->i4_bit_rate << 1) - |
1202 | 126k | ps_bit_allocation->i4_prev_frm_header_bits[I_PIC])) |
1203 | 0 | i4_est_bits_for_I = |
1204 | 0 | ((ps_bit_allocation->i4_bit_rate << 1) - |
1205 | 0 | ps_bit_allocation->i4_prev_frm_header_bits[I_PIC]); |
1206 | | |
1207 | 126k | if(i4_est_bits_for_I > |
1208 | 126k | (i4_max_buffer_based_I_pic - ps_bit_allocation->i4_prev_frm_header_bits[I_PIC])) |
1209 | 1 | { |
1210 | 1 | i4_est_bits_for_I = |
1211 | 1 | (i4_max_buffer_based_I_pic - ps_bit_allocation->i4_prev_frm_header_bits[I_PIC]); |
1212 | 1 | } |
1213 | 126k | } |
1214 | 817k | else |
1215 | 817k | { |
1216 | | /*returns total bits incase of scene cut*/ |
1217 | 817k | ASSERT(ai4_frms_in_baw[I_PIC] != 0); |
1218 | 817k | if((i4_non_I_scd == 1) && (i4_call_type == 1) && |
1219 | 817k | (ps_bit_allocation->f_curr_i_to_sum != 1.0f)) |
1220 | 0 | ai4_frms_in_baw[I_PIC]++; |
1221 | | |
1222 | 817k | i4_est_bits_for_I = (WORD32)( |
1223 | 817k | (i4_bits_in_period * I_to_avg_rest * ai4_frms_in_baw[I_PIC]) / |
1224 | 817k | (ai4_frms_in_baw[I_PIC] * I_to_avg_rest + |
1225 | 817k | (i4_bit_alloc_window - ai4_frms_in_baw[I_PIC]))); |
1226 | | |
1227 | 817k | if(i4_call_type == 1) |
1228 | 330k | i4_est_bits_for_I = |
1229 | 330k | (WORD32)((float)i4_est_bits_for_I * ps_bit_allocation->f_curr_i_to_sum); |
1230 | 486k | else |
1231 | 486k | { |
1232 | 486k | if(ai4_frms_in_baw[I_PIC] > 0) |
1233 | 486k | i4_est_bits_for_I = (WORD32)((float)i4_est_bits_for_I / ai4_frms_in_baw[I_PIC]); |
1234 | 486k | } |
1235 | | |
1236 | 817k | if(i4_call_type == 1) |
1237 | 330k | { |
1238 | 330k | trace_printf( |
1239 | 330k | "bits in period %d I_to_avg_rest %f f_curr_i_to_sum %f i " |
1240 | 330k | "frames %d i4_non_I_scd %d ", |
1241 | 330k | i4_bits_in_period, |
1242 | 330k | I_to_avg_rest, |
1243 | 330k | ps_bit_allocation->f_curr_i_to_sum, |
1244 | 330k | ai4_frms_in_baw[I_PIC], |
1245 | 330k | i4_non_I_scd); |
1246 | 330k | } |
1247 | | |
1248 | 817k | if(i4_est_bits_for_I > (ps_bit_allocation->i4_bit_rate << 1)) |
1249 | 14.2k | i4_est_bits_for_I = (ps_bit_allocation->i4_bit_rate << 1); |
1250 | 817k | if(i4_est_bits_for_I > i4_max_buffer_based_I_pic) |
1251 | 15.4k | i4_est_bits_for_I = i4_max_buffer_based_I_pic; |
1252 | 817k | } |
1253 | | |
1254 | 943k | return i4_est_bits_for_I; |
1255 | 943k | } |
1256 | | |
1257 | | /***************************************************************************** |
1258 | | Function Name : get_cur_frm_est_texture_bits |
1259 | | Description : Based on remaining bits in period and rd_model |
1260 | | the number of bits required for the current frame is estimated. |
1261 | | Inputs : ps_bit_allocation - bit_allocation structure |
1262 | | ps_rd_model - rd model pointer (for all the frame types) |
1263 | | e_pic_type - picture type |
1264 | | Globals : |
1265 | | Processing : |
1266 | | Outputs : |
1267 | | Returns : |
1268 | | Issues : |
1269 | | Revision History: |
1270 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1271 | | *****************************************************************************/ |
1272 | | WORD32 get_cur_frm_est_texture_bits( |
1273 | | bit_allocation_t *ps_bit_allocation, |
1274 | | rc_rd_model_handle *pps_rd_model, |
1275 | | est_sad_handle ps_est_sad, |
1276 | | pic_handling_handle ps_pic_handling, |
1277 | | cbr_buffer_handle ps_cbr_buffer, |
1278 | | picture_type_e e_pic_type, |
1279 | | WORD32 i4_use_model, |
1280 | | WORD32 i4_is_scd_frame, |
1281 | | WORD32 i4_call_type, |
1282 | | float i_to_avg_ratio, |
1283 | | WORD32 i4_is_model_valid) |
1284 | 364k | { |
1285 | 364k | WORD32 i, j; |
1286 | 364k | WORD32 i4_est_texture_bits_for_frm; |
1287 | 364k | WORD32 i4_rem_texture_bits; |
1288 | 364k | number_t avq_complexity_estimate[MAX_PIC_TYPE]; |
1289 | 364k | WORD32 ai4_frms_in_period[MAX_PIC_TYPE]; |
1290 | 364k | WORD32 i4_max_consumable_bits, i4_est_tot_head_bits_period = 0, i4_total_bits_prev_gop = 0; |
1291 | 364k | WORD32 i4_field_pic, i4_inter_frame_int; |
1292 | 364k | WORD32 complexity_est = 0; |
1293 | 364k | float f_percent_head_bits = 0.0f; |
1294 | 364k | WORD32 i4_intra_frm_int; |
1295 | 364k | i4_intra_frm_int = pic_type_get_actual_intra_frame_interval(ps_pic_handling); |
1296 | 364k | i4_inter_frame_int = pic_type_get_inter_frame_interval(ps_pic_handling); |
1297 | 364k | i4_field_pic = pic_type_get_field_pic(ps_pic_handling); |
1298 | | |
1299 | | /* If the complexity estimate is not filled based on |
1300 | | 1) Since not using model |
1301 | | 2) Using the module but one of the estimate values are zero |
1302 | | Then set the complexity estimate based on default values */ |
1303 | | // if(!complexity_est) |
1304 | 364k | { |
1305 | | /* Hardcoding the bit ratios between I, P and B same as during init time*/ |
1306 | 364k | SET_VAR_Q( |
1307 | 364k | avq_complexity_estimate[I_PIC], |
1308 | 364k | (I_TO_P_BIT_RATIO * P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), |
1309 | 364k | 0); |
1310 | 364k | SET_VAR_Q( |
1311 | 364k | avq_complexity_estimate[P_PIC], |
1312 | 364k | (P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), |
1313 | 364k | 0); |
1314 | 364k | SET_VAR_Q( |
1315 | 364k | avq_complexity_estimate[P1_PIC], |
1316 | 364k | (P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), |
1317 | 364k | 0); |
1318 | 364k | SET_VAR_Q(avq_complexity_estimate[B_PIC], (B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), 0); |
1319 | 364k | SET_VAR_Q(avq_complexity_estimate[BB_PIC], (B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), 0); |
1320 | 364k | SET_VAR_Q( |
1321 | 364k | avq_complexity_estimate[B1_PIC], |
1322 | 364k | (B1_TO_B2_BIT_RATIO), |
1323 | 364k | 0); //temporarliy treat ref and non ref as same |
1324 | 364k | SET_VAR_Q(avq_complexity_estimate[B11_PIC], (B1_TO_B2_BIT_RATIO), 0); |
1325 | 364k | SET_VAR_Q(avq_complexity_estimate[B2_PIC], 1, 0); |
1326 | 364k | SET_VAR_Q(avq_complexity_estimate[B22_PIC], 1, 0); |
1327 | 364k | } |
1328 | | /* Get the rem_frms_in_gop & the frms_in_gop from the pic_type state struct */ |
1329 | | /* pic_type_get_rem_frms_in_gop(ps_pic_handling, ai4_rem_frms_in_period); */ |
1330 | 364k | pic_type_get_frms_in_gop(ps_pic_handling, ai4_frms_in_period); |
1331 | | |
1332 | | /* Depending on the number of gops in a period, find the num_frms_in_prd */ |
1333 | 3.64M | for(j = 0; j < MAX_PIC_TYPE; j++) |
1334 | 3.28M | { |
1335 | | /* ai4_rem_frms_in_period[j] += (ai4_frms_in_period[j] * (ps_bit_allocation->i4_num_gops_in_period - 1)); */ |
1336 | 3.28M | ai4_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period; |
1337 | 3.28M | } |
1338 | | |
1339 | | /* If a frame is detected as SCD and bit allocation is asked for the remaining part of the frame |
1340 | | we allocate bits assuming that frame as a I frame. So reduce 1 frame from the picture type coming in |
1341 | | and add that to I frame */ |
1342 | 364k | if(i4_is_scd_frame && e_pic_type != I_PIC) |
1343 | 0 | { |
1344 | | /* ai4_rem_frms_in_period[0]++;ai4_rem_frms_in_period[e_pic_type]--; */ |
1345 | 0 | ai4_frms_in_period[0]++; |
1346 | 0 | ai4_frms_in_period[e_pic_type]--; |
1347 | 0 | } |
1348 | | /*HEVC_hierarchy: calculate header bits for all frames in period*/ |
1349 | 3.64M | for(j = 0; j < MAX_PIC_TYPE; j++) |
1350 | 3.28M | { |
1351 | 3.28M | i4_est_tot_head_bits_period += |
1352 | 3.28M | ai4_frms_in_period[j] * ps_bit_allocation->i4_prev_frm_header_bits[j]; |
1353 | 3.28M | i4_total_bits_prev_gop += |
1354 | 3.28M | ai4_frms_in_period[j] * ps_bit_allocation->ai4_prev_frm_tot_bits[j]; |
1355 | 3.28M | } |
1356 | | |
1357 | 364k | { |
1358 | 364k | WORD32 ai4_actual_frms_in_gop[MAX_PIC_TYPE], i, i4_total_frames = 0; |
1359 | 364k | pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_actual_frms_in_gop); |
1360 | 3.64M | for(i = 0; i < MAX_PIC_TYPE; i++) |
1361 | 3.28M | { |
1362 | 3.28M | i4_total_frames += ai4_actual_frms_in_gop[i]; |
1363 | 3.28M | } |
1364 | 364k | i4_max_consumable_bits = ps_bit_allocation->i4_max_bits_per_frm[0] * i4_total_frames; |
1365 | | |
1366 | | /* Remove the header bits from the remaining bits to find how many bits you |
1367 | | can transfer.*/ |
1368 | 364k | if(i4_call_type == 1) |
1369 | 97.8k | { |
1370 | 97.8k | if(ps_bit_allocation->i4_ba_rc_pass == 2) |
1371 | 0 | { |
1372 | 0 | WORD32 i4_tot_frm_remain = 0, i4_tot_head_bits_in_gop = 0, |
1373 | 0 | i4_tot_bits_last_in_gop = 0, i4_use_default_flag = 0; |
1374 | |
|
1375 | 0 | WORD32 i4_rbip = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0); |
1376 | 0 | if((i4_rbip + ps_bit_allocation->i4_frame_level_bit_error) < (i4_rbip * 0.30)) |
1377 | 0 | { |
1378 | 0 | ps_bit_allocation->i4_frame_level_bit_error = 0; //-(i4_rbip * 0.70); |
1379 | 0 | } |
1380 | 0 | i4_rem_texture_bits = |
1381 | 0 | i4_rbip + |
1382 | 0 | ps_bit_allocation->i4_frame_level_bit_error /*- i4_est_tot_head_bits_period*/ |
1383 | 0 | ; |
1384 | |
|
1385 | 0 | i4_est_tot_head_bits_period = 0; |
1386 | 0 | for(j = 0; j < MAX_PIC_TYPE; j++) |
1387 | 0 | { |
1388 | 0 | if((WORD32)ps_bit_allocation->af_sum_weigh[j][1] > 0) |
1389 | 0 | { |
1390 | 0 | i4_tot_frm_remain += (WORD32)ps_bit_allocation->af_sum_weigh[j][1]; |
1391 | 0 | i4_tot_head_bits_in_gop += (WORD32)( |
1392 | 0 | ps_bit_allocation->i4_prev_frm_header_bits[j] * |
1393 | 0 | ps_bit_allocation->af_sum_weigh[j][1]); |
1394 | 0 | i4_tot_bits_last_in_gop += (WORD32)( |
1395 | 0 | ps_bit_allocation->ai4_prev_frm_tot_bits[j] * |
1396 | 0 | ps_bit_allocation->af_sum_weigh[j][1]); |
1397 | 0 | if(ps_bit_allocation->ai4_prev_frm_tot_bits[j] == -1) |
1398 | 0 | { |
1399 | 0 | i4_use_default_flag = 1; |
1400 | 0 | } |
1401 | 0 | } |
1402 | 0 | } |
1403 | |
|
1404 | 0 | if(i4_use_default_flag != 1) |
1405 | 0 | { |
1406 | 0 | f_percent_head_bits = (float)i4_tot_head_bits_in_gop / i4_tot_bits_last_in_gop; |
1407 | |
|
1408 | 0 | if(f_percent_head_bits > 0.7f) |
1409 | 0 | f_percent_head_bits = 0.7f; |
1410 | | |
1411 | | /*Subtracting a percentage of header bits from the remaining bits in period*/ |
1412 | 0 | i4_rem_texture_bits = (WORD32)(i4_rem_texture_bits * (1 - f_percent_head_bits)); |
1413 | 0 | } |
1414 | 0 | else |
1415 | 0 | { |
1416 | | /*Assuming 30% of bits will go for header bits in a gop in preenc*/ |
1417 | 0 | i4_rem_texture_bits -= (WORD32)((float)i4_rem_texture_bits * 0.3f); |
1418 | 0 | } |
1419 | |
|
1420 | 0 | trace_printf( |
1421 | 0 | "Remaining texture bits %d fbe %d fphb %f thbg %d tblg %d", |
1422 | 0 | i4_rem_texture_bits, |
1423 | 0 | ps_bit_allocation->i4_frame_level_bit_error, |
1424 | 0 | f_percent_head_bits, |
1425 | 0 | i4_tot_head_bits_in_gop, |
1426 | 0 | i4_tot_bits_last_in_gop); |
1427 | 0 | } |
1428 | 97.8k | else |
1429 | 97.8k | { |
1430 | | /* Remove the header bits from the remaining bits to find how many bits you |
1431 | | can transfer.*/ |
1432 | 97.8k | WORD32 i4_rbip = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0); |
1433 | 97.8k | if((i4_rbip + ps_bit_allocation->i4_frame_level_bit_error) < (i4_rbip * 0.30)) |
1434 | 2 | { |
1435 | 2 | ps_bit_allocation->i4_frame_level_bit_error = 0; //-(i4_rbip * 0.70); |
1436 | 2 | } |
1437 | 97.8k | i4_rem_texture_bits = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0) + |
1438 | 97.8k | ps_bit_allocation->i4_frame_level_bit_error; |
1439 | | |
1440 | 97.8k | i4_est_tot_head_bits_period = (WORD32)( |
1441 | 97.8k | ((float)(i4_est_tot_head_bits_period) / (float)i4_total_bits_prev_gop) * |
1442 | 97.8k | i4_rem_texture_bits); |
1443 | | |
1444 | 97.8k | if(i4_is_model_valid) |
1445 | 97.8k | { |
1446 | 97.8k | i4_rem_texture_bits = i4_rem_texture_bits - i4_est_tot_head_bits_period; |
1447 | 97.8k | } |
1448 | 0 | else |
1449 | 0 | { |
1450 | | /*inorder to estimate the buffer position for model invalid cases, to control |
1451 | | encoder buffer overflow*/ |
1452 | 0 | i4_rem_texture_bits = ((i4_rem_texture_bits * 3) >> 1); |
1453 | 0 | } |
1454 | | |
1455 | 97.8k | trace_printf( |
1456 | 97.8k | "Remaining texture bits %d fbe %d ethp %d", |
1457 | 97.8k | i4_rem_texture_bits, |
1458 | 97.8k | ps_bit_allocation->i4_frame_level_bit_error, |
1459 | 97.8k | i4_est_tot_head_bits_period); |
1460 | 97.8k | } |
1461 | | |
1462 | 97.8k | { |
1463 | 97.8k | WORD32 i4_drain_bits_per_frame = get_buf_max_drain_rate(ps_cbr_buffer), i4_ebf; |
1464 | 97.8k | WORD32 i4_delay = cbr_get_delay_frames(ps_cbr_buffer), max_buffer_level = 0, |
1465 | 97.8k | rc_type = get_rc_type(ps_cbr_buffer); |
1466 | | |
1467 | 97.8k | if(rc_type == VBR_STREAMING) |
1468 | 52.0k | max_buffer_level = i4_drain_bits_per_frame * i4_delay; |
1469 | 45.8k | else |
1470 | 45.8k | max_buffer_level = get_cbr_buffer_size(ps_cbr_buffer); |
1471 | | |
1472 | 97.8k | i4_ebf = get_cbr_ebf(ps_cbr_buffer); |
1473 | | |
1474 | 97.8k | if(i4_ebf > (WORD32)(0.8f * max_buffer_level)) |
1475 | 0 | { |
1476 | 0 | if(ps_bit_allocation->af_sum_weigh[e_pic_type][0] > 1.0f) |
1477 | 0 | ps_bit_allocation->af_sum_weigh[e_pic_type][0] = 1.0f; |
1478 | 0 | } |
1479 | 97.8k | if(i4_ebf > (WORD32)(0.6f * max_buffer_level)) |
1480 | 0 | { |
1481 | 0 | if(ps_bit_allocation->af_sum_weigh[e_pic_type][0] > 1.5f) |
1482 | 0 | ps_bit_allocation->af_sum_weigh[e_pic_type][0] = 1.5f; |
1483 | 0 | } |
1484 | 97.8k | } |
1485 | 97.8k | } |
1486 | 267k | else |
1487 | 267k | { |
1488 | 267k | i4_rem_texture_bits = |
1489 | 267k | ret_rbip_default_preenc(&ps_bit_allocation->s_rbip, ps_pic_handling); |
1490 | | /*Assuming 30% of bits will go for header bits in a gop in preenc*/ |
1491 | 267k | i4_rem_texture_bits -= (WORD32)(i4_rem_texture_bits * 0.3f); |
1492 | 267k | } |
1493 | 364k | } |
1494 | | |
1495 | 364k | if(i4_use_model) |
1496 | 336k | { |
1497 | | /* The bits are then allocated based on the relative complexity of the |
1498 | | current frame with respect to that of the rest of the frames in period */ |
1499 | 3.36M | for(i = 0; i < MAX_PIC_TYPE; i++) |
1500 | 3.02M | { |
1501 | 3.02M | number_t vq_lin_mod_coeff, vq_est_sad, vq_K; |
1502 | | |
1503 | 3.02M | if(ai4_frms_in_period[i] > 0) /*Added for field case */ |
1504 | 859k | { |
1505 | | /* Getting the linear model coefficient */ |
1506 | 859k | vq_lin_mod_coeff = get_linear_coefficient(pps_rd_model[i]); |
1507 | | /* Getting the estimated SAD */ |
1508 | 859k | SET_VAR_Q(vq_est_sad, get_est_sad(ps_est_sad, (picture_type_e)i), 0); |
1509 | | /* Making K factor a var Q format */ |
1510 | 859k | SET_VAR_Q(vq_K, ps_bit_allocation->i2_K[i], K_Q); |
1511 | | /* Complexity_estimate = [ (lin_mod_coeff * estimated_sad) / K factor ] */ |
1512 | 859k | mult32_var_q(vq_lin_mod_coeff, vq_est_sad, &vq_lin_mod_coeff); |
1513 | 859k | div32_var_q(vq_lin_mod_coeff, vq_K, &avq_complexity_estimate[i]); |
1514 | 859k | } |
1515 | 3.02M | } |
1516 | | /*flag to check if complexity estimate is available*/ |
1517 | 336k | complexity_est = 1; |
1518 | | |
1519 | | /*HEVC_hierarchy: If complexity estimate = 0 for any pic type then use default ratios*/ |
1520 | 3.36M | for(i = 0; i < MAX_PIC_TYPE; i++) |
1521 | 3.02M | { |
1522 | 3.02M | if(ai4_frms_in_period[i] > 0) |
1523 | 859k | { |
1524 | 859k | complexity_est = complexity_est && avq_complexity_estimate[i].sm; |
1525 | 859k | } |
1526 | 3.02M | } |
1527 | 336k | } |
1528 | | |
1529 | | /* Make the picture type of the SCD frame a I_PIC */ |
1530 | 364k | if(i4_is_scd_frame && e_pic_type != I_PIC) |
1531 | 0 | e_pic_type = I_PIC; |
1532 | | |
1533 | 364k | if(e_pic_type == I_PIC) |
1534 | 133k | { |
1535 | | /*clip min max values*/ |
1536 | 133k | if(i_to_avg_ratio > I_TO_AVG_REST_GOP_BIT_MAX) |
1537 | 0 | i_to_avg_ratio = I_TO_AVG_REST_GOP_BIT_MAX; |
1538 | | |
1539 | 133k | if(i_to_avg_ratio < I_TO_AVG_REST_GOP_BIT_MIN) |
1540 | 0 | i_to_avg_ratio = I_TO_AVG_REST_GOP_BIT_MIN; |
1541 | | |
1542 | 133k | i4_est_texture_bits_for_frm = bit_alloc_get_intra_bits( |
1543 | 133k | ps_bit_allocation, |
1544 | 133k | ps_pic_handling, |
1545 | 133k | ps_cbr_buffer, |
1546 | 133k | e_pic_type, |
1547 | 133k | avq_complexity_estimate, |
1548 | 133k | 0, |
1549 | 133k | i_to_avg_ratio, |
1550 | 133k | i4_call_type, |
1551 | 133k | 0, |
1552 | 133k | f_percent_head_bits); |
1553 | 133k | } |
1554 | 231k | else |
1555 | 231k | { |
1556 | | /* Get the texture bits required for the current frame */ |
1557 | 231k | i4_est_texture_bits_for_frm = get_bits_based_on_complexity( |
1558 | 231k | ps_bit_allocation, |
1559 | 231k | i4_rem_texture_bits, |
1560 | 231k | ai4_frms_in_period, |
1561 | 231k | avq_complexity_estimate, |
1562 | 231k | e_pic_type, |
1563 | 231k | i4_call_type); |
1564 | 231k | } |
1565 | | |
1566 | 364k | ps_bit_allocation->i4_excess_bits_from_buffer = 0; |
1567 | | |
1568 | | /* If the remaining bits in the period becomes negative then the estimated texture |
1569 | | bits would also become negative. This would send a feedback to the model which |
1570 | | may go for a toss. Thus sending the minimum possible value = 0 */ |
1571 | 364k | if(i4_est_texture_bits_for_frm < 0) |
1572 | 319 | i4_est_texture_bits_for_frm = 0; |
1573 | | |
1574 | 364k | return (i4_est_texture_bits_for_frm); |
1575 | 364k | } |
1576 | | |
1577 | | /***************************************************************************** |
1578 | | Function Name : get_cur_frm_est_header_bits |
1579 | | Description : Based on remaining bits in period and rd_model |
1580 | | the number of bits required for the current frame is estimated. |
1581 | | Inputs : ps_bit_allocation - bit_allocation structure |
1582 | | ps_rd_model - rd model pointer (for all the frame types) |
1583 | | e_pic_type - picture type |
1584 | | Globals : |
1585 | | Processing : |
1586 | | Outputs : |
1587 | | Returns : |
1588 | | Issues : |
1589 | | Revision History: |
1590 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1591 | | *****************************************************************************/ |
1592 | | WORD32 get_cur_frm_est_header_bits(bit_allocation_t *ps_bit_allocation, picture_type_e e_pic_type) |
1593 | 661k | { |
1594 | | //ASSERT(ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type] == 0); |
1595 | 661k | return (ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type]); |
1596 | 661k | } |
1597 | | /***************************************************************************** |
1598 | | Function Name : get_rem_bits_in_period |
1599 | | Description : Get remaining bits in period |
1600 | | Inputs : ps_bit_allocation - bit_allocation structure |
1601 | | ps_pic_handling |
1602 | | Revision History: |
1603 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1604 | | *****************************************************************************/ |
1605 | | WORD32 |
1606 | | get_rem_bits_in_period(bit_allocation_t *ps_bit_allocation, pic_handling_handle ps_pic_handling) |
1607 | 0 | { |
1608 | 0 | return (update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0)); |
1609 | 0 | } |
1610 | | /***************************************************************************** |
1611 | | Function Name : get_bits_per_frame |
1612 | | Description : Get Bits per frame |
1613 | | Inputs : ps_bit_allocation - bit_allocation structure |
1614 | | Revision History: |
1615 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1616 | | *****************************************************************************/ |
1617 | | WORD32 get_bits_per_frame(bit_allocation_t *ps_bit_allocation) |
1618 | 567k | { |
1619 | 567k | return ((*ps_bit_allocation).i4_bits_per_frm); |
1620 | 567k | } |
1621 | | /***************************************************************************** |
1622 | | Function Name : ba_get_gop_bits |
1623 | | Description : |
1624 | | Inputs : ps_bit_allocation - bit_allocation structure |
1625 | | Revision History: |
1626 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1627 | | *****************************************************************************/ |
1628 | | LWORD64 ba_get_gop_bits(bit_allocation_t *ps_bit_allocation) |
1629 | 0 | { |
1630 | 0 | gop_level_stat_t *ps_cur_gop_stat; |
1631 | 0 | ps_cur_gop_stat = |
1632 | 0 | (gop_level_stat_t *)ps_bit_allocation->pv_gop_stat + ps_bit_allocation->i8_cur_gop_num; |
1633 | 0 | return ( |
1634 | 0 | ps_cur_gop_stat->i8_bits_allocated_to_gop + |
1635 | 0 | ps_cur_gop_stat->i8_buffer_play_bits_allocated_to_gop); |
1636 | 0 | } |
1637 | | /***************************************************************************** |
1638 | | Function Name : ba_get_gop_sad |
1639 | | Description : |
1640 | | Inputs : ps_bit_allocation - bit_allocation structure |
1641 | | Revision History: |
1642 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1643 | | *****************************************************************************/ |
1644 | | LWORD64 ba_get_gop_sad(bit_allocation_t *ps_bit_allocation) |
1645 | 0 | { |
1646 | 0 | gop_level_stat_t *ps_cur_gop_stat; |
1647 | 0 | ps_cur_gop_stat = |
1648 | 0 | (gop_level_stat_t *)ps_bit_allocation->pv_gop_stat + ps_bit_allocation->i8_cur_gop_num; |
1649 | 0 | return (ps_cur_gop_stat->i8_acc_gop_sad); |
1650 | 0 | } |
1651 | | /***************************************************************************** |
1652 | | Function Name : ba_get_buffer_play_bits_for_cur_gop |
1653 | | Description : |
1654 | | Inputs : ps_bit_allocation - bit_allocation structure |
1655 | | Revision History: |
1656 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1657 | | *****************************************************************************/ |
1658 | | LWORD64 ba_get_buffer_play_bits_for_cur_gop(bit_allocation_t *ps_bit_allocation) |
1659 | 0 | { |
1660 | 0 | gop_level_stat_t *ps_cur_gop_stat; |
1661 | 0 | ps_cur_gop_stat = |
1662 | 0 | (gop_level_stat_t *)ps_bit_allocation->pv_gop_stat + ps_bit_allocation->i8_cur_gop_num; |
1663 | 0 | return (ps_cur_gop_stat->i8_buffer_play_bits_allocated_to_gop); |
1664 | 0 | } |
1665 | | |
1666 | | /***************************************************************************** |
1667 | | Function Name : update_cur_frm_consumed_bits |
1668 | | Description : Based on remaining bits in period and rd_model |
1669 | | the number of bits required for the current frame is estimated. |
1670 | | Inputs : ps_bit_allocation - bit_allocation structure |
1671 | | ps_rd_model - rd model pointer (for all the frame types) |
1672 | | e_pic_type - picture type |
1673 | | Globals : |
1674 | | Processing : |
1675 | | Outputs : |
1676 | | Returns : |
1677 | | Issues : |
1678 | | Revision History: |
1679 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1680 | | *****************************************************************************/ |
1681 | | void update_cur_frm_consumed_bits( |
1682 | | bit_allocation_t *ps_bit_allocation, |
1683 | | pic_handling_handle ps_pic_handling, |
1684 | | cbr_buffer_handle ps_cbr_buf_handle, |
1685 | | WORD32 i4_total_frame_bits, |
1686 | | WORD32 i4_model_updation_hdr_bits, |
1687 | | picture_type_e e_pic_type, |
1688 | | UWORD8 u1_is_scd, |
1689 | | WORD32 i4_last_frm_in_period, |
1690 | | WORD32 i4_lap_comp_bits_reset, |
1691 | | WORD32 i4_suppress_bpic_update, |
1692 | | WORD32 i4_buffer_based_bit_error, |
1693 | | WORD32 i4_stuff_bits, |
1694 | | WORD32 i4_lap_window_comp, |
1695 | | rc_type_e e_rc_type, |
1696 | | WORD32 i4_num_gop, |
1697 | | WORD32 i4_is_pause_to_resume, |
1698 | | WORD32 i4_est_text_bits_ctr_update_qp, |
1699 | | WORD32 *pi4_gop_correction, |
1700 | | WORD32 *pi4_new_correction) |
1701 | 116k | { |
1702 | 116k | WORD32 i4_error_bits = get_error_bits(ps_bit_allocation->ps_error_bits); |
1703 | 116k | WORD32 i4_intra_frm_int, i, i4_flag_no_error_calc = 0; /*i_only*/ |
1704 | 116k | WORD32 i4_do_correction = 0; |
1705 | 116k | i4_intra_frm_int = pic_type_get_intra_frame_interval(ps_pic_handling); |
1706 | 116k | ps_bit_allocation->i4_rem_frame_in_period--; |
1707 | | |
1708 | | /*No frame level bit error for top layer pictures*/ |
1709 | | |
1710 | 116k | i4_flag_no_error_calc = /*((e_pic_type != B1_PIC && e_pic_type != B11_PIC) && ps_bit_allocation->i4_num_active_pic_type == 4)|| |
1711 | | ((e_pic_type != B2_PIC && e_pic_type != B22_PIC) && ps_bit_allocation->i4_num_active_pic_type == 5) &&*/ |
1712 | 116k | (i4_is_pause_to_resume == 0); |
1713 | | |
1714 | | /* Update the remaining bits in period */ |
1715 | 116k | ps_bit_allocation->i4_bits_from_buffer_in_cur_gop += |
1716 | 116k | ps_bit_allocation->i4_excess_bits_from_buffer; |
1717 | 116k | ps_bit_allocation->i4_buffer_based_bit_error -= ps_bit_allocation->i4_excess_bits_from_buffer; |
1718 | 116k | ps_bit_allocation->i4_gop_level_bit_error += |
1719 | 116k | (-(i4_total_frame_bits + i4_stuff_bits) + i4_error_bits + |
1720 | 116k | ps_bit_allocation->i4_bits_per_frm); |
1721 | 116k | ps_bit_allocation->i8_cur_gop_bit_consumption += (i4_total_frame_bits + i4_stuff_bits); |
1722 | | |
1723 | | //if(ps_bit_allocation-> == 2)ASSERT(i4_stuff_bits == 0);//No stuffing in two pass |
1724 | | //ASSERT(ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type] == 0); |
1725 | 116k | ps_bit_allocation->i4_buffer_based_bit_error += i4_buffer_based_bit_error; |
1726 | 116k | ps_bit_allocation->i8_frm_num_in_gop++; |
1727 | 116k | if(i4_last_frm_in_period && i4_lap_comp_bits_reset) |
1728 | 0 | i4_lap_comp_bits_reset = 0; //end of period is always I frame boundary. |
1729 | | |
1730 | 116k | if(e_pic_type == I_PIC) |
1731 | 30.2k | ps_bit_allocation->i4_num_frames_since_last_I_frame = 1; |
1732 | 85.9k | else |
1733 | 85.9k | ps_bit_allocation->i4_num_frames_since_last_I_frame++; |
1734 | | |
1735 | 116k | if((!i4_suppress_bpic_update)) |
1736 | 116k | { |
1737 | | //if(ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_update_qp] > 0) |
1738 | 116k | { |
1739 | 116k | ps_bit_allocation->ai4_prev_frm_tot_est_bits[e_pic_type] = |
1740 | 116k | ps_bit_allocation->ai4_cur_frm_est_hdr_bits[i4_est_text_bits_ctr_update_qp] + |
1741 | 116k | ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_update_qp]; |
1742 | | |
1743 | 116k | ps_bit_allocation->i4_frame_level_bit_error += |
1744 | 116k | (ps_bit_allocation->ai4_cur_frm_est_hdr_bits[i4_est_text_bits_ctr_update_qp] + |
1745 | 116k | ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_update_qp] - |
1746 | 116k | i4_total_frame_bits); |
1747 | 116k | } |
1748 | | |
1749 | 116k | trace_printf( |
1750 | 116k | "Prev frame header %d Total est %d total frame %d", |
1751 | 116k | ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type], |
1752 | 116k | ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_update_qp], |
1753 | 116k | i4_total_frame_bits); |
1754 | 116k | } |
1755 | | |
1756 | 116k | trace_printf( |
1757 | 116k | " rbip = %d frame lbe = %d bbbe = %d bfbicg = %d\n", |
1758 | 116k | update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0), |
1759 | 116k | ps_bit_allocation->i4_frame_level_bit_error, |
1760 | 116k | ps_bit_allocation->i4_buffer_based_bit_error, |
1761 | 116k | ps_bit_allocation->i4_bits_from_buffer_in_cur_gop); |
1762 | | |
1763 | | /* Update the header bits so that it can be used as an estimate to the next frame */ |
1764 | 116k | if(u1_is_scd) |
1765 | 363 | { |
1766 | | /* Initilising the header bits to be used for each picture type */ |
1767 | 363 | init_prev_header_bits(ps_bit_allocation, ps_pic_handling); |
1768 | | |
1769 | | /*init tot bits consumed of previous frame*/ |
1770 | 3.63k | for(i = 0; i < MAX_PIC_TYPE; i++) |
1771 | 3.26k | { |
1772 | 3.26k | ps_bit_allocation->ai4_prev_frm_tot_bits[i] = -1; |
1773 | 3.26k | ps_bit_allocation->ai4_prev_frm_tot_est_bits[i] = -1; |
1774 | 3.26k | } |
1775 | | /* In case of SCD, eventhough the frame type is P, it is equivalent to a I frame |
1776 | | and so the coresponding header bits is updated */ |
1777 | | //ASSERT(i4_model_updation_hdr_bits == 0); |
1778 | 363 | ps_bit_allocation->i4_prev_frm_header_bits[I_PIC] = i4_model_updation_hdr_bits; |
1779 | 363 | ps_bit_allocation->ai4_prev_frm_tot_bits[I_PIC] = i4_total_frame_bits; |
1780 | 363 | ps_bit_allocation->ai4_prev_frm_tot_est_bits[I_PIC] = i4_total_frame_bits; |
1781 | | /*SCD allowed only for I_PIC*/ |
1782 | 363 | ASSERT(e_pic_type == I_PIC); |
1783 | | |
1784 | 363 | #define MAX_NUM_GOPS_IN_PERIOD (5) |
1785 | 363 | if(ps_bit_allocation->i4_num_gops_in_period != 1 && |
1786 | 363 | ps_bit_allocation->i4_num_gops_in_period < MAX_NUM_GOPS_IN_PERIOD) |
1787 | 0 | { |
1788 | | /* Whenever there is a scene change increase the number of gops by 2 so that |
1789 | | the number of bits allocated is not very constrained. */ |
1790 | 0 | ps_bit_allocation->i4_num_gops_in_period += 2; |
1791 | | /* Add the extra bits in GOP to remaining bits in period */ |
1792 | 0 | change_rbip( |
1793 | 0 | &ps_bit_allocation->s_rbip, |
1794 | 0 | ps_bit_allocation->i4_bits_per_frm, |
1795 | 0 | ps_bit_allocation->i4_num_gops_in_period); |
1796 | | /* printf((const WORD8*)"SCD rbp %d, ngp %d\n", update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling,0), |
1797 | | ps_bit_allocation->i4_num_gops_in_period); */ |
1798 | 0 | } |
1799 | 363 | } |
1800 | 115k | else |
1801 | 115k | { |
1802 | | //ASSERT(i4_model_updation_hdr_bits == 0); |
1803 | 115k | if(!i4_suppress_bpic_update) |
1804 | 115k | { |
1805 | 115k | ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type] = i4_model_updation_hdr_bits; |
1806 | 115k | ps_bit_allocation->ai4_prev_frm_tot_bits[e_pic_type] = i4_total_frame_bits; |
1807 | 115k | } |
1808 | 115k | } |
1809 | | |
1810 | 116k | { |
1811 | | /* Removng the error due to buffer movement from gop level bit error */ |
1812 | 116k | WORD32 i4_gop_correction = 0; |
1813 | 116k | WORD32 i4_cur_ebf = get_cbr_ebf(ps_cbr_buf_handle); |
1814 | 116k | WORD32 i4_vbv_size = get_cbr_buffer_size(ps_cbr_buf_handle); |
1815 | 116k | WORD32 i4_min_vbv_size = (WORD32)(i4_vbv_size * MIN_THRESHOLD_VBV_GOP_ERROR); |
1816 | 116k | WORD32 i4_max_vbv_size = (WORD32)(i4_vbv_size * MAX_THRESHOLD_VBV_GOP_ERROR); |
1817 | | /*get desired buffer level so that bit error can be calculated. desired buf = 1 - lap window complexity*/ |
1818 | 116k | if(ps_bit_allocation->i4_ba_rc_pass != 2) |
1819 | 116k | { |
1820 | 116k | WORD32 i4_inter_frame_interval = pic_type_get_inter_frame_interval(ps_pic_handling); |
1821 | 116k | LWORD64 vbv_buffer_based_excess = 0; |
1822 | 116k | WORD32 i4_lap_window_comp_temp = i4_lap_window_comp; |
1823 | 116k | if(ps_bit_allocation->i4_lap_window > i4_inter_frame_interval) |
1824 | 0 | { |
1825 | 0 | if(e_rc_type == VBR_STREAMING) |
1826 | 0 | { |
1827 | 0 | if(((float)i4_lap_window_comp / 128) > |
1828 | 0 | ps_bit_allocation->f_min_complexity_cross_peak_rate) |
1829 | 0 | i4_lap_window_comp_temp = |
1830 | 0 | (WORD32)(ps_bit_allocation->f_min_complexity_cross_peak_rate * 128); |
1831 | | |
1832 | | /*Get excess bits if any from vbv buffer*/ |
1833 | 0 | vbv_buffer_based_excess = get_vbv_buffer_based_excess( |
1834 | 0 | ps_cbr_buf_handle, |
1835 | 0 | ps_bit_allocation->f_min_complexity_cross_peak_rate, |
1836 | 0 | ((float)i4_lap_window_comp / 128), |
1837 | 0 | (i4_intra_frm_int * ps_bit_allocation->s_rbip.i4_num_intra_frm_interval), |
1838 | 0 | 1); |
1839 | 0 | } |
1840 | |
|
1841 | 0 | i4_do_correction = 1; |
1842 | 0 | i4_gop_correction = get_error_bits_for_desired_buf( |
1843 | 0 | ps_cbr_buf_handle, |
1844 | 0 | i4_lap_window_comp_temp, |
1845 | 0 | (i4_intra_frm_int * ps_bit_allocation->s_rbip.i4_num_intra_frm_interval)); |
1846 | | /*In case of VBR, don't do buffer based correction if gop_correction is less than 0, as it is less than average*/ |
1847 | 0 | if((e_rc_type == VBR_STREAMING) && (i4_gop_correction <= 0)) |
1848 | 0 | { |
1849 | 0 | i4_do_correction = 0; |
1850 | 0 | } |
1851 | | |
1852 | | /* vbv buffer position based error correction to keep away encoder buffer overflow at GOP (I to I, not user configured)*/ |
1853 | 0 | if(i4_do_correction) |
1854 | 0 | { |
1855 | 0 | WORD32 i4_buffer_err_bits; |
1856 | | /*check if the ebf is greater than max ebf, |
1857 | | then account for complete error above max ebf in the current GOP itself*/ |
1858 | 0 | if(i4_cur_ebf > i4_max_vbv_size) |
1859 | 0 | { |
1860 | 0 | i4_gop_correction -= (i4_cur_ebf - i4_max_vbv_size); |
1861 | 0 | *pi4_new_correction -= (i4_cur_ebf - i4_max_vbv_size); |
1862 | 0 | i4_cur_ebf = i4_max_vbv_size; |
1863 | 0 | } |
1864 | | /* if ebf is above min but less than max, then distribute to the next GOPs*/ |
1865 | 0 | if(i4_cur_ebf > i4_min_vbv_size) |
1866 | 0 | { |
1867 | 0 | WORD32 i4_num_gops; |
1868 | 0 | float f_ebf_percent; |
1869 | | /*compute the error bits to be distributed over the next GOPs*/ |
1870 | 0 | i4_buffer_err_bits = (i4_cur_ebf - i4_min_vbv_size); |
1871 | | /*compute number fo GOPs the error to be distributed |
1872 | | high error -> few GOPs, less error -> more GOPs*/ |
1873 | 0 | f_ebf_percent = ((float)i4_cur_ebf / i4_vbv_size); |
1874 | 0 | i4_num_gops = (WORD32)((1.0 - f_ebf_percent) * 10) + 2; |
1875 | | /*add the error bits to the period*/ |
1876 | 0 | i4_gop_correction -= (WORD32)(i4_buffer_err_bits / i4_num_gops); |
1877 | 0 | *pi4_new_correction -= (WORD32)(i4_buffer_err_bits / i4_num_gops); |
1878 | 0 | } |
1879 | 0 | } |
1880 | 0 | *pi4_gop_correction = i4_gop_correction; |
1881 | 0 | set_rbip( |
1882 | 0 | &ps_bit_allocation->s_rbip, |
1883 | 0 | (i4_gop_correction + (WORD32)vbv_buffer_based_excess)); |
1884 | |
|
1885 | 0 | update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0); |
1886 | 0 | ASSERT(ps_bit_allocation->i4_bits_from_buffer_in_cur_gop == 0); |
1887 | 0 | trace_printf("\nRBIP updated "); |
1888 | 0 | } |
1889 | | /* initialise the GOP and bit errors to zero */ |
1890 | 116k | ps_bit_allocation->i4_gop_level_bit_error = 0; |
1891 | | /*frame level error can't be carried over when it is more than VBV buffer size*/ |
1892 | 116k | if(ps_bit_allocation->i4_frame_level_bit_error > i4_max_vbv_size) |
1893 | 15.6k | { |
1894 | 15.6k | ps_bit_allocation->i4_frame_level_bit_error = i4_max_vbv_size; |
1895 | 15.6k | } |
1896 | 116k | if((i4_last_frm_in_period) || |
1897 | 116k | (i4_intra_frm_int == 1 && ps_bit_allocation->i4_rem_frame_in_period == 0)) |
1898 | 18.3k | { /*For 1st pass set the errors to 0 at end of a gop*/ |
1899 | 18.3k | ps_bit_allocation->i8_cur_gop_bit_consumption = 0; |
1900 | 18.3k | ps_bit_allocation->i4_frame_level_bit_error = 0; |
1901 | 18.3k | ps_bit_allocation->i4_bits_from_buffer_in_cur_gop = 0; |
1902 | 18.3k | ps_bit_allocation->i4_rem_frame_in_period = |
1903 | 18.3k | ps_bit_allocation->i4_num_gops_in_period * |
1904 | 18.3k | i4_intra_frm_int; /*TBD: I only case*/ |
1905 | 18.3k | ps_bit_allocation->i8_frm_num_in_gop = 0; |
1906 | 18.3k | } |
1907 | 116k | } |
1908 | 116k | } |
1909 | | |
1910 | 116k | if(i4_last_frm_in_period && i4_intra_frm_int != 1) |
1911 | 18.0k | { |
1912 | | /* If the number of gops in period has been increased due to scene change, slowly bring in down |
1913 | | across the gops */ |
1914 | 18.0k | if(ps_bit_allocation->i4_num_gops_in_period > |
1915 | 18.0k | ps_bit_allocation->i4_actual_num_gops_in_period) |
1916 | 0 | { |
1917 | 0 | ps_bit_allocation->i4_num_gops_in_period--; |
1918 | 0 | change_rbip( |
1919 | 0 | &ps_bit_allocation->s_rbip, |
1920 | 0 | ps_bit_allocation->i4_bits_per_frm, |
1921 | 0 | ps_bit_allocation->i4_num_gops_in_period); |
1922 | 0 | } |
1923 | 18.0k | } |
1924 | | /*Check for complexity based bits reset in future with GOP*/ |
1925 | | |
1926 | | /* Update the lower modules */ |
1927 | 116k | update_error_bits(ps_bit_allocation->ps_error_bits); |
1928 | 116k | } |
1929 | | |
1930 | | /***************************************************************************** |
1931 | | Function Name : change_remaining_bits_in_period |
1932 | | Description : |
1933 | | Inputs : ps_bit_allocation - bit_allocation structure |
1934 | | |
1935 | | Globals : |
1936 | | Processing : |
1937 | | Outputs : |
1938 | | Returns : |
1939 | | Issues : |
1940 | | Revision History: |
1941 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
1942 | | *****************************************************************************/ |
1943 | | void change_remaining_bits_in_period( |
1944 | | bit_allocation_t *ps_bit_allocation, |
1945 | | WORD32 i4_bit_rate, |
1946 | | WORD32 i4_frame_rate, |
1947 | | WORD32 *i4_peak_bit_rate) |
1948 | 5.66k | { |
1949 | 5.66k | WORD32 i4_new_avg_bits_per_frm, i4_new_peak_bits_per_frm[MAX_NUM_DRAIN_RATES]; |
1950 | 5.66k | int i; |
1951 | | |
1952 | | /* Calculate the new per frame bits */ |
1953 | 5.66k | X_PROD_Y_DIV_Z(i4_bit_rate, 1000, i4_frame_rate, i4_new_avg_bits_per_frm); |
1954 | | |
1955 | 16.9k | for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) |
1956 | 11.3k | { |
1957 | 11.3k | X_PROD_Y_DIV_Z(i4_peak_bit_rate[i], 1000, i4_frame_rate, i4_new_peak_bits_per_frm[i]); |
1958 | 11.3k | } |
1959 | | |
1960 | 16.9k | for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) |
1961 | 11.3k | { |
1962 | 11.3k | ps_bit_allocation->i4_max_bits_per_frm[i] = i4_new_peak_bits_per_frm[i]; |
1963 | 11.3k | } |
1964 | | |
1965 | | /* Get the rem_frms_in_prd & the frms_in_prd from the pic_type state struct */ |
1966 | | /* pic_type_get_rem_frms_in_gop(ps_pic_handling, i4_rem_frms_in_period); */ |
1967 | | |
1968 | | /* If the difference > 0(/ <0), the remaining bits in period needs to be increased(/decreased) |
1969 | | based on the remaining number of frames */ |
1970 | 5.66k | change_rbip( |
1971 | 5.66k | &ps_bit_allocation->s_rbip, |
1972 | 5.66k | i4_new_avg_bits_per_frm, |
1973 | 5.66k | ps_bit_allocation->i4_num_gops_in_period); |
1974 | | |
1975 | | /* Update the new average bits per frame */ |
1976 | 5.66k | ps_bit_allocation->i4_bits_per_frm = i4_new_avg_bits_per_frm; |
1977 | | |
1978 | | /*change max_bits_per_frame*/ |
1979 | | //ps_bit_allocation->i4_max_bits_per_frm[0]=i4_new_avg_bits_per_frm; |
1980 | | //ps_bit_allocation->i4_max_bits_per_frm[1]=i4_new_avg_bits_per_frm; |
1981 | 5.66k | ps_bit_allocation->i4_min_bits_per_frm = |
1982 | 5.66k | i4_new_avg_bits_per_frm; /*VBR storage related parameter so this variable is currently not in use*/ |
1983 | | /* change the lower modules state */ |
1984 | | /*#ifdef DYNAMIC_RC*/ |
1985 | 5.66k | if(i4_bit_rate != ps_bit_allocation->i4_bit_rate) |
1986 | 5.66k | { |
1987 | 5.66k | X_PROD_Y_DIV_Z( |
1988 | 5.66k | ps_bit_allocation->i4_max_tex_bits_for_i, |
1989 | 5.66k | i4_bit_rate, |
1990 | 5.66k | ps_bit_allocation->i4_bit_rate, |
1991 | 5.66k | ps_bit_allocation->i4_max_tex_bits_for_i); |
1992 | 5.66k | } |
1993 | | /*#endif*/ |
1994 | | |
1995 | 5.66k | change_bitrate_in_error_bits(ps_bit_allocation->ps_error_bits, i4_bit_rate); |
1996 | 5.66k | change_frm_rate_in_error_bits(ps_bit_allocation->ps_error_bits, i4_frame_rate); |
1997 | | |
1998 | | /* Store the modified frame_rate */ |
1999 | 5.66k | ps_bit_allocation->i4_frame_rate = i4_frame_rate; |
2000 | 5.66k | ps_bit_allocation->i4_bit_rate = i4_bit_rate; |
2001 | 16.9k | for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) |
2002 | 11.3k | ps_bit_allocation->ai4_peak_bit_rate[i] = i4_peak_bit_rate[i]; |
2003 | 5.66k | } |
2004 | | /***************************************************************************** |
2005 | | Function Name : change_ba_peak_bit_rate |
2006 | | Description : |
2007 | | Inputs : ps_bit_allocation - bit_allocation structure |
2008 | | ai4_peak_bit_rate |
2009 | | Globals : |
2010 | | Processing : |
2011 | | Outputs : |
2012 | | Returns : |
2013 | | Issues : |
2014 | | Revision History: |
2015 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2016 | | *****************************************************************************/ |
2017 | | void change_ba_peak_bit_rate(bit_allocation_t *ps_bit_allocation, WORD32 *ai4_peak_bit_rate) |
2018 | 0 | { |
2019 | 0 | WORD32 i; |
2020 | | /* Calculate the bits per frame */ |
2021 | 0 | for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) |
2022 | 0 | { |
2023 | 0 | X_PROD_Y_DIV_Z( |
2024 | 0 | ai4_peak_bit_rate[i], |
2025 | 0 | 1000, |
2026 | 0 | ps_bit_allocation->i4_frame_rate, |
2027 | 0 | ps_bit_allocation->i4_max_bits_per_frm[i]); |
2028 | 0 | ps_bit_allocation->ai4_peak_bit_rate[i] = ai4_peak_bit_rate[i]; |
2029 | 0 | } |
2030 | 0 | } |
2031 | | /***************************************************************************** |
2032 | | Function Name : check_and_update_bit_allocation |
2033 | | Description : |
2034 | | Inputs : ps_bit_allocation - bit_allocation structure |
2035 | | ps_pic_handling |
2036 | | i4_max_bits_inflow_per_frm |
2037 | | Globals : |
2038 | | Processing : |
2039 | | Outputs : |
2040 | | Returns : |
2041 | | Issues : |
2042 | | Revision History: |
2043 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2044 | | *****************************************************************************/ |
2045 | | void check_and_update_bit_allocation( |
2046 | | bit_allocation_t *ps_bit_allocation, |
2047 | | pic_handling_handle ps_pic_handling, |
2048 | | WORD32 i4_max_bits_inflow_per_frm) |
2049 | 0 | { |
2050 | 0 | WORD32 i4_max_drain_bits, i4_extra_bits, i4_less_bits, i4_allocated_saved_bits, |
2051 | 0 | i4_min_bits_for_period; |
2052 | 0 | WORD32 i4_num_frms_in_period = get_actual_num_frames_in_gop(ps_pic_handling); |
2053 | 0 | WORD32 i4_rem_bits_in_period = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0); |
2054 | | |
2055 | | /* If the remaining bits is greater than what can be drained in that period |
2056 | | Clip the remaining bits in period to the maximum it can drain in that pariod |
2057 | | with the error of current buffer size.Accumulate the saved bits if any. |
2058 | | else if the remaining bits is lesser than the minimum bit rate promissed in that period |
2059 | | Add the excess bits to remaining bits in period and reduce it from the saved bits |
2060 | | Else |
2061 | | Provide the extra bits from the "saved bits pool".*/ |
2062 | |
|
2063 | 0 | i4_max_drain_bits = ps_bit_allocation->i4_num_gops_in_period * i4_num_frms_in_period * |
2064 | 0 | i4_max_bits_inflow_per_frm; |
2065 | | |
2066 | | /* Practical DBF = middle of the buffer */ |
2067 | | /* NITT TO BE VERIFIED |
2068 | | MAx drain bits becomes negative if the buffer underflows |
2069 | | i4_max_drain_bits += (i4_cur_buf_size + i4_max_bits_inflow_per_frm - i4_tot_frame_bits); */ |
2070 | |
|
2071 | 0 | i4_min_bits_for_period = ps_bit_allocation->i4_num_gops_in_period * i4_num_frms_in_period * |
2072 | 0 | ps_bit_allocation->i4_min_bits_per_frm; |
2073 | | |
2074 | | /* printf((const WORD8*)" mdb %d, mbfp %d, rbip %d, sb %d \n",i4_max_drain_bits, |
2075 | | i4_min_bits_for_period, ps_bit_allocation->i4_rem_bits_in_period, ps_bit_allocation->i4_saved_bits); */ |
2076 | 0 | if(i4_rem_bits_in_period > i4_max_drain_bits) |
2077 | 0 | { |
2078 | 0 | i4_extra_bits = (i4_rem_bits_in_period - i4_max_drain_bits); |
2079 | 0 | update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, -1 * i4_extra_bits); |
2080 | 0 | overflow_avoided_summation(&ps_bit_allocation->i4_saved_bits, i4_extra_bits); |
2081 | 0 | } |
2082 | 0 | else if(i4_rem_bits_in_period < i4_min_bits_for_period) |
2083 | 0 | { |
2084 | 0 | i4_extra_bits = (i4_min_bits_for_period - i4_rem_bits_in_period); |
2085 | 0 | update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, i4_extra_bits); |
2086 | 0 | overflow_avoided_summation(&ps_bit_allocation->i4_saved_bits, -1 * i4_extra_bits); |
2087 | 0 | } |
2088 | 0 | else if(ps_bit_allocation->i4_saved_bits > 0) |
2089 | 0 | { |
2090 | 0 | i4_less_bits = i4_max_drain_bits - i4_rem_bits_in_period; |
2091 | 0 | i4_allocated_saved_bits = MIN(i4_less_bits, ps_bit_allocation->i4_saved_bits); |
2092 | 0 | update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, i4_allocated_saved_bits); |
2093 | 0 | ps_bit_allocation->i4_saved_bits -= i4_allocated_saved_bits; |
2094 | 0 | } |
2095 | 0 | return; |
2096 | 0 | } |
2097 | | /***************************************************************************** |
2098 | | Function Name : ba_get_frame_rate |
2099 | | Description : |
2100 | | Inputs : ps_bit_allocation - bit_allocation structure |
2101 | | Revision History: |
2102 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2103 | | *****************************************************************************/ |
2104 | | WORD32 ba_get_frame_rate(bit_allocation_t *ps_bit_allocation) |
2105 | 5.66k | { |
2106 | 5.66k | return (ps_bit_allocation->i4_frame_rate); |
2107 | 5.66k | } |
2108 | | /***************************************************************************** |
2109 | | Function Name : ba_get_bit_rate |
2110 | | Description : |
2111 | | Inputs : ps_bit_allocation - bit_allocation structure |
2112 | | Revision History: |
2113 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2114 | | *****************************************************************************/ |
2115 | | WORD32 ba_get_bit_rate(bit_allocation_t *ps_bit_allocation) |
2116 | 5.66k | { |
2117 | 5.66k | return (ps_bit_allocation->i4_bit_rate); |
2118 | 5.66k | } |
2119 | | /***************************************************************************** |
2120 | | Function Name : ba_get_2pass_avg_bit_rate |
2121 | | Description : |
2122 | | Inputs : ps_bit_allocation - bit_allocation structure |
2123 | | Revision History: |
2124 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2125 | | *****************************************************************************/ |
2126 | | LWORD64 ba_get_2pass_avg_bit_rate(bit_allocation_t *ps_bit_allocation) |
2127 | 0 | { |
2128 | 0 | return (ps_bit_allocation->i8_2pass_avg_bit_rate); |
2129 | 0 | } |
2130 | | /***************************************************************************** |
2131 | | Function Name : ba_set_2pass_avg_bit_rate |
2132 | | Description : |
2133 | | Inputs : ps_bit_allocation - bit_allocation structure |
2134 | | Revision History: |
2135 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2136 | | *****************************************************************************/ |
2137 | | void ba_set_2pass_avg_bit_rate(bit_allocation_t *ps_bit_allocation, LWORD64 i8_2pass_avg_bit_rate) |
2138 | 0 | { |
2139 | 0 | ps_bit_allocation->i8_2pass_avg_bit_rate = i8_2pass_avg_bit_rate; |
2140 | 0 | } |
2141 | | /***************************************************************************** |
2142 | | Function Name : ba_get_peak_bit_rate |
2143 | | Description : |
2144 | | Inputs : ps_bit_allocation - bit_allocation structure |
2145 | | Revision History: |
2146 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2147 | | *****************************************************************************/ |
2148 | | void ba_get_peak_bit_rate(bit_allocation_t *ps_bit_allocation, WORD32 *pi4_peak_bit_rate) |
2149 | 0 | { |
2150 | 0 | WORD32 i; |
2151 | 0 | for(i = 0; i < MAX_NUM_DRAIN_RATES; i++) |
2152 | 0 | { |
2153 | 0 | pi4_peak_bit_rate[i] = ps_bit_allocation->ai4_peak_bit_rate[i]; |
2154 | 0 | } |
2155 | 0 | } |
2156 | | /***************************************************************************** |
2157 | | Function Name : init_intra_header_bits |
2158 | | Description : |
2159 | | Inputs : ps_bit_allocation - bit_allocation structure |
2160 | | Revision History: |
2161 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2162 | | *****************************************************************************/ |
2163 | | void init_intra_header_bits(bit_allocation_t *ps_bit_allocation, WORD32 i4_intra_header_bits) |
2164 | 0 | { |
2165 | | //ASSERT(i4_intra_header_bits == 0); |
2166 | 0 | ps_bit_allocation->i4_prev_frm_header_bits[0] = i4_intra_header_bits; |
2167 | 0 | } |
2168 | | /***************************************************************************** |
2169 | | Function Name : get_prev_header_bits |
2170 | | Description : |
2171 | | Inputs : ps_bit_allocation - bit_allocation structure |
2172 | | Revision History: |
2173 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2174 | | *****************************************************************************/ |
2175 | | WORD32 get_prev_header_bits(bit_allocation_t *ps_bit_allocation, WORD32 pic_type) |
2176 | 0 | { |
2177 | | //ASSERT(ps_bit_allocation->i4_prev_frm_header_bits[pic_type] == 0); |
2178 | 0 | return (ps_bit_allocation->i4_prev_frm_header_bits[pic_type]); |
2179 | 0 | } |
2180 | | |
2181 | 0 | #define I_TO_P_RATIO_HI_MO (16) |
2182 | 0 | #define P_TO_B_RATIO_HI_MO (18) |
2183 | 0 | #define P_TO_B_RATIO_HI_MO_HBR (16) |
2184 | | /***************************************************************************** |
2185 | | Function Name : set_Kp_Kb_for_hi_motion |
2186 | | Description : |
2187 | | Inputs : ps_bit_allocation - bit_allocation structure |
2188 | | Revision History: |
2189 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2190 | | *****************************************************************************/ |
2191 | | void set_Kp_Kb_for_hi_motion(bit_allocation_t *ps_bit_allocation) |
2192 | 0 | { |
2193 | 0 | ps_bit_allocation->i2_K[I_PIC] = (1 << K_Q); |
2194 | 0 | ps_bit_allocation->i2_K[P_PIC] = I_TO_P_RATIO_HI_MO; |
2195 | |
|
2196 | 0 | if(ps_bit_allocation->i4_is_hbr) |
2197 | 0 | { |
2198 | 0 | ps_bit_allocation->i2_K[B_PIC] = (P_TO_B_RATIO_HI_MO * I_TO_P_RATIO_HI_MO) >> K_Q; |
2199 | 0 | } |
2200 | 0 | else |
2201 | 0 | { |
2202 | 0 | ps_bit_allocation->i2_K[B_PIC] = (P_TO_B_RATIO_HI_MO_HBR * I_TO_P_RATIO_HI_MO) >> K_Q; |
2203 | 0 | } |
2204 | 0 | } |
2205 | | /***************************************************************************** |
2206 | | Function Name : reset_Kp_Kb |
2207 | | Description : I_P_B_B1_B2 QP offset calculation based on hme sad |
2208 | | Inputs : |
2209 | | Globals : |
2210 | | Processing : |
2211 | | Outputs : |
2212 | | Returns : |
2213 | | Issues : |
2214 | | Revision History: |
2215 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2216 | | *****************************************************************************/ |
2217 | | |
2218 | | void reset_Kp_Kb( |
2219 | | bit_allocation_t *ps_bit_allocation, |
2220 | | float f_i_to_avg_ratio, |
2221 | | WORD32 i4_num_active_pic_type, |
2222 | | float f_hme_sad_per_pixel, |
2223 | | float f_max_hme_sad_per_pixel, |
2224 | | WORD32 *pi4_complexity_bin, |
2225 | | WORD32 i4_rc_pass) |
2226 | 0 | { |
2227 | 0 | WORD32 i, i4_ratio = (WORD32)(f_max_hme_sad_per_pixel / f_hme_sad_per_pixel); |
2228 | 0 | WORD32 ai4_offsets[5] = { 0 }; |
2229 | 0 | float f_ratio = f_max_hme_sad_per_pixel / f_hme_sad_per_pixel; |
2230 | | |
2231 | | /*Filling out the offfset array for QP offset 0 - 7*/ |
2232 | 0 | const WORD32 ai4_offset_qp[8] = { |
2233 | 0 | (1 << K_Q), |
2234 | 0 | I_TO_P_RATIO, |
2235 | 0 | ((P_TO_B_RATIO * I_TO_P_RATIO) >> K_Q), |
2236 | 0 | (B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q), |
2237 | 0 | (B1_TO_B2_RATIO * B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q + K_Q), |
2238 | 0 | (B1_TO_B2_RATIO * B1_TO_B2_RATIO * B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> |
2239 | 0 | (K_Q + K_Q + K_Q + K_Q), |
2240 | 0 | (B1_TO_B2_RATIO * B1_TO_B2_RATIO * B1_TO_B2_RATIO * B_TO_B1_RATIO * P_TO_B_RATIO * |
2241 | 0 | I_TO_P_RATIO) >> |
2242 | 0 | (K_Q + K_Q + K_Q + K_Q + K_Q), |
2243 | 0 | (B1_TO_B2_RATIO * B1_TO_B2_RATIO * B1_TO_B2_RATIO * B1_TO_B2_RATIO * B_TO_B1_RATIO * |
2244 | 0 | P_TO_B_RATIO * I_TO_P_RATIO) >> |
2245 | 0 | (K_Q + K_Q + K_Q + K_Q + K_Q + K_Q) |
2246 | 0 | }; |
2247 | |
|
2248 | 0 | ba_get_qp_offset_offline_data( |
2249 | 0 | ai4_offsets, i4_ratio, f_ratio, i4_num_active_pic_type, pi4_complexity_bin); |
2250 | 0 | for(i = 0; i < 5; i++) |
2251 | 0 | { |
2252 | 0 | ASSERT((ai4_offsets[i] >= 0) && (ai4_offsets[i] <= 7)); |
2253 | 0 | ps_bit_allocation->i2_K[i] = ai4_offset_qp[ai4_offsets[i]]; |
2254 | | |
2255 | | /*For interlaced also we are filling out the offsets*/ |
2256 | 0 | if(i > 0) |
2257 | 0 | ps_bit_allocation->i2_K[i + 4] = ai4_offset_qp[ai4_offsets[i]]; |
2258 | 0 | } |
2259 | 0 | } |
2260 | | |
2261 | | /***************************************************************************** |
2262 | | Function Name : ba_get_qp_offset_offline_data |
2263 | | Description : Offline model for qp offset calculation |
2264 | | Inputs : ai4_offsets |
2265 | | i4_ratio |
2266 | | f_ratio |
2267 | | i4_num_active_pic_type |
2268 | | pi4_complexity_bin |
2269 | | Revision History: |
2270 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2271 | | *****************************************************************************/ |
2272 | | void ba_get_qp_offset_offline_data( |
2273 | | WORD32 ai4_offsets[5], |
2274 | | WORD32 i4_ratio, |
2275 | | float f_ratio, |
2276 | | WORD32 i4_num_active_pic_type, |
2277 | | WORD32 *pi4_complexity_bin) |
2278 | 0 | { |
2279 | 0 | WORD32 i4_bin; |
2280 | | /*Desired QP offset's for different complexity bins depending on number of temporal layers*/ |
2281 | | /*There are 6 complexity bins |
2282 | | Max_compl - Max_compl*3/4, |
2283 | | Max_compl*3/4 - Max_compl*1/2, |
2284 | | Max_compl*1/2 - Max_compl*1/4, |
2285 | | Max_compl*1/4 - Max_compl*1/8, |
2286 | | Max_compl*1/8 - Max_compl*1/16 |
2287 | | <Max_compl*1/16*/ |
2288 | | /*The kids_rain content was run on different resolutions and the max value for different temporal configs is the max value used*/ |
2289 | | |
2290 | | /*First index for complexity bin, second index for pic_types (P,B,B1,B2)*/ |
2291 | 0 | const WORD32 ai4_offset_values_7B[7][4] = { { 0, 1, 1, 2 }, { 1, 1, 2, 3 }, { 1, 2, 3, 3 }, |
2292 | 0 | { 1, 2, 3, 4 }, { 2, 2, 3, 4 }, { 2, 3, 4, 5 }, |
2293 | 0 | { 3, 4, 5, 6 } }; |
2294 | 0 | const WORD32 ai4_offset_values_3B[7][3] = { { 0, 1, 2 }, { 1, 2, 2 }, { 1, 2, 3 }, { 2, 2, 3 }, |
2295 | 0 | { 2, 3, 4 }, { 2, 4, 5 }, { 3, 4, 5 } }; |
2296 | 0 | const WORD32 ai4_offset_values_1B[7][2] = { { 1, 1 }, { 1, 2 }, { 1, 2 }, { 1, 3 }, |
2297 | 0 | { 2, 3 }, { 3, 4 }, { 3, 5 } }; |
2298 | 0 | const WORD32 ai4_offset_values_0B[7][1] = { { 0 }, { 1 }, { 2 }, { 2 }, { 3 }, { 3 }, { 4 } }; |
2299 | | |
2300 | | /*The ratio is clipped between 16 and 2 to put it into bins*/ |
2301 | |
|
2302 | 0 | CLIP(i4_ratio, 16, 2); |
2303 | |
|
2304 | 0 | for(i4_bin = 1; i4_bin < 5; i4_bin++) |
2305 | 0 | { |
2306 | 0 | if((i4_ratio >> i4_bin) == 1) |
2307 | 0 | { |
2308 | 0 | break; |
2309 | 0 | } |
2310 | 0 | } |
2311 | 0 | switch(i4_bin) |
2312 | 0 | { |
2313 | 0 | case(1): |
2314 | 0 | (f_ratio > 2.0f) ? (i4_bin = 3) : ((f_ratio > 1.33f) ? (i4_bin = 2) : (i4_bin = 1)); |
2315 | 0 | break; |
2316 | 0 | case(2): |
2317 | 0 | i4_bin = 4; |
2318 | 0 | break; |
2319 | 0 | case(3): |
2320 | 0 | (f_ratio > 12.0f) ? (i4_bin = 6) : (i4_bin = 5); |
2321 | 0 | break; |
2322 | 0 | case(4): |
2323 | 0 | i4_bin = 7; |
2324 | 0 | break; |
2325 | 0 | } |
2326 | | |
2327 | | /*For the i4_bin == 1, actual ratio could be >2.0,>1.33 or lesser hence putting them into different bins*/ |
2328 | | |
2329 | 0 | trace_printf("1 bin %d", i4_bin); |
2330 | | |
2331 | | /*Total 7 bins hence the clip*/ |
2332 | 0 | CLIP(i4_bin, 7, 1); |
2333 | |
|
2334 | 0 | *pi4_complexity_bin = i4_bin - 1; |
2335 | |
|
2336 | 0 | switch(i4_num_active_pic_type) |
2337 | 0 | { |
2338 | 0 | case 5: |
2339 | 0 | memmove( |
2340 | 0 | &ai4_offsets[1], |
2341 | 0 | ai4_offset_values_7B[i4_bin - 1], |
2342 | 0 | sizeof(ai4_offset_values_7B[i4_bin - 1])); |
2343 | 0 | break; |
2344 | 0 | case 4: |
2345 | 0 | memmove( |
2346 | 0 | &ai4_offsets[1], |
2347 | 0 | ai4_offset_values_3B[i4_bin - 1], |
2348 | 0 | sizeof(ai4_offset_values_3B[i4_bin - 1])); |
2349 | 0 | break; |
2350 | 0 | case 3: |
2351 | 0 | memmove( |
2352 | 0 | &ai4_offsets[1], |
2353 | 0 | ai4_offset_values_1B[i4_bin - 1], |
2354 | 0 | sizeof(ai4_offset_values_1B[i4_bin - 1])); |
2355 | 0 | break; |
2356 | 0 | case 2: |
2357 | 0 | memmove( |
2358 | 0 | &ai4_offsets[1], |
2359 | 0 | ai4_offset_values_0B[i4_bin - 1], |
2360 | 0 | sizeof(ai4_offset_values_0B[i4_bin - 1])); |
2361 | 0 | break; |
2362 | 0 | default: |
2363 | 0 | memmove( |
2364 | 0 | &ai4_offsets[1], |
2365 | 0 | ai4_offset_values_0B[i4_bin - 1], |
2366 | 0 | sizeof(ai4_offset_values_0B[i4_bin - 1])); |
2367 | 0 | break; |
2368 | 0 | } |
2369 | | |
2370 | 0 | trace_printf( |
2371 | 0 | "Enc %d,%d,%d,%d,%d offsets", |
2372 | 0 | ai4_offsets[0], |
2373 | 0 | ai4_offsets[1], |
2374 | 0 | ai4_offsets[2], |
2375 | 0 | ai4_offsets[3], |
2376 | 0 | ai4_offsets[4]); |
2377 | 0 | } |
2378 | | |
2379 | | /***************************************************************************** |
2380 | | Function Name : get_Kp_Kb |
2381 | | Description : Get the operating Kp and Kp so that scene cut sub gop can go |
2382 | | with similar qp offset |
2383 | | Inputs : ps_bit_allocation |
2384 | | e_pic_type |
2385 | | Revision History: |
2386 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2387 | | *****************************************************************************/ |
2388 | | |
2389 | | WORD32 get_Kp_Kb(bit_allocation_t *ps_bit_allocation, picture_type_e e_pic_type) |
2390 | 79.1k | { |
2391 | 79.1k | return ps_bit_allocation->i2_K[e_pic_type]; |
2392 | 79.1k | } |
2393 | | /***************************************************************************** |
2394 | | Function Name : get_scene_change_tot_frm_bits |
2395 | | Description : Based on remaining bits in period and default I_TO_B complexity |
2396 | | total bit budget for scene cut frame is obtained. |
2397 | | Inputs : ps_bit_allocation - bit_allocation structure |
2398 | | ps_rd_model - rd model pointer (for all the frame types) |
2399 | | e_pic_type - picture type |
2400 | | Globals : |
2401 | | Processing : |
2402 | | Outputs : |
2403 | | Returns : |
2404 | | Issues : |
2405 | | Revision History: |
2406 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2407 | | *****************************************************************************/ |
2408 | | WORD32 get_scene_change_tot_frm_bits( |
2409 | | bit_allocation_t *ps_bit_allocation, |
2410 | | pic_handling_handle ps_pic_handling, |
2411 | | cbr_buffer_handle ps_cbr_buf_handling, |
2412 | | WORD32 i4_num_pixels, |
2413 | | WORD32 i4_f_sim_lap, |
2414 | | float i_to_avg_rest, |
2415 | | WORD32 i4_call_type, |
2416 | | WORD32 i4_non_I_scd, |
2417 | | WORD32 i4_is_infinite_gop) |
2418 | 810k | { |
2419 | 810k | WORD32 j; |
2420 | 810k | WORD32 i4_tot_bits_for_scd_frame; |
2421 | 810k | WORD32 i4_total_bits_in_period; |
2422 | | //number_t avq_complexity_estimate[MAX_PIC_TYPE]; |
2423 | 810k | WORD32 /* ai4_rem_frms_in_period[MAX_PIC_TYPE], */ |
2424 | 810k | ai4_frms_in_period[MAX_PIC_TYPE]; |
2425 | 810k | WORD32 i4_max_consumable_bits; |
2426 | 810k | WORD32 i4_intra_frm_int; |
2427 | 810k | WORD32 ai4_actual_frms_in_gop[MAX_PIC_TYPE], i, i4_total_frames = 0; |
2428 | 810k | float final_ratio, f_sim = (float)i4_f_sim_lap / 128; |
2429 | | |
2430 | 810k | i4_intra_frm_int = pic_type_get_intra_frame_interval(ps_pic_handling); |
2431 | | |
2432 | | /* Get the rem_frms_in_gop & the frms_in_gop from the pic_type state struct */ |
2433 | | /* pic_type_get_rem_frms_in_gop(ps_pic_handling, ai4_rem_frms_in_period); */ |
2434 | 810k | pic_type_get_frms_in_gop(ps_pic_handling, ai4_frms_in_period); |
2435 | | |
2436 | | /* Depending on the number of gops in a period, find the num_frms_in_prd */ |
2437 | 8.10M | for(j = 0; j < MAX_PIC_TYPE; j++) |
2438 | 7.29M | { |
2439 | | /* ai4_rem_frms_in_period[j] += (ai4_frms_in_period[j] * (ps_bit_allocation->i4_num_gops_in_period - 1)); */ |
2440 | 7.29M | ai4_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period; |
2441 | 7.29M | } |
2442 | | |
2443 | | /* Remove the header bits from the remaining bits to find how many bits you |
2444 | | can transfer.*/ |
2445 | 810k | { |
2446 | 810k | i4_total_bits_in_period = ps_bit_allocation->s_rbip.i4_bits_per_frm * |
2447 | 810k | ps_bit_allocation->s_rbip.i4_tot_frms_in_gop; |
2448 | | //trace_printf(" SCD_rbip = %d",i4_total_bits_in_period); |
2449 | 810k | } |
2450 | | //since this marks end of previous GOP it is better to consider actual error than ps_bit_allocation->i4_frame_level_bit_error; |
2451 | | |
2452 | 810k | { |
2453 | 810k | pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_actual_frms_in_gop); |
2454 | 8.10M | for(i = 0; i < MAX_PIC_TYPE; i++) |
2455 | 7.29M | { |
2456 | 7.29M | i4_total_frames += ai4_frms_in_period[i]; |
2457 | 7.29M | } |
2458 | 810k | i4_max_consumable_bits = ps_bit_allocation->i4_max_bits_per_frm[0] * i4_total_frames; |
2459 | 810k | } |
2460 | 810k | if(i4_total_bits_in_period > 0) |
2461 | 810k | { |
2462 | 810k | i4_total_bits_in_period = MIN(i4_total_bits_in_period, i4_max_consumable_bits); |
2463 | 810k | } |
2464 | 810k | final_ratio = i_to_avg_rest; |
2465 | | /*If FSIM says the content is static (> 126 is assured to be static*/ |
2466 | | /*Very low FSIM safety check*/ |
2467 | 810k | if(f_sim < 0.50 && final_ratio > 8) |
2468 | 0 | final_ratio = 8; |
2469 | | /*Do not apply safety limits if second pass as data is reliable*/ |
2470 | 810k | if(ps_bit_allocation->i4_ba_rc_pass != 2) |
2471 | 810k | { |
2472 | | /*clip min max values*/ |
2473 | 810k | if((i4_is_infinite_gop == 1) && (final_ratio > I_TO_AVG_REST_GOP_BIT_MAX_INFINITE)) |
2474 | 6.07k | { |
2475 | 6.07k | final_ratio = I_TO_AVG_REST_GOP_BIT_MAX_INFINITE; |
2476 | 6.07k | } |
2477 | 804k | else |
2478 | 804k | { |
2479 | 804k | if(final_ratio > I_TO_AVG_REST_GOP_BIT_MAX) |
2480 | 49.2k | final_ratio = I_TO_AVG_REST_GOP_BIT_MAX; |
2481 | 804k | } |
2482 | 810k | if(final_ratio < I_TO_AVG_REST_GOP_BIT_MIN) |
2483 | 8 | final_ratio = I_TO_AVG_REST_GOP_BIT_MIN; |
2484 | 810k | } |
2485 | 0 | else |
2486 | 0 | { |
2487 | 0 | if(final_ratio > I_TO_AVG_REST_GOP_BIT_MAX_2_PASS) |
2488 | 0 | final_ratio = I_TO_AVG_REST_GOP_BIT_MAX_2_PASS; |
2489 | |
|
2490 | 0 | if(final_ratio < I_TO_AVG_REST_GOP_BIT_MIN_2_PASS) |
2491 | 0 | final_ratio = I_TO_AVG_REST_GOP_BIT_MIN_2_PASS; |
2492 | 0 | } |
2493 | | |
2494 | | /*based on offline runs to find I_BITS/(AVERAGE_CONSUMPTION_OF_REST_GOP)*/ |
2495 | | /* BITS FOR I |
2496 | | BITS = I_TO_AVG_REST_GOP * total_bits_period |
2497 | | ------------------------------------- |
2498 | | N - (num_I_in_period) + (I_TO_AVG_REST_GOP * num_I_in_period) |
2499 | | */ |
2500 | 810k | i4_tot_bits_for_scd_frame = bit_alloc_get_intra_bits( |
2501 | 810k | ps_bit_allocation, |
2502 | 810k | ps_pic_handling, |
2503 | 810k | ps_cbr_buf_handling, |
2504 | 810k | I_PIC, |
2505 | 810k | NULL, |
2506 | 810k | 1, |
2507 | 810k | final_ratio, |
2508 | 810k | i4_call_type, |
2509 | 810k | i4_non_I_scd, |
2510 | 810k | 0.0f); |
2511 | 810k | ps_bit_allocation->i4_excess_bits_from_buffer = 0; |
2512 | | |
2513 | 810k | if(i4_call_type == 1) |
2514 | 330k | { |
2515 | 330k | trace_printf("I_TO_AVG_REST_GOP_BIT used = %f\n", final_ratio); |
2516 | 330k | trace_printf(" SCD DETECTED bits allocated = %d", i4_tot_bits_for_scd_frame); |
2517 | 330k | } |
2518 | | |
2519 | | /* If the remaining bits in the period becomes negative then the estimated texture |
2520 | | bits would also become negative. This would send a feedback to the model which |
2521 | | may go for a toss. Thus sending the minimum possible value = 0 */ |
2522 | 810k | if(i4_tot_bits_for_scd_frame < 0) |
2523 | 0 | i4_tot_bits_for_scd_frame = 0; |
2524 | | |
2525 | 810k | return (i4_tot_bits_for_scd_frame); |
2526 | 810k | } |
2527 | | |
2528 | | /***************************************************************************** |
2529 | | Function Name : update_estimate_status |
2530 | | Description : Est texture bits in case of scene cut is obtained form offline |
2531 | | model. Update bit alloc |
2532 | | Inputs : ps_bit_allocation |
2533 | | e_pic_type |
2534 | | Revision History: |
2535 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2536 | | *****************************************************************************/ |
2537 | | |
2538 | | void update_estimate_status( |
2539 | | bit_allocation_t *ps_bit_allocation, |
2540 | | WORD32 i4_est_texture_bits, |
2541 | | WORD32 i4_hdr_bits, |
2542 | | WORD32 i4_est_text_bits_ctr_get_qp) |
2543 | 116k | { |
2544 | 116k | ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_get_qp] = i4_est_texture_bits; |
2545 | 116k | ps_bit_allocation->ai4_cur_frm_est_hdr_bits[i4_est_text_bits_ctr_get_qp] = i4_hdr_bits; |
2546 | 116k | } |
2547 | | |
2548 | | /***************************************************************************** |
2549 | | Function Name : bit_allocation_set_num_scd_lap_window |
2550 | | Description : |
2551 | | Inputs : ps_bit_allocation |
2552 | | i4_num_scd_in_lap_window |
2553 | | Revision History: |
2554 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2555 | | *****************************************************************************/ |
2556 | | void bit_allocation_set_num_scd_lap_window( |
2557 | | bit_allocation_t *ps_bit_allocation, |
2558 | | WORD32 i4_num_scd_in_lap_window, |
2559 | | WORD32 i4_num_frames_b4_Scd) |
2560 | 267k | { |
2561 | 267k | ps_bit_allocation->i4_num_scd_in_lap_window = i4_num_scd_in_lap_window; |
2562 | 267k | ps_bit_allocation->i4_num_frm_b4_scd = i4_num_frames_b4_Scd; |
2563 | | /*To avoid trashing I frame badly due to back to back scene cut limit the increment in Ni*/ |
2564 | 267k | if(ps_bit_allocation->i4_num_scd_in_lap_window > 2) |
2565 | 0 | ps_bit_allocation->i4_num_scd_in_lap_window = 2; |
2566 | 267k | } |
2567 | | /***************************************************************************** |
2568 | | Function Name : bit_allocation_set_sc_i_in_rc_look_ahead |
2569 | | Description : |
2570 | | Inputs : ps_bit_allocation |
2571 | | i4_next_sc_i_in_rc_look_ahead |
2572 | | Revision History: |
2573 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2574 | | *****************************************************************************/ |
2575 | | void bit_allocation_set_sc_i_in_rc_look_ahead( |
2576 | | bit_allocation_t *ps_bit_allocation, WORD32 i4_next_sc_i_in_rc_look_ahead) |
2577 | 0 | { |
2578 | 0 | ps_bit_allocation->i4_next_sc_i_in_rc_look_ahead = i4_next_sc_i_in_rc_look_ahead; |
2579 | 0 | } |
2580 | | /***************************************************************************** |
2581 | | Function Name : bit_allocation_update_gop_level_bit_error |
2582 | | Description : |
2583 | | Inputs : ps_bit_allocation |
2584 | | i4_error_bits |
2585 | | Revision History: |
2586 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2587 | | *****************************************************************************/ |
2588 | | void bit_allocation_update_gop_level_bit_error( |
2589 | | bit_allocation_t *ps_bit_allocation, WORD32 i4_error_bits) |
2590 | 168k | { |
2591 | 168k | ps_bit_allocation->i4_gop_level_bit_error += i4_error_bits; |
2592 | 168k | ps_bit_allocation->i4_frame_level_bit_error += i4_error_bits; |
2593 | | /*Error is (rdopt - entropy) Hence for total bit consumption subtract error*/ |
2594 | 168k | ps_bit_allocation->i8_cur_gop_bit_consumption -= i4_error_bits; |
2595 | 168k | } |
2596 | | |
2597 | | /****************************************************************************** |
2598 | | Function Name : rc_update_bit_distribution_gop_level_2pass |
2599 | | Description : This function distributes the bits to all the gops depending |
2600 | | on the complexities and the error bits accumulated until now |
2601 | | Arguments : ps_rate_control_api - rate control api handle |
2602 | | i4_start_gop_number : GOP number from which distribution should happen |
2603 | | Return Values : |
2604 | | Revision History: |
2605 | | |
2606 | | |
2607 | | Assumptions - |
2608 | | |
2609 | | Checks - |
2610 | | *****************************************************************************/ |
2611 | | void rc_update_bit_distribution_gop_level_2pass( |
2612 | | bit_allocation_t *ps_bit_allocation, |
2613 | | pic_handling_handle ps_pic_handle, |
2614 | | void *pv_gop_stat, |
2615 | | rc_type_e e_rc_type, |
2616 | | WORD32 i4_num_gop, |
2617 | | WORD32 i4_start_gop_number, |
2618 | | float f_avg_qscale_first_pass, |
2619 | | WORD32 i4_max_ebf, |
2620 | | WORD32 i4_ebf, |
2621 | | LWORD64 i8_tot_bits_sequence, |
2622 | | WORD32 i4_comp_error) |
2623 | 0 | { |
2624 | 0 | float cur_peak_factor, f_bits_per_frame; |
2625 | 0 | LWORD64 total_nbp_bits_allocated = 0; |
2626 | 0 | LWORD64 total_bp_bits_allocated = 0; |
2627 | 0 | LWORD64 total_bits_allocated = 0, prev_total_bits_allocated = -1; |
2628 | 0 | WORD32 |
2629 | 0 | i4_num_loop_inter_GOP_alloc = 0, ai4_peak_bitrate[MAX_NUM_DRAIN_RATES] = { 0 }, |
2630 | 0 | temp_i; /*Loop 20 times to meet precise bitrate, after that exit the loop and distribute remaining bits equally for all GOP*/ |
2631 | 0 | gop_level_stat_t *ps_cur_gop; |
2632 | 0 | WORD32 i4_num_frames_in_gop, i4_cur_gop_num, i4_num_frm_with_rmax, i4_num_frm_with_rmin; |
2633 | 0 | LWORD64 i8_max_bit_for_gop, /*i8_min_bit_for_gop,*/ i8_peak_bitrate, i8_frame_rate, |
2634 | 0 | i8_current_bitrate = (LWORD64)ba_get_2pass_avg_bit_rate(ps_bit_allocation); |
2635 | 0 | LWORD64 i8_actual_avg_bit_rate = ba_get_bit_rate(ps_bit_allocation); |
2636 | 0 | LWORD64 i8_num_frame_remaining = 0, i8_excess_bits = 0; |
2637 | 0 | float min_complexity_beyond_peak /*,f_max_complexity = 1.0f,f_min_complexity = 0.0f*/ |
2638 | 0 | ; //The minimum complexity for which bit allocation exceeds peak rate but |
2639 | 0 | float f_avg_bits_complexity_based; |
2640 | 0 | WORD32 i4_num_gop_not_rmax; |
2641 | 0 | LWORD64 i8_bits_for_this_gop; |
2642 | |
|
2643 | 0 | #define MAX_LOOP_INTER_GOP_ALLOC \ |
2644 | 0 | 20 /*The below loop shall run maximum of this macro once it exits allocate the difference bits equally for all the GOPS*/ |
2645 | |
|
2646 | 0 | i4_ebf = MAX(i4_ebf, 0); |
2647 | | //i4_ebf = 0; |
2648 | 0 | if(i4_start_gop_number == 0) |
2649 | 0 | { |
2650 | 0 | cur_peak_factor = 7.0; |
2651 | 0 | } |
2652 | 0 | else |
2653 | 0 | { |
2654 | 0 | cur_peak_factor = ps_bit_allocation->f_cur_peak_factor_2pass; |
2655 | 0 | } |
2656 | | /*Parsing of entire log file is done and summary of GOP level data has been updated in the temp, |
2657 | | Iteratively allocate the bits to make it meet bitrate*/ |
2658 | 0 | for(temp_i = i4_start_gop_number; temp_i < i4_num_gop; temp_i++) |
2659 | 0 | { |
2660 | 0 | ps_cur_gop = (gop_level_stat_t *)((gop_level_stat_t *)pv_gop_stat + temp_i); |
2661 | 0 | } |
2662 | 0 | i8_frame_rate = ba_get_frame_rate(ps_bit_allocation); |
2663 | 0 | ba_get_peak_bit_rate(ps_bit_allocation, &ai4_peak_bitrate[0]); |
2664 | 0 | i8_peak_bitrate = (LWORD64)ai4_peak_bitrate[0]; |
2665 | | |
2666 | | /*Modify the bitrate depending on the error bits and total bits*/ |
2667 | | //i8_current_bitrate = (LWORD64)((float)i8_tot_bits_sequence*i8_frame_rate/(1000*i8_num_frame_remaining)); |
2668 | |
|
2669 | 0 | f_bits_per_frame = (float)i8_current_bitrate / i8_frame_rate * 1000; |
2670 | 0 | ps_bit_allocation->i8_current_bitrate_2_pass = i8_current_bitrate; |
2671 | | //printf("\n%d current bitrate",i8_current_bitrate); |
2672 | |
|
2673 | 0 | do |
2674 | 0 | { |
2675 | | /*Get gop level stat*/ |
2676 | | /*recalculate the bits based on new scaling factor*/ |
2677 | 0 | total_bits_allocated = 0; |
2678 | 0 | total_bp_bits_allocated = 0; |
2679 | 0 | total_nbp_bits_allocated = 0; |
2680 | 0 | min_complexity_beyond_peak = |
2681 | 0 | (float)ps_bit_allocation->ai4_peak_bit_rate[0] / i8_current_bitrate; |
2682 | | |
2683 | | /*min_complexity_beyond_peak = ba_get_min_complexity_for_peak_br(ps_bit_allocation->ai4_peak_bit_rate[0], |
2684 | | (WORD32)i8_current_bitrate, |
2685 | | cur_peak_factor, |
2686 | | f_max_complexity, |
2687 | | f_min_complexity, |
2688 | | ps_bit_allocation->i4_ba_rc_pass);*/ |
2689 | |
|
2690 | 0 | for(i4_cur_gop_num = i4_start_gop_number; i4_cur_gop_num < i4_num_gop; i4_cur_gop_num++) |
2691 | 0 | { |
2692 | 0 | ps_cur_gop = (gop_level_stat_t *)((gop_level_stat_t *)pv_gop_stat + i4_cur_gop_num); |
2693 | 0 | ps_cur_gop->f_bits_complexity_l1_based_peak_factor = |
2694 | 0 | ps_cur_gop->f_bits_complexity_l1_based * cur_peak_factor; |
2695 | 0 | } |
2696 | 0 | i4_num_frm_with_rmax = 0; |
2697 | 0 | i4_num_frm_with_rmin = 0; |
2698 | 0 | f_avg_bits_complexity_based = 0.0; |
2699 | 0 | i4_num_gop_not_rmax = 0; |
2700 | 0 | i8_num_frame_remaining = 0; |
2701 | 0 | for(i4_cur_gop_num = i4_start_gop_number; i4_cur_gop_num < i4_num_gop; i4_cur_gop_num++) |
2702 | 0 | { |
2703 | 0 | ps_cur_gop = (gop_level_stat_t *)((gop_level_stat_t *)pv_gop_stat + i4_cur_gop_num); |
2704 | 0 | if(!ps_cur_gop->i4_peak_br_clip) |
2705 | 0 | { |
2706 | 0 | f_avg_bits_complexity_based += |
2707 | 0 | (ps_cur_gop->f_bits_complexity_l1_based * ps_cur_gop->i4_tot_frm_in_gop); |
2708 | 0 | i8_num_frame_remaining += ps_cur_gop->i4_tot_frm_in_gop; |
2709 | 0 | i4_num_gop_not_rmax++; |
2710 | 0 | } |
2711 | 0 | } |
2712 | 0 | f_avg_bits_complexity_based = (f_avg_bits_complexity_based / i8_num_frame_remaining); |
2713 | 0 | for(i4_cur_gop_num = i4_start_gop_number; i4_cur_gop_num < i4_num_gop; i4_cur_gop_num++) |
2714 | 0 | { |
2715 | | /*Parse through all the GOP*/ |
2716 | | /*get current gop data*/ |
2717 | | //i4_num_frames_in_gop = 0; |
2718 | 0 | LWORD64 i8_avg_bit_rate_bits; |
2719 | 0 | LWORD64 i8_curr_bit_rate_bits; |
2720 | 0 | ps_cur_gop = (gop_level_stat_t *)((gop_level_stat_t *)pv_gop_stat + i4_cur_gop_num); |
2721 | |
|
2722 | 0 | if(ps_cur_gop->i4_peak_br_clip) |
2723 | 0 | { |
2724 | 0 | i4_num_frm_with_rmax++; |
2725 | 0 | total_nbp_bits_allocated += ps_cur_gop->i8_bits_allocated_to_gop; |
2726 | 0 | continue; |
2727 | 0 | } |
2728 | 0 | ps_cur_gop->f_buffer_play_complexity = 0.; |
2729 | | //ps_cur_gop->f_gop_level_complexity_sum = -1; |
2730 | | //ps_cur_gop->i8_buffer_play_bits = 0; |
2731 | 0 | ps_cur_gop->i8_buffer_play_bits_allocated_to_gop = 0; |
2732 | 0 | i4_num_frames_in_gop = ps_cur_gop->i4_tot_frm_in_gop; |
2733 | |
|
2734 | 0 | if(i4_num_gop_not_rmax == i4_num_gop) |
2735 | 0 | { |
2736 | 0 | i8_bits_for_this_gop = |
2737 | 0 | (LWORD64)((i8_current_bitrate * i4_num_frames_in_gop * 1000) / i8_frame_rate); |
2738 | 0 | if(e_rc_type == VBR_STREAMING) |
2739 | 0 | { |
2740 | 0 | ps_cur_gop->i8_bits_allocated_to_gop = (LWORD64)( |
2741 | 0 | (ps_cur_gop->f_bits_complexity_l1_based / (f_avg_bits_complexity_based)) * |
2742 | 0 | i8_bits_for_this_gop); |
2743 | 0 | } |
2744 | 0 | else |
2745 | 0 | { |
2746 | 0 | ps_cur_gop->i8_bits_allocated_to_gop = |
2747 | 0 | (LWORD64)(i8_current_bitrate * i4_num_frames_in_gop / i8_frame_rate * 1000); |
2748 | 0 | } |
2749 | 0 | } |
2750 | 0 | else |
2751 | 0 | { |
2752 | | //i8_bits_for_this_gop = (LWORD64)((i8_excess_bits * i4_num_frames_in_gop * 1000)/(i8_frame_rate*i4_num_gop_not_rmax)); |
2753 | 0 | i8_bits_for_this_gop = |
2754 | 0 | (LWORD64)((i8_excess_bits * i4_num_frames_in_gop) / (i8_num_frame_remaining)); |
2755 | 0 | if(e_rc_type == VBR_STREAMING) |
2756 | 0 | { |
2757 | 0 | ps_cur_gop->i8_bits_allocated_to_gop += (LWORD64)( |
2758 | 0 | (ps_cur_gop->f_bits_complexity_l1_based / (f_avg_bits_complexity_based)) * |
2759 | 0 | i8_bits_for_this_gop); |
2760 | 0 | } |
2761 | 0 | else |
2762 | 0 | { |
2763 | 0 | ASSERT(0); |
2764 | 0 | } |
2765 | 0 | } |
2766 | 0 | ps_cur_gop->i8_actual_bits_allocated_to_gop = ps_cur_gop->i8_bits_allocated_to_gop; |
2767 | | /*clip based on peak rate*/ |
2768 | 0 | i8_max_bit_for_gop = i8_peak_bitrate * i4_num_frames_in_gop * 1000 / i8_frame_rate; |
2769 | 0 | ps_cur_gop->i8_max_bit_for_gop = i8_max_bit_for_gop; |
2770 | 0 | ps_cur_gop->i4_peak_br_clip = 0; |
2771 | 0 | if(ps_cur_gop->i8_bits_allocated_to_gop > i8_max_bit_for_gop) |
2772 | 0 | { |
2773 | 0 | ps_cur_gop->i8_bits_allocated_to_gop = i8_max_bit_for_gop; |
2774 | 0 | ps_cur_gop->i4_peak_br_clip = 1; |
2775 | 0 | i4_num_frm_with_rmax++; |
2776 | | /*if(ps_cur_gop->f_bits_complexity_l1_based < min_complexity_beyond_peak) |
2777 | | min_complexity_beyond_peak = ps_cur_gop->f_bits_complexity_l1_based;*/ |
2778 | 0 | } |
2779 | 0 | i8_curr_bit_rate_bits = |
2780 | 0 | (LWORD64)(i8_current_bitrate * i4_num_frames_in_gop / i8_frame_rate * 1000); |
2781 | 0 | i8_avg_bit_rate_bits = |
2782 | 0 | (LWORD64)(i8_actual_avg_bit_rate * i4_num_frames_in_gop / i8_frame_rate * 1000); |
2783 | 0 | ps_cur_gop->i4_is_below_avg_rate_gop_frame = 0; |
2784 | 0 | if(ps_cur_gop->i8_bits_allocated_to_gop < |
2785 | 0 | (MIN(i8_curr_bit_rate_bits, ps_cur_gop->i8_minimum_gop_bits))) |
2786 | 0 | { |
2787 | 0 | ps_cur_gop->i4_is_below_avg_rate_gop_frame = 1; |
2788 | 0 | ps_cur_gop->i8_bits_allocated_to_gop = |
2789 | 0 | MIN(i8_curr_bit_rate_bits, ps_cur_gop->i8_minimum_gop_bits); |
2790 | 0 | i4_num_frm_with_rmin++; |
2791 | 0 | } |
2792 | 0 | total_nbp_bits_allocated += ps_cur_gop->i8_bits_allocated_to_gop; |
2793 | 0 | } |
2794 | 0 | i4_num_loop_inter_GOP_alloc++; |
2795 | | /*check for tolerance of 0.5% in terms of meeting bitrate, terminate the loop when bitrate is met*/ |
2796 | 0 | total_bits_allocated = total_nbp_bits_allocated + total_bp_bits_allocated; |
2797 | 0 | if((total_bits_allocated < (1.005 * i8_tot_bits_sequence) && |
2798 | 0 | total_bits_allocated > (0.995 * i8_tot_bits_sequence)) || |
2799 | 0 | (i4_num_loop_inter_GOP_alloc > MAX_LOOP_INTER_GOP_ALLOC) /*|| (cur_peak_factor <= 1 )*/) |
2800 | 0 | { |
2801 | 0 | float error_bits = ((float)i8_tot_bits_sequence - total_bits_allocated); |
2802 | 0 | WORD32 temp_i; |
2803 | 0 | float f_per_frm_bits = ((float)(i8_current_bitrate)) / (i8_frame_rate / 1000); |
2804 | | //cur_peak_factor *= (float)i8_tot_bits_sequence/total_bits_allocated; |
2805 | 0 | if((i4_comp_error == 1) || ((i4_comp_error == 0) && (error_bits < 0))) |
2806 | 0 | { |
2807 | 0 | for(temp_i = i4_start_gop_number; temp_i < i4_num_gop; temp_i++) |
2808 | 0 | { |
2809 | 0 | ps_cur_gop = (gop_level_stat_t *)((gop_level_stat_t *)pv_gop_stat + temp_i); |
2810 | 0 | ps_cur_gop->i8_bits_allocated_to_gop += (LWORD64)( |
2811 | 0 | (error_bits * ps_cur_gop->i8_bits_allocated_to_gop / total_bits_allocated)); |
2812 | 0 | } |
2813 | 0 | } |
2814 | 0 | for(temp_i = i4_start_gop_number; temp_i < i4_num_gop; temp_i++) |
2815 | 0 | { |
2816 | 0 | ps_cur_gop = (gop_level_stat_t *)((gop_level_stat_t *)pv_gop_stat + temp_i); |
2817 | 0 | ps_cur_gop->f_avg_complexity_factor = (ps_cur_gop->f_bits_complexity_l1_based / |
2818 | 0 | ps_cur_gop->i8_bits_allocated_to_gop) * |
2819 | 0 | (f_per_frm_bits) * |
2820 | 0 | (ps_cur_gop->i4_tot_frm_in_gop); |
2821 | 0 | } |
2822 | 0 | break; |
2823 | 0 | } |
2824 | 0 | else |
2825 | 0 | { |
2826 | | /*Go for next iteration*/ |
2827 | 0 | cur_peak_factor *= (float)i8_tot_bits_sequence / total_bits_allocated; |
2828 | | //cur_peak_factor = MAX(cur_peak_factor,1); |
2829 | 0 | prev_total_bits_allocated = total_bits_allocated; |
2830 | 0 | i8_excess_bits = i8_tot_bits_sequence - total_bits_allocated; |
2831 | 0 | } |
2832 | |
|
2833 | 0 | } while(1); |
2834 | 0 | ps_bit_allocation->f_cur_peak_factor_2pass = cur_peak_factor; |
2835 | 0 | ps_bit_allocation->i8_total_bits_allocated = total_bits_allocated; |
2836 | | |
2837 | | /*Store complexity beyond which bits are clipped to peak rate*/ |
2838 | | /*if(i4_start_gop_number == 0)*/ |
2839 | 0 | { |
2840 | 0 | ps_bit_allocation->f_min_complexity_cross_peak_rate = /*min_complexity_beyond_peak*/ |
2841 | 0 | (float)ps_bit_allocation->ai4_peak_bit_rate[0] / i8_current_bitrate; |
2842 | | //ba_get_min_complexity_for_peak_br(ps_bit_allocation->ai4_peak_bit_rate[0],ps_bit_allocation->i4_bit_rate,cur_peak_factor,f_max_complexity,f_min_complexity,ps_bit_allocation->i4_ba_rc_pass); |
2843 | 0 | } |
2844 | 0 | } |
2845 | | |
2846 | | /***************************************************************************** |
2847 | | Function Name : get_prev_frame_total_header_bits |
2848 | | Description : |
2849 | | Inputs : ps_bit_allocation |
2850 | | e_pic_type |
2851 | | Revision History: |
2852 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2853 | | *****************************************************************************/ |
2854 | | void get_prev_frame_total_header_bits( |
2855 | | bit_allocation_t *ps_bit_allocation, |
2856 | | WORD32 *pi4_prev_frame_total_bits, |
2857 | | WORD32 *pi4_prev_frame_header_bits, |
2858 | | picture_type_e e_pic_type) |
2859 | 0 | { |
2860 | 0 | *pi4_prev_frame_total_bits = ps_bit_allocation->ai4_prev_frm_tot_bits[e_pic_type]; |
2861 | 0 | *pi4_prev_frame_header_bits = ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type]; |
2862 | 0 | } |
2863 | | |
2864 | | /***************************************************************************** |
2865 | | Function Name : bit_alloc_get_gop_num |
2866 | | Description : |
2867 | | Inputs : ps_bit_allocation |
2868 | | |
2869 | | Revision History: |
2870 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2871 | | *****************************************************************************/ |
2872 | | LWORD64 bit_alloc_get_gop_num(bit_allocation_t *ps_bit_allocation) |
2873 | 0 | { |
2874 | 0 | return (ps_bit_allocation->i8_cur_gop_num); |
2875 | 0 | } |
2876 | | /***************************************************************************** |
2877 | | Function Name : ba_get_min_bits_per_frame |
2878 | | Description : |
2879 | | Inputs : ps_bit_allocation |
2880 | | |
2881 | | Revision History: |
2882 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2883 | | *****************************************************************************/ |
2884 | | WORD32 ba_get_min_bits_per_frame(bit_allocation_t *ps_bit_allocation) |
2885 | 0 | { |
2886 | 0 | return (ps_bit_allocation->i4_min_bits_per_frm); |
2887 | 0 | } |
2888 | | /***************************************************************************** |
2889 | | Function Name : set_bit_allocation_i_frames |
2890 | | Description : |
2891 | | Inputs : ps_bit_allocation |
2892 | | |
2893 | | Revision History: |
2894 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2895 | | *****************************************************************************/ |
2896 | | void set_bit_allocation_i_frames( |
2897 | | bit_allocation_t *ps_bit_allocation, |
2898 | | cbr_buffer_handle ps_cbr_buffer, |
2899 | | pic_handling_handle ps_pic_handle, |
2900 | | WORD32 i4_lap_window_comp, |
2901 | | WORD32 i4_num_frames) |
2902 | 0 | { |
2903 | 0 | LWORD64 vbv_buffer_based_excess = 0; |
2904 | 0 | WORD32 i4_gop_correction; |
2905 | 0 | WORD32 i4_lap_window_comp_temp = i4_lap_window_comp; |
2906 | 0 | rc_type_e e_rc_type = get_rc_type(ps_cbr_buffer); |
2907 | 0 | if(e_rc_type == VBR_STREAMING) |
2908 | 0 | { |
2909 | 0 | if(((float)i4_lap_window_comp / 128) > ps_bit_allocation->f_min_complexity_cross_peak_rate) |
2910 | 0 | i4_lap_window_comp_temp = |
2911 | 0 | (WORD32)(ps_bit_allocation->f_min_complexity_cross_peak_rate * 128); |
2912 | | |
2913 | | /*Get excess bits if any from vbv buffer*/ |
2914 | 0 | vbv_buffer_based_excess = get_vbv_buffer_based_excess( |
2915 | 0 | ps_cbr_buffer, |
2916 | 0 | ps_bit_allocation->f_min_complexity_cross_peak_rate, |
2917 | 0 | ((float)i4_lap_window_comp / 128), |
2918 | 0 | i4_num_frames, |
2919 | 0 | 1); |
2920 | 0 | } |
2921 | 0 | i4_gop_correction = |
2922 | 0 | get_error_bits_for_desired_buf(ps_cbr_buffer, i4_lap_window_comp_temp, i4_num_frames); |
2923 | |
|
2924 | 0 | update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handle, 0); |
2925 | |
|
2926 | 0 | set_rbip(&ps_bit_allocation->s_rbip, (i4_gop_correction + (WORD32)vbv_buffer_based_excess)); |
2927 | |
|
2928 | 0 | update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handle, 0); |
2929 | 0 | } |
2930 | | |
2931 | | /***************************************************************************** |
2932 | | Function Name : bit_alloc_set_curr_i_to_sum_i |
2933 | | Description : |
2934 | | Inputs : ps_bit_allocation |
2935 | | |
2936 | | Revision History: |
2937 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2938 | | *****************************************************************************/ |
2939 | | void bit_alloc_set_curr_i_to_sum_i(bit_allocation_t *ps_bit_allocation, float f_curr_i_to_sum) |
2940 | 0 | { |
2941 | 0 | ps_bit_allocation->f_curr_i_to_sum = f_curr_i_to_sum; |
2942 | 0 | } |
2943 | | |
2944 | | /***************************************************************************** |
2945 | | Function Name : ba_set_gop_stat_in_bit_alloc |
2946 | | Description : |
2947 | | Inputs : ps_bit_allocation |
2948 | | |
2949 | | Revision History: |
2950 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2951 | | *****************************************************************************/ |
2952 | | void ba_set_gop_stat_in_bit_alloc(bit_allocation_t *ps_bit_allocation, void *pv_gop_stat_summary) |
2953 | 0 | { |
2954 | 0 | ps_bit_allocation->pv_gop_stat = pv_gop_stat_summary; |
2955 | 0 | } |
2956 | | /***************************************************************************** |
2957 | | Function Name : ba_get_luma_pels |
2958 | | Description : |
2959 | | Inputs : ps_bit_allocation |
2960 | | |
2961 | | Revision History: |
2962 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2963 | | *****************************************************************************/ |
2964 | | WORD32 ba_get_luma_pels(bit_allocation_t *ps_bit_allocation) |
2965 | 0 | { |
2966 | 0 | return (ps_bit_allocation->i4_luma_pels); |
2967 | 0 | } |
2968 | | /***************************************************************************** |
2969 | | Function Name : overflow_avoided_summation |
2970 | | Description : |
2971 | | Inputs : ps_bit_allocation |
2972 | | |
2973 | | Revision History: |
2974 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2975 | | *****************************************************************************/ |
2976 | | void overflow_avoided_summation(WORD32 *pi4_accumulator, WORD32 i4_input) |
2977 | 559k | { |
2978 | 559k | if((pi4_accumulator[0] > 0) && (((int)0x7fffffff - pi4_accumulator[0]) < i4_input)) |
2979 | 0 | pi4_accumulator[0] = 0x7fffffff; |
2980 | 559k | else if((pi4_accumulator[0] < 0) && (((int)0x80000000 - pi4_accumulator[0]) > i4_input)) |
2981 | 0 | pi4_accumulator[0] = 0x80000000; |
2982 | 559k | else |
2983 | 559k | pi4_accumulator[0] += i4_input; |
2984 | 559k | } |
2985 | | /***************************************************************************** |
2986 | | Function Name : ba_get_sum_complexity_segment_cross_peak |
2987 | | Description : |
2988 | | Inputs : ps_bit_allocation |
2989 | | |
2990 | | Revision History: |
2991 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
2992 | | *****************************************************************************/ |
2993 | | float ba_get_sum_complexity_segment_cross_peak(bit_allocation_t *ps_bit_allocation) |
2994 | 0 | { |
2995 | 0 | return (ps_bit_allocation->f_sum_complexity_segment_cross_peak); |
2996 | 0 | } |
2997 | | /***************************************************************************** |
2998 | | Function Name : ba_get_prev_frame_tot_est_bits |
2999 | | Description : |
3000 | | Inputs : ps_bit_allocation |
3001 | | |
3002 | | Revision History: |
3003 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3004 | | *****************************************************************************/ |
3005 | | WORD32 ba_get_prev_frame_tot_est_bits(bit_allocation_t *ps_bit_allocation, WORD32 i4_pic) |
3006 | 0 | { |
3007 | 0 | return (ps_bit_allocation->ai4_prev_frm_tot_est_bits[i4_pic]); |
3008 | 0 | } |
3009 | | /***************************************************************************** |
3010 | | Function Name : ba_get_prev_frame_tot_bits |
3011 | | Description : |
3012 | | Inputs : ps_bit_allocation |
3013 | | |
3014 | | Revision History: |
3015 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3016 | | *****************************************************************************/ |
3017 | | WORD32 ba_get_prev_frame_tot_bits(bit_allocation_t *ps_bit_allocation, WORD32 i4_pic) |
3018 | 0 | { |
3019 | 0 | return (ps_bit_allocation->ai4_prev_frm_tot_bits[i4_pic]); |
3020 | 0 | } |
3021 | | /***************************************************************************** |
3022 | | Function Name : ba_gop_info_average_qscale_gop_without_offset |
3023 | | Description : |
3024 | | Inputs : ps_bit_allocation |
3025 | | |
3026 | | Revision History: |
3027 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3028 | | *****************************************************************************/ |
3029 | | float ba_gop_info_average_qscale_gop_without_offset(bit_allocation_t *ps_bit_allocation) |
3030 | 0 | { |
3031 | 0 | gop_level_stat_t *ps_gop_level_stat = |
3032 | 0 | (gop_level_stat_t *)ps_bit_allocation->pv_gop_stat + ps_bit_allocation->i8_cur_gop_num; |
3033 | |
|
3034 | 0 | return (ps_gop_level_stat->f_hbd_avg_q_scale_gop_without_offset); |
3035 | 0 | } |
3036 | | /***************************************************************************** |
3037 | | Function Name : ba_get_min_complexity_for_peak_br |
3038 | | Description : compute min complexity above which peak rate needs to be given |
3039 | | Inputs : i4_peak_bit_rate |
3040 | | |
3041 | | Revision History: |
3042 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3043 | | *****************************************************************************/ |
3044 | | float ba_get_min_complexity_for_peak_br( |
3045 | | WORD32 i4_peak_bit_rate, |
3046 | | WORD32 i4_bit_rate, |
3047 | | float f_peak_rate_factor, |
3048 | | float f_max_val, |
3049 | | float f_min_val, |
3050 | | WORD32 i4_pass) |
3051 | 5.03k | { |
3052 | 5.03k | float f_target_bits_ratio = (float)i4_peak_bit_rate / i4_bit_rate; |
3053 | 5.03k | float f_at_min_val; |
3054 | 5.03k | float f_at_max_val; |
3055 | 5.03k | float f_avg_val, f_at_avg_val; |
3056 | 5.03k | WORD32 i4_iter = 0, i4_max_iter = 25; |
3057 | | |
3058 | 5.03k | f_avg_val = (f_max_val + f_min_val) / 2; |
3059 | | /*i4_target_bits_ratio = (-1.7561*(X*X*X*X) + ( 2.5547 * X * X * X) - 0.3408 * (X * X) + (0.5343 * X) - 0.003) * 10;*/ |
3060 | 5.03k | if(i4_pass != 2) |
3061 | 5.03k | { |
3062 | 5.03k | f_at_min_val = COMP_TO_BITS_MAP(f_min_val, f_peak_rate_factor); |
3063 | 5.03k | f_at_max_val = COMP_TO_BITS_MAP(f_max_val, f_peak_rate_factor); |
3064 | 5.03k | f_at_avg_val = COMP_TO_BITS_MAP(f_avg_val, f_peak_rate_factor); |
3065 | 5.03k | } |
3066 | 0 | else |
3067 | 0 | { |
3068 | 0 | f_at_min_val = COMP_TO_BITS_MAP_2_PASS(f_min_val, f_peak_rate_factor); |
3069 | 0 | f_at_max_val = COMP_TO_BITS_MAP_2_PASS(f_max_val, f_peak_rate_factor); |
3070 | 0 | f_at_avg_val = COMP_TO_BITS_MAP_2_PASS(f_avg_val, f_peak_rate_factor); |
3071 | 0 | } |
3072 | | |
3073 | 5.03k | do |
3074 | 70.1k | { |
3075 | 70.1k | if((f_at_min_val < f_target_bits_ratio) && (f_target_bits_ratio < f_at_avg_val)) |
3076 | 44.0k | { |
3077 | 44.0k | f_max_val = f_avg_val; |
3078 | 44.0k | } |
3079 | 26.0k | else |
3080 | 26.0k | { |
3081 | 26.0k | f_min_val = f_avg_val; |
3082 | 26.0k | } |
3083 | 70.1k | f_avg_val = (f_max_val + f_min_val) / 2; |
3084 | | |
3085 | | /*i4_target_bits_ratio = (-1.7561*(X*X*X*X) + ( 2.5547 * X * X * X) - 0.3408 * (X * X) + (0.5343 * X) - 0.003) * 10;*/ |
3086 | 70.1k | if(i4_pass != 2) |
3087 | 70.1k | { |
3088 | 70.1k | f_at_min_val = COMP_TO_BITS_MAP(f_min_val, f_peak_rate_factor); |
3089 | 70.1k | f_at_max_val = COMP_TO_BITS_MAP(f_max_val, f_peak_rate_factor); |
3090 | 70.1k | f_at_avg_val = COMP_TO_BITS_MAP(f_avg_val, f_peak_rate_factor); |
3091 | 70.1k | } |
3092 | 0 | else |
3093 | 0 | { |
3094 | 0 | f_at_min_val = COMP_TO_BITS_MAP_2_PASS(f_min_val, f_peak_rate_factor); |
3095 | 0 | f_at_max_val = COMP_TO_BITS_MAP_2_PASS(f_max_val, f_peak_rate_factor); |
3096 | 0 | f_at_avg_val = COMP_TO_BITS_MAP_2_PASS(f_avg_val, f_peak_rate_factor); |
3097 | 0 | } |
3098 | | |
3099 | 70.1k | if(((fabs((float)(f_at_avg_val - f_target_bits_ratio))) <= .0001f) || |
3100 | 70.1k | (i4_iter >= i4_max_iter)) |
3101 | 5.03k | { |
3102 | 5.03k | break; |
3103 | 5.03k | } |
3104 | 65.1k | i4_iter++; |
3105 | 65.1k | } while(1); |
3106 | | |
3107 | | /*f_min_complexity_across_which pk br is given is unmapped value for 1 pass and mapped value for 2 pass*/ |
3108 | 5.03k | if(i4_pass != 2) |
3109 | 5.03k | return (f_avg_val); |
3110 | 0 | else |
3111 | 0 | return (f_at_avg_val); |
3112 | 5.03k | } |
3113 | | /***************************************************************************** |
3114 | | Function Name : get_f_curr_by_sum_subgop |
3115 | | Description : |
3116 | | Inputs : ps_bit_allocation |
3117 | | |
3118 | | Revision History: |
3119 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3120 | | *****************************************************************************/ |
3121 | | float get_f_curr_by_sum_subgop(bit_allocation_t *ps_bit_allocation) |
3122 | 0 | { |
3123 | 0 | return (ps_bit_allocation->f_curr_by_sum_subgop); |
3124 | 0 | } |
3125 | | /***************************************************************************** |
3126 | | Function Name : ba_get_frame_number_in_gop |
3127 | | Description : |
3128 | | Inputs : ps_bit_allocation |
3129 | | |
3130 | | Revision History: |
3131 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3132 | | *****************************************************************************/ |
3133 | | WORD32 ba_get_frame_number_in_gop(bit_allocation_t *ps_bit_allocation) |
3134 | 0 | { |
3135 | 0 | return ((WORD32)(ps_bit_allocation->i8_frm_num_in_gop)); |
3136 | 0 | } |
3137 | | /***************************************************************************** |
3138 | | Function Name : ba_get_qscale_max_clip_in_second_pass |
3139 | | Description : |
3140 | | Inputs : ps_bit_allocation |
3141 | | |
3142 | | Revision History: |
3143 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3144 | | *****************************************************************************/ |
3145 | | float ba_get_qscale_max_clip_in_second_pass(bit_allocation_t *ps_bit_allocation) |
3146 | 0 | { |
3147 | 0 | return (ps_bit_allocation->f_qscale_max_clip_in_second_pass); |
3148 | 0 | } |
3149 | | /***************************************************************************** |
3150 | | Function Name : ba_set_avg_qscale_first_pass |
3151 | | Description : |
3152 | | Inputs : ps_bit_allocation |
3153 | | |
3154 | | Revision History: |
3155 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3156 | | *****************************************************************************/ |
3157 | | void ba_set_avg_qscale_first_pass( |
3158 | | bit_allocation_t *ps_bit_allocation, float f_average_qscale_1st_pass) |
3159 | 0 | { |
3160 | 0 | ps_bit_allocation->f_average_qscale_1st_pass = f_average_qscale_1st_pass; |
3161 | 0 | } |
3162 | | /***************************************************************************** |
3163 | | Function Name : ba_set_max_avg_qscale_first_pass |
3164 | | Description : |
3165 | | Inputs : ps_bit_allocation |
3166 | | |
3167 | | Revision History: |
3168 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3169 | | *****************************************************************************/ |
3170 | | void ba_set_max_avg_qscale_first_pass( |
3171 | | bit_allocation_t *ps_bit_allocation, float f_average_qscale_1st_pass) |
3172 | 0 | { |
3173 | 0 | ps_bit_allocation->f_max_average_qscale_1st_pass = f_average_qscale_1st_pass; |
3174 | 0 | } |
3175 | | /***************************************************************************** |
3176 | | Function Name : ba_get_avg_qscale_first_pass |
3177 | | Description : |
3178 | | Inputs : ps_bit_allocation |
3179 | | |
3180 | | Revision History: |
3181 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3182 | | *****************************************************************************/ |
3183 | | float ba_get_avg_qscale_first_pass(bit_allocation_t *ps_bit_allocation) |
3184 | 0 | { |
3185 | 0 | return (ps_bit_allocation->f_average_qscale_1st_pass); |
3186 | 0 | } |
3187 | | /***************************************************************************** |
3188 | | Function Name : ba_get_max_avg_qscale_first_pass |
3189 | | Description : |
3190 | | Inputs : ps_bit_allocation |
3191 | | |
3192 | | Revision History: |
3193 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3194 | | *****************************************************************************/ |
3195 | | float ba_get_max_avg_qscale_first_pass(bit_allocation_t *ps_bit_allocation) |
3196 | 0 | { |
3197 | 0 | return (ps_bit_allocation->f_max_average_qscale_1st_pass); |
3198 | 0 | } |
3199 | | /***************************************************************************** |
3200 | | Function Name : bit_alloc_set_2pass_total_frames |
3201 | | Description : |
3202 | | Inputs : ps_bit_allocation |
3203 | | |
3204 | | Revision History: |
3205 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3206 | | *****************************************************************************/ |
3207 | | void bit_alloc_set_2pass_total_frames( |
3208 | | bit_allocation_t *ps_bit_allocation, WORD32 i4_total_2pass_frames) |
3209 | 0 | { |
3210 | 0 | ps_bit_allocation->i4_total_2pass_frames = i4_total_2pass_frames; |
3211 | 0 | } |
3212 | | /***************************************************************************** |
3213 | | Function Name : ba_get_2pass_total_frames |
3214 | | Description : |
3215 | | Inputs : ps_bit_allocation |
3216 | | |
3217 | | Revision History: |
3218 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3219 | | *****************************************************************************/ |
3220 | | WORD32 ba_get_2pass_total_frames(bit_allocation_t *ps_bit_allocation) |
3221 | 0 | { |
3222 | 0 | return (ps_bit_allocation->i4_total_2pass_frames); |
3223 | 0 | } |
3224 | | /***************************************************************************** |
3225 | | Function Name : ba_set_enable_look_ahead |
3226 | | Description : |
3227 | | Inputs : ps_bit_allocation |
3228 | | |
3229 | | Revision History: |
3230 | | DD MM YYYY Author(s) Changes (Describe the changes made) |
3231 | | *****************************************************************************/ |
3232 | | void ba_set_enable_look_ahead(bit_allocation_t *ps_bit_allocation, WORD32 i4_fp_bit_alloc_in_sp) |
3233 | 0 | { |
3234 | 0 | ps_bit_allocation->i4_fp_bit_alloc_in_sp = i4_fp_bit_alloc_in_sp; |
3235 | 0 | } |