Coverage Report

Created: 2026-08-13 07:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/encoder/irc_bit_allocation.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2015 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
/** Includes */
22
#include <stdio.h>
23
#include <string.h>
24
#include "irc_datatypes.h"
25
#include "irc_mem_req_and_acq.h"
26
#include "irc_common.h"
27
#include "irc_cntrl_param.h"
28
#include "irc_fixed_point_error_bits.h"
29
#include "irc_rd_model.h"
30
#include "irc_est_sad.h"
31
#include "irc_picture_type.h"
32
#include "irc_bit_allocation.h"
33
#include "irc_trace_support.h"
34
35
/** Macros **/
36
#define MIN(x,y)  ((x) < (y))? (x) : (y)
37
38
/* State structure for bit allocation */
39
typedef struct
40
{
41
    /* using var_q number as it can cross 31 bits for large intra frameinterval */
42
    number_t vq_rem_bits_in_period;
43
44
    /* Storing inputs */
45
    WORD32 i4_tot_frms_in_gop;
46
47
    WORD32 i4_num_intra_frm_interval;
48
49
    WORD32 i4_bits_per_frm;
50
51
} rem_bit_in_prd_t;
52
53
typedef struct bit_allocation_t
54
{
55
    rem_bit_in_prd_t s_rbip;
56
57
    /* A universal constant giving the relative complexity between pictures */
58
    WORD32 i2_K[MAX_PIC_TYPE];
59
60
    /* To get a estimate of the header bits consumed */
61
    WORD32 i4_prev_frm_header_bits[MAX_PIC_TYPE];
62
63
    WORD32 i4_bits_per_frm;
64
65
    WORD32 i4_num_gops_in_period;
66
67
    /* Num gops as set by rate control module */
68
    WORD32 i4_actual_num_gops_in_period;
69
70
    number_t vq_saved_bits;
71
72
    WORD32 i4_max_bits_per_frm[MAX_NUM_DRAIN_RATES];
73
74
    WORD32 i4_min_bits_per_frm;
75
76
    /* Error bits module */
77
    error_bits_handle ps_error_bits;
78
79
    /* Storing frame rate */
80
    WORD32 i4_frame_rate;
81
82
    WORD32 i4_bit_rate;
83
84
    WORD32 ai4_peak_bit_rate[MAX_NUM_DRAIN_RATES];
85
86
} bit_allocation_t;
87
88
static WORD32 get_number_of_frms_in_a_gop(pic_handling_handle ps_pic_handling)
89
127k
{
90
127k
    WORD32 i4_tot_frms_in_gop = 0, i;
91
127k
    WORD32 ai4_frms_in_gop[MAX_PIC_TYPE];
92
93
    /* Query the pic_handling struct for the rem frames in the period */
94
127k
    irc_pic_type_get_frms_in_gop(ps_pic_handling, ai4_frms_in_gop);
95
96
    /* Get the total frms in the gop */
97
127k
    i4_tot_frms_in_gop = 0;
98
508k
    for(i = 0; i < MAX_PIC_TYPE; i++)
99
381k
    {
100
381k
        i4_tot_frms_in_gop += ai4_frms_in_gop[i];
101
381k
    }
102
127k
    return (i4_tot_frms_in_gop);
103
127k
}
104
105
static void init_rbip(rem_bit_in_prd_t *ps_rbip,
106
                      pic_handling_handle ps_pic_handling,
107
                      WORD32 i4_bits_per_frm,
108
                      WORD32 i4_num_intra_frm_interval)
109
29.5k
{
110
29.5k
    WORD32 i4_tot_frms_in_gop = get_number_of_frms_in_a_gop(ps_pic_handling);
111
112
    /* rem_bits_in_period = bits_per_frm * tot_frms_in_gop * num_intra_frm_interval */
113
29.5k
    {
114
29.5k
        number_t vq_bits_per_frm, vq_tot_frms_in_gop, vq_num_intra_frm_interval;
115
29.5k
        number_t *pvq_rem_bits_in_period = &ps_rbip->vq_rem_bits_in_period;
116
117
29.5k
        SET_VAR_Q(vq_bits_per_frm, i4_bits_per_frm, 0);
118
29.5k
        SET_VAR_Q(vq_tot_frms_in_gop, i4_tot_frms_in_gop, 0);
119
29.5k
        SET_VAR_Q(vq_num_intra_frm_interval, i4_num_intra_frm_interval, 0);
120
121
        /* rem_bits_in_period = bits_per_frm * tot_frms_in_gop */
122
29.5k
        mult32_var_q(vq_bits_per_frm, vq_tot_frms_in_gop,
123
29.5k
                     pvq_rem_bits_in_period);
124
125
        /* rem_bits_in_period *= num_intra_frm_interval */
126
29.5k
        mult32_var_q(vq_num_intra_frm_interval, pvq_rem_bits_in_period[0],
127
29.5k
                     pvq_rem_bits_in_period);
128
29.5k
    }
129
130
    /*
131
     * Store the total number of frames in GOP value which is
132
     * used from module A
133
     */
134
29.5k
    ps_rbip->i4_tot_frms_in_gop = i4_tot_frms_in_gop;
135
29.5k
    ps_rbip->i4_num_intra_frm_interval = i4_num_intra_frm_interval;
136
29.5k
    ps_rbip->i4_bits_per_frm = i4_bits_per_frm;
137
29.5k
}
138
139
static void check_update_rbip(rem_bit_in_prd_t *ps_rbip,
140
                              pic_handling_handle ps_pic_handling)
