Coverage Report

Created: 2026-05-30 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhevc/encoder/rc_rd_model_fix.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
21
/****************************************************************************/
22
/* File Name         : rc_rd_model.c                                        */
23
/*                                                                          */
24
/* Description       : Implall the Functions to Model the                   */
25
/*                     Rate Distortion Behaviour of the Codec over the Last */
26
/*                     Few Frames.                                          */
27
/*                                                                          */
28
/* List of Functions : update_frame_rd_model                                */
29
/*                     estimate_mpeg2_qp_for_resbits                        */
30
/*                                                                          */
31
/* Issues / Problems : None                                                 */
32
/*                                                                          */
33
/* Revision History  :                                                      */
34
/*        DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
35
/*        21 06 2006   ittiam           Initial Version                      */
36
/****************************************************************************/
37
/*****************************************************************************/
38
/* File Includes                                                             */
39
/*****************************************************************************/
40
/* System include files */
41
#include <stdarg.h>
42
#include <string.h>
43
#include <stdlib.h>
44
#include <stdio.h>
45
#include <math.h>
46
47
/* User include files */
48
#include "ittiam_datatypes.h"
49
#include "var_q_operator.h"
50
#include "rc_common.h"
51
#include "rc_cntrl_param.h"
52
#include "mem_req_and_acq.h"
53
#include "rc_rd_model.h"
54
#include "rc_rd_model_struct.h"
55
56
#if RC_FIXED_POINT
57
WORD32 rc_rd_model_num_fill_use_free_memtab(
58
    rc_rd_model_t **pps_rc_rd_model, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type)
59
12.4k
{
60
12.4k
    WORD32 i4_mem_tab_idx = 0;
61
12.4k
    static rc_rd_model_t s_rc_rd_model_temp;
62
63
    /* Hack for al alloc, during which we dont have any state memory.
64
      Dereferencing can cause issues */
65
12.4k
    if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
66
10.6k
        (*pps_rc_rd_model) = &s_rc_rd_model_temp;
67
68
    /*for src rate control state structure*/
69
12.4k
    if(e_func_type != GET_NUM_MEMTAB)
70
5.34k
    {
71
5.34k
        fill_memtab(
72
5.34k
            &ps_memtab[i4_mem_tab_idx], sizeof(rc_rd_model_t), MEM_TAB_ALIGNMENT, PERSISTENT, DDR);
73
5.34k
        use_or_fill_base(&ps_memtab[0], (void **)pps_rc_rd_model, e_func_type);
74
5.34k
    }
75
12.4k
    i4_mem_tab_idx++;
76
77
12.4k
    return (i4_mem_tab_idx);
78
12.4k
}
79
/******************************************************************************
80
  Function Name   : init_frm_rc_rd_model
81
  Description     :
82
  Arguments       : ps_rd_model
83
  Return Values   : void
84
  Revision History:
85
                    Creation
86
*****************************************************************************/
87
void init_frm_rc_rd_model(rc_rd_model_t *ps_rd_model, UWORD8 u1_max_frames_modelled)
88
1.38k
{
89
    /* ps_rd_model = ps_rd_model + u1_pic_type; */
90
91
1.38k
    ps_rd_model->u1_num_frms_in_model = 0;
92
1.38k
    ps_rd_model->u1_curr_frm_counter = 0;
93
1.38k
    ps_rd_model->u1_max_frms_to_model = u1_max_frames_modelled;
94
95
1.38k
    ps_rd_model->model_coeff_a_quad.sm = 0;
96
1.38k
    ps_rd_model->model_coeff_b_quad.sm = 0;
97
1.38k
    ps_rd_model->model_coeff_c_quad.sm = 0;
98
99
1.38k
    ps_rd_model->model_coeff_a_lin.sm = 0;
100
1.38k
    ps_rd_model->model_coeff_b_lin.sm = 0;
101
1.38k
    ps_rd_model->model_coeff_c_lin.sm = 0;
102
103
1.38k
    ps_rd_model->model_coeff_a_lin_wo_int.sm = 0;
104
1.38k
    ps_rd_model->model_coeff_b_lin_wo_int.sm = 0;
105
1.38k
    ps_rd_model->model_coeff_c_lin_wo_int.sm = 0;
106
107
1.38k
    ps_rd_model->model_coeff_a_quad.e = 0;
108
1.38k
    ps_rd_model->model_coeff_b_quad.e = 0;
109
1.38k
    ps_rd_model->model_coeff_c_quad.e = 0;
110
111
1.38k
    ps_rd_model->model_coeff_a_lin.e = 0;
112
1.38k
    ps_rd_model->model_coeff_b_lin.e = 0;
113
1.38k
    ps_rd_model->model_coeff_c_lin.e = 0;
114
115
1.38k
    ps_rd_model->model_coeff_a_lin_wo_int.e = 0;
116
1.38k
    ps_rd_model->model_coeff_b_lin_wo_int.e = 0;
117
1.38k
    ps_rd_model->model_coeff_c_lin_wo_int.e = 0;
118
1.38k
}
119
/******************************************************************************
120
  Function Name   : reset_frm_rc_rd_model
121
  Description     :
122
  Arguments       : ps_rd_model
123
  Return Values   : void
124
  Revision History:
125
                    Creation
126
*****************************************************************************/
127
void reset_frm_rc_rd_model(rc_rd_model_t *ps_rd_model)
128
139
{
129
139
    ps_rd_model->u1_num_frms_in_model = 0;
130
139
    ps_rd_model->u1_curr_frm_counter = 0;
131
132
139
    ps_rd_model->model_coeff_a_quad.sm = 0;
133
139
    ps_rd_model->model_coeff_b_quad.sm = 0;
134
139
    ps_rd_model->model_coeff_c_quad.sm = 0;
135
136
139
    ps_rd_model->model_coeff_a_lin.sm = 0;
137
139
    ps_rd_model->model_coeff_b_lin.sm = 0;
138
139
    ps_rd_model->model_coeff_c_lin.sm = 0;
139
140
139
    ps_rd_model->model_coeff_a_lin_wo_int.sm = 0;
141
139
    ps_rd_model->model_coeff_b_lin_wo_int.sm = 0;
142
139
    ps_rd_model->model_coeff_c_lin_wo_int.sm = 0;
143
144
139
    ps_rd_model->model_coeff_a_quad.e = 0;
145
139
    ps_rd_model->model_coeff_b_quad.e = 0;
146
139
    ps_rd_model->model_coeff_c_quad.e = 0;
147
148
139
    ps_rd_model->model_coeff_a_lin.e = 0;
149
139
    ps_rd_model->model_coeff_b_lin.e = 0;
150
139
    ps_rd_model->model_coeff_c_lin.e = 0;
151
152
139
    ps_rd_model->model_coeff_a_lin_wo_int.e = 0;
153
139
    ps_rd_model->model_coeff_b_lin_wo_int.e = 0;
154
139
    ps_rd_model->model_coeff_c_lin_wo_int.e = 0;
155
139
}
156
157
#if ENABLE_QUAD_MODEL
158
/******************************************************************************
159
  Function Name   : find_model_coeffs
160
  Description     :
161
  Arguments       :
162
  Return Values   : void
163
  Revision History:
164
                    Creation
165
*****************************************************************************/
166
static UWORD8 find_model_coeffs(
167
    UWORD32 *pi4_res_bits,
168
    LWORD64 *pi8_sad_h264,
169
    WORD32 *pi4_avg_mpeg2_qp_q6,
170
    UWORD8 u1_num_frms,
171
    UWORD8 u1_model_used,
172
    WORD8 *pi1_frame_index,
173
    number_t *pmc_model_coeff,
174
    number_t *pmc_model_coeff_lin,
175
    number_t *pmc_model_coeff_lin_wo_int,
176
    rc_rd_model_t *ps_rd_model)
