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