141
85.4k
{
142
    /*
143
     * NOTE: Intra frame interval changes after the first I frame that is
144
     * encoded in a GOP
145
     */
146
85.4k
    WORD32 i4_new_tot_frms_in_gop = get_number_of_frms_in_a_gop(
147
85.4k
                    ps_pic_handling);
148
149
85.4k
    if(i4_new_tot_frms_in_gop != ps_rbip->i4_tot_frms_in_gop)
150
113
    {
151
113
        WORD32 i4_rem_frames_in_period =
152
113
                        ps_rbip->i4_num_intra_frm_interval
153
113
                                        * (i4_new_tot_frms_in_gop
154
113
                                                        - ps_rbip->i4_tot_frms_in_gop);
155
156
113
        number_t vq_rem_frms_in_period, s_bits_per_frm, vq_delta_bits_in_period;
157
158
113
        SET_VAR_Q(vq_rem_frms_in_period, i4_rem_frames_in_period, 0);
159
113
        SET_VAR_Q(s_bits_per_frm, ps_rbip->i4_bits_per_frm, 0);
160
161
        /* delta_bits_in_period = bits_per_frm * rem_frms_in_period */
162
113
        mult32_var_q(s_bits_per_frm, vq_rem_frms_in_period,
163
113
                     &vq_delta_bits_in_period);
164
165
        /* rem_bits_in_period += delta_bits_in_period */
166
113
        add32_var_q(vq_delta_bits_in_period, ps_rbip->vq_rem_bits_in_period,
167
113
                    &ps_rbip->vq_rem_bits_in_period);
168
113
    }
169
    /* Updated the new values */
170
85.4k
    ps_rbip->i4_tot_frms_in_gop = i4_new_tot_frms_in_gop;
171
85.4k
}
172
173
static void irc_ba_update_rbip(rem_bit_in_prd_t *ps_rbip,
174
                               pic_handling_handle ps_pic_handling,
175
                               number_t vq_num_bits)
176
85.4k
{
177
85.4k
    check_update_rbip(ps_rbip, ps_pic_handling);
178
179
    /* rem_bits_in_period += num_of_bits */
180
85.4k
    add32_var_q(vq_num_bits, ps_rbip->vq_rem_bits_in_period,
181
85.4k
                &ps_rbip->vq_rem_bits_in_period);
182
85.4k
}
183
184
static void irc_ba_change_rbip(rem_bit_in_prd_t *ps_rbip,
185
                               pic_handling_handle ps_pic_handling,
186
                               WORD32 i4_new_bits_per_frm,
187
                               WORD32 i4_new_num_intra_frm_interval)
188
97.6k
{
189
97.6k
    WORD32 ai4_rem_frms_in_period[MAX_PIC_TYPE], i4_rem_frms_in_gop, i;
190
97.6k
    irc_pic_type_get_rem_frms_in_gop(ps_pic_handling, ai4_rem_frms_in_period);
191
192
97.6k
    i4_rem_frms_in_gop = 0;
193
390k
    for(i = 0; i < MAX_PIC_TYPE; i++)
194
292k
        i4_rem_frms_in_gop += ai4_rem_frms_in_period[i];
195
196
97.6k
    if(i4_new_bits_per_frm != ps_rbip->i4_bits_per_frm)
197
14.7k
    {
198
14.7k
        WORD32 i4_rem_frms_in_period = (ps_rbip->i4_num_intra_frm_interval - 1)
199
14.7k
                        * ps_rbip->i4_tot_frms_in_gop + i4_rem_frms_in_gop;
200
201
14.7k
        number_t vq_rem_frms_in_period, vq_delta_bits_per_frm,
202
14.7k
                        vq_delta_bits_in_period;
203
204
        /* delta_bits_per_frm = new_bits_per_frm - old_bits_per_frm */
205
14.7k
        SET_VAR_Q(vq_delta_bits_per_frm,
206
14.7k
                  (i4_new_bits_per_frm - ps_rbip->i4_bits_per_frm), 0);
207
208
14.7k
        SET_VAR_Q(vq_rem_frms_in_period, i4_rem_frms_in_period, 0);
209
210
        /* delta_bits_in_period = delta_bits_per_frm * rem_frms_in_period */
211
14.7k
        mult32_var_q(vq_delta_bits_per_frm, vq_rem_frms_in_period,
212
14.7k
                     &vq_delta_bits_in_period);
213
214
        /* ps_rbip->rem_bits_in_period += delta_bits_in_period */
215
14.7k
        add32_var_q(vq_delta_bits_in_period, ps_rbip->vq_rem_bits_in_period,
216
14.7k
                    &ps_rbip->vq_rem_bits_in_period);
217
14.7k
    }
218
219
97.6k
    if(i4_new_num_intra_frm_interval != ps_rbip->i4_num_intra_frm_interval)
220
1.19k
    {
221
1.19k
        WORD32 i4_rem_frms_in_period = ps_rbip->i4_tot_frms_in_gop
222
1.19k
                        * (i4_new_num_intra_frm_interval
223
1.19k
                                        - ps_rbip->i4_num_intra_frm_interval);
224
225
1.19k
        number_t vq_rem_frms_in_period, vq_new_bits_per_frm,
226
1.19k
                        vq_delta_bits_in_period;
227
228
        /* new_bits_per_frm = new_new_bits_per_frm - old_new_bits_per_frm */
229
1.19k
        SET_VAR_Q(vq_new_bits_per_frm, i4_new_bits_per_frm, 0);
230
231
1.19k
        SET_VAR_Q(vq_rem_frms_in_period, i4_rem_frms_in_period, 0);
232
233
        /* delta_bits_in_period = new_bits_per_frm * rem_frms_in_period */
234
1.19k
        mult32_var_q(vq_new_bits_per_frm, vq_rem_frms_in_period,
235
1.19k
                     &vq_delta_bits_in_period);
236
237
        /* ps_rbip->rem_bits_in_period += delta_bits_in_period */
238
1.19k
        add32_var_q(vq_delta_bits_in_period, ps_rbip->vq_rem_bits_in_period,
239
1.19k
                    &ps_rbip->vq_rem_bits_in_period);
240
1.19k
    }
241
    /* Update the new value */
242
97.6k
    ps_rbip->i4_num_intra_frm_interval = i4_new_num_intra_frm_interval;
243
97.6k
    ps_rbip->i4_bits_per_frm = i4_new_bits_per_frm;
244
97.6k
}
245
246
WORD32 irc_ba_num_fill_use_free_memtab(bit_allocation_t **pps_bit_allocation,
247
                                       itt_memtab_t *ps_memtab,
248
                                       ITT_FUNC_TYPE_E e_func_type)