177
1.68k
{
178
1.68k
    UWORD32 i;
179
1.68k
    UWORD8 u1_num_frms_used = 0;
180
1.68k
    UWORD8 u1_frm_indx;
181
182
1.68k
    number_t sum_y;
183
1.68k
    number_t sum_x_y;
184
1.68k
    number_t sum_x2_y;
185
1.68k
    number_t sum_x;
186
1.68k
    number_t sum_x2;
187
1.68k
    number_t sum_x3;
188
1.68k
    number_t sum_x4;
189
1.68k
    number_t var_x2_y;
190
1.68k
    number_t var_x_y;
191
1.68k
    number_t var_x2_x;
192
1.68k
    number_t var_x2_x2;
193
1.68k
    number_t var_x_x;
194
1.68k
    number_t x0, y0;
195
1.68k
    number_t s_res_bits, s_sad_h264, s_avg_mpeg2_qp;
196
1.68k
    number_t temp, temp1;
197
198
1.68k
    number_t model_coeff_a, model_coeff_b, model_coeff_c, model_coeff_den;
199
200
1.68k
    number_t s_num_frms_used;
201
202
    /* initilising */
203
1.68k
    model_coeff_a.sm = 0;
204
1.68k
    model_coeff_a.e = 0;
205
1.68k
    model_coeff_b.sm = 0;
206
1.68k
    model_coeff_b.e = 0;
207
1.68k
    model_coeff_c.sm = 0;
208
1.68k
    model_coeff_c.e = 0;
209
210
1.68k
    sum_y.sm = 0;
211
1.68k
    sum_x_y.sm = 0;
212
1.68k
    sum_x2_y.sm = 0;
213
1.68k
    sum_x.sm = 0;
214
1.68k
    sum_x2.sm = 0;
215
1.68k
    sum_x3.sm = 0;
216
1.68k
    sum_x4.sm = 0;
217
1.68k
    var_x2_y.sm = 0;
218
1.68k
    var_x_y.sm = 0;
219
1.68k
    var_x2_x.sm = 0;
220
1.68k
    var_x2_x2.sm = 0;
221
1.68k
    var_x_x.sm = 0;
222
223
1.68k
    sum_y.e = 0;
224
1.68k
    sum_x_y.e = 0;
225
1.68k
    sum_x2_y.e = 0;
226
1.68k
    sum_x.e = 0;
227
1.68k
    sum_x2.e = 0;
228
1.68k
    sum_x3.e = 0;
229
1.68k
    sum_x4.e = 0;
230
1.68k
    var_x2_y.e = 0;
231
1.68k
    var_x_y.e = 0;
232
1.68k
    var_x2_x.e = 0;
233
1.68k
    var_x2_x2.e = 0;
234
1.68k
    var_x_x.e = 0;
235
236
8.16k
    for(i = 0; i < u1_num_frms; i++)
237
6.47k
    {
238
6.47k
        LWORD64 i8_local_sad_sm = 0;
239
6.47k
        WORD32 i4_local_e = 0;
240
6.47k
        if(-1 == pi1_frame_index[i])
241
104
            continue;
242
243
6.37k
        u1_frm_indx = (UWORD8)pi1_frame_index[i];
244
245
6.37k
        s_res_bits.sm = pi4_res_bits[u1_frm_indx];
246
6.37k
        s_res_bits.e = 0;
247
248
        /*s_sad_h264.sm = pi8_sad_h264[u1_frm_indx];
249
        s_sad_h264.e  = 0;*/
250
6.37k
        i8_local_sad_sm = pi8_sad_h264[u1_frm_indx];
251
252
6.37k
        while(i8_local_sad_sm > 0x7FFFFFFF)
253
0
        {
254
0
            i8_local_sad_sm = i8_local_sad_sm / 2;
255
0
            i4_local_e++;
256
0
        }
257
6.37k
        SET_VARQ_FRM_FIXQ(((WORD32)i8_local_sad_sm), s_sad_h264, -i4_local_e);
258
259
        /*fract_quant*/
260
6.37k
        SET_VARQ_FRM_FIXQ(pi4_avg_mpeg2_qp_q6[u1_frm_indx], s_avg_mpeg2_qp, QSCALE_Q_FAC);
261
262
6.37k
        y0 = s_res_bits;
263
        /*x0 = (float) (pi4_sad_h264[u1_frm_indx] /
264
                     (float)pui_avg_mpeg2_qp[u1_frm_indx]); */
265
6.37k
        div32_var_q(s_sad_h264, s_avg_mpeg2_qp, &x0);
266
267
        /*
268
        sum_y    += y0;
269
        sum_x_y  += x0 * y0;
270
        sum_x2_y += x0 * x0 * y0;
271
        sum_x    += x0;
272
        sum_x2   += x0 * x0;
273
        sum_x3   += x0 * x0 * x0;
274
        sum_x4   += x0 * x0 * x0 * x0;
275
        */
276
        /* sum_y    += y0; */
277
6.37k
        add32_var_q(sum_y, y0, &sum_y);
278
        /* sum_x_y  += x0 * y0; */
279
6.37k
        mult32_var_q(x0, y0, &temp);
280
6.37k
        add32_var_q(sum_x_y, temp, &sum_x_y);
281
282
        /* sum_x2_y += x0 * x0 * y0; */
283
6.37k
        mult32_var_q(x0, temp, &temp);
284
6.37k
        add32_var_q(sum_x2_y, temp, &sum_x2_y);
285
286
        /* sum_x    += x0; */
287
6.37k
        add32_var_q(x0, sum_x, &sum_x);
288
289
        /* sum_x2   += x0 * x0; */
290
6.37k
        mult32_var_q(x0, x0, &temp);
291
6.37k
        add32_var_q(temp, sum_x2, &sum_x2);
292
293
        /* sum_x3   += x0 * x0 * x0; */
294
6.37k
        mult32_var_q(x0, temp, &temp);
295
6.37k
        add32_var_q(temp, sum_x3, &sum_x3);
296
297
        /* sum_x4   += x0 * x0 * x0 * x0; */
298
6.37k
        mult32_var_q(x0, temp, &temp);
299
6.37k
        add32_var_q(temp, sum_x4, &sum_x4);
300
301
6.37k
        u1_num_frms_used++;
302
6.37k
    }
303
304
1.68k
    s_num_frms_used.sm = u1_num_frms_used;
305
1.68k
    s_num_frms_used.e = 0;
306
307
    /* sum_y    /= u1_num_frms_used; */
308
1.68k
    div32_var_q(sum_y, s_num_frms_used, &sum_y);
309
    /* sum_x_y  /= u1_num_frms_used; */
310
1.68k
    div32_var_q(sum_x_y, s_num_frms_used, &sum_x_y);
311
    /* sum_x2_y /= u1_num_frms_used; */
312
1.68k
    div32_var_q(sum_x2_y, s_num_frms_used, &sum_x2_y);
313
314
    /* sum_x    /= u1_num_frms_used; */
315
1.68k
    div32_var_q(sum_x, s_num_frms_used, &sum_x);
316
317
    /* sum_x2   /= u1_num_frms_used; */
318
1.68k
    div32_var_q(sum_x2, s_num_frms_used, &sum_x2);
319
320
    /* sum_x3   /= u1_num_frms_used; */
321
1.68k
    div32_var_q(sum_x3, s_num_frms_used, &sum_x3);
322
323
    /* sum_x4   /= u1_num_frms_used; */
324
1.68k
    div32_var_q(sum_x4, s_num_frms_used, &sum_x4);
325
326
#if !QUAD
327
    u1_model_used = LIN_MODEL;
328
#endif
329
330
1.68k
    if((QUAD_MODEL == u1_model_used) && (u1_num_frms_used <= MIN_FRAMES_FOR_QUAD_MODEL))
331
145
    {
332
145
        u1_model_used = LIN_MODEL;
333
145
    }
334
335
1.68k
    if(QUAD_MODEL == u1_model_used)
336
422
    {
337
        /* var_x2_y  = sum_x2_y - sum_x2 * sum_y; */
338
422
        mult32_var_q(sum_x2, sum_y, &temp);
339
422
        sub32_var_q(sum_x2_y, temp, &var_x2_y);
340
341
        /* var_x_y   = sum_x_y  - sum_x  * sum_y; */
342
422
        mult32_var_q(sum_x, sum_y, &temp);
343
422
        sub32_var_q(sum_x_y, temp, &var_x_y);
344
345
        /* var_x2_x  = sum_x3   - sum_x2 * sum_x; */
346
422
        mult32_var_q(sum_x2, sum_x, &temp);
347
422
        sub32_var_q(sum_x3, temp, &var_x2_x);
348
349
        /* var_x2_x2 = sum_x4   - sum_x2 * sum_x2; */
350
422
        mult32_var_q(sum_x2, sum_x2, &temp);
351
422
        sub32_var_q(sum_x4, temp, &var_x2_x2);
352
353
        /* var_x_x   = sum_x2   - sum_x  * sum_x; */
354
422
        mult32_var_q(sum_x, sum_x, &temp);
355
422
        sub32_var_q(sum_x2, temp, &var_x_x);
356
357
        /* model_coeff_den = (var_x2_x * var_x2_x - var_x2_x2 * var_x_x); */
358
422
        mult32_var_q(var_x2_x, var_x2_x, &temp);
359
422
        mult32_var_q(var_x2_x2, var_x_x, &temp1);
360
422
        sub32_var_q(temp, temp1, &model_coeff_den);
361
362
422
        if(0 != model_coeff_den.sm)
363
422
        {
364
            /* model_coeff_b   = (var_x_y * var_x2_x - var_x2_y * var_x_x); */
365
422
            mult32_var_q(var_x_y, var_x2_x, &temp);
366
422
            mult32_var_q(var_x2_y, var_x_x, &temp1);
367
422
            sub32_var_q(temp, temp1, &model_coeff_b);
368
369
            /* model_coeff_b   /= model_coeff_den; */
370
422
            div32_var_q(model_coeff_b, model_coeff_den, &model_coeff_b);
371
372
            /* model_coeff_a   = (var_x2_y * var_x2_x - var_x_y * var_x2_x2); */
373
422
            mult32_var_q(var_x2_y, var_x2_x, &temp);
374
422
            mult32_var_q(var_x_y, var_x2_x2, &temp1);
375
422
            sub32_var_q(temp, temp1, &model_coeff_a);
376
377
            /* model_coeff_a   /= model_coeff_den; */
378
422
            div32_var_q(model_coeff_a, model_coeff_den, &model_coeff_a);
379
380
            /*model_coeff_c   = sum_y - (model_coeff_a * sum_x) -
381
                              (model_coeff_b * sum_x2); */
382
422
            mult32_var_q(model_coeff_a, sum_x, &temp);
383
422
            mult32_var_q(model_coeff_b, sum_x2, &temp1);
384
422
            sub32_var_q(sum_y, temp, &model_coeff_c);
385
422
            sub32_var_q(model_coeff_c, temp1, &model_coeff_c);
386
            /* till here */
387
422
        }
388
389
422
        pmc_model_coeff[0] = model_coeff_b;
390
        /* pmc_model_coeff[0] = (float)(model_coeff_b.sm /pow(2,model_coeff_b.e)); */
391
422
        pmc_model_coeff[1] = model_coeff_a;
392
        /* pmc_model_coeff[1] = (float)(model_coeff_a.sm /pow(2,model_coeff_a.e)); */
393
422
        pmc_model_coeff[2] = model_coeff_c;
394
        /* pmc_model_coeff[2] = (float)(model_coeff_c.sm /pow(2,model_coeff_c.e)); */
395
422
    }
396
397
1.68k
    if(NULL != pmc_model_coeff_lin)
398
1.60k
    {
399
        /* var_x_y   = sum_x_y  - sum_x  * sum_y; */
400
1.60k
        mult32_var_q(sum_x, sum_y, &temp);
401
1.60k
        sub32_var_q(sum_x_y, temp, &var_x_y);
402
403
        /* var_x_x   = sum_x2   - sum_x  * sum_x; */
404
1.60k
        mult32_var_q(sum_x, sum_x, &temp);
405
1.60k
        sub32_var_q(sum_x2, temp, &var_x_x);
406
407
1.60k
        if((0 != var_x_x.sm) && (u1_num_frms > 1))
408
1.16k
        {
409
            /* model_coeff_b = (var_x_y / var_x_x); */
410
1.16k
            div32_var_q(var_x_y, var_x_x, &model_coeff_b);
411
412
            /* model_coeff_c = sum_y - (model_coeff_b * sum_x); */
413
1.16k
            mult32_var_q(model_coeff_b, sum_x, &temp);
414
1.16k
            sub32_var_q(sum_y, temp, &model_coeff_c);
415
416
1.16k
            model_coeff_a = model_coeff_b;
417
418
1.16k
            pmc_model_coeff_lin[0] = model_coeff_b;
419
            /* pmc_model_coeff_lin[0] = (float)(model_coeff_b.sm /pow(2,model_coeff_b.e)); */
420
421
1.16k
            pmc_model_coeff_lin[1] = model_coeff_a;
422
            /* pmc_model_coeff_lin[1] = (float)(model_coeff_a.sm /pow(2,model_coeff_a.e)); */
423
424
1.16k
            pmc_model_coeff_lin[2] = model_coeff_c;
425
            /* pmc_model_coeff_lin[2] = (float)(model_coeff_c.sm /pow(2,model_coeff_c.e)); */
426
1.16k
        }
427
1.60k
    }
428
429
    /*  TO DO : FLOAT_TO_FIX */
430
1.68k
    if(NULL != pmc_model_coeff_lin_wo_int)
431
1.60k
    {
432
1.60k
        UWORD8 u1_curr_frame_index;
433
        /* UWORD8 u1_avgqp_prvfrm; */
434
1.60k
        number_t s_avgqp_prvfrm;
435
        /* UWORD32 u4_prevfrm_bits, u4_prevfrm_sad; */
436
1.60k
        number_t s_prevfrm_bits, s_prevfrm_sad;
437
1.60k
        WORD32 i4_local_e = 0;
438
1.60k
        LWORD64 i8_local_sad_sm = 0;
439
1.60k
        u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
440
1.60k
        if(0 == u1_curr_frame_index)
441
26
            u1_curr_frame_index = (UWORD8)(ps_rd_model->u1_max_frms_to_model - 1);
442
1.57k
        else
443
1.57k
            u1_curr_frame_index--;
444
445
        /* u1_avgqp_prvfrm = ps_rd_model->pu1_avg_mp2qp[u1_curr_frame_index]; */
446
        /*fract_quant*/
447
1.60k
        SET_VARQ_FRM_FIXQ(
448
1.60k
            ps_rd_model->ai4_avg_qp_q6[u1_curr_frame_index], s_avgqp_prvfrm, QSCALE_Q_FAC);
449
450
        /* u4_prevfrm_bits = ps_rd_model->pi4_res_bits[u1_curr_frame_index]; */
451
1.60k
        s_prevfrm_bits.sm = ps_rd_model->pi4_res_bits[u1_curr_frame_index];
452
1.60k
        s_prevfrm_bits.e = 0;
453
454
        /* u4_prevfrm_sad  = ps_rd_model->pi4_sad_h264[u1_curr_frame_index]; */
455
        /*s_prevfrm_sad.sm = ps_rd_model->pi8_sad[u1_curr_frame_index];
456
        s_prevfrm_sad.e  = 0;*/
457
1.60k
        i8_local_sad_sm = ps_rd_model->pi8_sad[u1_curr_frame_index];
458
1.60k
        while(i8_local_sad_sm > 0x7FFFFFFF)
459
0
        {
460
0
            i8_local_sad_sm = i8_local_sad_sm / 2;
461
0
            i4_local_e++;
462
0
        }
463
1.60k
        SET_VARQ_FRM_FIXQ(((WORD32)i8_local_sad_sm), s_prevfrm_sad, -i4_local_e);
464
465
1.60k
        if(0 != s_prevfrm_sad.sm)
466
1.60k
        {
467
            /* model_coeff_a = (float)(u4_prevfrm_bits * u1_avgqp_prvfrm) / u4_prevfrm_sad; */
468
1.60k
            mult32_var_q(s_prevfrm_bits, s_avgqp_prvfrm, &model_coeff_a);
469
1.60k
            div32_var_q(model_coeff_a, s_prevfrm_sad, &model_coeff_a);
470
1.60k
        }
471
0
        else
472
0
        {
473
0
            model_coeff_a.sm = 0;
474
0
            model_coeff_a.e = 0;
475
0
        }
476
477
1.60k
        model_coeff_b.sm = 0;
478
1.60k
        model_coeff_b.e = 0;
479
1.60k
        model_coeff_c.sm = 0;
480
1.60k
        model_coeff_c.e = 0;
481
482
1.60k
        pmc_model_coeff_lin_wo_int[0] = model_coeff_b;
483
1.60k
        pmc_model_coeff_lin_wo_int[1] = model_coeff_a;
484
1.60k
        pmc_model_coeff_lin_wo_int[2] = model_coeff_c;
485
1.60k
    }
486
    /* end of "TO DO : FLOAT_TO_FIX" */
487
488
1.68k
    return u1_model_used;
489
1.68k
}
490
491
/******************************************************************************
492
  Function Name   : refine_set_of_points
493
  Description     :
494
  Arguments       :
495
  Return Values   : void
496
  Revision History:
497
                    Creation
498
*****************************************************************************/
499
static WORD8 refine_set_of_points(
500
    UWORD32 *pi4_res_bits,
501
    LWORD64 *pi8_sad_h264,
502
    WORD32 *pi4_avg_mpeg2_qp_q6,
503
    UWORD8 u1_num_frms,
504
    WORD8 *pi1_frame_index,
505
    number_t *ps_model_coeff,
506
    number_t *ps_avg_deviation)
