1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /****************************************************************************/
22*495ae853SAndroid Build Coastguard Worker /* File Name : irc_rd_model.c */
23*495ae853SAndroid Build Coastguard Worker /* */
24*495ae853SAndroid Build Coastguard Worker /* Description : Implall the Functions to Model the */
25*495ae853SAndroid Build Coastguard Worker /* Rate Distortion Behaviour of the Codec over the Last */
26*495ae853SAndroid Build Coastguard Worker /* Few Frames. */
27*495ae853SAndroid Build Coastguard Worker /* */
28*495ae853SAndroid Build Coastguard Worker /* List of Functions : irc_update_frame_rd_model */
29*495ae853SAndroid Build Coastguard Worker /* estimate_mpeg2_qp_for_resbits */
30*495ae853SAndroid Build Coastguard Worker /* */
31*495ae853SAndroid Build Coastguard Worker /* Issues / Problems : None */
32*495ae853SAndroid Build Coastguard Worker /* */
33*495ae853SAndroid Build Coastguard Worker /* Revision History : */
34*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
35*495ae853SAndroid Build Coastguard Worker /* 21 06 2006 Sarat Initial Version */
36*495ae853SAndroid Build Coastguard Worker /****************************************************************************/
37*495ae853SAndroid Build Coastguard Worker
38*495ae853SAndroid Build Coastguard Worker /* System include files */
39*495ae853SAndroid Build Coastguard Worker #include <stdarg.h>
40*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
41*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
42*495ae853SAndroid Build Coastguard Worker #include <string.h>
43*495ae853SAndroid Build Coastguard Worker #include "math.h"
44*495ae853SAndroid Build Coastguard Worker
45*495ae853SAndroid Build Coastguard Worker /* User include files */
46*495ae853SAndroid Build Coastguard Worker #include "irc_datatypes.h"
47*495ae853SAndroid Build Coastguard Worker #include "irc_common.h"
48*495ae853SAndroid Build Coastguard Worker #include "irc_mem_req_and_acq.h"
49*495ae853SAndroid Build Coastguard Worker #include "irc_rd_model.h"
50*495ae853SAndroid Build Coastguard Worker #include "irc_rd_model_struct.h"
51*495ae853SAndroid Build Coastguard Worker
52*495ae853SAndroid Build Coastguard Worker
irc_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)53*495ae853SAndroid Build Coastguard Worker WORD32 irc_rd_model_num_fill_use_free_memtab(rc_rd_model_t **pps_rc_rd_model,
54*495ae853SAndroid Build Coastguard Worker itt_memtab_t *ps_memtab,
55*495ae853SAndroid Build Coastguard Worker ITT_FUNC_TYPE_E e_func_type)
56*495ae853SAndroid Build Coastguard Worker {
57*495ae853SAndroid Build Coastguard Worker WORD32 i4_mem_tab_idx = 0;
58*495ae853SAndroid Build Coastguard Worker rc_rd_model_t s_rc_rd_model_temp;
59*495ae853SAndroid Build Coastguard Worker
60*495ae853SAndroid Build Coastguard Worker /*
61*495ae853SAndroid Build Coastguard Worker * Hack for al alloc, during which we don't have any state memory.
62*495ae853SAndroid Build Coastguard Worker * Dereferencing can cause issues
63*495ae853SAndroid Build Coastguard Worker */
64*495ae853SAndroid Build Coastguard Worker if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
65*495ae853SAndroid Build Coastguard Worker (*pps_rc_rd_model) = &s_rc_rd_model_temp;
66*495ae853SAndroid Build Coastguard Worker
67*495ae853SAndroid Build Coastguard Worker /*for src rate control state structure*/
68*495ae853SAndroid Build Coastguard Worker if(e_func_type != GET_NUM_MEMTAB)
69*495ae853SAndroid Build Coastguard Worker {
70*495ae853SAndroid Build Coastguard Worker fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(rc_rd_model_t),
71*495ae853SAndroid Build Coastguard Worker ALIGN_128_BYTE, PERSISTENT, DDR);
72*495ae853SAndroid Build Coastguard Worker use_or_fill_base(&ps_memtab[0], (void**)pps_rc_rd_model, e_func_type);
73*495ae853SAndroid Build Coastguard Worker }
74*495ae853SAndroid Build Coastguard Worker i4_mem_tab_idx++;
75*495ae853SAndroid Build Coastguard Worker
76*495ae853SAndroid Build Coastguard Worker return (i4_mem_tab_idx);
77*495ae853SAndroid Build Coastguard Worker }
78*495ae853SAndroid Build Coastguard Worker
irc_init_frm_rc_rd_model(rc_rd_model_t * ps_rd_model,UWORD8 u1_max_frames_modelled)79*495ae853SAndroid Build Coastguard Worker void irc_init_frm_rc_rd_model(rc_rd_model_t *ps_rd_model,
80*495ae853SAndroid Build Coastguard Worker UWORD8 u1_max_frames_modelled)
81*495ae853SAndroid Build Coastguard Worker {
82*495ae853SAndroid Build Coastguard Worker
83*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_num_frms_in_model = 0;
84*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_curr_frm_counter = 0;
85*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_max_frms_to_model = u1_max_frames_modelled;
86*495ae853SAndroid Build Coastguard Worker
87*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_a_lin_wo_int = 0;
88*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_b_lin_wo_int = 0;
89*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_c_lin_wo_int = 0;
90*495ae853SAndroid Build Coastguard Worker }
91*495ae853SAndroid Build Coastguard Worker
irc_reset_frm_rc_rd_model(rc_rd_model_t * ps_rd_model)92*495ae853SAndroid Build Coastguard Worker void irc_reset_frm_rc_rd_model(rc_rd_model_t *ps_rd_model)
93*495ae853SAndroid Build Coastguard Worker {
94*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_num_frms_in_model = 0;
95*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_curr_frm_counter = 0;
96*495ae853SAndroid Build Coastguard Worker
97*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_a_lin_wo_int = 0;
98*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_b_lin_wo_int = 0;
99*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_c_lin_wo_int = 0;
100*495ae853SAndroid Build Coastguard Worker }
101*495ae853SAndroid Build Coastguard Worker
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)102*495ae853SAndroid Build Coastguard Worker static UWORD8 find_model_coeffs(UWORD32 *pi4_res_bits,
103*495ae853SAndroid Build Coastguard Worker UWORD32 *pi4_sad_h264,
104*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_num_skips,
105*495ae853SAndroid Build Coastguard Worker UWORD8 *pui_avg_mpeg2_qp,
106*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_frms,
107*495ae853SAndroid Build Coastguard Worker UWORD8 u1_model_used,
108*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_frame_index,
109*495ae853SAndroid Build Coastguard Worker model_coeff *pmc_model_coeff,
110*495ae853SAndroid Build Coastguard Worker model_coeff *pmc_model_coeff_lin,
111*495ae853SAndroid Build Coastguard Worker model_coeff *pmc_model_coeff_lin_wo_int,
112*495ae853SAndroid Build Coastguard Worker rc_rd_model_t *ps_rd_model)
113*495ae853SAndroid Build Coastguard Worker {
114*495ae853SAndroid Build Coastguard Worker UWORD32 i;
115*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_frms_used = 0;
116*495ae853SAndroid Build Coastguard Worker UWORD8 u1_frm_indx;
117*495ae853SAndroid Build Coastguard Worker
118*495ae853SAndroid Build Coastguard Worker float sum_y = 0;
119*495ae853SAndroid Build Coastguard Worker float sum_x_y = 0;
120*495ae853SAndroid Build Coastguard Worker float sum_x2_y = 0;
121*495ae853SAndroid Build Coastguard Worker float sum_x = 0;
122*495ae853SAndroid Build Coastguard Worker float sum_x2 = 0;
123*495ae853SAndroid Build Coastguard Worker float sum_x3 = 0;
124*495ae853SAndroid Build Coastguard Worker float sum_x4 = 0;
125*495ae853SAndroid Build Coastguard Worker
126*495ae853SAndroid Build Coastguard Worker float x0, y0;
127*495ae853SAndroid Build Coastguard Worker float model_coeff_a = 0.0, model_coeff_b = 0.0, model_coeff_c = 0.0;
128*495ae853SAndroid Build Coastguard Worker
129*495ae853SAndroid Build Coastguard Worker UNUSED(pu1_num_skips);
130*495ae853SAndroid Build Coastguard Worker UNUSED(pmc_model_coeff);
131*495ae853SAndroid Build Coastguard Worker UNUSED(pmc_model_coeff_lin);
132*495ae853SAndroid Build Coastguard Worker
133*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u1_num_frms; i++)
134*495ae853SAndroid Build Coastguard Worker {
135*495ae853SAndroid Build Coastguard Worker if(-1 == pi1_frame_index[i])
136*495ae853SAndroid Build Coastguard Worker continue;
137*495ae853SAndroid Build Coastguard Worker
138*495ae853SAndroid Build Coastguard Worker u1_frm_indx = (UWORD8)pi1_frame_index[i];
139*495ae853SAndroid Build Coastguard Worker
140*495ae853SAndroid Build Coastguard Worker y0 = (float)(pi4_res_bits[u1_frm_indx]);
141*495ae853SAndroid Build Coastguard Worker x0 = (float)(pi4_sad_h264[u1_frm_indx]
142*495ae853SAndroid Build Coastguard Worker / (float)pui_avg_mpeg2_qp[u1_frm_indx]);
143*495ae853SAndroid Build Coastguard Worker
144*495ae853SAndroid Build Coastguard Worker sum_y += y0;
145*495ae853SAndroid Build Coastguard Worker sum_x_y += x0 * y0;
146*495ae853SAndroid Build Coastguard Worker sum_x2_y += x0 * x0 * y0;
147*495ae853SAndroid Build Coastguard Worker sum_x += x0;
148*495ae853SAndroid Build Coastguard Worker sum_x2 += x0 * x0;
149*495ae853SAndroid Build Coastguard Worker sum_x3 += x0 * x0 * x0;
150*495ae853SAndroid Build Coastguard Worker sum_x4 += x0 * x0 * x0 * x0;
151*495ae853SAndroid Build Coastguard Worker u1_num_frms_used++;
152*495ae853SAndroid Build Coastguard Worker }
153*495ae853SAndroid Build Coastguard Worker
154*495ae853SAndroid Build Coastguard Worker sum_y /= u1_num_frms_used;
155*495ae853SAndroid Build Coastguard Worker sum_x_y /= u1_num_frms_used;
156*495ae853SAndroid Build Coastguard Worker sum_x2_y /= u1_num_frms_used;
157*495ae853SAndroid Build Coastguard Worker sum_x /= u1_num_frms_used;
158*495ae853SAndroid Build Coastguard Worker sum_x2 /= u1_num_frms_used;
159*495ae853SAndroid Build Coastguard Worker sum_x3 /= u1_num_frms_used;
160*495ae853SAndroid Build Coastguard Worker sum_x4 /= u1_num_frms_used;
161*495ae853SAndroid Build Coastguard Worker
162*495ae853SAndroid Build Coastguard Worker {
163*495ae853SAndroid Build Coastguard Worker UWORD8 u1_curr_frame_index;
164*495ae853SAndroid Build Coastguard Worker UWORD8 u1_avgqp_prvfrm;
165*495ae853SAndroid Build Coastguard Worker UWORD32 u4_prevfrm_bits, u4_prevfrm_sad;
166*495ae853SAndroid Build Coastguard Worker
167*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
168*495ae853SAndroid Build Coastguard Worker if(0 == u1_curr_frame_index)
169*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index = (MAX_FRAMES_MODELLED - 1);
170*495ae853SAndroid Build Coastguard Worker else
171*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index--;
172*495ae853SAndroid Build Coastguard Worker
173*495ae853SAndroid Build Coastguard Worker u1_avgqp_prvfrm = ps_rd_model->pu1_avg_qp[u1_curr_frame_index];
174*495ae853SAndroid Build Coastguard Worker u4_prevfrm_bits = ps_rd_model->pi4_res_bits[u1_curr_frame_index];
175*495ae853SAndroid Build Coastguard Worker u4_prevfrm_sad = ps_rd_model->pi4_sad[u1_curr_frame_index];
176*495ae853SAndroid Build Coastguard Worker
177*495ae853SAndroid Build Coastguard Worker if(0 != u4_prevfrm_sad)
178*495ae853SAndroid Build Coastguard Worker model_coeff_a = (float)(u4_prevfrm_bits * u1_avgqp_prvfrm)
179*495ae853SAndroid Build Coastguard Worker / u4_prevfrm_sad;
180*495ae853SAndroid Build Coastguard Worker else
181*495ae853SAndroid Build Coastguard Worker model_coeff_a = 0;
182*495ae853SAndroid Build Coastguard Worker
183*495ae853SAndroid Build Coastguard Worker model_coeff_b = 0;
184*495ae853SAndroid Build Coastguard Worker model_coeff_c = 0;
185*495ae853SAndroid Build Coastguard Worker
186*495ae853SAndroid Build Coastguard Worker pmc_model_coeff_lin_wo_int[0] = model_coeff_b;
187*495ae853SAndroid Build Coastguard Worker pmc_model_coeff_lin_wo_int[1] = model_coeff_a;
188*495ae853SAndroid Build Coastguard Worker pmc_model_coeff_lin_wo_int[2] = model_coeff_c;
189*495ae853SAndroid Build Coastguard Worker }
190*495ae853SAndroid Build Coastguard Worker
191*495ae853SAndroid Build Coastguard Worker return u1_model_used;
192*495ae853SAndroid Build Coastguard Worker }
193*495ae853SAndroid Build Coastguard Worker
irc_update_frame_rd_model(rc_rd_model_t * ps_rd_model)194*495ae853SAndroid Build Coastguard Worker static void irc_update_frame_rd_model(rc_rd_model_t *ps_rd_model)
195*495ae853SAndroid Build Coastguard Worker {
196*495ae853SAndroid Build Coastguard Worker WORD8 pi1_frame_index[MAX_FRAMES_MODELLED],
197*495ae853SAndroid Build Coastguard Worker pi1_frame_index_initial[MAX_FRAMES_MODELLED];
198*495ae853SAndroid Build Coastguard Worker
199*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_skips_temp;
200*495ae853SAndroid Build Coastguard Worker UWORD8 u1_avg_mpeg2_qp_temp, u1_min_mpeg2_qp, u1_max_mpeg2_qp;
201*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_frms_input, u1_num_active_frames, u1_reject_frame;
202*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_skips;
203*495ae853SAndroid Build Coastguard Worker
204*495ae853SAndroid Build Coastguard Worker UWORD8 u1_min2_mpeg2_qp, u1_max2_mpeg2_qp;
205*495ae853SAndroid Build Coastguard Worker UWORD8 u1_min_qp_frame_indx, u1_max_qp_frame_indx;
206*495ae853SAndroid Build Coastguard Worker UWORD8 pu1_num_frames[MPEG2_QP_ELEM];
207*495ae853SAndroid Build Coastguard Worker model_coeff model_coeff_array[3], model_coeff_array_lin[3],
208*495ae853SAndroid Build Coastguard Worker model_coeff_array_lin_wo_int[3];
209*495ae853SAndroid Build Coastguard Worker UWORD32 i;
210*495ae853SAndroid Build Coastguard Worker UWORD8 u1_curr_frame_index;
211*495ae853SAndroid Build Coastguard Worker
212*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
213*495ae853SAndroid Build Coastguard Worker
214*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
215*495ae853SAndroid Build Coastguard Worker
216*495ae853SAndroid Build Coastguard Worker if(0 == u1_curr_frame_index)
217*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index = (MAX_FRAMES_MODELLED - 1);
218*495ae853SAndroid Build Coastguard Worker else
219*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index--;
220*495ae853SAndroid Build Coastguard Worker
221*495ae853SAndroid Build Coastguard Worker /************************************************************************/
222*495ae853SAndroid Build Coastguard Worker /* Rearrange data to be fed into a Linear Regression Module */
223*495ae853SAndroid Build Coastguard Worker /* Module finds a,b,c such that */
224*495ae853SAndroid Build Coastguard Worker /* y = ax + bx^2 + c */
225*495ae853SAndroid Build Coastguard Worker /************************************************************************/
226*495ae853SAndroid Build Coastguard Worker u4_num_skips = 0;
227*495ae853SAndroid Build Coastguard Worker u1_num_frms_input = 0;
228*495ae853SAndroid Build Coastguard Worker memset(pu1_num_frames, 0, MPEG2_QP_ELEM);
229*495ae853SAndroid Build Coastguard Worker memset(pi1_frame_index, -1, MAX_FRAMES_MODELLED);
230*495ae853SAndroid Build Coastguard Worker u1_min_mpeg2_qp = MAX_MPEG2_QP;
231*495ae853SAndroid Build Coastguard Worker u1_max_mpeg2_qp = 0;
232*495ae853SAndroid Build Coastguard Worker
233*495ae853SAndroid Build Coastguard Worker u1_num_active_frames = ps_rd_model->u1_num_frms_in_model;
234*495ae853SAndroid Build Coastguard Worker if(u1_num_active_frames > MAX_ACTIVE_FRAMES)
235*495ae853SAndroid Build Coastguard Worker {
236*495ae853SAndroid Build Coastguard Worker u1_num_active_frames = MAX_ACTIVE_FRAMES;
237*495ae853SAndroid Build Coastguard Worker }
238*495ae853SAndroid Build Coastguard Worker
239*495ae853SAndroid Build Coastguard Worker /************************************************************************/
240*495ae853SAndroid Build Coastguard Worker /* Choose the set of Points to be used for MSE fit of Quadratic model */
241*495ae853SAndroid Build Coastguard Worker /* Points chosen are spread across the Qp range. Max of 2 points are */
242*495ae853SAndroid Build Coastguard Worker /* chosen for a Qp. */
243*495ae853SAndroid Build Coastguard Worker /************************************************************************/
244*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u1_num_active_frames; i++)
245*495ae853SAndroid Build Coastguard Worker {
246*495ae853SAndroid Build Coastguard Worker u1_reject_frame = 0;
247*495ae853SAndroid Build Coastguard Worker u1_num_skips_temp = ps_rd_model->pu1_num_skips[u1_curr_frame_index];
248*495ae853SAndroid Build Coastguard Worker u1_avg_mpeg2_qp_temp = ps_rd_model->pu1_avg_qp[u1_curr_frame_index];
249*495ae853SAndroid Build Coastguard Worker
250*495ae853SAndroid Build Coastguard Worker if((0 == u4_num_skips) && (0 != u1_num_skips_temp))
251*495ae853SAndroid Build Coastguard Worker u1_reject_frame = 1;
252*495ae853SAndroid Build Coastguard Worker if((1 == u4_num_skips) && (u1_num_skips_temp > 1))
253*495ae853SAndroid Build Coastguard Worker u1_reject_frame = 1;
254*495ae853SAndroid Build Coastguard Worker if(pu1_num_frames[u1_avg_mpeg2_qp_temp] >= 2)
255*495ae853SAndroid Build Coastguard Worker u1_reject_frame = 1;
256*495ae853SAndroid Build Coastguard Worker
257*495ae853SAndroid Build Coastguard Worker if(0 == i)
258*495ae853SAndroid Build Coastguard Worker u1_reject_frame = 0;
259*495ae853SAndroid Build Coastguard Worker
260*495ae853SAndroid Build Coastguard Worker if(0 == u1_reject_frame)
261*495ae853SAndroid Build Coastguard Worker {
262*495ae853SAndroid Build Coastguard Worker pi1_frame_index[u1_num_frms_input] = (WORD8)u1_curr_frame_index;
263*495ae853SAndroid Build Coastguard Worker pu1_num_frames[u1_avg_mpeg2_qp_temp] += 1;
264*495ae853SAndroid Build Coastguard Worker
265*495ae853SAndroid Build Coastguard Worker if(u1_min_mpeg2_qp > u1_avg_mpeg2_qp_temp)
266*495ae853SAndroid Build Coastguard Worker u1_min_mpeg2_qp = u1_avg_mpeg2_qp_temp;
267*495ae853SAndroid Build Coastguard Worker if(u1_max_mpeg2_qp < u1_avg_mpeg2_qp_temp)
268*495ae853SAndroid Build Coastguard Worker u1_max_mpeg2_qp = u1_avg_mpeg2_qp_temp;
269*495ae853SAndroid Build Coastguard Worker
270*495ae853SAndroid Build Coastguard Worker u1_num_frms_input++;
271*495ae853SAndroid Build Coastguard Worker }
272*495ae853SAndroid Build Coastguard Worker
273*495ae853SAndroid Build Coastguard Worker if(0 == u1_curr_frame_index)
274*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index = (MAX_FRAMES_MODELLED - 1);
275*495ae853SAndroid Build Coastguard Worker else
276*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index--;
277*495ae853SAndroid Build Coastguard Worker }
278*495ae853SAndroid Build Coastguard Worker
279*495ae853SAndroid Build Coastguard Worker /************************************************************************/
280*495ae853SAndroid Build Coastguard Worker /* Add Pivot Points to the Data set to be used for finding Quadratic */
281*495ae853SAndroid Build Coastguard Worker /* Model Coeffs. These will help in constraining the shape of Quadratic*/
282*495ae853SAndroid Build Coastguard Worker /* to adapt too much to the Local deviations. */
283*495ae853SAndroid Build Coastguard Worker /************************************************************************/
284*495ae853SAndroid Build Coastguard Worker u1_min2_mpeg2_qp = u1_min_mpeg2_qp;
285*495ae853SAndroid Build Coastguard Worker u1_max2_mpeg2_qp = u1_max_mpeg2_qp;
286*495ae853SAndroid Build Coastguard Worker u1_min_qp_frame_indx = INVALID_FRAME_INDEX;
287*495ae853SAndroid Build Coastguard Worker u1_max_qp_frame_indx = INVALID_FRAME_INDEX;
288*495ae853SAndroid Build Coastguard Worker
289*495ae853SAndroid Build Coastguard Worker /* Loop runnning over the Stored Frame Level Data
290*495ae853SAndroid Build Coastguard Worker to find frames of MinQp and MaxQp */
291*495ae853SAndroid Build Coastguard Worker for(; i < ps_rd_model->u1_num_frms_in_model; i++)
292*495ae853SAndroid Build Coastguard Worker {
293*495ae853SAndroid Build Coastguard Worker u1_num_skips_temp = ps_rd_model->pu1_num_skips[u1_curr_frame_index];
294*495ae853SAndroid Build Coastguard Worker u1_avg_mpeg2_qp_temp = ps_rd_model->pu1_avg_qp[u1_curr_frame_index];
295*495ae853SAndroid Build Coastguard Worker
296*495ae853SAndroid Build Coastguard Worker if(((0 == u4_num_skips) && (0 != u1_num_skips_temp))
297*495ae853SAndroid Build Coastguard Worker || ((1 == u4_num_skips) && (u1_num_skips_temp > 1)))
298*495ae853SAndroid Build Coastguard Worker continue;
299*495ae853SAndroid Build Coastguard Worker
300*495ae853SAndroid Build Coastguard Worker if(u1_min2_mpeg2_qp > u1_avg_mpeg2_qp_temp)
301*495ae853SAndroid Build Coastguard Worker {
302*495ae853SAndroid Build Coastguard Worker u1_min2_mpeg2_qp = u1_avg_mpeg2_qp_temp;
303*495ae853SAndroid Build Coastguard Worker u1_min_qp_frame_indx = u1_curr_frame_index;
304*495ae853SAndroid Build Coastguard Worker }
305*495ae853SAndroid Build Coastguard Worker if(u1_max2_mpeg2_qp < u1_avg_mpeg2_qp_temp)
306*495ae853SAndroid Build Coastguard Worker {
307*495ae853SAndroid Build Coastguard Worker u1_max2_mpeg2_qp = u1_avg_mpeg2_qp_temp;
308*495ae853SAndroid Build Coastguard Worker u1_max_qp_frame_indx = u1_curr_frame_index;
309*495ae853SAndroid Build Coastguard Worker }
310*495ae853SAndroid Build Coastguard Worker if(0 == u1_curr_frame_index)
311*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index = (MAX_FRAMES_MODELLED - 1);
312*495ae853SAndroid Build Coastguard Worker else
313*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index--;
314*495ae853SAndroid Build Coastguard Worker }
315*495ae853SAndroid Build Coastguard Worker
316*495ae853SAndroid Build Coastguard Worker /* Add the Chosen Points to the regression data set */
317*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_INDEX != u1_min_qp_frame_indx)
318*495ae853SAndroid Build Coastguard Worker {
319*495ae853SAndroid Build Coastguard Worker pi1_frame_index[u1_num_frms_input] = (WORD8)u1_min_qp_frame_indx;
320*495ae853SAndroid Build Coastguard Worker u1_num_frms_input++;
321*495ae853SAndroid Build Coastguard Worker }
322*495ae853SAndroid Build Coastguard Worker if(INVALID_FRAME_INDEX != u1_max_qp_frame_indx)
323*495ae853SAndroid Build Coastguard Worker {
324*495ae853SAndroid Build Coastguard Worker pi1_frame_index[u1_num_frms_input] = (WORD8)u1_max_qp_frame_indx;
325*495ae853SAndroid Build Coastguard Worker u1_num_frms_input++;
326*495ae853SAndroid Build Coastguard Worker }
327*495ae853SAndroid Build Coastguard Worker memcpy(pi1_frame_index_initial, pi1_frame_index, MAX_FRAMES_MODELLED);
328*495ae853SAndroid Build Coastguard Worker
329*495ae853SAndroid Build Coastguard Worker /***** Call the Module to Return the Coeffs for the Fed Data *****/
330*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_model_used = find_model_coeffs(ps_rd_model->pi4_res_bits,
331*495ae853SAndroid Build Coastguard Worker ps_rd_model->pi4_sad,
332*495ae853SAndroid Build Coastguard Worker ps_rd_model->pu1_num_skips,
333*495ae853SAndroid Build Coastguard Worker ps_rd_model->pu1_avg_qp,
334*495ae853SAndroid Build Coastguard Worker u1_num_frms_input,
335*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_model_used,
336*495ae853SAndroid Build Coastguard Worker pi1_frame_index,
337*495ae853SAndroid Build Coastguard Worker model_coeff_array,
338*495ae853SAndroid Build Coastguard Worker model_coeff_array_lin,
339*495ae853SAndroid Build Coastguard Worker model_coeff_array_lin_wo_int,
340*495ae853SAndroid Build Coastguard Worker ps_rd_model);
341*495ae853SAndroid Build Coastguard Worker
342*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_b_lin_wo_int = model_coeff_array_lin_wo_int[0];
343*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_a_lin_wo_int = model_coeff_array_lin_wo_int[1];
344*495ae853SAndroid Build Coastguard Worker ps_rd_model->model_coeff_c_lin_wo_int = model_coeff_array_lin_wo_int[2];
345*495ae853SAndroid Build Coastguard Worker }
346*495ae853SAndroid Build Coastguard Worker
irc_estimate_bits_for_qp(rc_rd_model_t * ps_rd_model,UWORD32 u4_estimated_sad,UWORD8 u1_avg_qp)347*495ae853SAndroid Build Coastguard Worker UWORD32 irc_estimate_bits_for_qp(rc_rd_model_t *ps_rd_model,
348*495ae853SAndroid Build Coastguard Worker UWORD32 u4_estimated_sad,
349*495ae853SAndroid Build Coastguard Worker UWORD8 u1_avg_qp)
350*495ae853SAndroid Build Coastguard Worker {
351*495ae853SAndroid Build Coastguard Worker float fl_num_bits = 0;
352*495ae853SAndroid Build Coastguard Worker
353*495ae853SAndroid Build Coastguard Worker fl_num_bits = ps_rd_model->model_coeff_a_lin_wo_int
354*495ae853SAndroid Build Coastguard Worker * ((float)(u4_estimated_sad / u1_avg_qp));
355*495ae853SAndroid Build Coastguard Worker
356*495ae853SAndroid Build Coastguard Worker return ((UWORD32)fl_num_bits);
357*495ae853SAndroid Build Coastguard Worker }
358*495ae853SAndroid Build Coastguard Worker
irc_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)359*495ae853SAndroid Build Coastguard Worker UWORD8 irc_find_qp_for_target_bits(rc_rd_model_t *ps_rd_model,
360*495ae853SAndroid Build Coastguard Worker UWORD32 u4_target_res_bits,
361*495ae853SAndroid Build Coastguard Worker UWORD32 u4_estimated_sad,
362*495ae853SAndroid Build Coastguard Worker UWORD8 u1_min_qp,
363*495ae853SAndroid Build Coastguard Worker UWORD8 u1_max_qp)
364*495ae853SAndroid Build Coastguard Worker {
365*495ae853SAndroid Build Coastguard Worker UWORD8 u1_qp;
366*495ae853SAndroid Build Coastguard Worker float x_value = 1.0, f_qp;
367*495ae853SAndroid Build Coastguard Worker
368*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_model_used = PREV_FRAME_MODEL;
369*495ae853SAndroid Build Coastguard Worker
370*495ae853SAndroid Build Coastguard Worker {
371*495ae853SAndroid Build Coastguard Worker x_value = (float)u4_target_res_bits
372*495ae853SAndroid Build Coastguard Worker / ps_rd_model->model_coeff_a_lin_wo_int;
373*495ae853SAndroid Build Coastguard Worker }
374*495ae853SAndroid Build Coastguard Worker
375*495ae853SAndroid Build Coastguard Worker if(0 != x_value)
376*495ae853SAndroid Build Coastguard Worker f_qp = u4_estimated_sad / x_value;
377*495ae853SAndroid Build Coastguard Worker else
378*495ae853SAndroid Build Coastguard Worker f_qp = 255;
379*495ae853SAndroid Build Coastguard Worker
380*495ae853SAndroid Build Coastguard Worker if(f_qp > 255)
381*495ae853SAndroid Build Coastguard Worker f_qp = 255;
382*495ae853SAndroid Build Coastguard Worker
383*495ae853SAndroid Build Coastguard Worker /* Truncating the QP to the Max and Min Qp values possible */
384*495ae853SAndroid Build Coastguard Worker if(f_qp < u1_min_qp)
385*495ae853SAndroid Build Coastguard Worker f_qp = u1_min_qp;
386*495ae853SAndroid Build Coastguard Worker if(f_qp > u1_max_qp)
387*495ae853SAndroid Build Coastguard Worker f_qp = u1_max_qp;
388*495ae853SAndroid Build Coastguard Worker
389*495ae853SAndroid Build Coastguard Worker u1_qp = (UWORD8)(f_qp + 0.5);
390*495ae853SAndroid Build Coastguard Worker
391*495ae853SAndroid Build Coastguard Worker return u1_qp;
392*495ae853SAndroid Build Coastguard Worker }
393*495ae853SAndroid Build Coastguard Worker
irc_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)394*495ae853SAndroid Build Coastguard Worker void irc_add_frame_to_rd_model(rc_rd_model_t *ps_rd_model,
395*495ae853SAndroid Build Coastguard Worker UWORD32 i4_res_bits,
396*495ae853SAndroid Build Coastguard Worker UWORD8 u1_avg_mp2qp,
397*495ae853SAndroid Build Coastguard Worker UWORD32 i4_sad_h264,
398*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_skips)
399*495ae853SAndroid Build Coastguard Worker {
400*495ae853SAndroid Build Coastguard Worker UWORD8 u1_curr_frame_index;
401*495ae853SAndroid Build Coastguard Worker u1_curr_frame_index = ps_rd_model->u1_curr_frm_counter;
402*495ae853SAndroid Build Coastguard Worker
403*495ae853SAndroid Build Coastguard Worker /*Insert the Present Frame Data into the RD Model State Memory*/
404*495ae853SAndroid Build Coastguard Worker ps_rd_model->pi4_res_bits[u1_curr_frame_index] = i4_res_bits;
405*495ae853SAndroid Build Coastguard Worker ps_rd_model->pi4_sad[u1_curr_frame_index] = i4_sad_h264;
406*495ae853SAndroid Build Coastguard Worker ps_rd_model->pu1_num_skips[u1_curr_frame_index] = u1_num_skips;
407*495ae853SAndroid Build Coastguard Worker ps_rd_model->pu1_avg_qp[u1_curr_frame_index] = u1_avg_mp2qp;
408*495ae853SAndroid Build Coastguard Worker
409*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_curr_frm_counter++;
410*495ae853SAndroid Build Coastguard Worker if(MAX_FRAMES_MODELLED == ps_rd_model->u1_curr_frm_counter)
411*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_curr_frm_counter = 0;
412*495ae853SAndroid Build Coastguard Worker
413*495ae853SAndroid Build Coastguard Worker if(ps_rd_model->u1_num_frms_in_model < ps_rd_model->u1_max_frms_to_model)
414*495ae853SAndroid Build Coastguard Worker {
415*495ae853SAndroid Build Coastguard Worker ps_rd_model->u1_num_frms_in_model++;
416*495ae853SAndroid Build Coastguard Worker }
417*495ae853SAndroid Build Coastguard Worker irc_update_frame_rd_model(ps_rd_model);
418*495ae853SAndroid Build Coastguard Worker }
419*495ae853SAndroid Build Coastguard Worker
420*495ae853SAndroid Build Coastguard Worker /*****************************************************************************
421*495ae853SAndroid Build Coastguard Worker *Function Name : irc_calc_per_frm_bits
422*495ae853SAndroid Build Coastguard Worker *Description :
423*495ae853SAndroid Build Coastguard Worker *Inputs : pu2_num_pics_of_a_pic_type
424*495ae853SAndroid Build Coastguard Worker * - pointer to RC api pointer
425*495ae853SAndroid Build Coastguard Worker * pu2_num_pics_of_a_pic_type
426*495ae853SAndroid Build Coastguard Worker * - N1, N2,...Nk
427*495ae853SAndroid Build Coastguard Worker * pu1_update_pic_type_model
428*495ae853SAndroid Build Coastguard Worker * - flag which tells whether or not to update model
429*495ae853SAndroid Build Coastguard Worker * coefficients of a particular pic-type
430*495ae853SAndroid Build Coastguard Worker * u1_num_pic_types
431*495ae853SAndroid Build Coastguard Worker * - value of k
432*495ae853SAndroid Build Coastguard Worker * pu4_num_skip_of_a_pic_type
433*495ae853SAndroid Build Coastguard Worker * - the number of skips of that pic-type. It "may" be used to
434*495ae853SAndroid Build Coastguard Worker * update the model coefficients at a later point. Right now
435*495ae853SAndroid Build Coastguard Worker * it is not being used at all.
436*495ae853SAndroid Build Coastguard Worker * u1_base_pic_type
437*495ae853SAndroid Build Coastguard Worker * - base pic type index wrt which alpha & beta are calculated
438*495ae853SAndroid Build Coastguard Worker * pfl_gamma
439*495ae853SAndroid Build Coastguard Worker * - gamma_i = beta_i / alpha_i
440*495ae853SAndroid Build Coastguard Worker * pfl_eta
441*495ae853SAndroid Build Coastguard Worker * -
442*495ae853SAndroid Build Coastguard Worker * u1_curr_pic_type
443*495ae853SAndroid Build Coastguard Worker * - the current pic-type for which the targetted bits need to
444*495ae853SAndroid Build Coastguard Worker * be computed
445*495ae853SAndroid Build Coastguard Worker * u4_bits_for_sub_gop
446*495ae853SAndroid Build Coastguard Worker * - the number of bits to be consumed for the remaining part of
447*495ae853SAndroid Build Coastguard Worker * sub-gop
448*495ae853SAndroid Build Coastguard Worker * u4_curr_estimated_sad
449*495ae853SAndroid Build Coastguard Worker * -
450*495ae853SAndroid Build Coastguard Worker * pu1_curr_pic_type_qp
451*495ae853SAndroid Build Coastguard Worker * - output of this function
452*495ae853SAndroid Build Coastguard Worker *****************************************************************************/
453*495ae853SAndroid Build Coastguard Worker
irc_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)454*495ae853SAndroid Build Coastguard Worker WORD32 irc_calc_per_frm_bits(rc_rd_model_t *ps_rd_model,
455*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_num_pics_of_a_pic_type,
456*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_update_pic_type_model,
457*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_pic_types,
458*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_num_skip_of_a_pic_type,
459*495ae853SAndroid Build Coastguard Worker UWORD8 u1_base_pic_type,
460*495ae853SAndroid Build Coastguard Worker float *pfl_gamma,
461*495ae853SAndroid Build Coastguard Worker float *pfl_eta,
462*495ae853SAndroid Build Coastguard Worker UWORD8 u1_curr_pic_type,
463*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bits_for_sub_gop,
464*495ae853SAndroid Build Coastguard Worker UWORD32 u4_curr_estimated_sad,
465*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_curr_pic_type_qp)
466*495ae853SAndroid Build Coastguard Worker {
467*495ae853SAndroid Build Coastguard Worker WORD32 i4_per_frm_bits_Ti;
468*495ae853SAndroid Build Coastguard Worker UWORD8 u1_i;
469*495ae853SAndroid Build Coastguard Worker rc_rd_model_t *ps_rd_model_of_pic_type;
470*495ae853SAndroid Build Coastguard Worker
471*495ae853SAndroid Build Coastguard Worker UNUSED(pu4_num_skip_of_a_pic_type);
472*495ae853SAndroid Build Coastguard Worker UNUSED(u1_base_pic_type);
473*495ae853SAndroid Build Coastguard Worker
474*495ae853SAndroid Build Coastguard Worker /* First part of this function updates all the model coefficients */
475*495ae853SAndroid Build Coastguard Worker /*for all the pic-types */
476*495ae853SAndroid Build Coastguard Worker {
477*495ae853SAndroid Build Coastguard Worker for(u1_i = 0; u1_i < u1_num_pic_types; u1_i++)
478*495ae853SAndroid Build Coastguard Worker {
479*495ae853SAndroid Build Coastguard Worker if((0 != pu2_num_pics_of_a_pic_type[u1_i])
480*495ae853SAndroid Build Coastguard Worker && (1 == pu1_update_pic_type_model[u1_i]))
481*495ae853SAndroid Build Coastguard Worker {
482*495ae853SAndroid Build Coastguard Worker irc_update_frame_rd_model(&ps_rd_model[u1_i]);
483*495ae853SAndroid Build Coastguard Worker }
484*495ae853SAndroid Build Coastguard Worker }
485*495ae853SAndroid Build Coastguard Worker }
486*495ae853SAndroid Build Coastguard Worker
487*495ae853SAndroid Build Coastguard Worker /*
488*495ae853SAndroid Build Coastguard Worker * The second part of this function deals with solving the
489*495ae853SAndroid Build Coastguard Worker * equation using all the pic-types models
490*495ae853SAndroid Build Coastguard Worker */
491*495ae853SAndroid Build Coastguard Worker {
492*495ae853SAndroid Build Coastguard Worker UWORD8 u1_combined_model_used;
493*495ae853SAndroid Build Coastguard Worker
494*495ae853SAndroid Build Coastguard Worker /* solve the equation */
495*495ae853SAndroid Build Coastguard Worker {
496*495ae853SAndroid Build Coastguard Worker model_coeff eff_A;
497*495ae853SAndroid Build Coastguard Worker float fl_sad_by_qp_base;
498*495ae853SAndroid Build Coastguard Worker float fl_sad_by_qp_curr_frm = 1.0;
499*495ae853SAndroid Build Coastguard Worker float fl_qp_curr_frm;
500*495ae853SAndroid Build Coastguard Worker float fl_bits_for_curr_frm = 0;
501*495ae853SAndroid Build Coastguard Worker
502*495ae853SAndroid Build Coastguard Worker
503*495ae853SAndroid Build Coastguard Worker
504*495ae853SAndroid Build Coastguard Worker /* If the combined chosen model is linear model without an intercept */
505*495ae853SAndroid Build Coastguard Worker
506*495ae853SAndroid Build Coastguard Worker u1_combined_model_used = PREV_FRAME_MODEL;
507*495ae853SAndroid Build Coastguard Worker {
508*495ae853SAndroid Build Coastguard Worker eff_A = 0.0;
509*495ae853SAndroid Build Coastguard Worker
510*495ae853SAndroid Build Coastguard Worker for(u1_i = 0; u1_i < u1_num_pic_types; u1_i++)
511*495ae853SAndroid Build Coastguard Worker {
512*495ae853SAndroid Build Coastguard Worker ps_rd_model_of_pic_type = ps_rd_model + u1_i;
513*495ae853SAndroid Build Coastguard Worker
514*495ae853SAndroid Build Coastguard Worker eff_A += ((pfl_eta[u1_i]
515*495ae853SAndroid Build Coastguard Worker + pu2_num_pics_of_a_pic_type[u1_i]- 1)
516*495ae853SAndroid Build Coastguard Worker * ps_rd_model_of_pic_type->model_coeff_a_lin_wo_int
517*495ae853SAndroid Build Coastguard Worker * pfl_gamma[u1_i]);
518*495ae853SAndroid Build Coastguard Worker }
519*495ae853SAndroid Build Coastguard Worker
520*495ae853SAndroid Build Coastguard Worker fl_sad_by_qp_base = u4_bits_for_sub_gop / eff_A;
521*495ae853SAndroid Build Coastguard Worker
522*495ae853SAndroid Build Coastguard Worker fl_sad_by_qp_curr_frm = fl_sad_by_qp_base
523*495ae853SAndroid Build Coastguard Worker * pfl_gamma[u1_curr_pic_type]
524*495ae853SAndroid Build Coastguard Worker * pfl_eta[u1_curr_pic_type];
525*495ae853SAndroid Build Coastguard Worker
526*495ae853SAndroid Build Coastguard Worker ps_rd_model_of_pic_type = ps_rd_model + u1_curr_pic_type;
527*495ae853SAndroid Build Coastguard Worker
528*495ae853SAndroid Build Coastguard Worker fl_bits_for_curr_frm =
529*495ae853SAndroid Build Coastguard Worker ps_rd_model_of_pic_type->model_coeff_a_lin_wo_int
530*495ae853SAndroid Build Coastguard Worker * fl_sad_by_qp_curr_frm;
531*495ae853SAndroid Build Coastguard Worker }
532*495ae853SAndroid Build Coastguard Worker
533*495ae853SAndroid Build Coastguard Worker /*
534*495ae853SAndroid Build Coastguard Worker * Store the model that was finally used to calculate Qp.
535*495ae853SAndroid Build Coastguard Worker * This is so that the same model is used in further calculations
536*495ae853SAndroid Build Coastguard Worker * for this picture.
537*495ae853SAndroid Build Coastguard Worker */
538*495ae853SAndroid Build Coastguard Worker ps_rd_model_of_pic_type = ps_rd_model + u1_curr_pic_type;
539*495ae853SAndroid Build Coastguard Worker ps_rd_model_of_pic_type->u1_model_used = u1_combined_model_used;
540*495ae853SAndroid Build Coastguard Worker
541*495ae853SAndroid Build Coastguard Worker i4_per_frm_bits_Ti = (WORD32)(fl_bits_for_curr_frm + 0.5);
542*495ae853SAndroid Build Coastguard Worker
543*495ae853SAndroid Build Coastguard Worker if(fl_sad_by_qp_curr_frm > 0)
544*495ae853SAndroid Build Coastguard Worker fl_qp_curr_frm = (float)u4_curr_estimated_sad
545*495ae853SAndroid Build Coastguard Worker / fl_sad_by_qp_curr_frm;
546*495ae853SAndroid Build Coastguard Worker else
547*495ae853SAndroid Build Coastguard Worker fl_qp_curr_frm = 255;
548*495ae853SAndroid Build Coastguard Worker
549*495ae853SAndroid Build Coastguard Worker if(fl_qp_curr_frm > 255)
550*495ae853SAndroid Build Coastguard Worker fl_qp_curr_frm = 255;
551*495ae853SAndroid Build Coastguard Worker
552*495ae853SAndroid Build Coastguard Worker *pu1_curr_pic_type_qp = (fl_qp_curr_frm + 0.5);
553*495ae853SAndroid Build Coastguard Worker
554*495ae853SAndroid Build Coastguard Worker }
555*495ae853SAndroid Build Coastguard Worker }
556*495ae853SAndroid Build Coastguard Worker return (i4_per_frm_bits_Ti);
557*495ae853SAndroid Build Coastguard Worker }
558*495ae853SAndroid Build Coastguard Worker
irc_get_linear_coefficient(rc_rd_model_t * ps_rd_model)559*495ae853SAndroid Build Coastguard Worker model_coeff irc_get_linear_coefficient(rc_rd_model_t *ps_rd_model)
560*495ae853SAndroid Build Coastguard Worker {
561*495ae853SAndroid Build Coastguard Worker return (ps_rd_model->model_coeff_a_lin_wo_int);
562*495ae853SAndroid Build Coastguard Worker }
563*495ae853SAndroid Build Coastguard Worker
564*495ae853SAndroid Build Coastguard Worker
565