249
88.2k
{
250
88.2k
    WORD32 i4_mem_tab_idx = 0;
251
88.2k
    bit_allocation_t s_bit_allocation_temp;
252
253
    /*
254
     * Hack for all alloc, during which we don't have any state memory.
255
     * Dereferencing can cause issues
256
     */
257
88.2k
    if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
258
73.5k
        (*pps_bit_allocation) = &s_bit_allocation_temp;
259
260
    /*for src rate control state structure*/
261
88.2k
    if(e_func_type != GET_NUM_MEMTAB)
262
44.1k
    {
263
44.1k
        fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(bit_allocation_t),
264
44.1k
                    ALIGN_128_BYTE, PERSISTENT, DDR);
265
44.1k
        use_or_fill_base(&ps_memtab[0], (void**)pps_bit_allocation,
266
44.1k
                         e_func_type);
267
44.1k
    }
268
88.2k
    i4_mem_tab_idx++;
269
270
88.2k
    i4_mem_tab_idx += irc_error_bits_num_fill_use_free_memtab(
271
88.2k
                    &pps_bit_allocation[0]->ps_error_bits,
272
88.2k
                    &ps_memtab[i4_mem_tab_idx], e_func_type);
273
274
88.2k
    return (i4_mem_tab_idx);
275
88.2k
}
276
277
/*******************************************************************************
278
 Function Name : irc_ba_init_bit_allocation
279
 Description   : Initialize the bit_allocation structure.
280
 ******************************************************************************/
281
void irc_ba_init_bit_allocation(bit_allocation_t *ps_bit_allocation,
282
                                pic_handling_handle ps_pic_handling,
283
                                WORD32 i4_num_intra_frm_interval,
284
                                WORD32 i4_bit_rate,
285
                                WORD32 i4_frm_rate,
286
                                WORD32 *i4_peak_bit_rate,
287
                                WORD32 i4_min_bitrate)
288
29.5k
{
289
29.5k
    WORD32 i;
290
29.5k
    WORD32 i4_bits_per_frm, i4_max_bits_per_frm[MAX_NUM_DRAIN_RATES];
291
292
    /* Calculate the bits per frame */
293
29.5k
    X_PROD_Y_DIV_Z(i4_bit_rate, 1000, i4_frm_rate, i4_bits_per_frm);
294
88.7k
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
295
59.1k
    {
296
59.1k
        X_PROD_Y_DIV_Z(i4_peak_bit_rate[i], 1000, i4_frm_rate,
297
59.1k
                       i4_max_bits_per_frm[i]);
298
59.1k
    }
299
    /* Initialize the bits_per_frame */
300
29.5k
    ps_bit_allocation->i4_bits_per_frm = i4_bits_per_frm;
301
88.7k
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
302
59.1k
    {
303
59.1k
        ps_bit_allocation->i4_max_bits_per_frm[i] = i4_max_bits_per_frm[i];
304
59.1k
    }
305
29.5k
    X_PROD_Y_DIV_Z(i4_min_bitrate, 1000, i4_frm_rate,
306
29.5k
                   ps_bit_allocation->i4_min_bits_per_frm);
307
308
    /*
309
     * Initialize the rem_bits in period
310
     * The first gop in case of an OPEN GOP may have fewer B_PICs,
311
     * That condition is not taken care of
312
     */
313
29.5k
    init_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, i4_bits_per_frm,
314
29.5k
              i4_num_intra_frm_interval);
315
316
    /* Initialize the num_gops_in_period */
317
29.5k
    ps_bit_allocation->i4_num_gops_in_period = i4_num_intra_frm_interval;
318
29.5k
    ps_bit_allocation->i4_actual_num_gops_in_period = i4_num_intra_frm_interval;
319
320
    /* Relative complexity between I and P frames */
321
29.5k
    ps_bit_allocation->i2_K[I_PIC] = (1 << K_Q);
322
29.5k
    ps_bit_allocation->i2_K[P_PIC] = I_TO_P_RATIO;
323
29.5k
    ps_bit_allocation->i2_K[B_PIC] = (P_TO_B_RATIO * I_TO_P_RATIO) >> K_Q;
324
325
    /* Initialize the saved bits to 0*/
326
29.5k
    SET_VAR_Q(ps_bit_allocation->vq_saved_bits, 0, 0);
327
328
    /* Update the error bits module with average bits */
329
29.5k
    irc_init_error_bits(ps_bit_allocation->ps_error_bits, i4_frm_rate,
330
29.5k
                        i4_bit_rate);
331
    /* Store the input for implementing change in values */
332
29.5k
    ps_bit_allocation->i4_frame_rate = i4_frm_rate;
333
29.5k
    ps_bit_allocation->i4_bit_rate = i4_bit_rate;
334
335
29.5k
    memset(ps_bit_allocation->i4_prev_frm_header_bits, 0, sizeof(ps_bit_allocation->i4_prev_frm_header_bits));
336
88.7k
    for(i=0;i<MAX_NUM_DRAIN_RATES;i++)
337
59.1k
        ps_bit_allocation->ai4_peak_bit_rate[i] = i4_peak_bit_rate[i];
338
29.5k
}
339
340
/*******************************************************************************
341
 Function Name : get_cur_frm_est_bits
342
 Description   : Based on remaining bits in period and rd_model
343
 the number of bits required for the current frame is estimated.
344
 ******************************************************************************/
345
WORD32 irc_ba_get_cur_frm_est_texture_bits(bit_allocation_t *ps_bit_allocation,
346
                                           rc_rd_model_handle *pps_rd_model,
347
                                           est_sad_handle ps_est_sad,
348
                                           pic_handling_handle ps_pic_handling,
349
                                           picture_type_e e_pic_type)