507
454
{
508
    /* float  fl_avg_deviation, fl_estimated_bits, fl_deviation, x_val; */
509
454
    number_t s_avg_deviation, s_estimated_bits, s_deviation, x_val;
510
    /* number_t  ps_model_coeff[3]; */
511
454
    number_t s_sad_h264, s_avg_mpeg2_qp, s_res_bits;
512
454
    number_t temp, temp1;
513
454
    UWORD8 u1_return_value = 1;
514
454
    UWORD32 i;
515
454
    UWORD8 u1_num_frms_used, u1_frm_indx;
516
454
    number_t s_num_frms_used;
517
518
    /*
519
    convert_float_to_fix(pmc_model_coeff[0],&ps_model_coeff[0]);
520
    convert_float_to_fix(pmc_model_coeff[1],&ps_model_coeff[1]);
521
    convert_float_to_fix(pmc_model_coeff[2],&ps_model_coeff[2]);
522
    */
523
524
454
    u1_num_frms_used = 0;
525
    /* fl_avg_deviation = 0; */
526
454
    s_avg_deviation.sm = 0;
527
454
    s_avg_deviation.e = 0;
528
529
4.13k
    for(i = 0; i < u1_num_frms; i++)
530
3.68k
    {
531
3.68k
        LWORD64 i8_local_sad_sm = 0;
532
3.68k
        WORD32 i4_local_e = 0;
533
3.68k
        if(-1 == pi1_frame_index[i])
534
104
            continue;
535
536
3.57k
        u1_frm_indx = (UWORD8)pi1_frame_index[i];
537
        /*x_val = pi4_sad_h264[u1_frm_indx] /
538
                (float) pui_avg_mpeg2_qp[u1_frm_indx]; */
539
        /* s_sad_h264.sm = pi8_sad_h264[u1_frm_indx];
540
        s_sad_h264.e  = 0;*/
541
542
3.57k
        i8_local_sad_sm = pi8_sad_h264[u1_frm_indx];
543
3.57k
        while(i8_local_sad_sm > 0x7FFFFFFF)
544
0
        {
545
0
            i8_local_sad_sm = i8_local_sad_sm / 2;
546
0
            i4_local_e++;
547
0
        }
548
3.57k
        SET_VARQ_FRM_FIXQ(((WORD32)i8_local_sad_sm), s_sad_h264, -i4_local_e);
549
550
        /*fract_quant*/
551
3.57k
        SET_VARQ_FRM_FIXQ(pi4_avg_mpeg2_qp_q6[u1_frm_indx], s_avg_mpeg2_qp, QSCALE_Q_FAC);
552
553
3.57k
        div32_var_q(s_sad_h264, s_avg_mpeg2_qp, &x_val);
554
555
        /*
556
        fl_estimated_bits = (pmc_model_coeff[0] * x_val * x_val ) +
557
                            (pmc_model_coeff[1] * x_val) +
558
                            (pmc_model_coeff[2]);
559
                            */
560
3.57k
        mult32_var_q(x_val, x_val, &temp);
561
3.57k
        mult32_var_q(temp, ps_model_coeff[0], &temp);
562
3.57k
        mult32_var_q(x_val, ps_model_coeff[1], &temp1);
563
3.57k
        add32_var_q(temp, temp1, &s_estimated_bits);
564
3.57k
        add32_var_q(s_estimated_bits, ps_model_coeff[2], &s_estimated_bits);
565
566
        /*
567
        fl_deviation        = fabs(pi4_res_bits[u1_frm_indx] - fl_estimated_bits) /
568
                              (float) pi4_res_bits[u1_frm_indx];
569
                              */
570
3.57k
        s_res_bits.sm = pi4_res_bits[u1_frm_indx];
571
3.57k
        s_res_bits.e = 0;
572
3.57k
        sub32_var_q(s_res_bits, s_estimated_bits, &temp);
573
3.57k
        temp.sm = (temp.sm > 0) ? temp.sm : (-temp.sm);
574
3.57k
        div32_var_q(temp, s_res_bits, &s_deviation);
575
576
        /* fl_deviation        = fl_deviation * fl_deviation; */
577
3.57k
        mult32_var_q(s_deviation, s_deviation, &s_deviation);
578
579
        /* fl_avg_deviation    += fl_deviation;*/
580
3.57k
        add32_var_q(s_avg_deviation, s_deviation, &s_avg_deviation);
581
582
3.57k
        u1_num_frms_used++;
583
3.57k
    }
584
585
    /* fl_avg_deviation /= u1_num_frms_used; */
586
454
    s_num_frms_used.sm = u1_num_frms_used;
587
454
    s_num_frms_used.e = 0;
588
454
    div32_var_q(s_avg_deviation, s_num_frms_used, &s_avg_deviation);
589
590
    /* fl_avg_deviation = sqrt(fl_avg_deviation); */
591
    /* fl_avg_deviation = (fl_avg_deviation); */
592
593
4.13k
    for(i = 0; i < u1_num_frms; i++)
594
3.68k
    {
595
3.68k
        LWORD64 i8_local_sad_sm = 0;
596
3.68k
        WORD32 i4_local_e = 0;
597
3.68k
        if ((-1 == pi1_frame_index[i]) /*&&
598
3.68k
            (i != 0)*/)
599
104
            continue;
600
601
3.57k
        u1_frm_indx = (UWORD8)pi1_frame_index[i];
602
603
        /*
604
        x_val = pi4_sad_h264[u1_frm_indx] /
605
                (float) pui_avg_mpeg2_qp[u1_frm_indx];
606
                */
607
608
        /* s_sad_h264.sm = pi8_sad_h264[u1_frm_indx];
609
        s_sad_h264.e  = 0;*/
610
611
3.57k
        i8_local_sad_sm = pi8_sad_h264[u1_frm_indx];
612
3.57k
        while(i8_local_sad_sm > 0x7FFFFFFF)
613
0
        {
614
0
            i8_local_sad_sm = i8_local_sad_sm / 2;
615
0
            i4_local_e++;
616
0
        }
617
3.57k
        SET_VARQ_FRM_FIXQ(((WORD32)i8_local_sad_sm), s_sad_h264, -i4_local_e);
618
619
        /*fract_quant*/
620
3.57k
        SET_VARQ_FRM_FIXQ(pi4_avg_mpeg2_qp_q6[u1_frm_indx], s_avg_mpeg2_qp, QSCALE_Q_FAC);
621
622
3.57k
        div32_var_q(s_sad_h264, s_avg_mpeg2_qp, &x_val);
623
624
        /*
625
        fl_estimated_bits = (pmc_model_coeff[0] * x_val * x_val ) +
626
                            (pmc_model_coeff[1] * x_val) +
627
                            (pmc_model_coeff[2]);
628
                            */
629
3.57k
        mult32_var_q(x_val, x_val, &temp);
630
3.57k
        mult32_var_q(temp, ps_model_coeff[0], &temp);
631
3.57k
        mult32_var_q(x_val, ps_model_coeff[1], &temp1);
632
3.57k
        add32_var_q(temp, temp1, &s_estimated_bits);
633
3.57k
        add32_var_q(s_estimated_bits, ps_model_coeff[2], &s_estimated_bits);
634
635
        /*
636
        fl_deviation      = fabs(pi4_res_bits[u1_frm_indx] - fl_estimated_bits) /
637
                            (float) pi4_res_bits[u1_frm_indx];
638
                            */
639
3.57k
        s_res_bits.sm = pi4_res_bits[u1_frm_indx];
640
3.57k
        s_res_bits.e = 0;
641
3.57k
        sub32_var_q(s_res_bits, s_estimated_bits, &temp);
642
3.57k
        temp.sm = (temp.sm > 0) ? temp.sm : (-temp.sm);
643
3.57k
        div32_var_q(temp, s_res_bits, &s_deviation);
644
645
        /* to remove the sqrt function */
646
        /*fl_deviation = fl_deviation * fl_deviation; */
647
3.57k
        mult32_var_q(s_deviation, s_deviation, &s_deviation);
648
649
        /*
650
        if (fl_deviation > (fl_avg_deviation))
651
        {
652
            pi1_frame_index[i] = -1;
653
        }
654
        */
655
3.57k
        sub32_var_q(s_deviation, s_avg_deviation, &temp);
656
3.57k
        if(temp.sm > 0)
657
1.02k
        {
658
1.02k
            pi1_frame_index[i] = -1;
659
1.02k
        }
660
3.57k
    }
661
662
454
    {
663
454
        number_t up_thr, lo_thr;
664
665
        /*
666
        if (fl_avg_deviation > 0.0625)
667
        u1_return_value = 0;
668
        */
669
454
        up_thr.sm = UP_THR_SM;
670
454
        up_thr.e = UP_THR_E;
671
454
        sub32_var_q(s_avg_deviation, up_thr, &temp);
672
454
        if(temp.sm > 0)
673
69
        {
674
69
            u1_return_value = 0;
675
69
        }
676
677
        /*
678
        if (fl_avg_deviation < 0.0225)
679
            u1_return_value = 2;
680
            */
681
454
        lo_thr.sm = LO_THR_SM;
682
454
        lo_thr.e = LO_THR_E;
683
454
        sub32_var_q(s_avg_deviation, lo_thr, &temp);
684
454
        if(temp.sm < 0)
685
343
        {
686
343
            u1_return_value = 2;
687
343
        }
688
454
    }
689
454
    *ps_avg_deviation = s_avg_deviation;
690
454
    return (u1_return_value);
691
454
}
692
/******************************************************************************
693
  Function Name   : calc_avg_sqr_dev_for_model
694
  Description     :
695
  Arguments       :
696
  Return Values   : void
697
  Revision History:
698
                    Creation
699
*****************************************************************************/
700
/* TO DO : FLOAT_TO_FIX */
701
static void calc_avg_sqr_dev_for_model(
702
    UWORD32 *pi4_res_bits,
703
    LWORD64 *pi8_sad_h264,
704
    WORD32 *pi4_avg_mpeg2_qp_q6,
705
    UWORD8 u1_num_frms,
706
    WORD8 *pi1_frame_index,
707
    number_t *ps_model_coeff,
708
    number_t *ps_avg_deviation)
