xref: /aosp_15_r20/external/libhevc/encoder/rc_rd_model.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar  *
5*c83a76b0SSuyog Pawar  * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar  * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar  * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar  *
9*c83a76b0SSuyog Pawar  * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar  *
11*c83a76b0SSuyog Pawar  * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar  * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar  * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar  * limitations under the License.
16*c83a76b0SSuyog Pawar  *
17*c83a76b0SSuyog Pawar  *****************************************************************************
18*c83a76b0SSuyog Pawar  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar 
21*c83a76b0SSuyog Pawar /****************************************************************************/
22*c83a76b0SSuyog Pawar /* File Name         : rc_rd_model.c                                        */
23*c83a76b0SSuyog Pawar /*                                                                          */
24*c83a76b0SSuyog Pawar /* Description       : Implall the Functions to Model the                   */
25*c83a76b0SSuyog Pawar /*                     Rate Distortion Behaviour of the Codec over the Last */
26*c83a76b0SSuyog Pawar /*                     Few Frames.                                          */
27*c83a76b0SSuyog Pawar /*                                                                          */
28*c83a76b0SSuyog Pawar /* List of Functions : update_frame_rd_model                                */
29*c83a76b0SSuyog Pawar /*                     estimate_mpeg2_qp_for_resbits                        */
30*c83a76b0SSuyog Pawar /*                                                                          */
31*c83a76b0SSuyog Pawar /* Issues / Problems : None                                                 */
32*c83a76b0SSuyog Pawar /*                                                                          */
33*c83a76b0SSuyog Pawar /* Revision History  :                                                      */
34*c83a76b0SSuyog Pawar /*        DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
35*c83a76b0SSuyog Pawar /*        21 06 2006   ittiam           Initial Version                      */
36*c83a76b0SSuyog Pawar /****************************************************************************/
37*c83a76b0SSuyog Pawar 
38*c83a76b0SSuyog Pawar /*****************************************************************************/
39*c83a76b0SSuyog Pawar /* File Includes                                                             */
40*c83a76b0SSuyog Pawar /*****************************************************************************/
41*c83a76b0SSuyog Pawar /* System include files */
42*c83a76b0SSuyog Pawar #include <stdarg.h>
43*c83a76b0SSuyog Pawar #include <stdlib.h>
44*c83a76b0SSuyog Pawar #include <stdio.h>
45*c83a76b0SSuyog Pawar #include <math.h>
46*c83a76b0SSuyog Pawar 
47*c83a76b0SSuyog Pawar /* System include files */
48*c83a76b0SSuyog Pawar #include "ittiam_datatypes.h"
49*c83a76b0SSuyog Pawar #include "rc_common.h"
50*c83a76b0SSuyog Pawar #include "var_q_operator.h"
51*c83a76b0SSuyog Pawar #include "mem_req_and_acq.h"
52*c83a76b0SSuyog Pawar #include "rc_rd_model.h"
53*c83a76b0SSuyog Pawar #include "rc_rd_model_struct.h"
54*c83a76b0SSuyog Pawar 
55*c83a76b0SSuyog Pawar #if !(RC_FIXED_POINT)
56*c83a76b0SSuyog Pawar 
57*c83a76b0SSuyog Pawar #if NON_STEADSTATE_CODE
rc_rd_model_num_fill_use_free_memtab(rc_rd_model_t ** pps_rc_rd_model,itt_memtab_t * ps_memtab,ITT_FUNC_TYPE_E e_func_type)58*c83a76b0SSuyog Pawar WORD32 rc_rd_model_num_fill_use_free_memtab(
59*c83a76b0SSuyog Pawar     rc_rd_model_t **pps_rc_rd_model, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type)
60*c83a76b0SSuyog Pawar {
61*c83a76b0SSuyog Pawar     WORD32 i4_mem_tab_idx = 0;
62*c83a76b0SSuyog Pawar     static rc_rd_model_t s_rc_rd_model_temp;
63*c83a76b0SSuyog Pawar 
64*c83a76b0SSuyog Pawar     /* Hack for al alloc, during which we dont have any state memory.
65*c83a76b0SSuyog Pawar       Dereferencing can cause issues */
66*c83a76b0SSuyog Pawar     if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
67*c83a76b0SSuyog Pawar         (*pps_rc_rd_model) = &s_rc_rd_model_temp;
68*c83a76b0SSuyog Pawar 
69*c83a76b0SSuyog Pawar     /*for src rate control state structure*/
70*c83a76b0SSuyog Pawar     if(e_func_type != GET_NUM_MEMTAB)
71*c83a76b0SSuyog Pawar     {
72*c83a76b0SSuyog Pawar         fill_memtab(
73*c83a76b0SSuyog Pawar             &ps_memtab[i4_mem_tab_idx], sizeof(rc_rd_model_t), MEM_TAB_ALIGNMENT, PERSISTENT, DDR);
74*c83a76b0SSuyog Pawar         use_or_fill_base(&ps_memtab[0], (void **)pps_rc_rd_model, e_func_type);
75*c83a76b0SSuyog Pawar     }
76*c83a76b0SSuyog Pawar     i4_mem_tab_idx++;
77*c83a76b0SSuyog Pawar 
78*c83a76b0SSuyog Pawar     return (i4_mem_tab_idx);
79*c83a76b0SSuyog Pawar }
80*c83a76b0SSuyog Pawar 
init_frm_rc_rd_model(rc_rd_model_t * ps_rd_model,UWORD8 u1_max_frames_modelled)81*c83a76b0SSuyog Pawar void init_frm_rc_rd_model(rc_rd_model_t *ps_rd_model, UWORD8 u1_max_frames_modelled)
82*c83a76b0SSuyog Pawar {
83*c83a76b0SSuyog Pawar     /*ps_rd_model = ps_rd_model + u1_pic_type;*/
84*c83a76b0SSuyog Pawar 
85*c83a76b0SSuyog Pawar     ps_rd_model->u1_num_frms_in_model = 0;
86*c83a76b0SSuyog Pawar     ps_rd_model->u1_curr_frm_counter = 0;
87*c83a76b0SSuyog Pawar     ps_rd_model->u1_max_frms_to_model = u1_max_frames_modelled;
88*c83a76b0SSuyog Pawar     /*
89*c83a76b0SSuyog Pawar     ps_rd_model->u1_min_frames_for_quad_model = u1_min_frames_for_quad_model;
90*c83a76b0SSuyog Pawar     ps_rd_model->u1_min_frames_for_lin_model  = u1_min_frames_for_lin_model;
91*c83a76b0SSuyog Pawar     */
92*c83a76b0SSuyog Pawar 
93*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_quad = 0;
94*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_quad = 0;
95*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_quad = 0;
96*c83a76b0SSuyog Pawar 
97*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_lin = 0;
98*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_lin = 0;
99*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_lin = 0;
100*c83a76b0SSuyog Pawar 
101*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_lin_wo_int = 0;
102*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_lin_wo_int = 0;
103*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_lin_wo_int = 0;
104*c83a76b0SSuyog Pawar }
105*c83a76b0SSuyog Pawar 
reset_frm_rc_rd_model(rc_rd_model_t * ps_rd_model)106*c83a76b0SSuyog Pawar void reset_frm_rc_rd_model(rc_rd_model_t *ps_rd_model)
107*c83a76b0SSuyog Pawar {
108*c83a76b0SSuyog Pawar     /*ps_rd_model = ps_rd_model + u1_pic_type;*/
109*c83a76b0SSuyog Pawar 
110*c83a76b0SSuyog Pawar     ps_rd_model->u1_num_frms_in_model = 0;
111*c83a76b0SSuyog Pawar     ps_rd_model->u1_curr_frm_counter = 0;
112*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_quad = 0;
113*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_quad = 0;
114*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_quad = 0;
115*c83a76b0SSuyog Pawar 
116*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_lin = 0;
117*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_lin = 0;
118*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_lin = 0;
119*c83a76b0SSuyog Pawar 
120*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_lin_wo_int = 0;
121*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_lin_wo_int = 0;
122*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_lin_wo_int = 0;
123*c83a76b0SSuyog Pawar }
124*c83a76b0SSuyog Pawar #endif /* #if NON_STEADSTATE_CODE */
125*c83a76b0SSuyog Pawar 
126*c83a76b0SSuyog Pawar #if ENABLE_QUAD_MODEL
find_model_coeffs(UWORD32 * pi4_res_bits,UWORD32 * pi4_sad_h264,UWORD8 * pu1_num_skips,UWORD8 * pui_avg_mpeg2_qp,UWORD8 u1_num_frms,UWORD8 u1_model_used,WORD8 * pi1_frame_index,model_coeff * pmc_model_coeff,model_coeff * pmc_model_coeff_lin,model_coeff * pmc_model_coeff_lin_wo_int,rc_rd_model_t * ps_rd_model)127*c83a76b0SSuyog Pawar static UWORD8 find_model_coeffs(
128*c83a76b0SSuyog Pawar     UWORD32 *pi4_res_bits,
129*c83a76b0SSuyog Pawar     UWORD32 *pi4_sad_h264,
130*c83a76b0SSuyog Pawar     UWORD8 *pu1_num_skips,
131*c83a76b0SSuyog Pawar     UWORD8 *pui_avg_mpeg2_qp,
132*c83a76b0SSuyog Pawar     UWORD8 u1_num_frms,
133*c83a76b0SSuyog Pawar     UWORD8 u1_model_used,
134*c83a76b0SSuyog Pawar     WORD8 *pi1_frame_index,
135*c83a76b0SSuyog Pawar     model_coeff *pmc_model_coeff,
136*c83a76b0SSuyog Pawar     model_coeff *pmc_model_coeff_lin,
137*c83a76b0SSuyog Pawar     model_coeff *pmc_model_coeff_lin_wo_int,
138*c83a76b0SSuyog Pawar     rc_rd_model_t *ps_rd_model)
139*c83a76b0SSuyog Pawar {
140*c83a76b0SSuyog Pawar     UWORD32 i;
141*c83a76b0SSuyog Pawar     UWORD8 u1_num_frms_used = 0;
142*c83a76b0SSuyog Pawar     UWORD8 u1_frm_indx;
143*c83a76b0SSuyog Pawar 
144*c83a76b0SSuyog Pawar     float sum_y = 0;
145*c83a76b0SSuyog Pawar     float sum_x_y = 0;
146*c83a76b0SSuyog Pawar     float sum_x2_y = 0;
147*c83a76b0SSuyog Pawar     float sum_x = 0;
148*c83a76b0SSuyog Pawar     float sum_x2 = 0;
149*c83a76b0SSuyog Pawar     float sum_x3 = 0;
150*c83a76b0SSuyog Pawar     float sum_x4 = 0;
151*c83a76b0SSuyog Pawar     float var_x2_y = 0;
152*c83a76b0SSuyog Pawar     float var_x_y = 0;
153*c83a76b0SSuyog Pawar     float var_x2_x = 0;
154*c83a76b0SSuyog Pawar     float var_x2_x2 = 0;
155*c83a76b0SSuyog Pawar     float var_x_x = 0;
156*c83a76b0SSuyog Pawar     float x0, y0;
157*c83a76b0SSuyog Pawar     float model_coeff_a, model_coeff_b, model_coeff_c, model_coeff_den;
158*c83a76b0SSuyog Pawar 
159*c83a76b0SSuyog Pawar     for(i = 0; i < u1_num_frms; i++)
160*c83a76b0SSuyog Pawar     {
161*c83a76b0SSuyog Pawar         if(-1 == pi1_frame_index[i])
162*c83a76b0SSuyog Pawar             continue;
163*c83a76b0SSuyog Pawar 
164*c83a76b0SSuyog Pawar         u1_frm_indx = (UWORD8)pi1_frame_index[i];
165*c83a76b0SSuyog Pawar 
166*c83a76b0SSuyog Pawar         y0 = (float)(pi4_res_bits[u1_frm_indx]);
167*c83a76b0SSuyog Pawar         x0 = (float)(pi4_sad_h264[u1_frm_indx] / (float)pui_avg_mpeg2_qp[u1_frm_indx]);
168*c83a76b0SSuyog Pawar 
169*c83a76b0SSuyog Pawar         sum_y += y0;
170*c83a76b0SSuyog Pawar         sum_x_y += x0 * y0;
171*c83a76b0SSuyog Pawar         sum_x2_y += x0 * x0 * y0;
172*c83a76b0SSuyog Pawar         sum_x += x0;
173*c83a76b0SSuyog Pawar         sum_x2 += x0 * x0;
174*c83a76b0SSuyog Pawar         sum_x3 += x0 * x0 * x0;
175*c83a76b0SSuyog Pawar         sum_x4 += x0 * x0 * x0 * x0;
176*c83a76b0SSuyog Pawar         u1_num_frms_used++;
177*c83a76b0SSuyog Pawar     }
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar     sum_y /= u1_num_frms_used;
180*c83a76b0SSuyog Pawar     sum_x_y /= u1_num_frms_used;
181*c83a76b0SSuyog Pawar     sum_x2_y /= u1_num_frms_used;
182*c83a76b0SSuyog Pawar     sum_x /= u1_num_frms_used;
183*c83a76b0SSuyog Pawar     sum_x2 /= u1_num_frms_used;
184*c83a76b0SSuyog Pawar     sum_x3 /= u1_num_frms_used;
185*c83a76b0SSuyog Pawar     sum_x4 /= u1_num_frms_used;
186*c83a76b0SSuyog Pawar 
187*c83a76b0SSuyog Pawar #if !QUAD
188*c83a76b0SSuyog Pawar     u1_model_used = LIN_MODEL;
189*c83a76b0SSuyog Pawar #endif
190*c83a76b0SSuyog Pawar 
191*c83a76b0SSuyog Pawar     if((QUAD_MODEL == u1_model_used) && (u1_num_frms_used <= MIN_FRAMES_FOR_QUAD_MODEL))
192*c83a76b0SSuyog Pawar     {
193*c83a76b0SSuyog Pawar         u1_model_used = LIN_MODEL;
194*c83a76b0SSuyog Pawar     }
195*c83a76b0SSuyog Pawar 
196*c83a76b0SSuyog Pawar     if(QUAD_MODEL == u1_model_used)
197*c83a76b0SSuyog Pawar     {
198*c83a76b0SSuyog Pawar         var_x2_y = sum_x2_y - sum_x2 * sum_y;
199*c83a76b0SSuyog Pawar         var_x_y = sum_x_y - sum_x * sum_y;
200*c83a76b0SSuyog Pawar         var_x2_x = sum_x3 - sum_x2 * sum_x;
201*c83a76b0SSuyog Pawar         var_x2_x2 = sum_x4 - sum_x2 * sum_x2;
202*c83a76b0SSuyog Pawar         var_x_x = sum_x2 - sum_x * sum_x;
203*c83a76b0SSuyog Pawar 
204*c83a76b0SSuyog Pawar         model_coeff_den = (var_x2_x * var_x2_x - var_x2_x2 * var_x_x);
205*c83a76b0SSuyog Pawar 
206*c83a76b0SSuyog Pawar         if(0 != model_coeff_den)
207*c83a76b0SSuyog Pawar         {
208*c83a76b0SSuyog Pawar             model_coeff_b = (var_x_y * var_x2_x - var_x2_y * var_x_x);
209*c83a76b0SSuyog Pawar             model_coeff_b /= model_coeff_den;
210*c83a76b0SSuyog Pawar 
211*c83a76b0SSuyog Pawar             model_coeff_a = (var_x2_y * var_x2_x - var_x_y * var_x2_x2);
212*c83a76b0SSuyog Pawar             model_coeff_a /= model_coeff_den;
213*c83a76b0SSuyog Pawar 
214*c83a76b0SSuyog Pawar             model_coeff_c = sum_y - (model_coeff_a * sum_x) - (model_coeff_b * sum_x2);
215*c83a76b0SSuyog Pawar         }
216*c83a76b0SSuyog Pawar 
217*c83a76b0SSuyog Pawar         pmc_model_coeff[0] = model_coeff_b;
218*c83a76b0SSuyog Pawar         pmc_model_coeff[1] = model_coeff_a;
219*c83a76b0SSuyog Pawar         pmc_model_coeff[2] = model_coeff_c;
220*c83a76b0SSuyog Pawar     }
221*c83a76b0SSuyog Pawar 
222*c83a76b0SSuyog Pawar     if(NULL != pmc_model_coeff_lin)
223*c83a76b0SSuyog Pawar     {
224*c83a76b0SSuyog Pawar         var_x_y = sum_x_y - sum_x * sum_y;
225*c83a76b0SSuyog Pawar         var_x_x = sum_x2 - sum_x * sum_x;
226*c83a76b0SSuyog Pawar 
227*c83a76b0SSuyog Pawar         if(0 != var_x_x)
228*c83a76b0SSuyog Pawar         {
229*c83a76b0SSuyog Pawar             model_coeff_a = (var_x_y / var_x_x);
230*c83a76b0SSuyog Pawar             model_coeff_c = sum_y - (model_coeff_a * sum_x);
231*c83a76b0SSuyog Pawar             /*model_coeff_b = 0;*/
232*c83a76b0SSuyog Pawar             model_coeff_b = model_coeff_a;
233*c83a76b0SSuyog Pawar 
234*c83a76b0SSuyog Pawar             pmc_model_coeff_lin[0] = model_coeff_b;
235*c83a76b0SSuyog Pawar             pmc_model_coeff_lin[1] = model_coeff_a;
236*c83a76b0SSuyog Pawar             pmc_model_coeff_lin[2] = model_coeff_c;
237*c83a76b0SSuyog Pawar         }
238*c83a76b0SSuyog Pawar     }
239*c83a76b0SSuyog Pawar 
240*c83a76b0SSuyog Pawar     if(NULL != pmc_model_coeff_lin_wo_int)
241*c83a76b0SSuyog Pawar     {
242*c83a76b0SSuyog Pawar         UWORD8 u1_curr_frame_index;
243*c83a76b0SSuyog Pawar         UWORD8 u1_avgqp_prvfrm;
244*c83a76b0SSuyog Pawar         UWORD32 u4_prevfrm_bits, u4_prevfrm_sad;
245*c83a76b0SSuyog Pawar 
246*c83a76b0SSuyog Pawar         u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
247*c83a76b0SSuyog Pawar         if(0 == u1_curr_frame_index)
248*c83a76b0SSuyog Pawar             u1_curr_frame_index = (MAX_FRAMES_MODELLED - 1);
249*c83a76b0SSuyog Pawar         else
250*c83a76b0SSuyog Pawar             u1_curr_frame_index--;
251*c83a76b0SSuyog Pawar 
252*c83a76b0SSuyog Pawar         u1_avgqp_prvfrm = ps_rd_model->pu1_avg_qp[u1_curr_frame_index];
253*c83a76b0SSuyog Pawar         u4_prevfrm_bits = ps_rd_model->pi4_res_bits[u1_curr_frame_index];
254*c83a76b0SSuyog Pawar         u4_prevfrm_sad = ps_rd_model->pi4_sad[u1_curr_frame_index];
255*c83a76b0SSuyog Pawar 
256*c83a76b0SSuyog Pawar         if(0 != u4_prevfrm_sad)
257*c83a76b0SSuyog Pawar             model_coeff_a = (float)(u4_prevfrm_bits * u1_avgqp_prvfrm) / u4_prevfrm_sad;
258*c83a76b0SSuyog Pawar         else
259*c83a76b0SSuyog Pawar             model_coeff_a = 0;
260*c83a76b0SSuyog Pawar 
261*c83a76b0SSuyog Pawar         model_coeff_b = 0;
262*c83a76b0SSuyog Pawar         model_coeff_c = 0;
263*c83a76b0SSuyog Pawar 
264*c83a76b0SSuyog Pawar         pmc_model_coeff_lin_wo_int[0] = model_coeff_b;
265*c83a76b0SSuyog Pawar         pmc_model_coeff_lin_wo_int[1] = model_coeff_a;
266*c83a76b0SSuyog Pawar         pmc_model_coeff_lin_wo_int[2] = model_coeff_c;
267*c83a76b0SSuyog Pawar     }
268*c83a76b0SSuyog Pawar 
269*c83a76b0SSuyog Pawar     return u1_model_used;
270*c83a76b0SSuyog Pawar }
271*c83a76b0SSuyog Pawar 
refine_set_of_points(UWORD32 * pi4_res_bits,UWORD32 * pi4_sad_h264,UWORD8 * pu1_num_skips,UWORD8 * pui_avg_mpeg2_qp,UWORD8 u1_num_frms,WORD8 * pi1_frame_index,model_coeff * pmc_model_coeff,float * pfl_avg_deviation)272*c83a76b0SSuyog Pawar static WORD8 refine_set_of_points(
273*c83a76b0SSuyog Pawar     UWORD32 *pi4_res_bits,
274*c83a76b0SSuyog Pawar     UWORD32 *pi4_sad_h264,
275*c83a76b0SSuyog Pawar     UWORD8 *pu1_num_skips,
276*c83a76b0SSuyog Pawar     UWORD8 *pui_avg_mpeg2_qp,
277*c83a76b0SSuyog Pawar     UWORD8 u1_num_frms,
278*c83a76b0SSuyog Pawar     WORD8 *pi1_frame_index,
279*c83a76b0SSuyog Pawar     model_coeff *pmc_model_coeff,
280*c83a76b0SSuyog Pawar     float *pfl_avg_deviation)
281*c83a76b0SSuyog Pawar {
282*c83a76b0SSuyog Pawar     float fl_avg_deviation, fl_estimated_bits, fl_deviation, x_val;
283*c83a76b0SSuyog Pawar     UWORD8 u1_return_value = 1;
284*c83a76b0SSuyog Pawar     UWORD32 i;
285*c83a76b0SSuyog Pawar     UWORD8 u1_num_frms_used, u1_frm_indx;
286*c83a76b0SSuyog Pawar 
287*c83a76b0SSuyog Pawar     u1_num_frms_used = 0;
288*c83a76b0SSuyog Pawar     fl_avg_deviation = 0;
289*c83a76b0SSuyog Pawar     for(i = 0; i < u1_num_frms; i++)
290*c83a76b0SSuyog Pawar     {
291*c83a76b0SSuyog Pawar         if(-1 == pi1_frame_index[i])
292*c83a76b0SSuyog Pawar             continue;
293*c83a76b0SSuyog Pawar 
294*c83a76b0SSuyog Pawar         u1_frm_indx = (UWORD8)pi1_frame_index[i];
295*c83a76b0SSuyog Pawar         x_val = pi4_sad_h264[u1_frm_indx] / (float)pui_avg_mpeg2_qp[u1_frm_indx];
296*c83a76b0SSuyog Pawar 
297*c83a76b0SSuyog Pawar         fl_estimated_bits = (pmc_model_coeff[0] * x_val * x_val) + (pmc_model_coeff[1] * x_val) +
298*c83a76b0SSuyog Pawar                             (pmc_model_coeff[2]);
299*c83a76b0SSuyog Pawar 
300*c83a76b0SSuyog Pawar         fl_deviation =
301*c83a76b0SSuyog Pawar             fabs(pi4_res_bits[u1_frm_indx] - fl_estimated_bits) / (float)pi4_res_bits[u1_frm_indx];
302*c83a76b0SSuyog Pawar         fl_deviation = fl_deviation * fl_deviation;
303*c83a76b0SSuyog Pawar         fl_avg_deviation += fl_deviation;
304*c83a76b0SSuyog Pawar         u1_num_frms_used++;
305*c83a76b0SSuyog Pawar     }
306*c83a76b0SSuyog Pawar 
307*c83a76b0SSuyog Pawar     fl_avg_deviation /= u1_num_frms_used;
308*c83a76b0SSuyog Pawar     /*fl_avg_deviation = sqrt(fl_avg_deviation);*/
309*c83a76b0SSuyog Pawar     fl_avg_deviation = (fl_avg_deviation);
310*c83a76b0SSuyog Pawar 
311*c83a76b0SSuyog Pawar     for(i = 0; i < u1_num_frms; i++)
312*c83a76b0SSuyog Pawar     {
313*c83a76b0SSuyog Pawar         if((-1 == pi1_frame_index[i]) && (i != 0))
314*c83a76b0SSuyog Pawar             continue;
315*c83a76b0SSuyog Pawar 
316*c83a76b0SSuyog Pawar         u1_frm_indx = (UWORD8)pi1_frame_index[i];
317*c83a76b0SSuyog Pawar 
318*c83a76b0SSuyog Pawar         x_val = pi4_sad_h264[u1_frm_indx] / (float)pui_avg_mpeg2_qp[u1_frm_indx];
319*c83a76b0SSuyog Pawar 
320*c83a76b0SSuyog Pawar         fl_estimated_bits = (pmc_model_coeff[0] * x_val * x_val) + (pmc_model_coeff[1] * x_val) +
321*c83a76b0SSuyog Pawar                             (pmc_model_coeff[2]);
322*c83a76b0SSuyog Pawar 
323*c83a76b0SSuyog Pawar         fl_deviation =
324*c83a76b0SSuyog Pawar             fabs(pi4_res_bits[u1_frm_indx] - fl_estimated_bits) / (float)pi4_res_bits[u1_frm_indx];
325*c83a76b0SSuyog Pawar 
326*c83a76b0SSuyog Pawar         fl_deviation = fl_deviation * fl_deviation;
327*c83a76b0SSuyog Pawar 
328*c83a76b0SSuyog Pawar         if(fl_deviation > (fl_avg_deviation))
329*c83a76b0SSuyog Pawar         {
330*c83a76b0SSuyog Pawar             pi1_frame_index[i] = -1;
331*c83a76b0SSuyog Pawar         }
332*c83a76b0SSuyog Pawar     }
333*c83a76b0SSuyog Pawar 
334*c83a76b0SSuyog Pawar     if(fl_avg_deviation > 0.0625)
335*c83a76b0SSuyog Pawar         u1_return_value = 0;
336*c83a76b0SSuyog Pawar     if(fl_avg_deviation < 0.0225)
337*c83a76b0SSuyog Pawar         u1_return_value = 2;
338*c83a76b0SSuyog Pawar 
339*c83a76b0SSuyog Pawar     *pfl_avg_deviation = fl_avg_deviation;
340*c83a76b0SSuyog Pawar 
341*c83a76b0SSuyog Pawar     return (u1_return_value);
342*c83a76b0SSuyog Pawar }
calc_avg_sqr_dev_for_model(UWORD32 * pi4_res_bits,UWORD32 * pi4_sad_h264,UWORD8 * pu1_num_skips,UWORD8 * pui_avg_mpeg2_qp,UWORD8 u1_num_frms,WORD8 * pi1_frame_index,model_coeff * pmc_model_coeff,float * pfl_avg_deviation)343*c83a76b0SSuyog Pawar static void calc_avg_sqr_dev_for_model(
344*c83a76b0SSuyog Pawar     UWORD32 *pi4_res_bits,
345*c83a76b0SSuyog Pawar     UWORD32 *pi4_sad_h264,
346*c83a76b0SSuyog Pawar     UWORD8 *pu1_num_skips,
347*c83a76b0SSuyog Pawar     UWORD8 *pui_avg_mpeg2_qp,
348*c83a76b0SSuyog Pawar     UWORD8 u1_num_frms,
349*c83a76b0SSuyog Pawar     WORD8 *pi1_frame_index,
350*c83a76b0SSuyog Pawar     model_coeff *pmc_model_coeff,
351*c83a76b0SSuyog Pawar     float *pfl_avg_deviation)
352*c83a76b0SSuyog Pawar {
353*c83a76b0SSuyog Pawar     float fl_avg_deviation, fl_estimated_bits, fl_deviation, x_val;
354*c83a76b0SSuyog Pawar     UWORD8 u1_return_value = 1;
355*c83a76b0SSuyog Pawar     UWORD32 i;
356*c83a76b0SSuyog Pawar     UWORD8 u1_num_frms_used, u1_frm_indx;
357*c83a76b0SSuyog Pawar 
358*c83a76b0SSuyog Pawar     u1_num_frms_used = 0;
359*c83a76b0SSuyog Pawar     fl_avg_deviation = 0;
360*c83a76b0SSuyog Pawar     for(i = 0; i < u1_num_frms; i++)
361*c83a76b0SSuyog Pawar     {
362*c83a76b0SSuyog Pawar         if(-1 == pi1_frame_index[i])
363*c83a76b0SSuyog Pawar             continue;
364*c83a76b0SSuyog Pawar 
365*c83a76b0SSuyog Pawar         u1_frm_indx = (UWORD8)pi1_frame_index[i];
366*c83a76b0SSuyog Pawar 
367*c83a76b0SSuyog Pawar         u1_frm_indx = (UWORD8)i;
368*c83a76b0SSuyog Pawar         x_val = pi4_sad_h264[u1_frm_indx] / (float)pui_avg_mpeg2_qp[u1_frm_indx];
369*c83a76b0SSuyog Pawar 
370*c83a76b0SSuyog Pawar         fl_estimated_bits = (pmc_model_coeff[1] * x_val) + (pmc_model_coeff[2]);
371*c83a76b0SSuyog Pawar 
372*c83a76b0SSuyog Pawar         fl_deviation =
373*c83a76b0SSuyog Pawar             fabs(pi4_res_bits[u1_frm_indx] - fl_estimated_bits) / (float)pi4_res_bits[u1_frm_indx];
374*c83a76b0SSuyog Pawar         fl_deviation = fl_deviation * fl_deviation;
375*c83a76b0SSuyog Pawar         fl_avg_deviation += fl_deviation;
376*c83a76b0SSuyog Pawar         u1_num_frms_used++;
377*c83a76b0SSuyog Pawar     }
378*c83a76b0SSuyog Pawar 
379*c83a76b0SSuyog Pawar     fl_avg_deviation /= u1_num_frms_used;
380*c83a76b0SSuyog Pawar     /*fl_avg_deviation = sqrt(fl_avg_deviation);*/
381*c83a76b0SSuyog Pawar     fl_avg_deviation = (fl_avg_deviation);
382*c83a76b0SSuyog Pawar 
383*c83a76b0SSuyog Pawar     *pfl_avg_deviation = fl_avg_deviation;
384*c83a76b0SSuyog Pawar     /*return (u1_return_value);*/
385*c83a76b0SSuyog Pawar }
update_frame_rd_model(rc_rd_model_t * ps_rd_model)386*c83a76b0SSuyog Pawar static void update_frame_rd_model(rc_rd_model_t *ps_rd_model)
387*c83a76b0SSuyog Pawar {
388*c83a76b0SSuyog Pawar     WORD8 pi1_frame_index[MAX_FRAMES_MODELLED], pi1_frame_index_initial[MAX_FRAMES_MODELLED];
389*c83a76b0SSuyog Pawar 
390*c83a76b0SSuyog Pawar     UWORD8 u1_num_skips_temp;
391*c83a76b0SSuyog Pawar     UWORD8 u1_avg_mpeg2_qp_temp, u1_min_mpeg2_qp, u1_max_mpeg2_qp;
392*c83a76b0SSuyog Pawar     UWORD8 u1_num_frms_input, u1_num_active_frames, u1_reject_frame;
393*c83a76b0SSuyog Pawar     UWORD32 u4_num_skips;
394*c83a76b0SSuyog Pawar 
395*c83a76b0SSuyog Pawar     UWORD8 u1_min2_mpeg2_qp, u1_max2_mpeg2_qp;
396*c83a76b0SSuyog Pawar     UWORD8 u1_min_qp_frame_indx, u1_max_qp_frame_indx;
397*c83a76b0SSuyog Pawar     UWORD8 pu1_num_frames[MPEG2_QP_ELEM];
398*c83a76b0SSuyog Pawar     model_coeff model_coeff_array[3], model_coeff_array_lin[3], model_coeff_array_lin_wo_int[3];
399*c83a76b0SSuyog Pawar     UWORD32 i;
400*c83a76b0SSuyog Pawar     UWORD8 u1_curr_frame_index;
401*c83a76b0SSuyog Pawar     UWORD8 u1_quad_model_valid, u1_lin_model_valid;
402*c83a76b0SSuyog Pawar 
403*c83a76b0SSuyog Pawar     float fl_quad_avg_dev, fl_lin_avg_dev;
404*c83a76b0SSuyog Pawar 
405*c83a76b0SSuyog Pawar     UWORD8 u1_check_model;
406*c83a76b0SSuyog Pawar 
407*c83a76b0SSuyog Pawar     /*ps_rd_model += u1_pic_type;*/
408*c83a76b0SSuyog Pawar 
409*c83a76b0SSuyog Pawar     u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
410*c83a76b0SSuyog Pawar 
411*c83a76b0SSuyog Pawar     ps_rd_model->u1_model_used = QUAD_MODEL;
412*c83a76b0SSuyog Pawar 
413*c83a76b0SSuyog Pawar     if(0 == u1_curr_frame_index)
414*c83a76b0SSuyog Pawar         u1_curr_frame_index = (MAX_FRAMES_MODELLED - 1);
415*c83a76b0SSuyog Pawar     else
416*c83a76b0SSuyog Pawar         u1_curr_frame_index--;
417*c83a76b0SSuyog Pawar 
418*c83a76b0SSuyog Pawar     /************************************************************************/
419*c83a76b0SSuyog Pawar     /* Rearrange data to be fed into a Linear Regression Module             */
420*c83a76b0SSuyog Pawar     /* Module finds a,b,c such that                                         */
421*c83a76b0SSuyog Pawar     /*      y = ax + bx^2 + c                                               */
422*c83a76b0SSuyog Pawar     /************************************************************************/
423*c83a76b0SSuyog Pawar     u4_num_skips = 0;
424*c83a76b0SSuyog Pawar     u1_num_frms_input = 0;
425*c83a76b0SSuyog Pawar     memset(pu1_num_frames, 0, MPEG2_QP_ELEM);
426*c83a76b0SSuyog Pawar     memset(pi1_frame_index, -1, MAX_FRAMES_MODELLED);
427*c83a76b0SSuyog Pawar     u1_min_mpeg2_qp = MAX_MPEG2_QP;
428*c83a76b0SSuyog Pawar     u1_max_mpeg2_qp = 0;
429*c83a76b0SSuyog Pawar 
430*c83a76b0SSuyog Pawar     u1_num_active_frames = ps_rd_model->u1_num_frms_in_model;
431*c83a76b0SSuyog Pawar     if(u1_num_active_frames > MAX_ACTIVE_FRAMES)
432*c83a76b0SSuyog Pawar         u1_num_active_frames = MAX_ACTIVE_FRAMES;
433*c83a76b0SSuyog Pawar 
434*c83a76b0SSuyog Pawar     /************************************************************************/
435*c83a76b0SSuyog Pawar     /* Choose the set of Points to be used for MSE fit of Quadratic model   */
436*c83a76b0SSuyog Pawar     /* Points chosen are spread across the Qp range. Max of 2 points are    */
437*c83a76b0SSuyog Pawar     /* chosen for a Qp.                                                     */
438*c83a76b0SSuyog Pawar     /************************************************************************/
439*c83a76b0SSuyog Pawar     for(i = 0; i < u1_num_active_frames; i++)
440*c83a76b0SSuyog Pawar     {
441*c83a76b0SSuyog Pawar         u1_reject_frame = 0;
442*c83a76b0SSuyog Pawar         u1_num_skips_temp = ps_rd_model->pu1_num_skips[u1_curr_frame_index];
443*c83a76b0SSuyog Pawar         u1_avg_mpeg2_qp_temp = ps_rd_model->pu1_avg_qp[u1_curr_frame_index];
444*c83a76b0SSuyog Pawar 
445*c83a76b0SSuyog Pawar         if((0 == u4_num_skips) && (0 != u1_num_skips_temp))
446*c83a76b0SSuyog Pawar             u1_reject_frame = 1;
447*c83a76b0SSuyog Pawar         if((1 == u4_num_skips) && (u1_num_skips_temp > 1))
448*c83a76b0SSuyog Pawar             u1_reject_frame = 1;
449*c83a76b0SSuyog Pawar         if(pu1_num_frames[u1_avg_mpeg2_qp_temp] >= 2)
450*c83a76b0SSuyog Pawar             u1_reject_frame = 1;
451*c83a76b0SSuyog Pawar 
452*c83a76b0SSuyog Pawar         if(0 == i)
453*c83a76b0SSuyog Pawar             u1_reject_frame = 0;
454*c83a76b0SSuyog Pawar 
455*c83a76b0SSuyog Pawar         if(0 == u1_reject_frame)
456*c83a76b0SSuyog Pawar         {
457*c83a76b0SSuyog Pawar             pi1_frame_index[u1_num_frms_input] = (WORD8)u1_curr_frame_index;
458*c83a76b0SSuyog Pawar             pu1_num_frames[u1_avg_mpeg2_qp_temp] += 1;
459*c83a76b0SSuyog Pawar 
460*c83a76b0SSuyog Pawar             if(u1_min_mpeg2_qp > u1_avg_mpeg2_qp_temp)
461*c83a76b0SSuyog Pawar                 u1_min_mpeg2_qp = u1_avg_mpeg2_qp_temp;
462*c83a76b0SSuyog Pawar             if(u1_max_mpeg2_qp < u1_avg_mpeg2_qp_temp)
463*c83a76b0SSuyog Pawar                 u1_max_mpeg2_qp = u1_avg_mpeg2_qp_temp;
464*c83a76b0SSuyog Pawar 
465*c83a76b0SSuyog Pawar             u1_num_frms_input++;
466*c83a76b0SSuyog Pawar         }
467*c83a76b0SSuyog Pawar 
468*c83a76b0SSuyog Pawar         if(0 == u1_curr_frame_index)
469*c83a76b0SSuyog Pawar             u1_curr_frame_index = (MAX_FRAMES_MODELLED - 1);
470*c83a76b0SSuyog Pawar         else
471*c83a76b0SSuyog Pawar             u1_curr_frame_index--;
472*c83a76b0SSuyog Pawar     }
473*c83a76b0SSuyog Pawar 
474*c83a76b0SSuyog Pawar     /************************************************************************/
475*c83a76b0SSuyog Pawar     /* Add Pivot Points to the Data set to be used for finding Quadratic    */
476*c83a76b0SSuyog Pawar     /* Model Coeffs. These will help in constraining the shape of  Quadratic*/
477*c83a76b0SSuyog Pawar     /* to adapt too much to the Local deviations.                           */
478*c83a76b0SSuyog Pawar     /************************************************************************/
479*c83a76b0SSuyog Pawar     u1_min2_mpeg2_qp = u1_min_mpeg2_qp;
480*c83a76b0SSuyog Pawar     u1_max2_mpeg2_qp = u1_max_mpeg2_qp;
481*c83a76b0SSuyog Pawar     u1_min_qp_frame_indx = INVALID_FRAME_INDEX;
482*c83a76b0SSuyog Pawar     u1_max_qp_frame_indx = INVALID_FRAME_INDEX;
483*c83a76b0SSuyog Pawar 
484*c83a76b0SSuyog Pawar     /* Loop runnning over the Stored Frame Level Data
485*c83a76b0SSuyog Pawar        to find frames of MinQp and MaxQp */
486*c83a76b0SSuyog Pawar     for(; i < ps_rd_model->u1_num_frms_in_model; i++)
487*c83a76b0SSuyog Pawar     {
488*c83a76b0SSuyog Pawar         u1_num_skips_temp = ps_rd_model->pu1_num_skips[u1_curr_frame_index];
489*c83a76b0SSuyog Pawar         u1_avg_mpeg2_qp_temp = ps_rd_model->pu1_avg_qp[u1_curr_frame_index];
490*c83a76b0SSuyog Pawar 
491*c83a76b0SSuyog Pawar         if(((0 == u4_num_skips) && (0 != u1_num_skips_temp)) ||
492*c83a76b0SSuyog Pawar            ((1 == u4_num_skips) && (u1_num_skips_temp > 1)))
493*c83a76b0SSuyog Pawar             continue;
494*c83a76b0SSuyog Pawar 
495*c83a76b0SSuyog Pawar         if(u1_min2_mpeg2_qp > u1_avg_mpeg2_qp_temp)
496*c83a76b0SSuyog Pawar         {
497*c83a76b0SSuyog Pawar             u1_min2_mpeg2_qp = u1_avg_mpeg2_qp_temp;
498*c83a76b0SSuyog Pawar             u1_min_qp_frame_indx = u1_curr_frame_index;
499*c83a76b0SSuyog Pawar         }
500*c83a76b0SSuyog Pawar         if(u1_max2_mpeg2_qp < u1_avg_mpeg2_qp_temp)
501*c83a76b0SSuyog Pawar         {
502*c83a76b0SSuyog Pawar             u1_max2_mpeg2_qp = u1_avg_mpeg2_qp_temp;
503*c83a76b0SSuyog Pawar             u1_max_qp_frame_indx = u1_curr_frame_index;
504*c83a76b0SSuyog Pawar         }
505*c83a76b0SSuyog Pawar         if(0 == u1_curr_frame_index)
506*c83a76b0SSuyog Pawar             u1_curr_frame_index = (MAX_FRAMES_MODELLED - 1);
507*c83a76b0SSuyog Pawar         else
508*c83a76b0SSuyog Pawar             u1_curr_frame_index--;
509*c83a76b0SSuyog Pawar     }
510*c83a76b0SSuyog Pawar 
511*c83a76b0SSuyog Pawar     /* Add the Chosen Points to the regression data set */
512*c83a76b0SSuyog Pawar     if(INVALID_FRAME_INDEX != u1_min_qp_frame_indx)
513*c83a76b0SSuyog Pawar     {
514*c83a76b0SSuyog Pawar         pi1_frame_index[u1_num_frms_input] = (WORD8)u1_min_qp_frame_indx;
515*c83a76b0SSuyog Pawar         u1_num_frms_input++;
516*c83a76b0SSuyog Pawar     }
517*c83a76b0SSuyog Pawar     if(INVALID_FRAME_INDEX != u1_max_qp_frame_indx)
518*c83a76b0SSuyog Pawar     {
519*c83a76b0SSuyog Pawar         pi1_frame_index[u1_num_frms_input] = (WORD8)u1_max_qp_frame_indx;
520*c83a76b0SSuyog Pawar         u1_num_frms_input++;
521*c83a76b0SSuyog Pawar     }
522*c83a76b0SSuyog Pawar     memcpy(pi1_frame_index_initial, pi1_frame_index, MAX_FRAMES_MODELLED);
523*c83a76b0SSuyog Pawar 
524*c83a76b0SSuyog Pawar     if(QUAD_MODEL == ps_rd_model->u1_model_used)
525*c83a76b0SSuyog Pawar     {
526*c83a76b0SSuyog Pawar         if(u1_num_frms_input < (MIN_FRAMES_FOR_QUAD_MODEL))
527*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = LIN_MODEL;
528*c83a76b0SSuyog Pawar         if((WORD32)u1_max_mpeg2_qp < ((WORD32)(21 * u1_min_mpeg2_qp) >> 4))
529*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = LIN_MODEL;
530*c83a76b0SSuyog Pawar     }
531*c83a76b0SSuyog Pawar 
532*c83a76b0SSuyog Pawar     if(LIN_MODEL == ps_rd_model->u1_model_used)
533*c83a76b0SSuyog Pawar     {
534*c83a76b0SSuyog Pawar         if(u1_num_frms_input < MIN_FRAMES_FOR_LIN_MODEL)
535*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
536*c83a76b0SSuyog Pawar         if((WORD32)u1_max_mpeg2_qp < ((WORD32)(19 * u1_min_mpeg2_qp) >> 4))
537*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
538*c83a76b0SSuyog Pawar     }
539*c83a76b0SSuyog Pawar 
540*c83a76b0SSuyog Pawar     /***** Call the Module to Return the Coeffs for the Fed Data *****/
541*c83a76b0SSuyog Pawar     ps_rd_model->u1_model_used = find_model_coeffs(
542*c83a76b0SSuyog Pawar         ps_rd_model->pi4_res_bits,
543*c83a76b0SSuyog Pawar         ps_rd_model->pi4_sad,
544*c83a76b0SSuyog Pawar         ps_rd_model->pu1_num_skips,
545*c83a76b0SSuyog Pawar         ps_rd_model->pu1_avg_qp,
546*c83a76b0SSuyog Pawar         u1_num_frms_input,
547*c83a76b0SSuyog Pawar         ps_rd_model->u1_model_used,
548*c83a76b0SSuyog Pawar         pi1_frame_index,
549*c83a76b0SSuyog Pawar         model_coeff_array,
550*c83a76b0SSuyog Pawar         model_coeff_array_lin,
551*c83a76b0SSuyog Pawar         model_coeff_array_lin_wo_int,
552*c83a76b0SSuyog Pawar         ps_rd_model);
553*c83a76b0SSuyog Pawar 
554*c83a76b0SSuyog Pawar     if((model_coeff_array_lin[2] > 0) || (model_coeff_array_lin[0] < 0))
555*c83a76b0SSuyog Pawar         u1_lin_model_valid = 0;
556*c83a76b0SSuyog Pawar     else
557*c83a76b0SSuyog Pawar     {
558*c83a76b0SSuyog Pawar         u1_lin_model_valid = 1;
559*c83a76b0SSuyog Pawar         /* lin deviation calculation */
560*c83a76b0SSuyog Pawar         calc_avg_sqr_dev_for_model(
561*c83a76b0SSuyog Pawar             ps_rd_model->pi4_res_bits,
562*c83a76b0SSuyog Pawar             ps_rd_model->pi4_sad,
563*c83a76b0SSuyog Pawar             ps_rd_model->pu1_num_skips,
564*c83a76b0SSuyog Pawar             ps_rd_model->pu1_avg_qp,
565*c83a76b0SSuyog Pawar             u1_num_frms_input,
566*c83a76b0SSuyog Pawar             pi1_frame_index_initial,
567*c83a76b0SSuyog Pawar             model_coeff_array_lin,
568*c83a76b0SSuyog Pawar             &fl_lin_avg_dev);
569*c83a76b0SSuyog Pawar     }
570*c83a76b0SSuyog Pawar 
571*c83a76b0SSuyog Pawar     if(QUAD_MODEL == ps_rd_model->u1_model_used)
572*c83a76b0SSuyog Pawar     {
573*c83a76b0SSuyog Pawar         u1_check_model = refine_set_of_points(
574*c83a76b0SSuyog Pawar             ps_rd_model->pi4_res_bits,
575*c83a76b0SSuyog Pawar             ps_rd_model->pi4_sad,
576*c83a76b0SSuyog Pawar             ps_rd_model->pu1_num_skips,
577*c83a76b0SSuyog Pawar             ps_rd_model->pu1_avg_qp,
578*c83a76b0SSuyog Pawar             u1_num_frms_input,
579*c83a76b0SSuyog Pawar             pi1_frame_index,
580*c83a76b0SSuyog Pawar             model_coeff_array,
581*c83a76b0SSuyog Pawar             &fl_quad_avg_dev);
582*c83a76b0SSuyog Pawar 
583*c83a76b0SSuyog Pawar         if(2 == u1_check_model)
584*c83a76b0SSuyog Pawar         {
585*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = QUAD_MODEL;
586*c83a76b0SSuyog Pawar         }
587*c83a76b0SSuyog Pawar         else
588*c83a76b0SSuyog Pawar         {
589*c83a76b0SSuyog Pawar             /*******************************************************************/
590*c83a76b0SSuyog Pawar             /* Make sure that some of the Pivot Points are used in the Refined */
591*c83a76b0SSuyog Pawar             /* data set. 1. Previous Frame                                     */
592*c83a76b0SSuyog Pawar             /*******************************************************************/
593*c83a76b0SSuyog Pawar             /*pi1_frame_index[0] = ps_rd_model->u1_curr_frm_counter;*/
594*c83a76b0SSuyog Pawar 
595*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = find_model_coeffs(
596*c83a76b0SSuyog Pawar                 ps_rd_model->pi4_res_bits,
597*c83a76b0SSuyog Pawar                 ps_rd_model->pi4_sad,
598*c83a76b0SSuyog Pawar                 ps_rd_model->pu1_num_skips,
599*c83a76b0SSuyog Pawar                 ps_rd_model->pu1_avg_qp,
600*c83a76b0SSuyog Pawar                 u1_num_frms_input,
601*c83a76b0SSuyog Pawar                 ps_rd_model->u1_model_used,
602*c83a76b0SSuyog Pawar                 pi1_frame_index,
603*c83a76b0SSuyog Pawar                 model_coeff_array,
604*c83a76b0SSuyog Pawar                 NULL,
605*c83a76b0SSuyog Pawar                 NULL,
606*c83a76b0SSuyog Pawar                 ps_rd_model);
607*c83a76b0SSuyog Pawar 
608*c83a76b0SSuyog Pawar             u1_check_model = refine_set_of_points(
609*c83a76b0SSuyog Pawar                 ps_rd_model->pi4_res_bits,
610*c83a76b0SSuyog Pawar                 ps_rd_model->pi4_sad,
611*c83a76b0SSuyog Pawar                 ps_rd_model->pu1_num_skips,
612*c83a76b0SSuyog Pawar                 ps_rd_model->pu1_avg_qp,
613*c83a76b0SSuyog Pawar                 u1_num_frms_input,
614*c83a76b0SSuyog Pawar                 pi1_frame_index,
615*c83a76b0SSuyog Pawar                 model_coeff_array,
616*c83a76b0SSuyog Pawar                 &fl_quad_avg_dev);
617*c83a76b0SSuyog Pawar 
618*c83a76b0SSuyog Pawar             if((0 == u1_check_model))
619*c83a76b0SSuyog Pawar             {
620*c83a76b0SSuyog Pawar #if RC_MODEL_USED_BUG_FIX
621*c83a76b0SSuyog Pawar                 if((fl_lin_avg_dev < fl_quad_avg_dev) && (1 == u1_lin_model_valid))
622*c83a76b0SSuyog Pawar #endif
623*c83a76b0SSuyog Pawar                     ps_rd_model->u1_model_used = LIN_MODEL;
624*c83a76b0SSuyog Pawar             }
625*c83a76b0SSuyog Pawar         }
626*c83a76b0SSuyog Pawar     }
627*c83a76b0SSuyog Pawar 
628*c83a76b0SSuyog Pawar     if(QUAD_MODEL == ps_rd_model->u1_model_used)
629*c83a76b0SSuyog Pawar     {
630*c83a76b0SSuyog Pawar         /*min_res_bits = model_coeff_c -
631*c83a76b0SSuyog Pawar                        ((model_coeff_a * model_coeff_a) / (4 * model_coeff_b));*/
632*c83a76b0SSuyog Pawar 
633*c83a76b0SSuyog Pawar         if(model_coeff_array[0] < 0)
634*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = LIN_MODEL;
635*c83a76b0SSuyog Pawar 
636*c83a76b0SSuyog Pawar         /*if ((model_coeff_a * model_coeff_b) > 0)
637*c83a76b0SSuyog Pawar              u1_model_used = LIN_MODEL;*/
638*c83a76b0SSuyog Pawar     }
639*c83a76b0SSuyog Pawar     if(LIN_MODEL == ps_rd_model->u1_model_used)
640*c83a76b0SSuyog Pawar     {
641*c83a76b0SSuyog Pawar         if((model_coeff_array_lin[2] > 0) || (model_coeff_array_lin[0] < 0))
642*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
643*c83a76b0SSuyog Pawar     }
644*c83a76b0SSuyog Pawar 
645*c83a76b0SSuyog Pawar #if RC_MODEL_USED_BUG_FIX
646*c83a76b0SSuyog Pawar     /* Another threshold of .25 on deviation i.e. deviation greater than 25%  */
647*c83a76b0SSuyog Pawar     if((QUAD_MODEL == ps_rd_model->u1_model_used) && (fl_quad_avg_dev > .25))
648*c83a76b0SSuyog Pawar         ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
649*c83a76b0SSuyog Pawar 
650*c83a76b0SSuyog Pawar     if((LIN_MODEL == ps_rd_model->u1_model_used) && (fl_lin_avg_dev > .25))
651*c83a76b0SSuyog Pawar         ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
652*c83a76b0SSuyog Pawar #endif /* #if RC_MODEL_USED_BUG_FIX */
653*c83a76b0SSuyog Pawar 
654*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_quad = model_coeff_array[0];
655*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_quad = model_coeff_array[1];
656*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_quad = model_coeff_array[2];
657*c83a76b0SSuyog Pawar 
658*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_lin = model_coeff_array_lin[0];
659*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_lin = model_coeff_array_lin[1];
660*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_lin = model_coeff_array_lin[2];
661*c83a76b0SSuyog Pawar 
662*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_b_lin_wo_int = model_coeff_array_lin_wo_int[0];
663*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_a_lin_wo_int = model_coeff_array_lin_wo_int[1];
664*c83a76b0SSuyog Pawar     ps_rd_model->model_coeff_c_lin_wo_int = model_coeff_array_lin_wo_int[2];
665*c83a76b0SSuyog Pawar 
666*c83a76b0SSuyog Pawar     /*ps_rd_model->u1_model_used = PREV_FRAME_MODEL;*/
667*c83a76b0SSuyog Pawar }
668*c83a76b0SSuyog Pawar #endif /* ENABLE_QUAD_MODEL */
669*c83a76b0SSuyog Pawar 
estimate_bits_for_qp(rc_rd_model_t * ps_rd_model,UWORD32 u4_estimated_sad,UWORD8 u1_avg_qp)670*c83a76b0SSuyog Pawar UWORD32 estimate_bits_for_qp(rc_rd_model_t *ps_rd_model, UWORD32 u4_estimated_sad, UWORD8 u1_avg_qp)
671*c83a76b0SSuyog Pawar {
672*c83a76b0SSuyog Pawar     float fl_num_bits;
673*c83a76b0SSuyog Pawar     /*ps_rd_model += u1_curr_pic_type;*/
674*c83a76b0SSuyog Pawar 
675*c83a76b0SSuyog Pawar     {
676*c83a76b0SSuyog Pawar         fl_num_bits =
677*c83a76b0SSuyog Pawar             ps_rd_model->model_coeff_a_lin_wo_int * ((float)(u4_estimated_sad / u1_avg_qp));
678*c83a76b0SSuyog Pawar     }
679*c83a76b0SSuyog Pawar 
680*c83a76b0SSuyog Pawar     return ((UWORD32)fl_num_bits);
681*c83a76b0SSuyog Pawar }
682*c83a76b0SSuyog Pawar 
find_qp_for_target_bits(rc_rd_model_t * ps_rd_model,UWORD32 u4_target_res_bits,UWORD32 u4_estimated_sad,UWORD8 u1_min_qp,UWORD8 u1_max_qp)683*c83a76b0SSuyog Pawar UWORD8 find_qp_for_target_bits(
684*c83a76b0SSuyog Pawar     rc_rd_model_t *ps_rd_model,
685*c83a76b0SSuyog Pawar     UWORD32 u4_target_res_bits,
686*c83a76b0SSuyog Pawar     UWORD32 u4_estimated_sad,
687*c83a76b0SSuyog Pawar     UWORD8 u1_min_qp,
688*c83a76b0SSuyog Pawar     UWORD8 u1_max_qp)
689*c83a76b0SSuyog Pawar {
690*c83a76b0SSuyog Pawar     UWORD8 u1_qp;
691*c83a76b0SSuyog Pawar     float x_value, f_qp;
692*c83a76b0SSuyog Pawar     /*ps_rd_model += u1_curr_pic_type;*/
693*c83a76b0SSuyog Pawar #if ENABLE_QUAD_MODEL
694*c83a76b0SSuyog Pawar     if(QUAD_MODEL == ps_rd_model->u1_model_used)
695*c83a76b0SSuyog Pawar     {
696*c83a76b0SSuyog Pawar         float det;
697*c83a76b0SSuyog Pawar         det = (ps_rd_model->model_coeff_a_quad * ps_rd_model->model_coeff_a_quad) -
698*c83a76b0SSuyog Pawar               (4 * (ps_rd_model->model_coeff_b_quad) *
699*c83a76b0SSuyog Pawar                (ps_rd_model->model_coeff_c_quad - u4_target_res_bits));
700*c83a76b0SSuyog Pawar 
701*c83a76b0SSuyog Pawar         if(det > 0)
702*c83a76b0SSuyog Pawar         {
703*c83a76b0SSuyog Pawar             x_value = sqrt(det);
704*c83a76b0SSuyog Pawar 
705*c83a76b0SSuyog Pawar             x_value =
706*c83a76b0SSuyog Pawar                 (x_value - ps_rd_model->model_coeff_a_quad) / (2 * ps_rd_model->model_coeff_b_quad);
707*c83a76b0SSuyog Pawar         }
708*c83a76b0SSuyog Pawar         else
709*c83a76b0SSuyog Pawar             ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
710*c83a76b0SSuyog Pawar     }
711*c83a76b0SSuyog Pawar 
712*c83a76b0SSuyog Pawar     if(LIN_MODEL == ps_rd_model->u1_model_used)
713*c83a76b0SSuyog Pawar     {
714*c83a76b0SSuyog Pawar         x_value = ((float)u4_target_res_bits - ps_rd_model->model_coeff_c_lin) /
715*c83a76b0SSuyog Pawar                   (ps_rd_model->model_coeff_b_lin);
716*c83a76b0SSuyog Pawar     }
717*c83a76b0SSuyog Pawar #else
718*c83a76b0SSuyog Pawar     ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
719*c83a76b0SSuyog Pawar #endif
720*c83a76b0SSuyog Pawar 
721*c83a76b0SSuyog Pawar     if(PREV_FRAME_MODEL == ps_rd_model->u1_model_used)
722*c83a76b0SSuyog Pawar     {
723*c83a76b0SSuyog Pawar         x_value = (float)u4_target_res_bits / ps_rd_model->model_coeff_a_lin_wo_int;
724*c83a76b0SSuyog Pawar     }
725*c83a76b0SSuyog Pawar 
726*c83a76b0SSuyog Pawar     if(0 != x_value)
727*c83a76b0SSuyog Pawar         f_qp = u4_estimated_sad / x_value;
728*c83a76b0SSuyog Pawar     else
729*c83a76b0SSuyog Pawar         f_qp = 255;
730*c83a76b0SSuyog Pawar 
731*c83a76b0SSuyog Pawar     if(f_qp > 255)
732*c83a76b0SSuyog Pawar         f_qp = 255;
733*c83a76b0SSuyog Pawar 
734*c83a76b0SSuyog Pawar     /* Truncating the QP to the Max and Min Qp values possible */
735*c83a76b0SSuyog Pawar     if(f_qp < u1_min_qp)
736*c83a76b0SSuyog Pawar         f_qp = u1_min_qp;
737*c83a76b0SSuyog Pawar     if(f_qp > u1_max_qp)
738*c83a76b0SSuyog Pawar         f_qp = u1_max_qp;
739*c83a76b0SSuyog Pawar 
740*c83a76b0SSuyog Pawar     u1_qp = (UWORD8)(f_qp + 0.5);
741*c83a76b0SSuyog Pawar 
742*c83a76b0SSuyog Pawar     return u1_qp;
743*c83a76b0SSuyog Pawar }
744*c83a76b0SSuyog Pawar 
add_frame_to_rd_model(rc_rd_model_t * ps_rd_model,UWORD32 i4_res_bits,UWORD8 u1_avg_mp2qp,UWORD32 i4_sad_h264,UWORD8 u1_num_skips)745*c83a76b0SSuyog Pawar void add_frame_to_rd_model(
746*c83a76b0SSuyog Pawar     rc_rd_model_t *ps_rd_model,
747*c83a76b0SSuyog Pawar     UWORD32 i4_res_bits,
748*c83a76b0SSuyog Pawar     UWORD8 u1_avg_mp2qp,
749*c83a76b0SSuyog Pawar     UWORD32 i4_sad_h264,
750*c83a76b0SSuyog Pawar     UWORD8 u1_num_skips)
751*c83a76b0SSuyog Pawar {
752*c83a76b0SSuyog Pawar     UWORD8 u1_curr_frame_index;
753*c83a76b0SSuyog Pawar     /*ps_rd_model += u1_curr_pic_type;*/
754*c83a76b0SSuyog Pawar     u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
755*c83a76b0SSuyog Pawar     /*** Insert the Present Frame Data into the RD Model State Memory ***/
756*c83a76b0SSuyog Pawar     ps_rd_model->pi4_res_bits[u1_curr_frame_index] = i4_res_bits;
757*c83a76b0SSuyog Pawar     ps_rd_model->pi4_sad[u1_curr_frame_index] = i4_sad_h264;
758*c83a76b0SSuyog Pawar     ps_rd_model->pu1_num_skips[u1_curr_frame_index] = u1_num_skips;
759*c83a76b0SSuyog Pawar     ps_rd_model->pu1_avg_qp[u1_curr_frame_index] = u1_avg_mp2qp;
760*c83a76b0SSuyog Pawar 
761*c83a76b0SSuyog Pawar     ps_rd_model->u1_curr_frm_counter++;
762*c83a76b0SSuyog Pawar     if(MAX_FRAMES_MODELLED == ps_rd_model->u1_curr_frm_counter)
763*c83a76b0SSuyog Pawar         ps_rd_model->u1_curr_frm_counter = 0;
764*c83a76b0SSuyog Pawar 
765*c83a76b0SSuyog Pawar     if(ps_rd_model->u1_num_frms_in_model < ps_rd_model->u1_max_frms_to_model)
766*c83a76b0SSuyog Pawar     {
767*c83a76b0SSuyog Pawar         ps_rd_model->u1_num_frms_in_model++;
768*c83a76b0SSuyog Pawar     }
769*c83a76b0SSuyog Pawar     update_frame_rd_model(ps_rd_model);
770*c83a76b0SSuyog Pawar }
771*c83a76b0SSuyog Pawar 
calc_per_frm_bits(rc_rd_model_t * ps_rd_model,UWORD16 * pu2_num_pics_of_a_pic_type,UWORD8 * pu1_update_pic_type_model,UWORD8 u1_num_pic_types,UWORD32 * pu4_num_skip_of_a_pic_type,UWORD8 u1_base_pic_type,float * pfl_gamma,float * pfl_eta,UWORD8 u1_curr_pic_type,UWORD32 u4_bits_for_sub_gop,UWORD32 u4_curr_estimated_sad,UWORD8 * pu1_curr_pic_type_qp)772*c83a76b0SSuyog Pawar WORD32 calc_per_frm_bits(
773*c83a76b0SSuyog Pawar     rc_rd_model_t *ps_rd_model, /* array of model structs */
774*c83a76b0SSuyog Pawar     UWORD16 *pu2_num_pics_of_a_pic_type, /* N1, N2,...Nk */
775*c83a76b0SSuyog Pawar     UWORD8 *
776*c83a76b0SSuyog Pawar         pu1_update_pic_type_model, /* flag which tells whether or not to update model coefficients of a particular pic-type */
777*c83a76b0SSuyog Pawar     UWORD8 u1_num_pic_types, /* value of k */
778*c83a76b0SSuyog Pawar     UWORD32 *
779*c83a76b0SSuyog Pawar         pu4_num_skip_of_a_pic_type, /* the number of skips of that pic-type. It "may" be used to update the model coefficients at a later point. Right now it is not being used at all. */
780*c83a76b0SSuyog Pawar     UWORD8 u1_base_pic_type, /* base pic type index wrt which alpha & beta are calculated */
781*c83a76b0SSuyog Pawar     float *pfl_gamma, /* gamma_i = beta_i / alpha_i */
782*c83a76b0SSuyog Pawar     float *pfl_eta,
783*c83a76b0SSuyog Pawar     UWORD8
784*c83a76b0SSuyog Pawar         u1_curr_pic_type, /* the current pic-type for which the targetted bits need to be computed */
785*c83a76b0SSuyog Pawar     UWORD32
786*c83a76b0SSuyog Pawar         u4_bits_for_sub_gop, /* the number of bits to be consumed for the remaining part of sub-gop */
787*c83a76b0SSuyog Pawar     UWORD32 u4_curr_estimated_sad,
788*c83a76b0SSuyog Pawar     UWORD8 *pu1_curr_pic_type_qp) /* output of this function */
789*c83a76b0SSuyog Pawar {
790*c83a76b0SSuyog Pawar     WORD32 i4_per_frm_bits_Ti;
791*c83a76b0SSuyog Pawar     UWORD8 u1_i;
792*c83a76b0SSuyog Pawar     rc_rd_model_t *ps_rd_model_of_pic_type;
793*c83a76b0SSuyog Pawar 
794*c83a76b0SSuyog Pawar     /* first part of this function updates all the model coefficients */
795*c83a76b0SSuyog Pawar     /*for all the pic-types */
796*c83a76b0SSuyog Pawar     {
797*c83a76b0SSuyog Pawar         for(u1_i = 0; u1_i < u1_num_pic_types; u1_i++)
798*c83a76b0SSuyog Pawar         {
799*c83a76b0SSuyog Pawar             if((0 != pu2_num_pics_of_a_pic_type[u1_i]) && (1 == pu1_update_pic_type_model[u1_i]))
800*c83a76b0SSuyog Pawar             {
801*c83a76b0SSuyog Pawar                 /* ps_rd_model_of_pic_type = ps_rd_model + u1_i; */
802*c83a76b0SSuyog Pawar 
803*c83a76b0SSuyog Pawar                 update_frame_rd_model(&ps_rd_model[u1_i]);
804*c83a76b0SSuyog Pawar             }
805*c83a76b0SSuyog Pawar         }
806*c83a76b0SSuyog Pawar     }
807*c83a76b0SSuyog Pawar 
808*c83a76b0SSuyog Pawar     /* The second part of this function deals with solving the
809*c83a76b0SSuyog Pawar     equation using all the pic-types models */
810*c83a76b0SSuyog Pawar 
811*c83a76b0SSuyog Pawar     {
812*c83a76b0SSuyog Pawar         UWORD8 u1_combined_model_used;
813*c83a76b0SSuyog Pawar 
814*c83a76b0SSuyog Pawar         /* first choose the model to be used */
815*c83a76b0SSuyog Pawar         u1_combined_model_used = QUAD_MODEL;
816*c83a76b0SSuyog Pawar 
817*c83a76b0SSuyog Pawar         for(u1_i = 0; u1_i < u1_num_pic_types; u1_i++)
818*c83a76b0SSuyog Pawar         {
819*c83a76b0SSuyog Pawar             ps_rd_model_of_pic_type = ps_rd_model + u1_i;
820*c83a76b0SSuyog Pawar 
821*c83a76b0SSuyog Pawar             if((0 != pu2_num_pics_of_a_pic_type[u1_i]) &&
822*c83a76b0SSuyog Pawar                (QUAD_MODEL != ps_rd_model_of_pic_type->u1_model_used))
823*c83a76b0SSuyog Pawar             {
824*c83a76b0SSuyog Pawar                 u1_combined_model_used = LIN_MODEL;
825*c83a76b0SSuyog Pawar                 break;
826*c83a76b0SSuyog Pawar             }
827*c83a76b0SSuyog Pawar         }
828*c83a76b0SSuyog Pawar 
829*c83a76b0SSuyog Pawar         if(u1_combined_model_used == LIN_MODEL)
830*c83a76b0SSuyog Pawar         {
831*c83a76b0SSuyog Pawar             for(u1_i = 0; u1_i < u1_num_pic_types; u1_i++)
832*c83a76b0SSuyog Pawar             {
833*c83a76b0SSuyog Pawar                 ps_rd_model_of_pic_type = ps_rd_model + u1_i;
834*c83a76b0SSuyog Pawar 
835*c83a76b0SSuyog Pawar                 if((0 != pu2_num_pics_of_a_pic_type[u1_i]) &&
836*c83a76b0SSuyog Pawar                    (QUAD_MODEL != ps_rd_model_of_pic_type->u1_model_used) &&
837*c83a76b0SSuyog Pawar                    (LIN_MODEL != ps_rd_model_of_pic_type->u1_model_used))
838*c83a76b0SSuyog Pawar                 {
839*c83a76b0SSuyog Pawar                     u1_combined_model_used = PREV_FRAME_MODEL;
840*c83a76b0SSuyog Pawar                     break;
841*c83a76b0SSuyog Pawar                 }
842*c83a76b0SSuyog Pawar             }
843*c83a76b0SSuyog Pawar         }
844*c83a76b0SSuyog Pawar 
845*c83a76b0SSuyog Pawar         /* solve the equation for the */
846*c83a76b0SSuyog Pawar         {
847*c83a76b0SSuyog Pawar             model_coeff eff_A;
848*c83a76b0SSuyog Pawar             model_coeff eff_B;
849*c83a76b0SSuyog Pawar             model_coeff eff_C;
850*c83a76b0SSuyog Pawar             float fl_determinant;
851*c83a76b0SSuyog Pawar             float fl_sad_by_qp_base;
852*c83a76b0SSuyog Pawar             float fl_sad_by_qp_curr_frm;
853*c83a76b0SSuyog Pawar             float fl_qp_curr_frm;
854*c83a76b0SSuyog Pawar             float fl_bits_for_curr_frm;
855*c83a76b0SSuyog Pawar 
856*c83a76b0SSuyog Pawar             /* If the combined chosen model is quad model */
857*c83a76b0SSuyog Pawar             if(QUAD_MODEL == u1_combined_model_used)
858*c83a76b0SSuyog Pawar             {
859*c83a76b0SSuyog Pawar                 eff_A = 0.0;
860*c83a76b0SSuyog Pawar                 eff_B = 0.0;
861*c83a76b0SSuyog Pawar                 eff_C = 0.0;
862*c83a76b0SSuyog Pawar                 for(u1_i = 0; u1_i < u1_num_pic_types; u1_i++)
863*c83a76b0SSuyog Pawar                 {
864*c83a76b0SSuyog Pawar                     ps_rd_model_of_pic_type = ps_rd_model + u1_i;
865*c83a76b0SSuyog Pawar 
866*c83a76b0SSuyog Pawar                     eff_A +=
867*c83a76b0SSuyog Pawar                         ((pfl_eta[u1_i] + pu2_num_pics_of_a_pic_type[u1_i] - 1) *
868*c83a76b0SSuyog Pawar                          ps_rd_model_of_pic_type->model_coeff_a_quad * pfl_gamma[u1_i]);
869*c83a76b0SSuyog Pawar                     eff_B +=
870*c83a76b0SSuyog Pawar                         ((pfl_eta[u1_i] * pfl_eta[u1_i] + pu2_num_pics_of_a_pic_type[u1_i] - 1) *
871*c83a76b0SSuyog Pawar                          ps_rd_model_of_pic_type->model_coeff_b_quad * pfl_gamma[u1_i] *
872*c83a76b0SSuyog Pawar                          pfl_gamma[u1_i]);
873*c83a76b0SSuyog Pawar                     eff_C +=
874*c83a76b0SSuyog Pawar                         (pu2_num_pics_of_a_pic_type[u1_i] *
875*c83a76b0SSuyog Pawar                          ps_rd_model_of_pic_type->model_coeff_c_quad);
876*c83a76b0SSuyog Pawar                 }
877*c83a76b0SSuyog Pawar                 eff_C -= u4_bits_for_sub_gop;
878*c83a76b0SSuyog Pawar 
879*c83a76b0SSuyog Pawar                 fl_determinant = eff_A * eff_A - 4 * eff_B * eff_C;
880*c83a76b0SSuyog Pawar 
881*c83a76b0SSuyog Pawar                 if(fl_determinant < 0)
882*c83a76b0SSuyog Pawar                 {
883*c83a76b0SSuyog Pawar                     u1_combined_model_used =
884*c83a76b0SSuyog Pawar                         PREV_FRAME_MODEL; /* TO BE replaced by LIN_MODEL later */
885*c83a76b0SSuyog Pawar                 }
886*c83a76b0SSuyog Pawar                 else
887*c83a76b0SSuyog Pawar                 {
888*c83a76b0SSuyog Pawar                     fl_determinant = sqrt(fl_determinant);
889*c83a76b0SSuyog Pawar 
890*c83a76b0SSuyog Pawar                     fl_sad_by_qp_base = fl_determinant - eff_A;
891*c83a76b0SSuyog Pawar                     fl_sad_by_qp_base = fl_sad_by_qp_base / (2 * eff_B);
892*c83a76b0SSuyog Pawar 
893*c83a76b0SSuyog Pawar                     fl_sad_by_qp_curr_frm =
894*c83a76b0SSuyog Pawar                         fl_sad_by_qp_base * pfl_gamma[u1_curr_pic_type] * pfl_eta[u1_curr_pic_type];
895*c83a76b0SSuyog Pawar 
896*c83a76b0SSuyog Pawar                     ps_rd_model_of_pic_type = ps_rd_model + u1_curr_pic_type;
897*c83a76b0SSuyog Pawar 
898*c83a76b0SSuyog Pawar                     fl_bits_for_curr_frm =
899*c83a76b0SSuyog Pawar                         ps_rd_model_of_pic_type->model_coeff_a_quad * fl_sad_by_qp_curr_frm +
900*c83a76b0SSuyog Pawar                         ps_rd_model_of_pic_type->model_coeff_b_quad * fl_sad_by_qp_curr_frm *
901*c83a76b0SSuyog Pawar                             fl_sad_by_qp_curr_frm +
902*c83a76b0SSuyog Pawar                         ps_rd_model_of_pic_type->model_coeff_c_quad;
903*c83a76b0SSuyog Pawar                 }
904*c83a76b0SSuyog Pawar             }
905*c83a76b0SSuyog Pawar 
906*c83a76b0SSuyog Pawar             /* If the combined chosen model is linear model with an intercept */
907*c83a76b0SSuyog Pawar             if(LIN_MODEL == u1_combined_model_used)
908*c83a76b0SSuyog Pawar             {
909*c83a76b0SSuyog Pawar                 eff_A = 0.0;
910*c83a76b0SSuyog Pawar                 eff_B = 0.0;
911*c83a76b0SSuyog Pawar                 eff_C = 0.0;
912*c83a76b0SSuyog Pawar                 for(u1_i = 0; u1_i < u1_num_pic_types; u1_i++)
913*c83a76b0SSuyog Pawar                 {
914*c83a76b0SSuyog Pawar                     ps_rd_model_of_pic_type = ps_rd_model + u1_i;
915*c83a76b0SSuyog Pawar 
916*c83a76b0SSuyog Pawar                     eff_A +=
917*c83a76b0SSuyog Pawar                         ((pfl_eta[u1_i] + pu2_num_pics_of_a_pic_type[u1_i] - 1) *
918*c83a76b0SSuyog Pawar                          ps_rd_model_of_pic_type->model_coeff_a_lin * pfl_gamma[u1_i]);
919*c83a76b0SSuyog Pawar 
920*c83a76b0SSuyog Pawar                     eff_C +=
921*c83a76b0SSuyog Pawar                         (pu2_num_pics_of_a_pic_type[u1_i] *
922*c83a76b0SSuyog Pawar                          ps_rd_model_of_pic_type->model_coeff_c_lin);
923*c83a76b0SSuyog Pawar                 }
924*c83a76b0SSuyog Pawar                 eff_C -= u4_bits_for_sub_gop;
925*c83a76b0SSuyog Pawar 
926*c83a76b0SSuyog Pawar                 fl_determinant = (-(eff_C / eff_A));
927*c83a76b0SSuyog Pawar 
928*c83a76b0SSuyog Pawar                 if((fl_determinant) <= 0)
929*c83a76b0SSuyog Pawar                 {
930*c83a76b0SSuyog Pawar                     u1_combined_model_used = PREV_FRAME_MODEL;
931*c83a76b0SSuyog Pawar                 }
932*c83a76b0SSuyog Pawar                 else
933*c83a76b0SSuyog Pawar                 {
934*c83a76b0SSuyog Pawar                     fl_sad_by_qp_base = fl_determinant;
935*c83a76b0SSuyog Pawar 
936*c83a76b0SSuyog Pawar                     fl_sad_by_qp_curr_frm =
937*c83a76b0SSuyog Pawar                         fl_sad_by_qp_base * pfl_gamma[u1_curr_pic_type] * pfl_eta[u1_curr_pic_type];
938*c83a76b0SSuyog Pawar 
939*c83a76b0SSuyog Pawar                     ps_rd_model_of_pic_type = ps_rd_model + u1_curr_pic_type;
940*c83a76b0SSuyog Pawar 
941*c83a76b0SSuyog Pawar                     fl_bits_for_curr_frm =
942*c83a76b0SSuyog Pawar                         ps_rd_model_of_pic_type->model_coeff_a_lin * fl_sad_by_qp_curr_frm +
943*c83a76b0SSuyog Pawar                         ps_rd_model_of_pic_type->model_coeff_c_lin;
944*c83a76b0SSuyog Pawar                 }
945*c83a76b0SSuyog Pawar             }
946*c83a76b0SSuyog Pawar 
947*c83a76b0SSuyog Pawar             /* If the combined chosen model is linear model without an intercept */
948*c83a76b0SSuyog Pawar             if(PREV_FRAME_MODEL == u1_combined_model_used)
949*c83a76b0SSuyog Pawar             {
950*c83a76b0SSuyog Pawar                 eff_A = 0.0;
951*c83a76b0SSuyog Pawar                 eff_B = 0.0;
952*c83a76b0SSuyog Pawar                 eff_C = 0.0;
953*c83a76b0SSuyog Pawar                 for(u1_i = 0; u1_i < u1_num_pic_types; u1_i++)
954*c83a76b0SSuyog Pawar                 {
955*c83a76b0SSuyog Pawar                     ps_rd_model_of_pic_type = ps_rd_model + u1_i;
956*c83a76b0SSuyog Pawar 
957*c83a76b0SSuyog Pawar                     eff_A +=
958*c83a76b0SSuyog Pawar                         ((pfl_eta[u1_i] + pu2_num_pics_of_a_pic_type[u1_i] - 1) *
959*c83a76b0SSuyog Pawar                          ps_rd_model_of_pic_type->model_coeff_a_lin_wo_int * pfl_gamma[u1_i]);
960*c83a76b0SSuyog Pawar                 }
961*c83a76b0SSuyog Pawar 
962*c83a76b0SSuyog Pawar                 fl_sad_by_qp_base = u4_bits_for_sub_gop / eff_A;
963*c83a76b0SSuyog Pawar 
964*c83a76b0SSuyog Pawar                 fl_sad_by_qp_curr_frm =
965*c83a76b0SSuyog Pawar                     fl_sad_by_qp_base * pfl_gamma[u1_curr_pic_type] * pfl_eta[u1_curr_pic_type];
966*c83a76b0SSuyog Pawar 
967*c83a76b0SSuyog Pawar                 ps_rd_model_of_pic_type = ps_rd_model + u1_curr_pic_type;
968*c83a76b0SSuyog Pawar 
969*c83a76b0SSuyog Pawar                 fl_bits_for_curr_frm =
970*c83a76b0SSuyog Pawar                     ps_rd_model_of_pic_type->model_coeff_a_lin_wo_int * fl_sad_by_qp_curr_frm;
971*c83a76b0SSuyog Pawar             }
972*c83a76b0SSuyog Pawar 
973*c83a76b0SSuyog Pawar             /* store the model that was finally used to calculate Qp.
974*c83a76b0SSuyog Pawar             This is so that the same model is used in further calculations for this picture. */
975*c83a76b0SSuyog Pawar             ps_rd_model_of_pic_type = ps_rd_model + u1_curr_pic_type;
976*c83a76b0SSuyog Pawar             ps_rd_model_of_pic_type->u1_model_used = u1_combined_model_used;
977*c83a76b0SSuyog Pawar 
978*c83a76b0SSuyog Pawar             i4_per_frm_bits_Ti = (WORD32)(fl_bits_for_curr_frm + 0.5);
979*c83a76b0SSuyog Pawar 
980*c83a76b0SSuyog Pawar             if(fl_sad_by_qp_curr_frm > 0)
981*c83a76b0SSuyog Pawar                 fl_qp_curr_frm = (float)u4_curr_estimated_sad / fl_sad_by_qp_curr_frm;
982*c83a76b0SSuyog Pawar             else
983*c83a76b0SSuyog Pawar                 fl_qp_curr_frm = 255;
984*c83a76b0SSuyog Pawar 
985*c83a76b0SSuyog Pawar             if(fl_qp_curr_frm > 255)
986*c83a76b0SSuyog Pawar                 fl_qp_curr_frm = 255;
987*c83a76b0SSuyog Pawar 
988*c83a76b0SSuyog Pawar             *pu1_curr_pic_type_qp = (fl_qp_curr_frm + 0.5);
989*c83a76b0SSuyog Pawar         }
990*c83a76b0SSuyog Pawar     }
991*c83a76b0SSuyog Pawar     return (i4_per_frm_bits_Ti);
992*c83a76b0SSuyog Pawar }
993*c83a76b0SSuyog Pawar 
get_linear_coefficient(rc_rd_model_t * ps_rd_model)994*c83a76b0SSuyog Pawar model_coeff get_linear_coefficient(rc_rd_model_t *ps_rd_model)
995*c83a76b0SSuyog Pawar {
996*c83a76b0SSuyog Pawar     /*UWORD32 linear_coeff:
997*c83a76b0SSuyog Pawar     linear_coeff = ps_rd_model->model_coeff_a_lin_wo_int;*/
998*c83a76b0SSuyog Pawar     return (ps_rd_model->model_coeff_a_lin_wo_int);
999*c83a76b0SSuyog Pawar }
1000*c83a76b0SSuyog Pawar #endif /* !(RC_FIXED_POINT) */
rc_rd_model_dummy_for_avoiding_warnings(rc_rd_model_t ** pps_rc_rd_model,itt_memtab_t * ps_memtab,ITT_FUNC_TYPE_E e_func_type)1001*c83a76b0SSuyog Pawar WORD32 rc_rd_model_dummy_for_avoiding_warnings(
1002*c83a76b0SSuyog Pawar     rc_rd_model_t **pps_rc_rd_model, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type)
1003*c83a76b0SSuyog Pawar {
1004*c83a76b0SSuyog Pawar     WORD32 i4_mem_tab_idx = 0;
1005*c83a76b0SSuyog Pawar     static rc_rd_model_t s_rc_rd_model_temp;
1006*c83a76b0SSuyog Pawar 
1007*c83a76b0SSuyog Pawar     /* Hack for al alloc, during which we dont have any state memory.
1008*c83a76b0SSuyog Pawar       Dereferencing can cause issues */
1009*c83a76b0SSuyog Pawar     if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
1010*c83a76b0SSuyog Pawar         (*pps_rc_rd_model) = &s_rc_rd_model_temp;
1011*c83a76b0SSuyog Pawar 
1012*c83a76b0SSuyog Pawar     /*for src rate control state structure*/
1013*c83a76b0SSuyog Pawar     if(e_func_type != GET_NUM_MEMTAB)
1014*c83a76b0SSuyog Pawar     {
1015*c83a76b0SSuyog Pawar         fill_memtab(
1016*c83a76b0SSuyog Pawar             &ps_memtab[i4_mem_tab_idx], sizeof(rc_rd_model_t), MEM_TAB_ALIGNMENT, PERSISTENT, DDR);
1017*c83a76b0SSuyog Pawar         use_or_fill_base(&ps_memtab[0], (void **)pps_rc_rd_model, e_func_type);
1018*c83a76b0SSuyog Pawar     }
1019*c83a76b0SSuyog Pawar     i4_mem_tab_idx++;
1020*c83a76b0SSuyog Pawar 
1021*c83a76b0SSuyog Pawar     return (i4_mem_tab_idx);
1022*c83a76b0SSuyog Pawar }
1023