350
26.8k
{
351
26.8k
    WORD32 i, j;
352
26.8k
    WORD32 i4_est_texture_bits_for_frm;
353
26.8k
    number_t vq_rem_texture_bits;
354
26.8k
    number_t vq_complexity_estimate[MAX_PIC_TYPE];
355
26.8k
    WORD32 i4_rem_frms_in_period[MAX_PIC_TYPE], i4_frms_in_period[MAX_PIC_TYPE];
356
26.8k
    number_t vq_max_consumable_bits;
357
26.8k
    number_t vq_rem_frms_in_period[MAX_PIC_TYPE], vq_est_texture_bits_for_frm;
358
26.8k
    number_t vq_prev_hdr_bits[MAX_PIC_TYPE];
359
26.8k
    number_t vq_num_bits;
360
26.8k
    WORD32 complexity_est = 0;
361
362
    /* Get the rem_frms_in_gop & the frms_in_gop from the pic_type state struct */
363
26.8k
    irc_pic_type_get_rem_frms_in_gop(ps_pic_handling, i4_rem_frms_in_period);
364
26.8k
    irc_pic_type_get_frms_in_gop(ps_pic_handling, i4_frms_in_period);
365
366
    /* Depending on the number of gops in a period, find the num_frms_in_prd */
367
107k
    for(j = 0; j < MAX_PIC_TYPE; j++)
368
80.5k
    {
369
80.5k
        i4_rem_frms_in_period[j] += (i4_frms_in_period[j]
370
80.5k
                        * (ps_bit_allocation->i4_num_gops_in_period - 1));
371
80.5k
        i4_frms_in_period[j] *= ps_bit_allocation->i4_num_gops_in_period;
372
80.5k
    }
373
374
    /* Remove the header bits from the remaining bits to find how many bits you
375
     can transfer.*/
376
26.8k
    SET_VAR_Q(vq_num_bits, 0, 0);
377
26.8k
    irc_ba_update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, vq_num_bits);
378
107k
    for(i = 0; i < MAX_PIC_TYPE; i++)
379
80.5k
    {
380
80.5k
        SET_VAR_Q(vq_rem_frms_in_period[i], i4_rem_frms_in_period[i], 0);
381
80.5k
        SET_VAR_Q(vq_prev_hdr_bits[i],
382
80.5k
                  ps_bit_allocation->i4_prev_frm_header_bits[i], 0);
383
80.5k
    }
384
26.8k
    {
385
        /*
386
         *rem_texture_bits = rem_bits_in_period -
387
         *(rem_frms_in_period[I_PIC] * prev_frm_header_bits[I_PIC]) -
388
         *(rem_frms_in_period[P_PIC] * prev_frm_header_bits[P_PIC]) -
389
         *(rem_frms_in_period[B_PIC] * prev_frm_header_bits[B_PIC]);
390
         */
391
26.8k
        number_t vq_rem_hdr_bits;
392
26.8k
        vq_rem_texture_bits = ps_bit_allocation->s_rbip.vq_rem_bits_in_period;
393
394
26.8k
        mult32_var_q(vq_prev_hdr_bits[I_PIC], vq_rem_frms_in_period[I_PIC],
395
26.8k
                     &vq_rem_hdr_bits);
396
26.8k
        sub32_var_q(vq_rem_texture_bits, vq_rem_hdr_bits, &vq_rem_texture_bits);
397
398
26.8k
        mult32_var_q(vq_prev_hdr_bits[P_PIC], vq_rem_frms_in_period[P_PIC],
399
26.8k
                     &vq_rem_hdr_bits);
400
26.8k
        sub32_var_q(vq_rem_texture_bits, vq_rem_hdr_bits, &vq_rem_texture_bits);
401
402
26.8k
        mult32_var_q(vq_prev_hdr_bits[B_PIC], vq_rem_frms_in_period[B_PIC],
403
26.8k
                     &vq_rem_hdr_bits);
404
26.8k
        sub32_var_q(vq_rem_texture_bits, vq_rem_hdr_bits, &vq_rem_texture_bits);
405
26.8k
    }
406
26.8k
    {
407
        /* max_consumable_bits =
408
         *(frms_in_period[I_PIC] * max_bits_per_frm[0] ) +
409
         *(frms_in_period[P_PIC] + frms_in_period[B_PIC] ) * max_bits_per_frm[1];
410
         */
411
26.8k
        number_t vq_max_bits, vq_max_bits_per_frm[2];
412
413
26.8k
        SET_VAR_Q(vq_max_bits_per_frm[0],
414
26.8k
                  ps_bit_allocation->i4_max_bits_per_frm[0], 0);
415
26.8k
        SET_VAR_Q(vq_max_bits_per_frm[1],
416
26.8k
                  ps_bit_allocation->i4_max_bits_per_frm[1], 0);
417
418
26.8k
        mult32_var_q(vq_rem_frms_in_period[I_PIC], vq_max_bits_per_frm[0],
419
26.8k
                     &vq_max_bits);
420
26.8k
        vq_max_consumable_bits = vq_max_bits;
421
422
26.8k
        mult32_var_q(vq_rem_frms_in_period[P_PIC], vq_max_bits_per_frm[1],
423
26.8k
                     &vq_max_bits);
424
26.8k
        add32_var_q(vq_max_bits, vq_max_consumable_bits,
425
26.8k
                    &vq_max_consumable_bits);
426
427
26.8k
        mult32_var_q(vq_rem_frms_in_period[B_PIC], vq_max_bits_per_frm[1],
428
26.8k
                     &vq_max_bits);
429
26.8k
        add32_var_q(vq_max_bits, vq_max_consumable_bits,
430
26.8k
                    &vq_max_consumable_bits);
431
26.8k
    }
432
433
    /* rem_texture_bits = MIN(rem_texture_bits, max_consumable_bits) */
434
26.8k
    MIN_VARQ(vq_max_consumable_bits, vq_rem_texture_bits, vq_rem_texture_bits);