709
514
{
710
    /* float  fl_avg_deviation, fl_estimated_bits, fl_deviation, x_val; */
711
514
    number_t s_avg_deviation, s_estimated_bits, s_deviation, x_val;
712
    /* UWORD8 u1_return_value = 1; */
713
514
    UWORD32 i;
714
514
    UWORD8 u1_num_frms_used, u1_frm_indx;
715
716
514
    number_t s_sad_h264;
717
514
    number_t s_avg_mpeg2_qp;
718
514
    number_t s_res_bits;
719
514
    number_t temp;
720
514
    number_t s_num_frms_used;
721
722
514
    u1_num_frms_used = 0;
723
    /* fl_avg_deviation = 0; */
724
514
    s_deviation.sm = 0;
725
514
    s_deviation.e = 0;
726
727
514
    s_avg_deviation.sm = 0;
728
514
    s_avg_deviation.e = 0;
729
730
1.17k
    for(i = 0; i < u1_num_frms; i++)
731
658
    {
732
658
        LWORD64 i8_local_sad_sm;
733
658
        WORD32 i4_local_e = 0;
734
658
        if(-1 == pi1_frame_index[i])
735
0
            continue;
736
737
658
        u1_frm_indx = (UWORD8)pi1_frame_index[i];
738
739
658
        u1_frm_indx = (UWORD8)i;
740
        /*
741
        x_val = pi4_sad_h264[u1_frm_indx] /
742
                (float) pui_avg_mpeg2_qp[u1_frm_indx];
743
                */
744
        /* s_sad_h264.sm = pi8_sad_h264[u1_frm_indx];
745
        s_sad_h264.e  = 0;*/
746
658
        i8_local_sad_sm = pi8_sad_h264[u1_frm_indx];
747
658
        while(i8_local_sad_sm > 0x7FFFFFFF)
748
0
        {
749
0
            i8_local_sad_sm = i8_local_sad_sm / 2;
750
0
            i4_local_e++;
751
0
        }
752
658
        SET_VARQ_FRM_FIXQ(((WORD32)i8_local_sad_sm), s_sad_h264, -i4_local_e);
753
        /*fract_quant*/
754
658
        SET_VARQ_FRM_FIXQ(pi4_avg_mpeg2_qp_q6[u1_frm_indx], s_avg_mpeg2_qp, QSCALE_Q_FAC);
755
756
658
        div32_var_q(s_sad_h264, s_avg_mpeg2_qp, &x_val);
757
758
        /*fl_estimated_bits = (pmc_model_coeff[1] * x_val) +
759
                            (pmc_model_coeff[2]); */
760
658
        mult32_var_q(x_val, ps_model_coeff[1], &s_estimated_bits);
761
658
        add32_var_q(s_estimated_bits, ps_model_coeff[2], &s_estimated_bits);
762
763
        /*fl_deviation        = fabs(pi4_res_bits[u1_frm_indx] - fl_estimated_bits) /
764
                              (float) pi4_res_bits[u1_frm_indx]; */
765
658
        s_res_bits.sm = pi4_res_bits[u1_frm_indx];
766
658
        s_res_bits.e = 0;
767
658
        sub32_var_q(s_res_bits, s_estimated_bits, &temp);
768
658
        temp.sm = (temp.sm > 0) ? temp.sm : (-temp.sm);
769
658
        div32_var_q(temp, s_res_bits, &s_deviation);
770
771
        /* fl_deviation        = fl_deviation * fl_deviation; */
772
658
        mult32_var_q(s_deviation, s_deviation, &s_deviation);
773
774
        /* fl_avg_deviation    += fl_deviation; */
775
658
        add32_var_q(s_avg_deviation, s_deviation, &s_avg_deviation);
776
777
658
        u1_num_frms_used++;
778
658
    }
779
780
    /* fl_avg_deviation /= u1_num_frms_used; */
781
514
    s_num_frms_used.sm = u1_num_frms_used;
782
514
    s_num_frms_used.e = 0;
783
514
    div32_var_q(s_avg_deviation, s_num_frms_used, &s_avg_deviation);
784
514
    *ps_avg_deviation = s_avg_deviation;
785
514
}
786
/* end of "TO DO : FLOAT_TO_FIX" */
787
/******************************************************************************
788
  Function Name   : is_qp_available
789
  Description     :
790
  Arguments       : ps_rd_model
791
  Return Values   : void
792
  Revision History:
793
                    Creation
794
*****************************************************************************/
795
static WORD32 is_qp_available(
796
    rc_rd_model_t *ps_rd_model, UWORD8 u1_curr_frame_index, WORD32 i4_num_frames_to_check)
