Coverage Report

Created: 2026-06-13 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhevc/encoder/bit_allocation.c
Line
Count
Source
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
16.3k
#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
11.6k
{
170
11.6k
    WORD32 i4_tot_frms_in_gop = 0, i;
171
11.6k
    WORD32 ai4_actual_frms_in_gop[MAX_PIC_TYPE];
172
11.6k
    memset(ai4_actual_frms_in_gop, 0, MAX_PIC_TYPE * sizeof(WORD32));
173
11.6k
    pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_actual_frms_in_gop);
174
116k
    for(i = 0; i < MAX_PIC_TYPE; i++)
175
105k
    {
176
105k
        i4_tot_frms_in_gop += ai4_actual_frms_in_gop[i];
177
105k
    }
178
11.6k
    return (i4_tot_frms_in_gop);
179
11.6k
}
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
165
{
211
165
    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
165
    ps_rbip->i4_rem_bits_in_period =
219
165
        i4_bits_per_frm *
220
165
        (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
165
    ps_rbip->i4_tot_frms_in_gop = i4_tot_frms_in_gop;
225
165
    ps_rbip->i4_num_intra_frm_interval = i4_num_intra_frm_interval;
226
165
    ps_rbip->i4_bits_per_frm = i4_bits_per_frm;
227
165
}
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
11.5k
{
240
    /* NOTE: Intra frame interval changes aafter the first I frame that is encoded in a GOP */
241
11.5k
    WORD32 i4_new_tot_frms_in_gop = get_actual_num_frames_in_gop(ps_pic_handling);
242
11.5k
    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
11.5k
    ps_rbip->i4_tot_frms_in_gop = i4_new_tot_frms_in_gop;
251
11.5k
}
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
12.5k
{
263
12.5k
    WORD32 i4_bits_in_period =
264
12.5k
        pic_type_get_intra_frame_interval(ps_pic_handling) * ps_rbip->i4_bits_per_frm;
265
12.5k
    return (i4_bits_in_period);
266
12.5k
}
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
11.5k
{
278
11.5k
    check_update_rbip(ps_rbip, ps_pic_handling);
279
11.5k
    overflow_avoided_summation(&ps_rbip->i4_rem_bits_in_period, i4_num_of_bits);
280
11.5k
    return (ps_rbip->i4_rem_bits_in_period);
281
11.5k
}
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
177
{
345
177
    if(i4_new_bits_per_frm != ps_rbip->i4_bits_per_frm)
346
177
    {
347
177
        WORD32 i4_rem_frms_in_period =
348
177
            (ps_rbip->i4_num_intra_frm_interval) * ps_rbip->i4_tot_frms_in_gop;
349
177
        overflow_avoided_summation(
350
177
            &ps_rbip->i4_rem_bits_in_period,
351
177
            ((i4_new_bits_per_frm - ps_rbip->i4_bits_per_frm) * i4_rem_frms_in_period));
352
177
    }
353
177
    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
177
    ps_rbip->i4_num_intra_frm_interval = i4_new_num_intra_frm_interval;
362
177
    ps_rbip->i4_bits_per_frm = i4_new_bits_per_frm;
363
177
}
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
1.47k
{
369
1.47k
    WORD32 i4_mem_tab_idx = 0;
370
1.47k
    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
1.47k
    if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
375
1.26k
        (*pps_bit_allocation) = &s_bit_allocation_temp;
376
377
    /*for src rate control state structure*/
378
1.47k
    if(e_func_type != GET_NUM_MEMTAB)
379
633
    {
380
633
        fill_memtab(
381
633
            &ps_memtab[i4_mem_tab_idx],
382
633
            sizeof(bit_allocation_t),
383
633
            MEM_TAB_ALIGNMENT,
384
633
            PERSISTENT,
385
633
            DDR);
386
633
        use_or_fill_base(&ps_memtab[0], (void **)pps_bit_allocation, e_func_type);
387
633
    }
388
1.47k
    i4_mem_tab_idx++;
389
390
1.47k
    i4_mem_tab_idx += error_bits_num_fill_use_free_memtab(
391
1.47k
        &pps_bit_allocation[0]->ps_error_bits, &ps_memtab[i4_mem_tab_idx], e_func_type);
392
393
1.47k
    return (i4_mem_tab_idx);
394
1.47k
}
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
6.06k
{
418
6.06k
    WORD32 i, i4_estimated_bits;
419
6.06k
    number_t vq_bits_in_period, vq_frms_in_period[MAX_PIC_TYPE], vq_comp_coeff,
420
6.06k
        vq_est_texture_bits_for_frm;
421
6.06k
    WORD32 i4_num_scd_in_LAP_window = ps_bit_allocation->i4_num_scd_in_lap_window;
422
6.06k
    WORD32 i4_active_pic_types = ps_bit_allocation->i4_num_active_pic_type,
423
6.06k
           i4_field_pic = ps_bit_allocation->i4_field_pic;
424
6.06k
    float af_sum_weigh[MAX_PIC_TYPE][3];
425
426
6.06k
    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
6.06k
    i4_num_scd_in_LAP_window = 0;
430
6.06k
    pi4_frms_in_period[I_PIC] += i4_num_scd_in_LAP_window;
431
    /* Converting inputs to var_q format */
432
6.06k
    SET_VAR_Q(vq_bits_in_period, i4_bits_in_period, 0);
433
60.6k
    for(i = 0; i < MAX_PIC_TYPE; i++)
434
54.6k
    {
435
54.6k
        SET_VAR_Q(vq_frms_in_period[i], pi4_frms_in_period[i], 0);
436
54.6k
    }
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
6.06k
    if(i4_call_type == 1)
445
1.31k
    {
446
1.31k
        trace_printf("1 CUrr / avg %f", af_sum_weigh[e_pic_type][0]);
447
1.31k
    }
448
6.06k
    if(af_sum_weigh[e_pic_type][0] > 4.0f)
449
0
        af_sum_weigh[e_pic_type][0] = 4.0f;
450
6.06k
    if(af_sum_weigh[e_pic_type][0] < 0.3f)
451
0
        af_sum_weigh[e_pic_type][0] = 0.3f;
452
6.06k
    if(i4_call_type == 1)
453
1.31k
    {
454
1.31k
        trace_printf("2 CUrr / avg %f", af_sum_weigh[e_pic_type][0]);
455
1.31k
    }
456
457
6.06k
    if((ps_bit_allocation->i4_ba_rc_pass != 2) || (i4_call_type == 0) ||
458
0
       (ps_bit_allocation->i4_fp_bit_alloc_in_sp == 0))
459
6.06k
    {
460
6.06k
        convert_float_to_fix(af_sum_weigh[e_pic_type][0], &vq_comp_coeff);
461
6.06k
        mult32_var_q(vq_bits_in_period, vq_comp_coeff, &vq_bits_in_period);
462
6.06k
        mult32_var_q(vq_bits_in_period, pvq_complexity_estimate[e_pic_type], &vq_bits_in_period);
463
6.06k
    }
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
60.6k
    for(i = 0; i < MAX_PIC_TYPE; i++)
491
54.6k
    {
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
54.6k
        if(af_sum_weigh[i][1] == 0.0 &&
494
54.6k
           !((i4_call_type == 1) && (ps_bit_allocation->i4_ba_rc_pass == 2)))
495
54.6k
            af_sum_weigh[i][1] = (float)pi4_frms_in_period[i];
496
497
54.6k
        convert_float_to_fix(af_sum_weigh[i][1], &vq_comp_coeff);
498
54.6k
        mult32_var_q(vq_comp_coeff, pvq_complexity_estimate[i], &vq_frms_in_period[i]);
499
54.6k
    }
500
501
    /* changed the index range from active_pic to max_pic*/
502
6.06k
    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
6.06k
    else /*field case*/
514
6.06k
    {
515
12.3k
        for(i = 1; i < i4_active_pic_types; i++)
516
6.31k
        {
517
6.31k
            add32_var_q(vq_frms_in_period[I_PIC], vq_frms_in_period[i], &vq_frms_in_period[I_PIC]);
518
6.31k
        }
519
6.06k
    }
520
521
6.06k
    div32_var_q(vq_bits_in_period, vq_frms_in_period[I_PIC], &vq_est_texture_bits_for_frm);
522
6.06k
    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
6.06k
    if(!pi4_frms_in_period[e_pic_type])
526
1.14k
        i4_estimated_bits = 0;
527
6.06k
    return (i4_estimated_bits);
528
6.06k
}
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
20.8k
{
539
20.8k
    WORD32 i;
540
208k
    for(i = 0; i < MAX_PIC_TYPE; i++)
541
187k
    {
542
187k
        ps_bit_allocation->af_sum_weigh[i][0] = af_sum_weigh[i][0];
543
187k
        ps_bit_allocation->af_sum_weigh[i][1] = af_sum_weigh[i][1];
544
187k
        ps_bit_allocation->af_sum_weigh[i][2] = af_sum_weigh[i][2];
545
187k
    }
546
20.8k
}
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
165
{
572
165
    WORD32 i4_rem_bits_in_period, /* ai4_rem_frms_in_period[MAX_PIC_TYPE], */
573
165
        ai4_frms_in_period[MAX_PIC_TYPE], i, j;
574
165
    number_t avq_complexity_estimate[MAX_PIC_TYPE];
575
165
    WORD32 i4_field_pic;
576
165
    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
165
    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
165
    SET_VAR_Q(
583
165
        avq_complexity_estimate[I_PIC],
584
165
        (I_TO_P_BIT_RATIO * P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO),
585
165
        0);
586
165
    SET_VAR_Q(
587
165
        avq_complexity_estimate[P_PIC],
588
165
        (P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO),
589
165
        0);
590
165
    SET_VAR_Q(
591
165
        avq_complexity_estimate[P1_PIC],
592
165
        (P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO),
593
165
        0);
594
165
    SET_VAR_Q(avq_complexity_estimate[B_PIC], (B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), 0);
595
165
    SET_VAR_Q(avq_complexity_estimate[BB_PIC], (B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), 0);
596
165
    SET_VAR_Q(avq_complexity_estimate[B1_PIC], (B1_TO_B2_BIT_RATIO), 0);
597
165
    SET_VAR_Q(
598
165
        avq_complexity_estimate[B11_PIC],
599
165
        (B1_TO_B2_BIT_RATIO),
600
165
        0);  //temporarliy treat ref and non ref as same
601
165
    SET_VAR_Q(avq_complexity_estimate[B2_PIC], 1, 0);
602
165
    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
165
    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
1.65k
    for(j = 0; j < MAX_PIC_TYPE; j++)
610
1.48k
    {
611
1.48k
        ai4_frms_in_period[j] = (ai4_frms_in_period[j] * ps_bit_allocation->i4_num_gops_in_period);
612
1.48k
    }
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
165
    {
630
1.84k
#define FRAME_HEADER_BITS_Q_FACTOR (10)
631
165
        WORD32 ai4_header_bits_percentage[MAX_PIC_TYPE];
632
633
165
        WORD32 i4_bpp;
634
165
        X_PROD_Y_DIV_Z(
635
165
            ps_bit_allocation->i4_bits_per_frm,
636
165
            (1 << FRAME_HEADER_BITS_Q_FACTOR),
637
165
            ps_bit_allocation->i4_pels_in_frame,
638
165
            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
165
        if(i4_bpp > 131)
642
140
            ai4_header_bits_percentage[I_PIC] = 297;
643
25
        else
644
25
            ai4_header_bits_percentage[I_PIC] =
645
25
                ((-2238 * i4_bpp) >> FRAME_HEADER_BITS_Q_FACTOR) + 583;
646
165
        ai4_header_bits_percentage[P_PIC] = ((-2990 * i4_bpp) >> FRAME_HEADER_BITS_Q_FACTOR) + 845;
647
648
165
        ai4_header_bits_percentage[B_PIC] = ((-3308 * i4_bpp) >> FRAME_HEADER_BITS_Q_FACTOR) + 1135;
649
650
        /* Changes for 2B subGOP */
651
165
        ai4_header_bits_percentage[P_PIC] = (ai4_header_bits_percentage[P_PIC] * 13) >> 4;
652
165
        ai4_header_bits_percentage[P1_PIC] = (ai4_header_bits_percentage[P_PIC] * 13) >> 4;
653
165
        ai4_header_bits_percentage[B_PIC] = (ai4_header_bits_percentage[B_PIC] * 12) >> 4;
654
165
        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
165
        ai4_header_bits_percentage[B1_PIC] = ai4_header_bits_percentage[B_PIC];
657
165
        ai4_header_bits_percentage[B11_PIC] = ai4_header_bits_percentage[B_PIC];
658
165
        ai4_header_bits_percentage[B2_PIC] = ai4_header_bits_percentage[B_PIC];
659
165
        ai4_header_bits_percentage[B22_PIC] = ai4_header_bits_percentage[B_PIC];
660
661
1.65k
        for(i = 0; i < MAX_PIC_TYPE; i++)
662
1.48k
        {
663
1.48k
            ps_bit_allocation->af_sum_weigh[i][0] = 1.0;
664
1.48k
            ps_bit_allocation->af_sum_weigh[i][1] = 0.0;
665
1.48k
            ps_bit_allocation->af_sum_weigh[i][2] = 0.0;
666
1.48k
        }
667
668
1.65k
        for(i = 0; i < MAX_PIC_TYPE; i++)
669
1.48k
        {
670
            /* Getting the total bits allocated for each picture type */
671
1.48k
            WORD32 i4_num_bits_allocated = get_bits_based_on_complexity(
672
1.48k
                ps_bit_allocation,
673
1.48k
                i4_rem_bits_in_period,
674
1.48k
                ai4_frms_in_period,
675
1.48k
                avq_complexity_estimate,
676
1.48k
                (picture_type_e)i,
677
1.48k
                0);
678
679
1.48k
            if(ai4_header_bits_percentage[i] < 0)
680
1.09k
                ai4_header_bits_percentage[i] = 0;
681
682
1.48k
            ps_bit_allocation->i4_prev_frm_header_bits[i] = (WORD32)(
683
1.48k
                ((LWORD64)ai4_header_bits_percentage[i] * i4_num_bits_allocated) >>
684
1.48k
                FRAME_HEADER_BITS_Q_FACTOR);
685
1.48k
        }
686
165
    }
687
165
}
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
165
{
718
165
    WORD32 i;
719
165
    WORD32 i4_bits_per_frm, i4_max_bits_per_frm[MAX_NUM_DRAIN_RATES];
720
    /* Store the pels in frame value */
721
165
    ps_bit_allocation->i4_pels_in_frame = i4_pels_in_frame;
722
165
    ps_bit_allocation->i4_num_scd_in_lap_window = 0;
723
165
    ps_bit_allocation->i4_num_frm_b4_scd = 0;
724
165
    ps_bit_allocation->i4_num_active_pic_type = i4_num_active_pic_type;
725
165
    ps_bit_allocation->i4_field_pic = i4_field_pic;
726
165
    ps_bit_allocation->i4_ba_rc_pass = rc_pass;
727
165
    ps_bit_allocation->i4_br_id = 0; /* 0 - peak, 1 - average*/
728
165
    ps_bit_allocation->i8_cur_gop_num =
729
165
        0; /*Will be incremented after first frame allocation is done(during init itslef)*/
730
165
    ps_bit_allocation->i8_frm_num_in_gop = 0;
731
165
    ps_bit_allocation->pv_gop_stat =
732
165
        NULL; /*In 2 pass the gop stat pointer is set API parameter call*/
733
165
    ps_bit_allocation->f_min_complexity_cross_peak_rate =
734
165
        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
165
    ps_bit_allocation->f_cur_peak_factor_2pass = -1.0;
738
165
    ps_bit_allocation->i8_total_bits_allocated = -1;
739
165
    ps_bit_allocation->i4_luma_pels = i4_luma_pels;
740
165
    ps_bit_allocation->i4_num_gop = -1;
741
165
    ps_bit_allocation->f_sum_complexity_segment_cross_peak = 0.0f;
742
    //ps_bit_allocation->i8_vbv_based_excess_for_segment = 0;
743
165
    ps_bit_allocation->i4_flag_no_more_set_rbip = 0;
744
165
    ps_bit_allocation->f_curr_i_to_sum = 1.0f;
745
165
    ps_bit_allocation->i4_fp_bit_alloc_in_sp = i4_fp_bit_alloc_in_sp;
746
747
    /* Calculate the bits per frame */
748
165
    X_PROD_Y_DIV_Z(i4_bit_rate, 1000, i4_frm_rate, i4_bits_per_frm);
749
495
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
750
330
    {
751
330
        X_PROD_Y_DIV_Z(i4_peak_bit_rate[i], 1000, i4_frm_rate, i4_max_bits_per_frm[i]);
752
330
    }
753
    /* Initialize the bits_per_frame */
754
165
    ps_bit_allocation->i4_bits_per_frm = i4_bits_per_frm;
755
495
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
756
330
    {
757
330
        ps_bit_allocation->i4_max_bits_per_frm[i] = i4_max_bits_per_frm[i];
758
330
    }
759
165
    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
165
    init_rbip(
765
165
        &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
165
    ps_bit_allocation->i4_num_gops_in_period = i4_num_intra_frm_interval;
769
165
    ps_bit_allocation->i4_actual_num_gops_in_period = i4_num_intra_frm_interval;
770
771
    /* Relative complexity between I and P frames */
772
165
    ps_bit_allocation->i2_K[I_PIC] = (1 << K_Q);
773
165
    ps_bit_allocation->i2_K[P_PIC] = I_TO_P_RATIO;
774
165
    ps_bit_allocation->i2_K[P1_PIC] = I_TO_P_RATIO;
775
165
    ps_bit_allocation->i2_K[B_PIC] = (P_TO_B_RATIO * I_TO_P_RATIO) >> K_Q;
776
165
    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
165
    ps_bit_allocation->i2_K[B1_PIC] = (B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q);
780
165
    ps_bit_allocation->i2_K[B11_PIC] = (B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q);
781
165
    ps_bit_allocation->i2_K[B2_PIC] =
782
165
        (B1_TO_B2_RATIO * B_TO_B1_RATIO * P_TO_B_RATIO * I_TO_P_RATIO) >> (K_Q + K_Q + K_Q);
783
165
    ps_bit_allocation->i2_K[B22_PIC] =
784
165
        (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
165
    ps_bit_allocation->i4_saved_bits = 0;
788
789
    /* Update the error bits module with average bits */
790
165
    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
165
    ps_bit_allocation->i4_frame_rate = i4_frm_rate;
793
165
    ps_bit_allocation->i4_bit_rate = i4_bit_rate;
794
495
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
795
330
        ps_bit_allocation->ai4_peak_bit_rate[i] = i4_peak_bit_rate[i];
796
797
165
    ps_bit_allocation->i4_is_hbr = i4_is_hbr;
798
    /* Initilising the header bits to be used for each picture type */
799
165
    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
1.65k
    for(i = 0; i < MAX_PIC_TYPE; i++)
804
1.48k
    {
805
1.48k
        ps_bit_allocation->ai4_prev_frm_tot_bits[i] =
806
1.48k
            -1;  //-1 indicates that pic type has not been encoded
807
1.48k
        ps_bit_allocation->ai4_prev_frm_tot_est_bits[i] = -1;
808
1.48k
    }
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
165
    {
813
165
        WORD32 ai4_frms_in_period[MAX_PIC_TYPE];
814
165
        WORD32 ai4_actual_frms_in_period[MAX_PIC_TYPE], i4_actual_frms_in_period = 0;
815
165
        WORD32 i4_rem_texture_bits, j, i4_tot_header_bits_est = 0;
816
165
        number_t avq_complexity_estimate[MAX_PIC_TYPE];
817
165
        WORD32 i4_total_frms;
818
819
        /* Get the rem_frms_in_gop & the frms_in_gop from the pic_type state struct */
820
165
        pic_type_get_frms_in_gop(ps_pic_handling, ai4_frms_in_period);
821
165
        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
165
        i4_total_frms = 0;
824
1.65k
        for(j = 0; j < MAX_PIC_TYPE; j++)
825
1.48k
        {
826
1.48k
            ai4_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period;
827
1.48k
            ai4_actual_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period;
828
1.48k
            i4_total_frms += ai4_frms_in_period[j];
829
1.48k
            i4_actual_frms_in_period += ai4_actual_frms_in_period[j];
830
1.48k
        }
831
165
        ps_bit_allocation->i4_rem_frame_in_period = i4_actual_frms_in_period; /*i_only*/
832
833
1.65k
        for(j = 0; j < MAX_PIC_TYPE; j++)
834
1.48k
        {
835
1.48k
            i4_tot_header_bits_est +=
836
1.48k
                ai4_frms_in_period[j] * ps_bit_allocation->i4_prev_frm_header_bits[j];
837
1.48k
        }
838
        /* Remove the header bits from the remaining bits to find how many bits you
839
        can transfer.*/
840
165
        i4_rem_texture_bits =
841
165
            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
165
        SET_VAR_Q(avq_complexity_estimate[I_PIC], STATIC_I_TO_B2_RATIO, 0);
845
165
        SET_VAR_Q(avq_complexity_estimate[P_PIC], STATIC_P_TO_B2_RATIO, 0);
846
165
        SET_VAR_Q(avq_complexity_estimate[P1_PIC], STATIC_P_TO_B2_RATIO, 0);
847
165
        SET_VAR_Q(avq_complexity_estimate[B_PIC], STATIC_B_TO_B2_RATIO, 0);
848
165
        SET_VAR_Q(avq_complexity_estimate[BB_PIC], STATIC_B_TO_B2_RATIO, 0);
849
165
        SET_VAR_Q(avq_complexity_estimate[B1_PIC], STATIC_B1_TO_B2_RATIO, 0);
850
165
        SET_VAR_Q(avq_complexity_estimate[B11_PIC], STATIC_B1_TO_B2_RATIO, 0);
851
165
        SET_VAR_Q(avq_complexity_estimate[B2_PIC], 1, 0);
852
165
        SET_VAR_Q(avq_complexity_estimate[B22_PIC], 1, 0);
853
        /* Get the texture bits required for the current frame */
854
165
        ps_bit_allocation->i4_max_tex_bits_for_i = get_bits_based_on_complexity(
855
165
            ps_bit_allocation,
856
165
            i4_rem_texture_bits,
857
165
            ai4_frms_in_period,
858
165
            avq_complexity_estimate,
859
165
            I_PIC,
860
165
            0);
861
165
    }
862
    /* initialise the GOP and bit errors to zero */
863
165
    ps_bit_allocation->i4_gop_level_bit_error = 0;
864
165
    ps_bit_allocation->i4_frame_level_bit_error = 0;
865
1.48k
    for(i = 0; i < MAX_NUM_FRAME_PARALLEL; i++)
866
1.32k
    {
867
1.32k
        ps_bit_allocation->ai4_cur_frm_est_tex_bits[i] = 0;
868
1.32k
        ps_bit_allocation->ai4_cur_frm_est_hdr_bits[i] = 0;
869
1.32k
    }
870
165
    ps_bit_allocation->i4_buffer_based_bit_error = 0;
871
165
    ps_bit_allocation->i4_bits_from_buffer_in_cur_gop = 0;
872
165
    ps_bit_allocation->i4_excess_bits_from_buffer = 0;
873
165
    ps_bit_allocation->i4_lap_window = i4_lap_window;
874
165
    ps_bit_allocation->i8_cur_gop_bit_consumption = 0;
875
    //ps_bit_allocation->i8_2pass_gop_error_accum = 0;
876
165
    ps_bit_allocation->f_qscale_max_clip_in_second_pass = (float)0x7FFFFFFF;
877
878
    /*Buffer play for single pass*/
879
165
    if(rc_pass != 2)
880
165
    {
881
        /*Find ps_bit_allocation->f_min_complexity_cross_peak_rate*/
882
        /*Find the complexity which maps to peak bit-rate*/
883
165
        {
884
165
            ps_bit_allocation->f_min_complexity_cross_peak_rate = ba_get_min_complexity_for_peak_br(
885
165
                i4_peak_bit_rate[0], i4_bit_rate, 10.0f, 1.0f, 0.0f, rc_pass);
886
165
        }
887
165
    }
888
889
165
    ps_bit_allocation->i4_total_2pass_frames = 0;
890
165
    ps_bit_allocation->i8_2pass_avg_bit_rate = -1;
891
165
}
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
18.1k
{
967
18.1k
    WORD32 ai4_frms_in_period[MAX_PIC_TYPE], ai4_frm_in_gop[MAX_PIC_TYPE], tot_frms_in_period = 0;
968
18.1k
    WORD32 i4_field_pic,
969
18.1k
        i4_safe_margin = 0,
970
18.1k
        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
18.1k
    WORD32 i4_buffer_size =
973
18.1k
        ((get_cbr_buffer_size(ps_cbr_buf_handling)) >> 4) * UPPER_THRESHOLD_EBF_Q4;
974
18.1k
    WORD32 i4_cur_buf_pos = get_cbr_ebf(ps_cbr_buf_handling), i4_max_buffer_based,
975
18.1k
           i4_max_buffer_based_I_pic, i, i4_num_scaled_frms = 1;
976
18.1k
    WORD32 i4_bit_alloc_window =
977
18.1k
        (ps_bit_allocation->s_rbip.i4_tot_frms_in_gop *
978
18.1k
         ps_bit_allocation->s_rbip.i4_num_intra_frm_interval);
979
18.1k
    WORD32 i4_num_buf_frms,
980
18.1k
        ai4_frms_in_baw[MAX_PIC_TYPE];  //window for which I frame bit allocation is done
981
18.1k
    WORD32 i4_bits_in_period, i4_frames_in_buf = 0, i4_default_bits_in_period = 0;
982
18.1k
    WORD32 i4_est_bits_for_I, i4_peak_drain_rate, i4_subgop_size;
983
18.1k
    rc_type_e rc_type = get_rc_type(ps_cbr_buf_handling);
984
18.1k
    pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_frm_in_gop);
985
986
181k
    for(i = 0; i < MAX_PIC_TYPE; i++)
987
162k
    {
988
162k
        ai4_frms_in_baw[i] =
989
162k
            ai4_frm_in_gop[i] * ps_bit_allocation->s_rbip.i4_num_intra_frm_interval;
990
162k
        ai4_frms_in_period[i] =
991
162k
            ai4_frm_in_gop[i] * ps_bit_allocation->s_rbip.i4_num_intra_frm_interval;
992
162k
        tot_frms_in_period += ai4_frm_in_gop[i];
993
162k
    }
994
995
18.1k
    if(i4_call_type == 1)
996
8.72k
    {
997
8.72k
        i4_default_bits_in_period = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0);
998
8.72k
        if((i4_default_bits_in_period + ps_bit_allocation->i4_frame_level_bit_error) <
999
8.72k
           (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
8.72k
        i4_bits_in_period = i4_default_bits_in_period + ps_bit_allocation->i4_frame_level_bit_error;
1004
8.72k
        if(i4_non_I_scd == 0)
1005
4.53k
        {
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
4.53k
            WORD32 i4_intra_int = pic_type_get_intra_frame_interval(ps_pic_handling);
1009
4.53k
            WORD32 i4_inter_int = pic_type_get_inter_frame_interval(ps_pic_handling);
1010
4.53k
            if((tot_frms_in_period ==
1011
4.53k
                (i4_intra_int - i4_inter_int + (1 << ps_bit_allocation->i4_field_pic))) &&
1012
4.35k
               (i4_intra_int != 1))
1013
3.82k
            {
1014
3.82k
                i4_bits_in_period =
1015
3.82k
                    (WORD32)(i4_bits_in_period * ((float)i4_intra_int / tot_frms_in_period));
1016
3.82k
            }
1017
4.53k
        }
1018
8.72k
        trace_printf("\nBits in period %d", i4_bits_in_period);
1019
8.72k
    }
1020
9.37k
    else
1021
9.37k
    {
1022
9.37k
        i4_bits_in_period = ret_rbip_default_preenc(&ps_bit_allocation->s_rbip, ps_pic_handling);
1023
1024
9.37k
        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
9.37k
    }
1027
1028
18.1k
    i4_peak_drain_rate = get_buf_max_drain_rate(ps_cbr_buf_handling);
1029
18.1k
    i4_num_buf_frms =
1030
18.1k
        (get_cbr_buffer_size(ps_cbr_buf_handling) + (ps_bit_allocation->i4_bits_per_frm >> 1)) /
1031
18.1k
        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
18.1k
    i4_num_buf_frms = i4_num_buf_frms * i4_peak_drain_rate / ps_bit_allocation->i4_bits_per_frm;
1035
1036
18.1k
    i4_field_pic = pic_type_get_field_pic(ps_pic_handling);
1037
1038
18.1k
    i4_subgop_size = pic_type_get_inter_frame_interval(ps_pic_handling);
1039
18.1k
    if(pvq_complexity_estimate == NULL)
1040
16.3k
        i4_cur_buf_pos = 0;
1041
1042
18.1k
    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
18.1k
    if(ps_bit_allocation->i4_lap_window < MINIMUM_VISIBILITY_B4_STATIC_I)
1046
18.1k
    {
1047
18.1k
        i4_lap_window = MINIMUM_VISIBILITY_B4_STATIC_I;
1048
18.1k
    }
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
18.1k
    if(i4_lap_window < MINIMUM_FRM_I_TO_REST_LAP_ENABLED)
1058
0
        i4_lap_window = MINIMUM_FRM_I_TO_REST_LAP_ENABLED;
1059
18.1k
    if(ps_bit_allocation->i4_ba_rc_pass != 2)
1060
18.1k
    {
1061
18.1k
        if(i4_lap_window < i4_num_buf_frms)
1062
18.1k
            i4_num_buf_frms = i4_lap_window;
1063
18.1k
    }
1064
1065
18.1k
    if(i4_num_buf_frms > tot_frms_in_period)
1066
15.3k
    {
1067
15.3k
        i4_num_buf_frms = tot_frms_in_period;
1068
15.3k
        i4_bit_alloc_window = i4_num_buf_frms;
1069
15.3k
    }
1070
    /*get picture type dist based on bit alloc window*/
1071
18.1k
    if(i4_num_buf_frms < tot_frms_in_period)
1072
2.77k
    {
1073
5.55k
        for(i = 1; i < ps_bit_allocation->i4_num_active_pic_type; i++)
1074
2.77k
        {
1075
2.77k
            ai4_frms_in_baw[i] =
1076
2.77k
                (ai4_frms_in_period[i] * i4_num_buf_frms + (tot_frms_in_period >> 1)) /
1077
2.77k
                tot_frms_in_period;
1078
2.77k
            i4_num_scaled_frms += ai4_frms_in_baw[i];
1079
2.77k
            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
2.77k
        }
1085
2.77k
        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
2.77k
        if(!ps_bit_allocation->i4_field_pic)
1092
2.77k
        {
1093
2.77k
            ai4_frms_in_baw[ps_bit_allocation->i4_num_active_pic_type - 1] +=
1094
2.77k
                (i4_num_buf_frms - i4_num_scaled_frms);
1095
2.77k
        }
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
2.77k
        i4_bits_in_period =
1104
2.77k
            ((LWORD64)i4_bits_in_period * i4_num_buf_frms + (tot_frms_in_period >> 1)) /
1105
2.77k
            tot_frms_in_period;
1106
2.77k
        i4_bit_alloc_window = i4_num_buf_frms;
1107
2.77k
    }
1108
1109
18.1k
    i4_safe_margin = (WORD32)(i4_buffer_size * 0.1);
1110
18.1k
    i4_max_buffer_based = ((LWORD64)i4_buffer_size - i4_cur_buf_pos) /
1111
18.1k
                          ps_bit_allocation->i4_bits_per_frm * i4_peak_drain_rate;
1112
18.1k
    i4_max_buffer_based_I_pic = i4_buffer_size - i4_cur_buf_pos;
1113
1114
181k
    for(i = 0; i < MAX_PIC_TYPE; i++)
1115
162k
    {
1116
162k
        i4_frames_in_buf += ai4_frms_in_baw[i];
1117
162k
    }
1118
1119
18.1k
    if((rc_type == VBR_STREAMING) && (i4_call_type == 1))
1120
7.67k
    {
1121
7.67k
        WORD32 i4_delay_frames = cbr_get_delay_frames(ps_cbr_buf_handling);
1122
7.67k
        i4_max_buffer_based =
1123
7.67k
            (i4_peak_drain_rate *
1124
7.67k
                 (ps_bit_allocation->s_rbip.i4_tot_frms_in_gop + (WORD32)(i4_delay_frames * 0.8f)) -
1125
7.67k
             i4_cur_buf_pos);
1126
1127
        /*RBIP is updated once it is restricted for an Intra period */
1128
7.67k
        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
7.67k
        i4_max_buffer_based =
1135
7.67k
            (i4_peak_drain_rate * (i4_frames_in_buf + (WORD32)(i4_delay_frames * 0.8f)) -
1136
7.67k
             i4_cur_buf_pos);
1137
7.67k
    }
1138
10.4k
    else
1139
10.4k
    {
1140
10.4k
        i4_max_buffer_based =
1141
10.4k
            ((((LWORD64)i4_buffer_size - i4_cur_buf_pos) / ps_bit_allocation->i4_bits_per_frm) +
1142
10.4k
             i4_frames_in_buf) *
1143
10.4k
            i4_peak_drain_rate;
1144
10.4k
    }
1145
1146
    /*the estimated bits for total period is clipped to buffer limits*/
1147
18.1k
    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
18.1k
    if((!i4_is_scd) &&
1152
1.79k
       (ps_bit_allocation->i4_num_frames_since_last_I_frame <
1153
1.79k
        (ps_bit_allocation->i4_frame_rate * 2) / 1000) &&
1154
1.69k
       (ps_bit_allocation->i4_ba_rc_pass != 2))
1155
1.69k
    {
1156
        /*returns texture bits*/
1157
1.69k
        LWORD64 i8_header_bits_in_previous_period = 0, i8_total_bits_in_previous_period = 0,
1158
1.69k
                i4_frames_in_header = 0;
1159
1.69k
        WORD32 i4_texture_bits = 0;
1160
1.69k
        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
16.9k
        for(i = 0; i < MAX_PIC_TYPE; i++)
1164
15.2k
        {
1165
15.2k
            i8_header_bits_in_previous_period +=
1166
15.2k
                (ps_bit_allocation->i4_prev_frm_header_bits[i] * ai4_frms_in_baw[i]);
1167
15.2k
            i8_total_bits_in_previous_period +=
1168
15.2k
                (ps_bit_allocation->ai4_prev_frm_tot_bits[i] * ai4_frms_in_baw[i]);
1169
15.2k
            i4_frames_in_header += ai4_frms_in_baw[i];
1170
15.2k
        }
1171
1172
1.69k
        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
1.69k
        else
1177
1.69k
        {
1178
1.69k
            f_percent_header_bits =
1179
1.69k
                (float)i8_header_bits_in_previous_period / i8_total_bits_in_previous_period;
1180
1.69k
            i4_texture_bits =
1181
1.69k
                i4_bits_in_period - (WORD32)(f_percent_header_bits * i4_bits_in_period);
1182
1.69k
        }
1183
1184
1.69k
        if(i4_call_type == 1)
1185
177
        {
1186
177
            trace_printf(
1187
177
                "\nHeader Bits in period %d, total_frames %d "
1188
177
                "i4_max_buffer_based %d ",
1189
177
                (WORD32)f_percent_header_bits * i4_bits_in_period,
1190
177
                i4_frames_in_header,
1191
177
                i4_max_buffer_based);
1192
177
        }
1193
1.69k
        i4_est_bits_for_I = get_bits_based_on_complexity(
1194
1.69k
            ps_bit_allocation,
1195
1.69k
            i4_texture_bits,
1196
1.69k
            ai4_frms_in_baw,
1197
1.69k
            pvq_complexity_estimate,
1198
1.69k
            e_pic_type,
1199
1.69k
            i4_call_type);
1200
        /*twice the bitrate */
1201
1.69k
        if(i4_est_bits_for_I > ((ps_bit_allocation->i4_bit_rate << 1) -
1202
1.69k
                                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
1.69k
        if(i4_est_bits_for_I >
1208
1.69k
           (i4_max_buffer_based_I_pic - ps_bit_allocation->i4_prev_frm_header_bits[I_PIC]))
1209
0
        {
1210
0
            i4_est_bits_for_I =
1211
0
                (i4_max_buffer_based_I_pic - ps_bit_allocation->i4_prev_frm_header_bits[I_PIC]);
1212
0
        }
1213
1.69k
    }
1214
16.4k
    else
1215
16.4k
    {
1216
        /*returns total bits incase of scene cut*/
1217
16.4k
        ASSERT(ai4_frms_in_baw[I_PIC] != 0);
1218
16.4k
        if((i4_non_I_scd == 1) && (i4_call_type == 1) &&
1219
4.19k
           (ps_bit_allocation->f_curr_i_to_sum != 1.0f))
1220
0
            ai4_frms_in_baw[I_PIC]++;
1221
1222
16.4k
        i4_est_bits_for_I = (WORD32)(
1223
16.4k
            (i4_bits_in_period * I_to_avg_rest * ai4_frms_in_baw[I_PIC]) /
1224
16.4k
            (ai4_frms_in_baw[I_PIC] * I_to_avg_rest +
1225
16.4k
             (i4_bit_alloc_window - ai4_frms_in_baw[I_PIC])));
1226
1227
16.4k
        if(i4_call_type == 1)
1228
8.55k
            i4_est_bits_for_I =
1229
8.55k
                (WORD32)((float)i4_est_bits_for_I * ps_bit_allocation->f_curr_i_to_sum);
1230
7.86k
        else
1231
7.86k
        {
1232
7.86k
            if(ai4_frms_in_baw[I_PIC] > 0)
1233
7.86k
                i4_est_bits_for_I = (WORD32)((float)i4_est_bits_for_I / ai4_frms_in_baw[I_PIC]);
1234
7.86k
        }
1235
1236
16.4k
        if(i4_call_type == 1)
1237
8.55k
        {
1238
8.55k
            trace_printf(
1239
8.55k
                "bits in period %d I_to_avg_rest %f f_curr_i_to_sum %f i "
1240
8.55k
                "frames %d i4_non_I_scd %d ",
1241
8.55k
                i4_bits_in_period,
1242
8.55k
                I_to_avg_rest,
1243
8.55k
                ps_bit_allocation->f_curr_i_to_sum,
1244
8.55k
                ai4_frms_in_baw[I_PIC],
1245
8.55k
                i4_non_I_scd);
1246
8.55k
        }
1247
1248
16.4k
        if(i4_est_bits_for_I > (ps_bit_allocation->i4_bit_rate << 1))
1249
198
            i4_est_bits_for_I = (ps_bit_allocation->i4_bit_rate << 1);
1250
16.4k
        if(i4_est_bits_for_I > i4_max_buffer_based_I_pic)
1251
216
            i4_est_bits_for_I = i4_max_buffer_based_I_pic;
1252
16.4k
    }
1253
1254
18.1k
    return i4_est_bits_for_I;
1255
18.1k
}
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
4.52k
{
1285
4.52k
    WORD32 i, j;
1286
4.52k
    WORD32 i4_est_texture_bits_for_frm;
1287
4.52k
    WORD32 i4_rem_texture_bits;
1288
4.52k
    number_t avq_complexity_estimate[MAX_PIC_TYPE];
1289
4.52k
    WORD32 ai4_frms_in_period[MAX_PIC_TYPE];
1290
4.52k
    WORD32 i4_max_consumable_bits, i4_est_tot_head_bits_period = 0, i4_total_bits_prev_gop = 0;
1291
4.52k
    WORD32 i4_field_pic, i4_inter_frame_int;
1292
4.52k
    WORD32 complexity_est = 0;
1293
4.52k
    float f_percent_head_bits = 0.0f;
1294
4.52k
    WORD32 i4_intra_frm_int;
1295
4.52k
    i4_intra_frm_int = pic_type_get_actual_intra_frame_interval(ps_pic_handling);
1296
4.52k
    i4_inter_frame_int = pic_type_get_inter_frame_interval(ps_pic_handling);
1297
4.52k
    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
4.52k
    {
1305
        /* Hardcoding the bit ratios between I, P and B same as during init time*/
1306
4.52k
        SET_VAR_Q(
1307
4.52k
            avq_complexity_estimate[I_PIC],
1308
4.52k
            (I_TO_P_BIT_RATIO * P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO),
1309
4.52k
            0);
1310
4.52k
        SET_VAR_Q(
1311
4.52k
            avq_complexity_estimate[P_PIC],
1312
4.52k
            (P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO),
1313
4.52k
            0);
1314
4.52k
        SET_VAR_Q(
1315
4.52k
            avq_complexity_estimate[P1_PIC],
1316
4.52k
            (P_TO_B_BIT_RATIO * B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO),
1317
4.52k
            0);
1318
4.52k
        SET_VAR_Q(avq_complexity_estimate[B_PIC], (B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), 0);
1319
4.52k
        SET_VAR_Q(avq_complexity_estimate[BB_PIC], (B_TO_B1_BIT_RATO0 * B1_TO_B2_BIT_RATIO), 0);
1320
4.52k
        SET_VAR_Q(
1321
4.52k
            avq_complexity_estimate[B1_PIC],
1322
4.52k
            (B1_TO_B2_BIT_RATIO),
1323
4.52k
            0);  //temporarliy treat ref and non ref as same
1324
4.52k
        SET_VAR_Q(avq_complexity_estimate[B11_PIC], (B1_TO_B2_BIT_RATIO), 0);
1325
4.52k
        SET_VAR_Q(avq_complexity_estimate[B2_PIC], 1, 0);
1326
4.52k
        SET_VAR_Q(avq_complexity_estimate[B22_PIC], 1, 0);
1327
4.52k
    }
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
4.52k
    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
45.2k
    for(j = 0; j < MAX_PIC_TYPE; j++)
1334
40.6k
    {
1335
        /* ai4_rem_frms_in_period[j] += (ai4_frms_in_period[j] * (ps_bit_allocation->i4_num_gops_in_period - 1)); */
1336
40.6k
        ai4_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period;
1337
40.6k
    }
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
4.52k
    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
45.2k
    for(j = 0; j < MAX_PIC_TYPE; j++)
1350
40.6k
    {
1351
40.6k
        i4_est_tot_head_bits_period +=
1352
40.6k
            ai4_frms_in_period[j] * ps_bit_allocation->i4_prev_frm_header_bits[j];
1353
40.6k
        i4_total_bits_prev_gop +=
1354
40.6k
            ai4_frms_in_period[j] * ps_bit_allocation->ai4_prev_frm_tot_bits[j];
1355
40.6k
    }
1356
1357
4.52k
    {
1358
4.52k
        WORD32 ai4_actual_frms_in_gop[MAX_PIC_TYPE], i, i4_total_frames = 0;
1359
4.52k
        pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_actual_frms_in_gop);
1360
45.2k
        for(i = 0; i < MAX_PIC_TYPE; i++)
1361
40.6k
        {
1362
40.6k
            i4_total_frames += ai4_actual_frms_in_gop[i];
1363
40.6k
        }
1364
4.52k
        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
4.52k
        if(i4_call_type == 1)
1369
1.31k
        {
1370
1.31k
            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
1.31k
            else
1429
1.31k
            {
1430
                /* Remove the header bits from the remaining bits to find how many bits you
1431
            can transfer.*/
1432
1.31k
                WORD32 i4_rbip = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0);
1433
1.31k
                if((i4_rbip + ps_bit_allocation->i4_frame_level_bit_error) < (i4_rbip * 0.30))
1434
0
                {
1435
0
                    ps_bit_allocation->i4_frame_level_bit_error = 0;  //-(i4_rbip * 0.70);
1436
0
                }
1437
1.31k
                i4_rem_texture_bits = update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0) +
1438
1.31k
                                      ps_bit_allocation->i4_frame_level_bit_error;
1439
1440
1.31k
                i4_est_tot_head_bits_period = (WORD32)(
1441
1.31k
                    ((float)(i4_est_tot_head_bits_period) / (float)i4_total_bits_prev_gop) *
1442
1.31k
                    i4_rem_texture_bits);
1443
1444
1.31k
                if(i4_is_model_valid)
1445
1.31k
                {
1446
1.31k
                    i4_rem_texture_bits = i4_rem_texture_bits - i4_est_tot_head_bits_period;
1447
1.31k
                }
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
1.31k
                trace_printf(
1456
1.31k
                    "Remaining texture bits %d fbe %d ethp %d",
1457
1.31k
                    i4_rem_texture_bits,
1458
1.31k
                    ps_bit_allocation->i4_frame_level_bit_error,
1459
1.31k
                    i4_est_tot_head_bits_period);
1460
1.31k
            }
1461
1462
1.31k
            {
1463
1.31k
                WORD32 i4_drain_bits_per_frame = get_buf_max_drain_rate(ps_cbr_buffer), i4_ebf;
1464
1.31k
                WORD32 i4_delay = cbr_get_delay_frames(ps_cbr_buffer), max_buffer_level = 0,
1465
1.31k
                       rc_type = get_rc_type(ps_cbr_buffer);
1466
1467
1.31k
                if(rc_type == VBR_STREAMING)
1468
813
                    max_buffer_level = i4_drain_bits_per_frame * i4_delay;
1469
498
                else
1470
498
                    max_buffer_level = get_cbr_buffer_size(ps_cbr_buffer);
1471
1472
1.31k
                i4_ebf = get_cbr_ebf(ps_cbr_buffer);
1473
1474
1.31k
                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
1.31k
                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
1.31k
            }
1485
1.31k
        }
1486
3.21k
        else
1487
3.21k
        {
1488
3.21k
            i4_rem_texture_bits =
1489
3.21k
                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
3.21k
            i4_rem_texture_bits -= (WORD32)(i4_rem_texture_bits * 0.3f);
1492
3.21k
        }
1493
4.52k
    }
1494
1495
4.52k
    if(i4_use_model)
1496
4.16k
    {
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
41.6k
        for(i = 0; i < MAX_PIC_TYPE; i++)
1500
37.5k
        {
1501
37.5k
            number_t vq_lin_mod_coeff, vq_est_sad, vq_K;
1502
1503
37.5k
            if(ai4_frms_in_period[i] > 0) /*Added for field case */
1504
8.37k
            {
1505
                /* Getting the linear model coefficient */
1506
8.37k
                vq_lin_mod_coeff = get_linear_coefficient(pps_rd_model[i]);
1507
                /* Getting the estimated SAD */
1508
8.37k
                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
8.37k
                SET_VAR_Q(vq_K, ps_bit_allocation->i2_K[i], K_Q);
1511
                /* Complexity_estimate = [ (lin_mod_coeff * estimated_sad) / K factor ]  */
1512
8.37k
                mult32_var_q(vq_lin_mod_coeff, vq_est_sad, &vq_lin_mod_coeff);
1513
8.37k
                div32_var_q(vq_lin_mod_coeff, vq_K, &avq_complexity_estimate[i]);
1514
8.37k
            }
1515
37.5k
        }
1516
        /*flag to check if complexity estimate is available*/
1517
4.16k
        complexity_est = 1;
1518
1519
        /*HEVC_hierarchy: If complexity estimate = 0 for any pic type then use default ratios*/
1520
41.6k
        for(i = 0; i < MAX_PIC_TYPE; i++)
1521
37.5k
        {
1522
37.5k
            if(ai4_frms_in_period[i] > 0)
1523
8.37k
            {
1524
8.37k
                complexity_est = complexity_est && avq_complexity_estimate[i].sm;
1525
8.37k
            }
1526
37.5k
        }
1527
4.16k
    }
1528
1529
    /* Make the picture type of the SCD frame a I_PIC */
1530
4.52k
    if(i4_is_scd_frame && e_pic_type != I_PIC)
1531
0
        e_pic_type = I_PIC;
1532
1533
4.52k
    if(e_pic_type == I_PIC)
1534
1.79k
    {
1535
        /*clip min max values*/
1536
1.79k
        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
1.79k
        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
1.79k
        i4_est_texture_bits_for_frm = bit_alloc_get_intra_bits(
1543
1.79k
            ps_bit_allocation,
1544
1.79k
            ps_pic_handling,
1545
1.79k
            ps_cbr_buffer,
1546
1.79k
            e_pic_type,
1547
1.79k
            avq_complexity_estimate,
1548
1.79k
            0,
1549
1.79k
            i_to_avg_ratio,
1550
1.79k
            i4_call_type,
1551
1.79k
            0,
1552
1.79k
            f_percent_head_bits);
1553
1.79k
    }
1554
2.72k
    else
1555
2.72k
    {
1556
        /* Get the texture bits required for the current frame */
1557
2.72k
        i4_est_texture_bits_for_frm = get_bits_based_on_complexity(
1558
2.72k
            ps_bit_allocation,
1559
2.72k
            i4_rem_texture_bits,
1560
2.72k
            ai4_frms_in_period,
1561
2.72k
            avq_complexity_estimate,
1562
2.72k
            e_pic_type,
1563
2.72k
            i4_call_type);
1564
2.72k
    }
1565
1566
4.52k
    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
4.52k
    if(i4_est_texture_bits_for_frm < 0)
1572
5
        i4_est_texture_bits_for_frm = 0;
1573
1574
4.52k
    return (i4_est_texture_bits_for_frm);
1575
4.52k
}
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
9.45k
{
1594
    //ASSERT(ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type] == 0);
1595
9.45k
    return (ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type]);
1596
9.45k
}
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
12.3k
{
1619
12.3k
    return ((*ps_bit_allocation).i4_bits_per_frm);
1620
12.3k
}
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
1.78k
{
1702
1.78k
    WORD32 i4_error_bits = get_error_bits(ps_bit_allocation->ps_error_bits);
1703
1.78k
    WORD32 i4_intra_frm_int, i, i4_flag_no_error_calc = 0; /*i_only*/
1704
1.78k
    WORD32 i4_do_correction = 0;
1705
1.78k
    i4_intra_frm_int = pic_type_get_intra_frame_interval(ps_pic_handling);
1706
1.78k
    ps_bit_allocation->i4_rem_frame_in_period--;
1707
1708
    /*No frame level bit error for top layer pictures*/
1709
1710
1.78k
    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
1.78k
        (i4_is_pause_to_resume == 0);
1713
1714
    /* Update the remaining bits in period */
1715
1.78k
    ps_bit_allocation->i4_bits_from_buffer_in_cur_gop +=
1716
1.78k
        ps_bit_allocation->i4_excess_bits_from_buffer;
1717
1.78k
    ps_bit_allocation->i4_buffer_based_bit_error -= ps_bit_allocation->i4_excess_bits_from_buffer;
1718
1.78k
    ps_bit_allocation->i4_gop_level_bit_error +=
1719
1.78k
        (-(i4_total_frame_bits + i4_stuff_bits) + i4_error_bits +
1720
1.78k
         ps_bit_allocation->i4_bits_per_frm);
1721
1.78k
    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
1.78k
    ps_bit_allocation->i4_buffer_based_bit_error += i4_buffer_based_bit_error;
1726
1.78k
    ps_bit_allocation->i8_frm_num_in_gop++;
1727
1.78k
    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
1.78k
    if(e_pic_type == I_PIC)
1731
419
        ps_bit_allocation->i4_num_frames_since_last_I_frame = 1;
1732
1.36k
    else
1733
1.36k
        ps_bit_allocation->i4_num_frames_since_last_I_frame++;
1734
1735
1.78k
    if((!i4_suppress_bpic_update))
1736
1.78k
    {
1737
        //if(ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_update_qp] > 0)
1738
1.78k
        {
1739
1.78k
            ps_bit_allocation->ai4_prev_frm_tot_est_bits[e_pic_type] =
1740
1.78k
                ps_bit_allocation->ai4_cur_frm_est_hdr_bits[i4_est_text_bits_ctr_update_qp] +
1741
1.78k
                ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_update_qp];
1742
1743
1.78k
            ps_bit_allocation->i4_frame_level_bit_error +=
1744
1.78k
                (ps_bit_allocation->ai4_cur_frm_est_hdr_bits[i4_est_text_bits_ctr_update_qp] +
1745
1.78k
                 ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_update_qp] -
1746
1.78k
                 i4_total_frame_bits);
1747
1.78k
        }
1748
1749
1.78k
        trace_printf(
1750
1.78k
            "Prev frame header %d Total est %d total frame %d",
1751
1.78k
            ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type],
1752
1.78k
            ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_update_qp],
1753
1.78k
            i4_total_frame_bits);