435
436
    /* The bits are then allocated based on the relative complexity of the
437
     current frame with respect to that of the rest of the frames in period */
438
107k
    for(i = 0; i < MAX_PIC_TYPE; i++)
439
80.5k
    {
440
80.5k
        number_t vq_lin_mod_coeff, vq_est_sad, vq_K;
441
442
        /* Getting the linear model coefficient */
443
80.5k
        vq_lin_mod_coeff = irc_get_linear_coefficient(pps_rd_model[i]);
444
445
        /* Getting the estimated SAD */
446
80.5k
        SET_VAR_Q(vq_est_sad, irc_get_est_sad(ps_est_sad,i), 0);
447
448
        /* Making K factor a var Q format */
449
80.5k
        SET_VAR_Q(vq_K, ps_bit_allocation->i2_K[i], K_Q);
450
451
        /* Complexity_estimate = [ (lin_mod_coeff * estimated_sad) / K factor ]  */
452
80.5k
        mult32_var_q(vq_lin_mod_coeff, vq_est_sad, &vq_lin_mod_coeff);
453
80.5k
        div32_var_q(vq_lin_mod_coeff, vq_K, &vq_complexity_estimate[i]);
454
80.5k
    }
455
456
    /*
457
     * For simple cases, one of the complexities go to zero and in those cases
458
     * distribute the bits evenly among frames based on I_TO_P_RATIO
459
     */
460
461
    /* Also check the B-pictures complexity only in case they are present*/
462
26.8k
    if(i4_frms_in_period[B_PIC] == 0)
463
26.8k
    {
464
26.8k
        complexity_est = (vq_complexity_estimate[I_PIC]
465
18.5k
                        && vq_complexity_estimate[P_PIC]);
466
26.8k
    }
467
0
    else
468
0
    {
469
0
        complexity_est = (vq_complexity_estimate[I_PIC]
470
0
                        && vq_complexity_estimate[P_PIC]
471
0
                        && vq_complexity_estimate[B_PIC]);
472
0
    }
473
474
26.8k
    if(complexity_est)
475
10.3k
    {
476
        /*
477
         * Estimated texture bits =
478
         * (remaining bits) * (cur frm complexity)
479
         * ---------------------------------------
480
         * (num_i_frm*i_frm_complexity) + (num_p_frm*pfrm_complexity)
481
         *  + (b_frm * b_frm_cm)
482
         */
483
10.3k
        mult32_var_q(vq_rem_texture_bits, vq_complexity_estimate[e_pic_type],
484
10.3k
                     &vq_rem_texture_bits);
485
486
41.3k
        for(i = 0; i < MAX_PIC_TYPE; i++)
487
30.9k
        {
488
30.9k
            mult32_var_q(vq_rem_frms_in_period[i], vq_complexity_estimate[i],
489
30.9k
                         &vq_rem_frms_in_period[i]);
490
30.9k
        }
491
492
10.3k
        add32_var_q(vq_rem_frms_in_period[I_PIC], vq_rem_frms_in_period[P_PIC],
493
10.3k
                    &vq_rem_frms_in_period[I_PIC]);
494
495
10.3k
        add32_var_q(vq_rem_frms_in_period[I_PIC], vq_rem_frms_in_period[B_PIC],
496
10.3k
                    &vq_rem_frms_in_period[I_PIC]);
497
498
10.3k
        div32_var_q(vq_rem_texture_bits, vq_rem_frms_in_period[I_PIC],
499
10.3k
                    &vq_est_texture_bits_for_frm);
500
501
10.3k
        number_t_to_word32(vq_est_texture_bits_for_frm,
502
10.3k
                           &i4_est_texture_bits_for_frm);
503
10.3k
    }
504
16.5k
    else
505
16.5k
    {
506
16.5k
        number_t vq_i_to_p_bit_ratio, vq_rem_frms;
507
508
16.5k
        SET_VAR_Q(vq_i_to_p_bit_ratio, I_TO_P_BIT_RATIO, 0);
509
510
        /* rem_frms = ((I_TO_P_BIT_RATIO * rem_frms_in_period[I_PIC]) +
511
         * rem_frms_in_period[P_PIC]  +  rem_frms_in_period[B_PIC]);
512
         */
513
16.5k
        mult32_var_q(vq_rem_frms_in_period[I_PIC], vq_i_to_p_bit_ratio,
514
16.5k
                     &vq_rem_frms);
515
16.5k
        add32_var_q(vq_rem_frms_in_period[P_PIC], vq_rem_frms, &vq_rem_frms);
516
16.5k
        add32_var_q(vq_rem_frms_in_period[B_PIC], vq_rem_frms, &vq_rem_frms);
517
518
        /* est_texture_bits_for_frm = rem_texture_bits / rem_frms */
519
16.5k
        div32_var_q(vq_rem_texture_bits, vq_rem_frms,
520
16.5k
                    &vq_est_texture_bits_for_frm);
521
16.5k
        number_t_to_word32(vq_est_texture_bits_for_frm,
522
16.5k
                           &i4_est_texture_bits_for_frm);
523
524
16.5k
        i4_est_texture_bits_for_frm =
525
16.5k
                        (I_PIC == e_pic_type) ?
526
8.55k
                                        (i4_est_texture_bits_for_frm
527
8.55k
                                                        * I_TO_P_BIT_RATIO) :
528
16.5k
                                        i4_est_texture_bits_for_frm;
529
16.5k
    }
530
531
    /*
532
     * If the remaining bits in the period becomes negative then the estimated
533
     * texture bits would also become negative. This would send a feedback to
534
     * the model which may go for a toss. Thus sending the minimum possible
535
     * value = 0
536
     */
537
26.8k
    if(i4_est_texture_bits_for_frm < 0)
538
9.18k
    {
539
9.18k
        i4_est_texture_bits_for_frm = 0;
540
9.18k
    }
541
542
26.8k
    return (i4_est_texture_bits_for_frm);