797
10.0k
{
798
10.0k
    WORD32 i;
799
    /*fract_quant*/
800
10.0k
    WORD32 i4_qp = ps_rd_model->ai4_avg_qp_q6[u1_curr_frame_index];
801
10.0k
    WORD32 i4_num_frms = 0;
802
803
63.1k
    for(i = 0; i < i4_num_frames_to_check; i++)
804
53.0k
    {
805
53.0k
        u1_curr_frame_index++;
806
53.0k
        if(ps_rd_model->u1_max_frms_to_model == u1_curr_frame_index)
807
2.56k
            u1_curr_frame_index = 0;
808
        /*fract_quant*/
809
53.0k
        if(ps_rd_model->ai4_avg_qp_q6[u1_curr_frame_index] == i4_qp)
810
31.3k
            i4_num_frms++;
811
53.0k
    }
812
10.0k
    if(i4_num_frms >= 2)
813
4.23k
        return (1);
814
5.86k
    else
815
5.86k
        return (0);
816
10.0k
}
817
/****************************************************************************/
818
/*                                                                          */
819
/*  Function Name : example_of_a_function                                   */
820
/*                                                                          */
821
/*  Description   : This function illustrates the use of C coding standards.*/
822
/*                  switch/case, if, for, block comments have been shown    */
823
/*                  here.                                                   */
824
/*  Inputs        : <What inputs does the function take?>                   */
825
/*  Globals       : <Does it use any global variables?>                     */
826
/*  Processing    : <Describe how the function operates - include algorithm */
827
/*                  description>                                            */
828
/*  Outputs       : <What does the function produce?>                       */
829
/*  Returns       : <What does the function return?>                        */
830
/*                                                                          */
831
/*  Issues        : <List any issues or problems with this function>        */
832
/*                                                                          */
833
/*  Revision History:                                                       */
834
/*                                                                          */
835
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made) */
836
/*         13 07 2002   Ittiam          Draft                               */
837
/*                                                                          */
838
/****************************************************************************/
839
static void update_frame_rd_model(rc_rd_model_t *ps_rd_model)
840
1.60k
{
841
1.60k
    WORD8 pi1_frame_index[MAX_FRAMES_MODELLED];
842
1.60k
    WORD8 pi1_frame_index_initial[MAX_FRAMES_MODELLED];
843
1.60k
    UWORD32 u4_num_skips;
844
845
1.60k
    UWORD8 u1_num_skips_temp;
846
    /*UWORD8  u1_avg_mpeg2_qp_temp, u1_min_mpeg2_qp, u1_max_mpeg2_qp; */
847
    /*WORD32  i4_avg_mpeg2_qp_temp, i4_min_mpeg2_qp, i4_max_mpeg2_qp;*/
848
1.60k
    WORD32 i4_avg_mpeg2_qp_temp_q6, i4_min_mpeg2_qp_q6, i4_max_mpeg2_qp_q6;
849
1.60k
    UWORD8 u1_num_frms_input, u1_num_active_frames, u1_reject_frame;
850
851
    /* UWORD8  u1_min2_mpeg2_qp, u1_max2_mpeg2_qp; */
852
    /* WORD32  i4_min2_mpeg2_qp, i4_max2_mpeg2_qp;*/
853
1.60k
    WORD32 i4_min2_mpeg2_qp_q6, i4_max2_mpeg2_qp_q6;
854
1.60k
    UWORD8 u1_min_qp_frame_indx, u1_max_qp_frame_indx;
855
856
1.60k
    number_t model_coeff_array[3], model_coeff_array_lin[3];
857
1.60k
    number_t model_coeff_array_lin_wo_int[3];
858
1.60k
    WORD32 i;
859
1.60k
    UWORD8 u1_curr_frame_index;
860
861
#if RC_MODEL_USED_BUG_FIX
862
    UWORD8 u1_lin_model_valid;
863
#endif
864
865
1.60k
    number_t s_quad_avg_sqr_dev, s_lin_avg_sqr_dev;
866
867
1.60k
    UWORD8 u1_check_model;
868
869
1.60k
    model_coeff_array[0].sm = 0;
870
1.60k
    model_coeff_array[0].e = 0;
871
1.60k
    model_coeff_array[1].sm = 0;
872
1.60k
    model_coeff_array[1].e = 0;
873
1.60k
    model_coeff_array[2].sm = 0;
874
1.60k
    model_coeff_array[2].e = 0;
875
876
1.60k
    model_coeff_array_lin[0].sm = 0;
877
1.60k
    model_coeff_array_lin[0].e = 0;
878
1.60k
    model_coeff_array_lin[1].sm = 0;
879
1.60k
    model_coeff_array_lin[1].e = 0;
880
1.60k
    model_coeff_array_lin[2].sm = 0;
881
1.60k
    model_coeff_array_lin[2].e = 0;
882
883
1.60k
    model_coeff_array_lin_wo_int[0].sm = 0;
884
1.60k
    model_coeff_array_lin_wo_int[0].e = 0;
885
1.60k
    model_coeff_array_lin_wo_int[1].sm = 0;
886
1.60k
    model_coeff_array_lin_wo_int[1].e = 0;
887
1.60k
    model_coeff_array_lin_wo_int[2].sm = 0;
888
1.60k
    model_coeff_array_lin_wo_int[2].e = 0;
889
890
    /* ps_rd_model += u1_pic_type; */
891
892
1.60k
    u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
893
894
1.60k
    ps_rd_model->u1_model_used = QUAD_MODEL;
895
896
1.60k
    if(0 == u1_curr_frame_index)
897
26
        u1_curr_frame_index = (UWORD8)(ps_rd_model->u1_max_frms_to_model - 1);
898
1.57k
    else
899
1.57k
        u1_curr_frame_index--;
900
901
    /************************************************************************/
902
    /* Rearrange data to be fed into a Linear Regression Module             */
903
    /* Module finds a,b,c such that                                         */
904
    /*      y = ax + bx^2 + c                                               */
905
    /************************************************************************/
906
1.60k
    u4_num_skips = 0;
907
1.60k
    u1_num_frms_input = 0;
908
    /*memset(ps_rd_model->au1_num_frames,   0, MPEG2_QP_ELEM);*/
909
1.60k
    memset(pi1_frame_index, -1, MAX_FRAMES_MODELLED);
910
    /*i4_min_mpeg2_qp = MAX_MPEG2_QP;
911
    i4_max_mpeg2_qp = 0;*/
912
913
1.60k
    i4_min_mpeg2_qp_q6 = (MAX_MPEG2_QP << QSCALE_Q_FAC);
914
1.60k
    i4_max_mpeg2_qp_q6 = MIN_QSCALE_Q6;
915
916
1.60k
    u1_num_active_frames = ps_rd_model->u1_num_frms_in_model;
917
1.60k
    if(u1_num_active_frames > MAX_ACTIVE_FRAMES)
918
0
        u1_num_active_frames = MAX_ACTIVE_FRAMES;
919
920
    /************************************************************************/
921
    /* Choose the set of Points to be used for MSE fit of Quadratic model   */
922
    /* Points chosen are spread across the Qp range. Max of 2 points are    */
923
    /* chosen for a Qp.                                                     */
924
    /************************************************************************/
925
11.6k
    for(i = 0; i < u1_num_active_frames; i++)
926
10.0k
    {
927
        /* WORD32 i4_test1 = 0, i4_test2 = 0; NITT TBD */
928
10.0k
        u1_reject_frame = 0;
929
10.0k
        u1_num_skips_temp = ps_rd_model->pu1_num_skips[u1_curr_frame_index];
930
        /*fract_quant*/
931
        /*i4_avg_mpeg2_qp_temp = (ps_rd_model->ai4_avg_qp_q6[u1_curr_frame_index] >> QSCALE_Q_FAC);*/
932
10.0k
        i4_avg_mpeg2_qp_temp_q6 = ps_rd_model->ai4_avg_qp_q6[u1_curr_frame_index];
933
934
10.0k
        if((0 == u4_num_skips) && (0 != u1_num_skips_temp))
935
0
            u1_reject_frame = 1;
936
10.0k
        if((1 == u4_num_skips) && (u1_num_skips_temp > 1))
937
0
            u1_reject_frame = 1;
938
        /* If there is already a frame having same qp reject the current frame */
939
10.0k
        if(is_qp_available(ps_rd_model, u1_curr_frame_index, i))
940
4.23k
            u1_reject_frame = 1;
941
        /*if (ps_rd_model->au1_num_frames[i4_avg_mpeg2_qp_temp]  >= 2)
942
        {
943
            u1_reject_frame = 1;
944
            i4_test2 = 1;
945
        }
946
        if(i4_test2 != i4_test1)
947
        {
948
            printf("Why am I here??\n");
949
        }*/
950
951
10.0k
        if(0 == i)
952
1.60k
            u1_reject_frame = 0;
953
954
10.0k
        if(0 == u1_reject_frame)
955
5.86k
        {
956
5.86k
            pi1_frame_index[u1_num_frms_input] = (WORD8)u1_curr_frame_index;
957
            /* ps_rd_model->au1_num_frames[i4_avg_mpeg2_qp_temp] += 1; */
958
959
            /*if (i4_min_mpeg2_qp > i4_avg_mpeg2_qp_temp) i4_min_mpeg2_qp = i4_avg_mpeg2_qp_temp;
960
            if (i4_max_mpeg2_qp < i4_avg_mpeg2_qp_temp) i4_max_mpeg2_qp = i4_avg_mpeg2_qp_temp;*/
961
962
5.86k
            if(i4_min_mpeg2_qp_q6 > i4_avg_mpeg2_qp_temp_q6)
963
1.63k
                i4_min_mpeg2_qp_q6 = i4_avg_mpeg2_qp_temp_q6;
964
5.86k
            if(i4_max_mpeg2_qp_q6 < i4_avg_mpeg2_qp_temp_q6)
965
5.05k
                i4_max_mpeg2_qp_q6 = i4_avg_mpeg2_qp_temp_q6;
966
5.86k
            u1_num_frms_input++;
967
5.86k
        }
968
969
10.0k
        if(0 == u1_curr_frame_index)
970
1.60k
            u1_curr_frame_index = (UWORD8)(ps_rd_model->u1_max_frms_to_model - 1);
971
8.49k
        else
972
8.49k
            u1_curr_frame_index--;
973
10.0k
    }
974
975
    /************************************************************************/
976
    /* Add Pivot Points to the Data set to be used for finding Quadratic    */
977
    /* Model Coeffs. These will help in constraining the shape of  Quadratic*/
978
    /* to adapt too much to the Local deviations.                           */
979
    /************************************************************************/
980
    /*i4_min2_mpeg2_qp     = i4_min_mpeg2_qp;
981
    i4_max2_mpeg2_qp     = i4_max_mpeg2_qp;*/
982
983
1.60k
    i4_min2_mpeg2_qp_q6 = i4_min_mpeg2_qp_q6;
984
1.60k
    i4_max2_mpeg2_qp_q6 = i4_max_mpeg2_qp_q6;
985
986
1.60k
    u1_min_qp_frame_indx = INVALID_FRAME_INDEX;
987
1.60k
    u1_max_qp_frame_indx = INVALID_FRAME_INDEX;
988
989
    /* Loop runnning over the Stored Frame Level Data
990
       to find frames of MinQp and MaxQp */
991
1.60k
    for(; i < ps_rd_model->u1_num_frms_in_model; i++)
992
0
    {
993
0
        u1_num_skips_temp = ps_rd_model->pu1_num_skips[u1_curr_frame_index];
994
        /*fract_quant*/
995
        //i4_avg_mpeg2_qp_temp = ps_rd_model->ai4_avg_qp[u1_curr_frame_index];
996
997
        //i4_avg_mpeg2_qp_temp = (ps_rd_model->ai4_avg_qp_q6[u1_curr_frame_index] >> QSCALE_Q_FAC);
998
999
0
        i4_avg_mpeg2_qp_temp_q6 = ps_rd_model->ai4_avg_qp_q6[u1_curr_frame_index];
1000
1001
0
        if(((0 == u4_num_skips) && (0 != u1_num_skips_temp)) ||
1002
0
           ((1 == u4_num_skips) && (u1_num_skips_temp > 1)))
1003
0
            continue;
1004
        /*
1005
        if (i4_min2_mpeg2_qp > i4_avg_mpeg2_qp_temp)
1006
        {
1007
            i4_min2_mpeg2_qp     = i4_avg_mpeg2_qp_temp;
1008
            u1_min_qp_frame_indx = u1_curr_frame_index;
1009
        }
1010
        if (i4_max2_mpeg2_qp < i4_avg_mpeg2_qp_temp)
1011
        {
1012
            i4_max2_mpeg2_qp     = i4_avg_mpeg2_qp_temp;
1013
            u1_max_qp_frame_indx = u1_curr_frame_index;
1014
        }
1015
*/
1016
1017
0
        if(i4_min2_mpeg2_qp_q6 > i4_avg_mpeg2_qp_temp_q6)
1018
0
        {
1019
0
            i4_min2_mpeg2_qp_q6 = i4_avg_mpeg2_qp_temp_q6;
1020
0
            u1_min_qp_frame_indx = u1_curr_frame_index;
1021
0
        }
1022
0
        if(i4_max2_mpeg2_qp_q6 < i4_avg_mpeg2_qp_temp_q6)
1023
0
        {
1024
0
            i4_max2_mpeg2_qp_q6 = i4_avg_mpeg2_qp_temp_q6;
1025
0
            u1_max_qp_frame_indx = u1_curr_frame_index;
1026
0
        }
1027
1028
0
        if(0 == u1_curr_frame_index)
1029
0
            u1_curr_frame_index = (UWORD8)(ps_rd_model->u1_max_frms_to_model - 1);
1030
0
        else
1031
0
            u1_curr_frame_index--;
1032
0
    }
1033
1034
    /* Add the Chosen Points to the regression data set */
1035
1.60k
    if(INVALID_FRAME_INDEX != u1_min_qp_frame_indx)
1036
0
    {
1037
0
        pi1_frame_index[u1_num_frms_input] = (WORD8)u1_min_qp_frame_indx;
1038
0
        u1_num_frms_input++;
1039
0
    }
1040
1.60k
    if(INVALID_FRAME_INDEX != u1_max_qp_frame_indx)
1041
0
    {
1042
0
        pi1_frame_index[u1_num_frms_input] = (WORD8)u1_max_qp_frame_indx;
1043
0
        u1_num_frms_input++;
1044
0
    }
1045
1046
    /* memcpy(pi1_frame_index_initial, pi1_frame_index, MAX_FRAMES_MODELLED); */
1047
1.60k
    {
1048
1.60k
        UWORD8 u1_k;
1049
27.2k
        for(u1_k = 0; u1_k < MAX_FRAMES_MODELLED; u1_k++)
1050
25.6k
        {
1051
25.6k
            pi1_frame_index_initial[u1_k] = pi1_frame_index[u1_k];
1052
25.6k
        }
1053
1.60k
    }
1054
1055
1.60k
    if(QUAD_MODEL == ps_rd_model->u1_model_used)
1056
1.60k
    {
1057
1.60k
        if(u1_num_frms_input < (MIN_FRAMES_FOR_QUAD_MODEL))
1058
1.12k
            ps_rd_model->u1_model_used = LIN_MODEL;
1059
1.60k
        if((WORD32)i4_max_mpeg2_qp_q6 < ((WORD32)(21 * i4_min_mpeg2_qp_q6) >> 4))
1060
947
            ps_rd_model->u1_model_used = LIN_MODEL;
1061
1.60k
    }
1062
1063
1.60k
    if(LIN_MODEL == ps_rd_model->u1_model_used)
1064
1.12k
    {
1065
1.12k
        if(u1_num_frms_input < MIN_FRAMES_FOR_LIN_MODEL)
1066
826
            ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1067
1.12k
        if((WORD32)i4_max_mpeg2_qp_q6 < ((WORD32)(19 * i4_min_mpeg2_qp_q6) >> 4))
1068
818
            ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1069
1.12k
    }
1070
1071
    /***** Call the Module to Return the Coeffs for the Fed Data *****/
1072
1.60k
    ps_rd_model->u1_model_used = find_model_coeffs(
1073
1.60k
        ps_rd_model->pi4_res_bits,
1074
1.60k
        ps_rd_model->pi8_sad,
1075
1.60k
        ps_rd_model->ai4_avg_qp_q6,
1076
1.60k
        u1_num_frms_input,
1077
1.60k
        ps_rd_model->u1_model_used,
1078
1.60k
        pi1_frame_index,
1079
1.60k
        model_coeff_array,
1080
1.60k
        model_coeff_array_lin,
1081
1.60k
        model_coeff_array_lin_wo_int,
1082
1.60k
        ps_rd_model);
1083
1084
1.60k
    if((model_coeff_array_lin[2].sm > 0) || (model_coeff_array_lin[0].sm < 0))
1085
1.08k
    {
1086
#if RC_MODEL_USED_BUG_FIX
1087
        u1_lin_model_valid = 0;
1088
#endif
1089
1.08k
    }
1090
514
    else
1091
514
    {
1092
#if RC_MODEL_USED_BUG_FIX
1093
        u1_lin_model_valid = 1;
1094
#endif
1095
        /* lin deviation calculation */
1096
514
        calc_avg_sqr_dev_for_model(
1097
514
            ps_rd_model->pi4_res_bits,
1098
514
            ps_rd_model->pi8_sad,
1099
514
            ps_rd_model->ai4_avg_qp_q6,
1100
514
            u1_num_frms_input,
1101
514
            pi1_frame_index_initial,
1102
514
            model_coeff_array_lin,
1103
514
            &s_lin_avg_sqr_dev);
1104
514
    }
1105
1106
1.60k
    if(QUAD_MODEL == ps_rd_model->u1_model_used)
1107
367
    {
1108
367
        u1_check_model = refine_set_of_points(
1109
367
            ps_rd_model->pi4_res_bits,
1110
367
            ps_rd_model->pi8_sad,
1111
367
            ps_rd_model->ai4_avg_qp_q6,
1112
367
            u1_num_frms_input,
1113
367
            pi1_frame_index,
1114
367
            model_coeff_array,
1115
367
            &s_quad_avg_sqr_dev);
1116
1117
367
        if(2 == u1_check_model)
1118
280
        {
1119
280
            ps_rd_model->u1_model_used = QUAD_MODEL;
1120
280
        }
1121
87
        else
1122
87
        {
1123
            /*******************************************************************/
1124
            /* Make sure that some of the Pivot Points are used in the Refined */
1125
            /* data set. 1. Previous Frame                                     */
1126
            /*******************************************************************/
1127
            /* pi1_frame_index[0] = ps_rd_model->u1_curr_frm_counter; */
1128
1129
87
            ps_rd_model->u1_model_used = find_model_coeffs(
1130
87
                ps_rd_model->pi4_res_bits,
1131
87
                ps_rd_model->pi8_sad,
1132
87
                ps_rd_model->ai4_avg_qp_q6,
1133
87
                u1_num_frms_input,
1134
87
                ps_rd_model->u1_model_used,
1135
87
                pi1_frame_index,
1136
87
                model_coeff_array,
1137
87
                NULL,
1138
87
                NULL,
1139
87
                ps_rd_model);
1140
1141
87
            u1_check_model = refine_set_of_points(
1142
87
                ps_rd_model->pi4_res_bits,
1143
87
                ps_rd_model->pi8_sad,
1144
87
                ps_rd_model->ai4_avg_qp_q6,
1145
87
                u1_num_frms_input,
1146
87
                pi1_frame_index,
1147
87
                model_coeff_array,
1148
87
                &s_quad_avg_sqr_dev);
1149
1150
87
            if((0 == u1_check_model))
1151
12
            {
1152
#if RC_MODEL_USED_BUG_FIX
1153
                if((s_lin_avg_sqr_dev < s_quad_avg_sqr_dev) && (1 == u1_lin_model_valid))
1154
#endif
1155
12
                    ps_rd_model->u1_model_used = LIN_MODEL;
1156
12
            }
1157
87
        }
1158
367
    }
1159
1160
1.60k
    if(QUAD_MODEL == ps_rd_model->u1_model_used)
1161
325
    {
1162
        /* min_res_bits = model_coeff_c -  */
1163
        /*               ((model_coeff_a * model_coeff_a) / (4 * model_coeff_b)); */
1164
1165
325
        if(model_coeff_array[0].sm < 0)
1166
238
            ps_rd_model->u1_model_used = LIN_MODEL;
1167
1168
        /* if ((model_coeff_a * model_coeff_b) > 0) */
1169
        /*    u1_model_used = LIN_MODEL; */
1170
1171
325
        ps_rd_model->model_coeff_b_quad = model_coeff_array[0];
1172
325
        ps_rd_model->model_coeff_a_quad = model_coeff_array[1];
1173
325
        ps_rd_model->model_coeff_c_quad = model_coeff_array[2];
1174
325
    }
1175
1.60k
    if(LIN_MODEL == ps_rd_model->u1_model_used)
1176
661
    {
1177
661
        if((model_coeff_array_lin[2].sm > 0) || (model_coeff_array_lin[0].sm < 0))
1178
636
            ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1179
661
    }
1180
/* TO DO : FLOAT_TO_FIX */
1181
#if RC_MODEL_USED_BUG_FIX
1182
    {
1183
        number_t s_quad_dev_thr;
1184
        number_t s_lin_dev_thr;
1185
        number_t s_diff;
1186
1187
        s_quad_dev_thr.sm = QUAD_DEV_THR_SM;
1188
        s_quad_dev_thr.e = QUAD_DEV_THR_E;
1189
1190
        /* (s_quad_avg_sqr_dev > .25) */
1191
        sub32_var_q(s_quad_avg_sqr_dev, s_quad_dev_thr, &s_diff);
1192
1193
        /* Another threshold of .25 on deviation i.e. deviation greater than 25%  */
1194
        if((QUAD_MODEL == ps_rd_model->u1_model_used) && (s_diff.sm > 0))
1195
            ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1196
1197
        s_lin_dev_thr.sm = LIN_DEV_THR_SM;
1198
        s_lin_dev_thr.e = LIN_DEV_THR_E;
1199
1200
        /* (s_lin_avg_sqr_dev > .25) */
1201
        sub32_var_q(s_lin_avg_sqr_dev, s_lin_dev_thr, &s_diff);
1202
1203
        if((LIN_MODEL == ps_rd_model->u1_model_used) && (s_diff.sm > 0))
1204
            ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1205
    }
1206
#endif /* #if RC_MODEL_USED_BUG_FIX */
1207
    /* end of "TO DO : FLOAT_TO_FIX" */
1208
1.60k
    ps_rd_model->model_coeff_b_lin = model_coeff_array_lin[0];
1209
1.60k
    ps_rd_model->model_coeff_a_lin = model_coeff_array_lin[1];
1210
1.60k
    ps_rd_model->model_coeff_c_lin = model_coeff_array_lin[2];
1211
1.60k
    ps_rd_model->model_coeff_b_lin_wo_int = model_coeff_array_lin_wo_int[0];
1212
1.60k
    ps_rd_model->model_coeff_a_lin_wo_int = model_coeff_array_lin_wo_int[1];
1213
1.60k
    ps_rd_model->model_coeff_c_lin_wo_int = model_coeff_array_lin_wo_int[2];
1214
    /* ps_rd_model->u1_model_used = PREV_FRAME_MODEL; */
1215
1.60k
}
1216
#endif
1217
1218
/******************************************************************************
1219
  Function Name   : estimate_bits_for_qp
1220
  Description     :
1221
  Arguments       : ps_rd_model
1222
  Return Values   : void
1223
  Revision History:
1224
                    Creation
1225
*****************************************************************************/
1226
UWORD32
1227
    estimate_bits_for_qp(rc_rd_model_t *ps_rd_model, UWORD32 u4_estimated_sad, WORD32 i4_avg_qp_q6)