1754
1.78k
    }
1755
1756
1.78k
    trace_printf(
1757
1.78k
        "  rbip = %d  frame lbe = %d    bbbe = %d  bfbicg = %d\n",
1758
1.78k
        update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, 0),
1759
1.78k
        ps_bit_allocation->i4_frame_level_bit_error,
1760
1.78k
        ps_bit_allocation->i4_buffer_based_bit_error,
1761
1.78k
        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
1.78k
    if(u1_is_scd)
1765
0
    {
1766
        /* Initilising the header bits to be used for each picture type */
1767
0
        init_prev_header_bits(ps_bit_allocation, ps_pic_handling);
1768
1769
        /*init tot bits consumed of previous frame*/
1770
0
        for(i = 0; i < MAX_PIC_TYPE; i++)
1771
0
        {
1772
0
            ps_bit_allocation->ai4_prev_frm_tot_bits[i] = -1;
1773
0
            ps_bit_allocation->ai4_prev_frm_tot_est_bits[i] = -1;
1774
0
        }
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
0
        ps_bit_allocation->i4_prev_frm_header_bits[I_PIC] = i4_model_updation_hdr_bits;
1779
0
        ps_bit_allocation->ai4_prev_frm_tot_bits[I_PIC] = i4_total_frame_bits;
1780
0
        ps_bit_allocation->ai4_prev_frm_tot_est_bits[I_PIC] = i4_total_frame_bits;
1781
        /*SCD allowed only for I_PIC*/
1782
0
        ASSERT(e_pic_type == I_PIC);
1783
1784
0
#define MAX_NUM_GOPS_IN_PERIOD (5)
1785
0
        if(ps_bit_allocation->i4_num_gops_in_period != 1 &&
1786
0
           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
0
    }
1800
1.78k
    else
1801
1.78k
    {
1802
        //ASSERT(i4_model_updation_hdr_bits == 0);
1803
1.78k
        if(!i4_suppress_bpic_update)
1804
1.78k
        {
1805
1.78k
            ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type] = i4_model_updation_hdr_bits;
1806
1.78k
            ps_bit_allocation->ai4_prev_frm_tot_bits[e_pic_type] = i4_total_frame_bits;
1807
1.78k
        }
1808
1.78k
    }