543
26.8k
}
544
545
/******************************************************************************
546
 Function Name : irc_ba_get_cur_frm_est_header_bits
547
 Description   : Based on remaining bits in period and rd_model
548
                 the number of bits required for the current frame is estimated.
549
 ******************************************************************************/
550
WORD32 irc_ba_get_cur_frm_est_header_bits(bit_allocation_t *ps_bit_allocation,
551
                                          picture_type_e e_pic_type)
552
26.8k
{
553
26.8k
    return (ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type]);
554
26.8k
}
555
556
WORD32 irc_ba_get_rem_bits_in_period(bit_allocation_t *ps_bit_allocation,
557
                                     pic_handling_handle ps_pic_handling)
558
0
{
559
0
    WORD32 i4_rem_bits_in_gop = 0;
560
561
0
    number_t vq_num_bits;
562
0
    SET_VAR_Q(vq_num_bits, 0, 0);
563
564
0
    irc_ba_update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, vq_num_bits);
565
0
    number_t_to_word32(ps_bit_allocation->s_rbip.vq_rem_bits_in_period,
566
0
                       &i4_rem_bits_in_gop);
567
0
    return (i4_rem_bits_in_gop);
568
0
}
569
570
/*******************************************************************************
571
 Function Name : irc_ba_update_cur_frm_consumed_bits
572
 Description   : Based on remaining bits in period and rd_model
573
                 the number of bits required for the current frame is estimated.
574
 ******************************************************************************/
575
void irc_ba_update_cur_frm_consumed_bits(bit_allocation_t *ps_bit_allocation,
576
                                         pic_handling_handle ps_pic_handling,
577
                                         WORD32 i4_total_frame_bits,
578
                                         WORD32 i4_model_updation_hdr_bits,
579
                                         picture_type_e e_pic_type,
580
                                         UWORD8 u1_is_scd,
581
                                         WORD32 i4_last_frm_in_gop)
582
50.2k
{
583
50.2k
    WORD32 i4_error_bits = irc_get_error_bits(ps_bit_allocation->ps_error_bits);
584
585
    /* Update the remaining bits in period */
586
50.2k
    number_t vq_num_bits;
587
50.2k
    SET_VAR_Q(vq_num_bits, (-i4_total_frame_bits + i4_error_bits), 0);
588
589
50.2k
    irc_ba_update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, vq_num_bits);
590
591
    /*
592
     * Update the header bits so that it can be used as an estimate to the next
593
     * frame
594
     */
595
50.2k
    if(u1_is_scd)
596
2.63k
    {
597
        /*
598
         * In case of SCD, even though the frame type is P, it is equivalent to
599
         * a I frame and so the corresponding header bits is updated
600
         */
601
2.63k
        ps_bit_allocation->i4_prev_frm_header_bits[I_PIC] =
602
2.63k
                        i4_model_updation_hdr_bits;
603
604
2.63k
#define MAX_NUM_GOPS_IN_PERIOD (3)
605
2.63k
        if(ps_bit_allocation->i4_num_gops_in_period < MAX_NUM_GOPS_IN_PERIOD)
606
829
        {
607
            /*
608
             * Whenever there is a scene change increase the number of gops by
609
             * 2 so that the number of bits allocated is not very constrained
610
             */
611
829
            ps_bit_allocation->i4_num_gops_in_period += 2;
612
            /* Add the extra bits in GOP to remaining bits in period */
613
829
            irc_ba_change_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling,
614
829
                               ps_bit_allocation->i4_bits_per_frm,
615
829
                               ps_bit_allocation->i4_num_gops_in_period);
616
829
        }
617
2.63k
    }
618
47.6k
    else
619
47.6k
    {
620
47.6k
        ps_bit_allocation->i4_prev_frm_header_bits[e_pic_type] =
621
47.6k
                        i4_model_updation_hdr_bits;
622
47.6k
    }
623
624
50.2k
    if(i4_last_frm_in_gop)
625
7.74k
    {
626
7.74k
        WORD32 i4_tot_frms_in_gop = get_number_of_frms_in_a_gop(
627
7.74k
                ps_pic_handling);
628
7.74k
        number_t vq_total_frms_in_gop, vq_bits_per_frm, vq_num_bits_in_gop;
629
630
7.74k
        SET_VAR_Q(vq_total_frms_in_gop, i4_tot_frms_in_gop, 0);
631
7.74k
        SET_VAR_Q(vq_bits_per_frm, ps_bit_allocation->i4_bits_per_frm, 0);
632
633
7.74k
        mult32_var_q(vq_bits_per_frm, vq_total_frms_in_gop,
634
7.74k
                     &vq_num_bits_in_gop);
635
        /*
636
         * If the number of gops in period has been increased due to scene
637
         * change, slowly bring in down across the gops
638
         */
639
7.74k
        if(ps_bit_allocation->i4_num_gops_in_period
640
7.74k
                        > ps_bit_allocation->i4_actual_num_gops_in_period)
641
369
        {
642
369
            ps_bit_allocation->i4_num_gops_in_period--;
643
369
            irc_ba_change_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling,
644
369
                               ps_bit_allocation->i4_bits_per_frm,
645
369
                               ps_bit_allocation->i4_num_gops_in_period);
646
369
        }
647
        /*
648
         * If rem_bits_in_period < 0 decrease the number of bits allocated for
649
         * the next period else increase it
650
         */
651
7.74k
        irc_ba_update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling,
652
7.74k
                           vq_num_bits_in_gop);
653
7.74k
    }
654
    /* Update the lower modules */
655
50.2k
    irc_update_error_bits(ps_bit_allocation->ps_error_bits);
656
50.2k
}
657
658
void irc_ba_change_remaining_bits_in_period(bit_allocation_t *ps_bit_allocation,
659
                                            pic_handling_handle ps_pic_handling,
660
                                            WORD32 i4_bit_rate,
661
                                            WORD32 i4_frame_rate,
662
                                            WORD32 *i4_peak_bit_rate)