1228
8.22k
{
1229
    /* float fl_num_bits; */
1230
8.22k
    number_t s_num_bits;
1231
8.22k
    number_t s_estimated_sad, s_avg_qp;
1232
1233
    /* number_t s_model_coeff_a, s_model_coeff_b, s_model_coeff_c; */
1234
8.22k
    WORD32 i4_temp;
1235
8.22k
    number_t x_val;
1236
1237
    /* ps_rd_model += u1_curr_pic_type; */
1238
8.22k
    s_estimated_sad.sm = u4_estimated_sad;
1239
8.22k
    s_estimated_sad.e = 0;
1240
    /*fract_quant*/
1241
8.22k
    SET_VARQ_FRM_FIXQ(i4_avg_qp_q6, s_avg_qp, QSCALE_Q_FAC);
1242
    /* initilising s_num_bits */
1243
8.22k
    s_num_bits.sm = 0;
1244
8.22k
    s_num_bits.e = 0;
1245
1246
    /*
1247
    convert_float_to_fix(ps_rd_model->model_coeff_a, &s_model_coeff_a);
1248
    convert_float_to_fix(ps_rd_model->model_coeff_b, &s_model_coeff_b);
1249
    convert_float_to_fix(ps_rd_model->model_coeff_c, &s_model_coeff_c);
1250
    */
1251
8.22k
    div32_var_q(s_estimated_sad, s_avg_qp, &x_val);
1252
8.22k
    {
1253
        /* TO DO : FLOAT_TO_FIX */
1254
        /* fl_num_bits = ps_rd_model->model_coeff_a_lin_wo_int * x_val; */
1255
8.22k
        mult32_var_q(ps_rd_model->model_coeff_a_lin_wo_int, x_val, &s_num_bits);
1256
        /* end of "TO DO : FLOAT_TO_FIX" */
1257
8.22k
    }
1258
1259
    /* return ((UWORD32) fl_num_bits); */
1260
8.22k
    number_t_to_word32(s_num_bits, &i4_temp);
1261
8.22k
    if(i4_temp < 0)
1262
0
        i4_temp = 0;
1263
8.22k
    return ((UWORD32)i4_temp);
1264
8.22k
}
1265
1266
/******************************************************************************
1267
  Function Name   : find_qp_for_target_bits
1268
  Description     :
1269
  Arguments       : ps_rd_model
1270
  Return Values   : void
1271
  Revision History:
1272
                    Creation
1273
*****************************************************************************/
1274
WORD32 find_qp_for_target_bits(
1275
    rc_rd_model_handle ps_rd_model,
1276
    UWORD32 u4_target_res_bits,
1277
    UWORD32 u4_estimated_sad,
1278
    WORD32 i4_max_qp_q6,
1279
    WORD32 i4_min_qp_q6)
