Coverage Report

Created: 2025-07-11 06:43

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