1809
1810
1.78k
    {
1811
        /* Removng the error due to buffer movement from gop level bit error */
1812
1.78k
        WORD32 i4_gop_correction = 0;
1813
1.78k
        WORD32 i4_cur_ebf = get_cbr_ebf(ps_cbr_buf_handle);
1814
1.78k
        WORD32 i4_vbv_size = get_cbr_buffer_size(ps_cbr_buf_handle);
1815
1.78k
        WORD32 i4_min_vbv_size = (WORD32)(i4_vbv_size * MIN_THRESHOLD_VBV_GOP_ERROR);
1816
1.78k
        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
1.78k
        if(ps_bit_allocation->i4_ba_rc_pass != 2)
1819
1.78k
        {
1820
1.78k
            WORD32 i4_inter_frame_interval = pic_type_get_inter_frame_interval(ps_pic_handling);
1821
1.78k
            LWORD64 vbv_buffer_based_excess = 0;
1822
1.78k
            WORD32 i4_lap_window_comp_temp = i4_lap_window_comp;
1823
1.78k
            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
1.78k
            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
1.78k
            if(ps_bit_allocation->i4_frame_level_bit_error > i4_max_vbv_size)
1893
272
            {
1894
272
                ps_bit_allocation->i4_frame_level_bit_error = i4_max_vbv_size;
1895
272
            }
1896
1.78k
            if((i4_last_frm_in_period) ||
1897
1.68k
               (i4_intra_frm_int == 1 && ps_bit_allocation->i4_rem_frame_in_period == 0))
1898
105
            { /*For 1st pass set the errors to 0 at end of a gop*/
1899
105
                ps_bit_allocation->i8_cur_gop_bit_consumption = 0;
1900
105
                ps_bit_allocation->i4_frame_level_bit_error = 0;
1901
105
                ps_bit_allocation->i4_bits_from_buffer_in_cur_gop = 0;
1902
105
                ps_bit_allocation->i4_rem_frame_in_period =
1903
105
                    ps_bit_allocation->i4_num_gops_in_period *
1904
105
                    i4_intra_frm_int; /*TBD: I only case*/
1905
105
                ps_bit_allocation->i8_frm_num_in_gop = 0;
1906
105
            }
1907
1.78k
        }
1908
1.78k
    }