1280
35.3k
{
1281
35.3k
    WORD32 i4_qp_q6;
1282
    /* float  x_value, f_qp; */
1283
35.3k
    number_t x_value, s_qp;
1284
    /* number_t s_model_coeff_a, s_model_coeff_b, s_model_coeff_c; */
1285
35.3k
    number_t s_target_res_bits;
1286
35.3k
    number_t s_estimated_sad;
1287
35.3k
    number_t temp, temp3;
1288
35.3k
    number_t temp2, temp1;
1289
1290
    /* ps_rd_model += u1_curr_pic_type; */
1291
1292
35.3k
    s_target_res_bits.sm = u4_target_res_bits;
1293
35.3k
    s_target_res_bits.e = 0;
1294
1295
35.3k
    s_estimated_sad.sm = u4_estimated_sad;
1296
35.3k
    s_estimated_sad.e = 0;
1297
1298
    /* initilising default value */
1299
35.3k
    x_value.sm = 0;
1300
35.3k
    x_value.e = 0;
1301
1302
    /*
1303
    convert_float_to_fix(ps_rd_model->model_coeff_a, &(ps_rd_model->s_model_coeff_a));
1304
    convert_float_to_fix(ps_rd_model->model_coeff_b, &(ps_rd_model->s_model_coeff_b));
1305
    convert_float_to_fix(ps_rd_model->model_coeff_c, &(ps_rd_model->s_model_coeff_c));
1306
    */
1307
1308
35.3k
#if ENABLE_QUAD_MODEL
1309
35.3k
    if(QUAD_MODEL == ps_rd_model->u1_model_used)
1310
1.18k
    {
1311
        /* float det; */
1312
1.18k
        number_t det;
1313
1314
        /*
1315
        det = (ps_rd_model->model_coeff_a * ps_rd_model->model_coeff_a) -
1316
              (4 * (ps_rd_model->model_coeff_b) *
1317
               (ps_rd_model->model_coeff_c - u4_target_res_bits));
1318
        */
1319
1.18k
        mult32_var_q(ps_rd_model->model_coeff_a_quad, ps_rd_model->model_coeff_a_quad, &temp);
1320
1.18k
        temp3.sm = 4;
1321
1.18k
        temp3.e = 0;
1322
1.18k
        mult32_var_q(temp3, ps_rd_model->model_coeff_b_quad, &temp1);
1323
1.18k
        sub32_var_q(ps_rd_model->model_coeff_c_quad, s_target_res_bits, &temp2);
1324
1.18k
        mult32_var_q(temp1, temp2, &temp1);
1325
1.18k
        sub32_var_q(temp, temp1, &det);
1326
1327
        /* x_value = sqrt(det); */
1328
1.18k
        sqrt32_var_q(det, &x_value);
1329
1330
        /* x_value = (x_value - ps_rd_model->model_coeff_a) /
1331
            (2 * ps_rd_model->model_coeff_b);
1332
        */
1333
1.18k
        sub32_var_q(x_value, ps_rd_model->model_coeff_a_quad, &temp);
1334
1.18k
        temp3.sm = 2;
1335
1.18k
        temp3.e = 0;
1336
1.18k
        mult32_var_q(temp3, ps_rd_model->model_coeff_b_quad, &temp1);
1337
1.18k
        div32_var_q(temp, temp1, &x_value);
1338
1339
1.18k
        if(det.sm < 0 || x_value.sm < 0)
1340
9
        {
1341
            /* x_value = 0; */
1342
9
            ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1343
9
        }
1344
1.18k
    }
1345
1346
35.3k
    if(LIN_MODEL == ps_rd_model->u1_model_used)
1347
644
    {
1348
        /*
1349
        x_value = ((float)u4_target_res_bits - ps_rd_model->model_coeff_c) /
1350
                   (ps_rd_model->model_coeff_b);
1351
        */
1352
644
        sub32_var_q(s_target_res_bits, ps_rd_model->model_coeff_c_lin, &temp);
1353
644
        div32_var_q(temp, ps_rd_model->model_coeff_b_lin, &x_value);
1354
644
        if(x_value.sm < 0)
1355
0
        {
1356
            /* x_value = 0; */
1357
0
            ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1358
0
        }
1359
644
    }
1360
#else
1361
    ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1362
#endif
1363
35.3k
    if(PREV_FRAME_MODEL == ps_rd_model->u1_model_used)
1364
33.4k
    {
1365
        /* TO DO : FLOAT_TO_FIX */
1366
        /* x_value = (float) u4_target_res_bits / ps_rd_model->model_coeff_a_lin_wo_int; */
1367
33.4k
        div32_var_q(s_target_res_bits, ps_rd_model->model_coeff_a_lin_wo_int, &x_value);
1368
        /* end of "TO DO : FLOAT_TO_FIX" */
1369
33.4k
    }
1370
1371
35.3k
    if(0 != x_value.sm)
1372
35.3k
    {
1373
        /* f_qp = u4_estimated_sad / x_value; */
1374
35.3k
        div32_var_q(s_estimated_sad, x_value, &s_qp);
1375
35.3k
    }
1376
0
    else
1377
0
    {
1378
0
        s_qp.sm = MAX_MPEG2_QP;
1379
0
        s_qp.e = 0;
1380
0
    }
1381
1382
    /*
1383
    if (f_qp > MAX_MPEG2_QP)
1384
    f_qp = MAX_MPEG2_QP;
1385
    */
1386
35.3k
    temp3.sm = MAX_MPEG2_QP;
1387
35.3k
    temp3.e = 0;
1388
35.3k
    sub32_var_q(s_qp, temp3, &temp);
1389
35.3k
    if(temp.sm > 0)
1390
0
    {
1391
0
        s_qp = temp3;
1392
0
    }
1393
35.3k
    convert_varq_to_fixq(s_qp, &i4_qp_q6, (WORD32)QSCALE_Q_FAC);
1394
    /* Truncating the QP to the Max and Min Qp values possible */
1395
35.3k
    if(i4_qp_q6 < i4_min_qp_q6)
1396
27.7k
    {
1397
27.7k
        i4_qp_q6 = i4_min_qp_q6;
1398
27.7k
    }
1399
35.3k
    if(i4_qp_q6 > i4_max_qp_q6)
1400
4
    {
1401
4
        i4_qp_q6 = i4_max_qp_q6;
1402
4
    }
1403
35.3k
    return (i4_qp_q6);
1404
35.3k
}
1405
/******************************************************************************
1406
  Function Name   : add_frame_to_rd_model
1407
  Description     :
1408
  Arguments       : ps_rd_model
1409
  Return Values   : void
1410
  Revision History:
1411
                    Creation
1412
*****************************************************************************/
1413
void add_frame_to_rd_model(
1414
    rc_rd_model_t *ps_rd_model,
1415
    UWORD32 i4_res_bits,
1416
    WORD32 i4_avg_mp2qp_q6,
1417
    LWORD64 i8_sad_h264,
1418
    UWORD8 u1_num_skips)