663
96.4k
{
664
96.4k
    WORD32 i4_new_avg_bits_per_frm;
665
96.4k
    WORD32 i4_new_peak_bits_per_frm[MAX_NUM_DRAIN_RATES];
666
96.4k
    WORD32 i4_rem_frms_in_period[MAX_PIC_TYPE];
667
96.4k
    int i;
668
669
    /* Calculate the new per frame bits */
670
96.4k
    X_PROD_Y_DIV_Z(i4_bit_rate, 1000, i4_frame_rate, i4_new_avg_bits_per_frm);
671
289k
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
672
192k
    {
673
192k
        X_PROD_Y_DIV_Z(i4_peak_bit_rate[i], 1000, i4_frame_rate,
674
192k
                       i4_new_peak_bits_per_frm[i]);
675
192k
    }
676
677
289k
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
678
192k
    {
679
192k
        ps_bit_allocation->i4_max_bits_per_frm[i] = i4_new_peak_bits_per_frm[i];
680
192k
    }
681
682
    /*
683
     * Get the rem_frms_in_prd & the frms_in_prd from the pic_type state
684
     * struct
685
     */
686
96.4k
    irc_pic_type_get_rem_frms_in_gop(ps_pic_handling, i4_rem_frms_in_period);
687
688
    /*
689
     * If the difference > 0(/ <0), the remaining bits in period needs to be
690
     * increased(/decreased) based on the remaining number of frames
691
     */
692
96.4k
    irc_ba_change_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling,
693
96.4k
                       i4_new_avg_bits_per_frm,
694
96.4k
                       ps_bit_allocation->i4_num_gops_in_period);
695
696
    /* Update the new average bits per frame */
697
96.4k
    ps_bit_allocation->i4_bits_per_frm = i4_new_avg_bits_per_frm;
698
    /* change the lower modules state */
699
96.4k
    irc_change_bitrate_in_error_bits(ps_bit_allocation->ps_error_bits,
700
96.4k
                                     i4_bit_rate);
701
96.4k
    irc_change_frm_rate_in_error_bits(ps_bit_allocation->ps_error_bits,
702
96.4k
                                      i4_frame_rate);
703
704
    /* Store the modified frame_rate */
705
96.4k
    ps_bit_allocation->i4_frame_rate = i4_frame_rate;
706
96.4k
    ps_bit_allocation->i4_bit_rate = i4_bit_rate;
707
289k
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
708
192k
        ps_bit_allocation->ai4_peak_bit_rate[i] = i4_peak_bit_rate[i];
709
96.4k
}
710
711
void irc_ba_change_ba_peak_bit_rate(bit_allocation_t *ps_bit_allocation,
712
                                    WORD32 *ai4_peak_bit_rate)
713
0
{
714
0
    WORD32 i;
715
716
    /* Calculate the bits per frame */
717
0
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
718
0
    {
719
0
        X_PROD_Y_DIV_Z(ai4_peak_bit_rate[i], 1000,
720
0
                       ps_bit_allocation->i4_frame_rate,
721
0
                       ps_bit_allocation->i4_max_bits_per_frm[i]);
722
0
        ps_bit_allocation->ai4_peak_bit_rate[i] = ai4_peak_bit_rate[i];
723
0
    }
724
0
}
725
726
/******************************************************************************
727
 * @brief Modifies the remaining bit in period for the gop which has fif.
728
 *      since fif would cause a new gop to be created, we need to add the number
729
 *      of encoded frames in the fif GOP worth of bits to remaining bits in
730
 *      period
731
 ******************************************************************************/
732
void irc_ba_change_rem_bits_in_prd_at_force_I_frame(bit_allocation_t *ps_bit_allocation,
733
                                                    pic_handling_handle ps_pic_handling)
734
602
{
735
602
    WORD32 i4_frms_in_period;
736
602
    number_t vq_frms_in_period, vq_bits_per_frm, vq_num_bits_in_period;
737
738
602
    i4_frms_in_period = irc_pic_type_get_frms_in_gop_force_I_frm(
739
602
                    ps_pic_handling);
740
602
    SET_VAR_Q(vq_frms_in_period, i4_frms_in_period, 0);
741
602
    SET_VAR_Q(vq_bits_per_frm, ps_bit_allocation->i4_bits_per_frm, 0);
742
743
602
    mult32_var_q(vq_bits_per_frm, vq_frms_in_period, &vq_num_bits_in_period);
744
745
602
    irc_ba_update_rbip(&ps_bit_allocation->s_rbip, ps_pic_handling, vq_num_bits_in_period);
746
602
}
747
748
void irc_ba_check_and_update_bit_allocation(bit_allocation_t *ps_bit_allocation,
749
                                            pic_handling_handle ps_pic_handling,
750
                                            WORD32 i4_cur_buf_size,
751
                                            WORD32 i4_max_buf_size,
752
                                            WORD32 i4_max_bits_inflow_per_frm,
753
                                            WORD32 i4_tot_frame_bits)