1909
1910
1.78k
    if(i4_last_frm_in_period && i4_intra_frm_int != 1)
1911
104
    {
1912
        /* If the number of gops in period has been increased due to scene change, slowly bring in down
1913
           across the gops */
1914
104
        if(ps_bit_allocation->i4_num_gops_in_period >
1915
104
           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
104
    }
1924
    /*Check for complexity based bits reset in future with GOP*/
1925
1926
    /* Update the lower modules */
1927
1.78k
    update_error_bits(ps_bit_allocation->ps_error_bits);
1928
1.78k
}
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
177
{
1949
177
    WORD32 i4_new_avg_bits_per_frm, i4_new_peak_bits_per_frm[MAX_NUM_DRAIN_RATES];
1950
177
    int i;
1951
1952
    /* Calculate the new per frame bits */
1953
177
    X_PROD_Y_DIV_Z(i4_bit_rate, 1000, i4_frame_rate, i4_new_avg_bits_per_frm);
1954
1955
531
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
1956
354
    {
1957
354
        X_PROD_Y_DIV_Z(i4_peak_bit_rate[i], 1000, i4_frame_rate, i4_new_peak_bits_per_frm[i]);
1958
354
    }
1959
1960
531
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
1961
354
    {
1962
354
        ps_bit_allocation->i4_max_bits_per_frm[i] = i4_new_peak_bits_per_frm[i];
1963
354
    }
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
177
    change_rbip(
1971
177
        &ps_bit_allocation->s_rbip,
1972
177
        i4_new_avg_bits_per_frm,
1973
177
        ps_bit_allocation->i4_num_gops_in_period);
1974
1975
    /* Update the new average bits per frame */
1976
177
    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
177
    ps_bit_allocation->i4_min_bits_per_frm =
1982
177
        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
177
    if(i4_bit_rate != ps_bit_allocation->i4_bit_rate)
1986
177
    {
1987
177
        X_PROD_Y_DIV_Z(
1988
177
            ps_bit_allocation->i4_max_tex_bits_for_i,
1989
177
            i4_bit_rate,
1990
177
            ps_bit_allocation->i4_bit_rate,
1991
177
            ps_bit_allocation->i4_max_tex_bits_for_i);
1992
177
    }
1993
    /*#endif*/
1994
1995
177
    change_bitrate_in_error_bits(ps_bit_allocation->ps_error_bits, i4_bit_rate);
1996
177
    change_frm_rate_in_error_bits(ps_bit_allocation->ps_error_bits, i4_frame_rate);
1997
1998
    /* Store the modified frame_rate */
1999
177
    ps_bit_allocation->i4_frame_rate = i4_frame_rate;
2000
177
    ps_bit_allocation->i4_bit_rate = i4_bit_rate;
2001
531
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
2002
354
        ps_bit_allocation->ai4_peak_bit_rate[i] = i4_peak_bit_rate[i];
2003
177
}
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
177
{
2106
177
    return (ps_bit_allocation->i4_frame_rate);
2107
177
}
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
177
{
2117
177
    return (ps_bit_allocation->i4_bit_rate);
2118
177
}
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
1.01k
{
2391
1.01k
    return ps_bit_allocation->i2_K[e_pic_type];
2392
1.01k
}
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
16.3k
{
2419
16.3k
    WORD32 j;
2420
16.3k
    WORD32 i4_tot_bits_for_scd_frame;
2421
16.3k
    WORD32 i4_total_bits_in_period;
2422
    //number_t avq_complexity_estimate[MAX_PIC_TYPE];
2423
16.3k
    WORD32 /* ai4_rem_frms_in_period[MAX_PIC_TYPE], */
2424
16.3k
        ai4_frms_in_period[MAX_PIC_TYPE];
2425
16.3k
    WORD32 i4_max_consumable_bits;
2426
16.3k
    WORD32 i4_intra_frm_int;
2427
16.3k
    WORD32 ai4_actual_frms_in_gop[MAX_PIC_TYPE], i, i4_total_frames = 0;
2428
16.3k
    float final_ratio, f_sim = (float)i4_f_sim_lap / 128;
2429
2430
16.3k
    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
16.3k
    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
163k
    for(j = 0; j < MAX_PIC_TYPE; j++)
2438
146k
    {
2439
        /* ai4_rem_frms_in_period[j] += (ai4_frms_in_period[j] * (ps_bit_allocation->i4_num_gops_in_period - 1)); */
2440
146k
        ai4_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period;
2441
146k
    }
2442
2443
    /* Remove the header bits from the remaining bits to find how many bits you
2444
       can transfer.*/
2445
16.3k
    {
2446
16.3k
        i4_total_bits_in_period = ps_bit_allocation->s_rbip.i4_bits_per_frm *
2447
16.3k
                                  ps_bit_allocation->s_rbip.i4_tot_frms_in_gop;
2448
        //trace_printf(" SCD_rbip = %d",i4_total_bits_in_period);
2449
16.3k
    }
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
16.3k
    {
2453
16.3k
        pic_type_get_actual_frms_in_gop(ps_pic_handling, ai4_actual_frms_in_gop);
2454
163k
        for(i = 0; i < MAX_PIC_TYPE; i++)
2455
146k
        {
2456
146k
            i4_total_frames += ai4_frms_in_period[i];
2457
146k
        }
2458
16.3k
        i4_max_consumable_bits = ps_bit_allocation->i4_max_bits_per_frm[0] * i4_total_frames;
2459
16.3k
    }
2460
16.3k
    if(i4_total_bits_in_period > 0)
2461
16.3k
    {
2462
16.3k
        i4_total_bits_in_period = MIN(i4_total_bits_in_period, i4_max_consumable_bits);
2463
16.3k
    }
2464
16.3k
    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
16.3k
    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
16.3k
    if(ps_bit_allocation->i4_ba_rc_pass != 2)
2471
16.3k
    {
2472
        /*clip min max values*/
2473
16.3k
        if((i4_is_infinite_gop == 1) && (final_ratio > I_TO_AVG_REST_GOP_BIT_MAX_INFINITE))
2474
21
        {
2475
21
            final_ratio = I_TO_AVG_REST_GOP_BIT_MAX_INFINITE;
2476
21
        }
2477
16.2k
        else
2478
16.2k
        {
2479
16.2k
            if(final_ratio > I_TO_AVG_REST_GOP_BIT_MAX)
2480
131
                final_ratio = I_TO_AVG_REST_GOP_BIT_MAX;
2481
16.2k
        }
2482
16.3k
        if(final_ratio < I_TO_AVG_REST_GOP_BIT_MIN)
2483
38
            final_ratio = I_TO_AVG_REST_GOP_BIT_MIN;
2484
16.3k
    }
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
16.3k
    i4_tot_bits_for_scd_frame = bit_alloc_get_intra_bits(
2501
16.3k
        ps_bit_allocation,
2502
16.3k
        ps_pic_handling,
2503
16.3k
        ps_cbr_buf_handling,
2504
16.3k
        I_PIC,
2505
16.3k
        NULL,
2506
16.3k
        1,
2507
16.3k
        final_ratio,
2508
16.3k
        i4_call_type,
2509
16.3k
        i4_non_I_scd,
2510
16.3k
        0.0f);
2511
16.3k
    ps_bit_allocation->i4_excess_bits_from_buffer = 0;
2512
2513
16.3k
    if(i4_call_type == 1)
2514
8.55k
    {
2515
8.55k
        trace_printf("I_TO_AVG_REST_GOP_BIT used = %f\n", final_ratio);
2516
8.55k
        trace_printf(" SCD DETECTED   bits allocated = %d", i4_tot_bits_for_scd_frame);
2517
8.55k
    }
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
16.3k
    if(i4_tot_bits_for_scd_frame < 0)
2523
0
        i4_tot_bits_for_scd_frame = 0;
2524
2525
16.3k
    return (i4_tot_bits_for_scd_frame);
2526
16.3k
}
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
1.78k
{
2544
1.78k
    ps_bit_allocation->ai4_cur_frm_est_tex_bits[i4_est_text_bits_ctr_get_qp] = i4_est_texture_bits;
2545
1.78k
    ps_bit_allocation->ai4_cur_frm_est_hdr_bits[i4_est_text_bits_ctr_get_qp] = i4_hdr_bits;
2546
1.78k
}
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
3.21k
{
2561
3.21k
    ps_bit_allocation->i4_num_scd_in_lap_window = i4_num_scd_in_lap_window;
2562
3.21k
    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
3.21k
    if(ps_bit_allocation->i4_num_scd_in_lap_window > 2)
2565
0
        ps_bit_allocation->i4_num_scd_in_lap_window = 2;
2566
3.21k
}
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
2.40k
{
2591
2.40k
    ps_bit_allocation->i4_gop_level_bit_error += i4_error_bits;
2592
2.40k
    ps_bit_allocation->i4_frame_level_bit_error += i4_error_bits;
2593
    /*Error is (rdopt - entropy) Hence for total bit consumption subtract error*/
2594
2.40k
    ps_bit_allocation->i8_cur_gop_bit_consumption -= i4_error_bits;
2595
2.40k
}
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
11.6k
{
2978
11.6k
    if((pi4_accumulator[0] > 0) && (((int)0x7fffffff - pi4_accumulator[0]) < i4_input))
2979
0
        pi4_accumulator[0] = 0x7fffffff;
2980
11.6k
    else if((pi4_accumulator[0] < 0) && (((int)0x80000000 - pi4_accumulator[0]) > i4_input))
2981
0
        pi4_accumulator[0] = 0x80000000;
2982
11.6k
    else
2983
11.6k
        pi4_accumulator[0] += i4_input;
2984
11.6k
}
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
165
{
3052
165
    float f_target_bits_ratio = (float)i4_peak_bit_rate / i4_bit_rate;
3053
165
    float f_at_min_val;
3054
165
    float f_at_max_val;
3055
165
    float f_avg_val, f_at_avg_val;
3056
165
    WORD32 i4_iter = 0, i4_max_iter = 25;
3057
3058
165
    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
165
    if(i4_pass != 2)
3061
165
    {
3062
165
        f_at_min_val = COMP_TO_BITS_MAP(f_min_val, f_peak_rate_factor);
3063
165
        f_at_max_val = COMP_TO_BITS_MAP(f_max_val, f_peak_rate_factor);
3064
165
        f_at_avg_val = COMP_TO_BITS_MAP(f_avg_val, f_peak_rate_factor);
3065
165
    }
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
165
    do
3074
2.30k
    {
3075
2.30k
        if((f_at_min_val < f_target_bits_ratio) && (f_target_bits_ratio < f_at_avg_val))
3076
1.34k
        {
3077
1.34k
            f_max_val = f_avg_val;
3078
1.34k
        }
3079
965
        else
3080
965
        {
3081
965
            f_min_val = f_avg_val;
3082
965
        }
3083
2.30k
        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
2.30k
        if(i4_pass != 2)
3087
2.30k
        {
3088
2.30k
            f_at_min_val = COMP_TO_BITS_MAP(f_min_val, f_peak_rate_factor);
3089
2.30k
            f_at_max_val = COMP_TO_BITS_MAP(f_max_val, f_peak_rate_factor);
3090
2.30k
            f_at_avg_val = COMP_TO_BITS_MAP(f_avg_val, f_peak_rate_factor);
3091
2.30k
        }
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
2.30k
        if(((fabs((float)(f_at_avg_val - f_target_bits_ratio))) <= .0001f) ||
3100
2.14k
           (i4_iter >= i4_max_iter))
3101
165
        {
3102
165
            break;
3103
165
        }
3104
2.14k
        i4_iter++;
3105
2.14k
    } 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
165
    if(i4_pass != 2)
3109
165
        return (f_avg_val);
3110
0
    else
3111
0
        return (f_at_avg_val);
3112
165
}
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
}