1419
1.60k
{
1420
1.60k
    UWORD8 u1_curr_frame_index, i4_same_bit_count = 0;
1421
    /* ps_rd_model += u1_curr_pic_type; */
1422
1.60k
    u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
1423
1424
1.60k
    {
1425
1.60k
        WORD32 i;
1426
1427
1.60k
        i = ps_rd_model->u1_num_frms_in_model - 1;
1428
10.4k
        while(i >= 0)
1429
8.80k
        {
1430
8.80k
            if(ps_rd_model->pi4_res_bits[i] == i4_res_bits)
1431
2
                i4_same_bit_count++;
1432
8.80k
            i--;
1433
8.80k
        }
1434
1.60k
    }
1435
    /* - the condition check is a temporary fix to avoid feeding zero into model.
1436
    The change should be done so that 0 is not at all fed into model. When texture bit consumption becomes zero next frame qp should be explicitly decreased so that finite amount of texture
1437
    bits is consumed and feeds valid data to model to come out of deadlock*/
1438
1439
1.60k
    if(i4_same_bit_count < 3)
1440
1.60k
    {
1441
        /*** Insert the Present Frame Data into the RD Model State Memory ***/
1442
1.60k
        ps_rd_model->pi4_res_bits[u1_curr_frame_index] = i4_res_bits;
1443
1.60k
        ps_rd_model->pi8_sad[u1_curr_frame_index] = i8_sad_h264;
1444
1.60k
        ps_rd_model->pu1_num_skips[u1_curr_frame_index] = u1_num_skips;
1445
1.60k
        ps_rd_model->ai4_avg_qp[u1_curr_frame_index] = (i4_avg_mp2qp_q6 >> QSCALE_Q_FAC);
1446
1.60k
        ps_rd_model->ai4_avg_qp_q6[u1_curr_frame_index] = i4_avg_mp2qp_q6;
1447
1448
1.60k
        ps_rd_model->u1_curr_frm_counter++;
1449
1.60k
        if(ps_rd_model->u1_max_frms_to_model == ps_rd_model->u1_curr_frm_counter)
1450
26
            ps_rd_model->u1_curr_frm_counter = 0;
1451
1452
1.60k
        if(ps_rd_model->u1_num_frms_in_model < ps_rd_model->u1_max_frms_to_model)
1453
1.29k
        {
1454
1.29k
            ps_rd_model->u1_num_frms_in_model++;
1455
1.29k
        }
1456
1.60k
        update_frame_rd_model(ps_rd_model);
1457
1.60k
    }
1458
1.60k
}
1459
/******************************************************************************
1460
  Function Name   : get_linear_coefficient
1461
  Description     :
1462
  Arguments       : ps_rd_model
1463
  Return Values   : void
1464
  Revision History:
1465
                    Creation
1466
*****************************************************************************/
1467
number_t get_linear_coefficient(rc_rd_model_t *ps_rd_model)
1468
13.6k
{
1469
13.6k
    return (ps_rd_model->model_coeff_a_lin_wo_int);
1470
13.6k
}
1471
/******************************************************************************
1472
  Function Name   : set_linear_coefficient
1473
  Description     :
1474
  Arguments       : ps_rd_model
1475
  Return Values   : void
1476
  Revision History:
1477
                    Creation
1478
*****************************************************************************/
1479
void set_linear_coefficient(rc_rd_model_t *ps_rd_model, number_t model_coeff_a_lin_wo_int)
1480
0
{
1481
0
    ps_rd_model->model_coeff_a_lin_wo_int = model_coeff_a_lin_wo_int;
1482
0
    ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
1483
0
}
1484
/******************************************************************************
1485
  Function Name   : is_model_valid
1486
  Description     :
1487
  Arguments       : ps_rd_model
1488
  Return Values   : void
1489
  Revision History:
1490
                    Creation
1491
*****************************************************************************/
1492
WORD32 is_model_valid(rc_rd_model_t *ps_rd_model)
1493
5.98k
{
1494
    /*return 1 if atleast one data point is availbale: this is required because frames with zero texture consumption is not updated in model*/
1495
5.98k
    if(ps_rd_model->u1_num_frms_in_model > 0)
1496
5.53k
    {
1497
5.53k
        return 1;
1498
5.53k
    }
1499
455
    else
1500
455
    {
1501
455
        return 0;
1502
455
    }
1503
5.98k
}
1504
1505
#endif /* #if RC_FIXED_POINT */