754
4.32k
{
755
756
4.32k
    number_t vq_max_drain_bits, vq_extra_bits, vq_less_bits,
757
4.32k
                    vq_allocated_saved_bits, vq_min_bits_for_period;
758
4.32k
    WORD32 i4_num_frms_in_period = get_number_of_frms_in_a_gop(ps_pic_handling);
759
4.32k
    number_t vq_rem_bits_in_period, vq_num_frms_in_period, vq_zero;
760
4.32k
    WORD32 b_rem_bits_gt_max_drain, b_rem_bits_lt_min_bits,
761
4.32k
                    b_saved_bits_gt_zero;
762
4.32k
    rem_bit_in_prd_t *ps_rbip = &ps_bit_allocation->s_rbip;
763
764
4.32k
    UNUSED(i4_cur_buf_size);
765
4.32k
    UNUSED(i4_max_buf_size);
766
4.32k
    UNUSED(i4_tot_frame_bits);
767
768
    /*
769
     * If the remaining bits is greater than what can be drained in that period
770
     * Clip the remaining bits in period to the maximum it can drain in that
771
     * period with the error of current buffer size.Accumulate the saved bits
772
     * if any. else if the remaining bits is lesser than the minimum bit rate
773
     * promised in that period Add the excess bits to remaining bits in period
774
     * and reduce it from the saved bits Else Provide the extra bits from the
775
     * "saved bits pool".
776
     */
777
    /*
778
     * max_drain_bits = num_gops_in_period * num_frms_in_period *
779
     * * max_bits_inflow_per_frm
780
     */
781
4.32k
    SET_VAR_Q(vq_num_frms_in_period,
782
4.32k
              (ps_bit_allocation->i4_num_gops_in_period * i4_num_frms_in_period),
783
4.32k
              0);
784
4.32k
    SET_VAR_Q(vq_max_drain_bits, i4_max_bits_inflow_per_frm, 0);
785
4.32k
    SET_VAR_Q(vq_zero, 0, 0);
786
4.32k
    mult32_var_q(vq_max_drain_bits, vq_num_frms_in_period, &vq_max_drain_bits);
787
788
    /*
789
     * min_bits_for_period = num_gops_in_period * num_frms_in_period *
790
     * min_bits_per_frm
791
     */
792
4.32k
    SET_VAR_Q(vq_min_bits_for_period, ps_bit_allocation->i4_min_bits_per_frm,
793
4.32k
              0);
794
4.32k
    mult32_var_q(vq_min_bits_for_period, vq_num_frms_in_period,
795
4.32k
                 &vq_min_bits_for_period);
796
797
4.32k
    vq_rem_bits_in_period = ps_rbip->vq_rem_bits_in_period;
798
799
    /* Evaluate rem_bits_in_period  > max_drain_bits      */
800
4.32k
    VQ_A_GT_VQ_B(ps_rbip->vq_rem_bits_in_period, vq_max_drain_bits,
801
4.32k
                 b_rem_bits_gt_max_drain);
802
803
    /* Evaluate rem_bits_in_period  < min_bits_for_period */
804
4.32k
    VQ_A_LT_VQ_B(ps_rbip->vq_rem_bits_in_period, vq_min_bits_for_period,
805
4.32k
                 b_rem_bits_lt_min_bits);
806
807
    /* Evaluate saved_bits  > 0 */
808
4.32k
    VQ_A_LT_VQ_B(ps_bit_allocation->vq_saved_bits, vq_zero,
809
4.32k
                 b_saved_bits_gt_zero);
810
811
    /* (i4_rem_bits_in_period > i4_max_drain_bits) */
812
4.32k
    if(b_rem_bits_gt_max_drain)
813
564
    {
814
        /* extra_bits = rem_bits_in_period - max_drain_bits */
815
564
        sub32_var_q(ps_rbip->vq_rem_bits_in_period, vq_max_drain_bits,
816
564
                    &vq_extra_bits);
817
818
        /* saved_bits += extra_bits */
819
564
        add32_var_q(ps_bit_allocation->vq_saved_bits, vq_extra_bits,
820
564
                    &ps_bit_allocation->vq_saved_bits);
821
822
        /* rem_bits_in_period = vq_max_drain_bits */
823
564
        ps_rbip->vq_rem_bits_in_period = vq_max_drain_bits;
824
564
    }
825
3.76k
    else if(b_rem_bits_lt_min_bits)
826
2.14k
    {
827
        /* extra_bits(-ve) =  rem_bits_in_period - i4_min_bits_for_period */
828
2.14k
        sub32_var_q(ps_rbip->vq_rem_bits_in_period, vq_min_bits_for_period,
829
2.14k
                    &vq_extra_bits);
830
831
        /* saved_bits += extra_bits(-ve) */
832
2.14k
        add32_var_q(ps_bit_allocation->vq_saved_bits, vq_extra_bits,
833
2.14k
                    &ps_bit_allocation->vq_saved_bits);
834
835
        /* rem_bits_in_period = min_bits_for_period */
836
2.14k
        ps_rbip->vq_rem_bits_in_period = vq_min_bits_for_period;
837
2.14k
    }
838
1.62k
    else if(b_saved_bits_gt_zero)
839
215
    {
840
        /* less_bits = max_drain_bits - _rem_bits_in_period */
841
215
        sub32_var_q(vq_max_drain_bits, vq_rem_bits_in_period, &vq_less_bits);
842
843
        /* allocated_saved_bits = MIN (less_bits, saved_bits) */
844
215
        MIN_VARQ(ps_bit_allocation->vq_saved_bits, vq_less_bits,
845
215
                 vq_allocated_saved_bits);
846
847
        /* rem_bits_in_period += allocted_save_bits */
848
215
        add32_var_q(ps_rbip->vq_rem_bits_in_period, vq_allocated_saved_bits,
849
215
                    &ps_rbip->vq_rem_bits_in_period);
850
851
        /* saved_bits -= allocted_save_bits */
852
215
        sub32_var_q(ps_bit_allocation->vq_saved_bits, vq_allocated_saved_bits,
853
215
                    &ps_bit_allocation->vq_saved_bits);
854
215
    }
855
4.32k
    return;
856
4.32k
}
857
858
WORD32 irc_ba_get_frame_rate(bit_allocation_t *ps_bit_allocation)
859
108k
{
860
108k
    return (ps_bit_allocation->i4_frame_rate);
861
108k
}
862
863
WORD32 irc_ba_get_bit_rate(bit_allocation_t *ps_bit_allocation)
864
188k
{
865
188k
    return (ps_bit_allocation->i4_bit_rate);
866
188k
}
867
868
void irc_ba_get_peak_bit_rate(bit_allocation_t *ps_bit_allocation,
869
                              WORD32 *pi4_peak_bit_rate)
870
0
{
871
0
    WORD32 i;
872
0
    for(i = 0; i < MAX_NUM_DRAIN_RATES; i++)
873
0
    {
874
0
        pi4_peak_bit_rate[i] = ps_bit_allocation->ai4_peak_bit_rate[i];
875
0
    }
876
0
}