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 est_sad.c
23*c83a76b0SSuyog Pawar *
24*c83a76b0SSuyog Pawar * \brief
25*c83a76b0SSuyog Pawar * This file contain sad estimation related functions
26*c83a76b0SSuyog Pawar *
27*c83a76b0SSuyog Pawar * \date
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * \author
30*c83a76b0SSuyog Pawar * ittiam
31*c83a76b0SSuyog Pawar *
32*c83a76b0SSuyog Pawar ******************************************************************************
33*c83a76b0SSuyog Pawar */
34*c83a76b0SSuyog Pawar /*****************************************************************************/
35*c83a76b0SSuyog Pawar /* File Includes */
36*c83a76b0SSuyog Pawar /*****************************************************************************/
37*c83a76b0SSuyog Pawar /* User include files */
38*c83a76b0SSuyog Pawar #include "ittiam_datatypes.h"
39*c83a76b0SSuyog Pawar #include "rc_common.h"
40*c83a76b0SSuyog Pawar #include "rc_cntrl_param.h"
41*c83a76b0SSuyog Pawar #include "var_q_operator.h"
42*c83a76b0SSuyog Pawar #include "mem_req_and_acq.h"
43*c83a76b0SSuyog Pawar #include "est_sad.h"
44*c83a76b0SSuyog Pawar
45*c83a76b0SSuyog Pawar typedef struct est_sad_t
46*c83a76b0SSuyog Pawar {
47*c83a76b0SSuyog Pawar WORD32 i4_use_est_intra_sad;
48*c83a76b0SSuyog Pawar UWORD32 au4_prev_frm_sad[MAX_PIC_TYPE]; /* Previous frame SAD */
49*c83a76b0SSuyog Pawar UWORD32 u4_n_p_frm_ifi_avg_sad; /* Current (nth) ifi average P frame SAD */
50*c83a76b0SSuyog Pawar UWORD32 u4_n_1_p_frm_ifi_avg_sad; /* (n-1)th ifi average P frame SAD */
51*c83a76b0SSuyog Pawar UWORD32 u4_n_2_p_frm_ifi_avg_sad; /* (n-2)th ifi average P frame SAD */
52*c83a76b0SSuyog Pawar WORD32 i4_num_ifi_encoded; /* number of ifi encoded till now */
53*c83a76b0SSuyog Pawar WORD32 i4_num_p_frm_in_cur_ifi; /* number of P frames in the current IFI */
54*c83a76b0SSuyog Pawar } est_sad_t;
55*c83a76b0SSuyog Pawar
56*c83a76b0SSuyog Pawar #if NON_STEADSTATE_CODE
est_sad_num_fill_use_free_memtab(est_sad_t ** pps_est_sad,itt_memtab_t * ps_memtab,ITT_FUNC_TYPE_E e_func_type)57*c83a76b0SSuyog Pawar WORD32 est_sad_num_fill_use_free_memtab(
58*c83a76b0SSuyog Pawar est_sad_t **pps_est_sad, itt_memtab_t *ps_memtab, ITT_FUNC_TYPE_E e_func_type)
59*c83a76b0SSuyog Pawar {
60*c83a76b0SSuyog Pawar WORD32 i4_mem_tab_idx = 0;
61*c83a76b0SSuyog Pawar static est_sad_t s_est_sad;
62*c83a76b0SSuyog Pawar
63*c83a76b0SSuyog Pawar /* Hack for al alloc, during which we dont have any state memory.
64*c83a76b0SSuyog Pawar Dereferencing can cause issues */
65*c83a76b0SSuyog Pawar if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
66*c83a76b0SSuyog Pawar (*pps_est_sad) = &s_est_sad;
67*c83a76b0SSuyog Pawar
68*c83a76b0SSuyog Pawar /*for src rate control state structure*/
69*c83a76b0SSuyog Pawar if(e_func_type != GET_NUM_MEMTAB)
70*c83a76b0SSuyog Pawar {
71*c83a76b0SSuyog Pawar fill_memtab(
72*c83a76b0SSuyog Pawar &ps_memtab[i4_mem_tab_idx], sizeof(est_sad_t), MEM_TAB_ALIGNMENT, PERSISTENT, DDR);
73*c83a76b0SSuyog Pawar use_or_fill_base(&ps_memtab[0], (void **)pps_est_sad, e_func_type);
74*c83a76b0SSuyog Pawar }
75*c83a76b0SSuyog Pawar i4_mem_tab_idx++;
76*c83a76b0SSuyog Pawar
77*c83a76b0SSuyog Pawar return (i4_mem_tab_idx);
78*c83a76b0SSuyog Pawar }
79*c83a76b0SSuyog Pawar #endif /* #if NON_STEADSTATE_CODE */
80*c83a76b0SSuyog Pawar /****************************************************************************
81*c83a76b0SSuyog Pawar Function Name : init_est_sad
82*c83a76b0SSuyog Pawar Description :
83*c83a76b0SSuyog Pawar Inputs : ps_est_sad
84*c83a76b0SSuyog Pawar i4_use_est_intra_sad
85*c83a76b0SSuyog Pawar
86*c83a76b0SSuyog Pawar Revision History:
87*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
88*c83a76b0SSuyog Pawar *****************************************************************************/
init_est_sad(est_sad_t * ps_est_sad,WORD32 i4_use_est_intra_sad)89*c83a76b0SSuyog Pawar void init_est_sad(est_sad_t *ps_est_sad, WORD32 i4_use_est_intra_sad)
90*c83a76b0SSuyog Pawar {
91*c83a76b0SSuyog Pawar WORD32 i;
92*c83a76b0SSuyog Pawar ps_est_sad->i4_use_est_intra_sad = i4_use_est_intra_sad;
93*c83a76b0SSuyog Pawar
94*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PIC_TYPE; i++)
95*c83a76b0SSuyog Pawar ps_est_sad->au4_prev_frm_sad[i] = 0;
96*c83a76b0SSuyog Pawar
97*c83a76b0SSuyog Pawar ps_est_sad->u4_n_p_frm_ifi_avg_sad = 0;
98*c83a76b0SSuyog Pawar ps_est_sad->u4_n_1_p_frm_ifi_avg_sad = 0;
99*c83a76b0SSuyog Pawar ps_est_sad->u4_n_2_p_frm_ifi_avg_sad = 0;
100*c83a76b0SSuyog Pawar ps_est_sad->i4_num_ifi_encoded = 0;
101*c83a76b0SSuyog Pawar ps_est_sad->i4_num_p_frm_in_cur_ifi = 0;
102*c83a76b0SSuyog Pawar }
103*c83a76b0SSuyog Pawar /****************************************************************************
104*c83a76b0SSuyog Pawar Function Name : reset_est_sad
105*c83a76b0SSuyog Pawar Description :
106*c83a76b0SSuyog Pawar Inputs : ps_est_sad
107*c83a76b0SSuyog Pawar
108*c83a76b0SSuyog Pawar Revision History:
109*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
110*c83a76b0SSuyog Pawar *****************************************************************************/
reset_est_sad(est_sad_t * ps_est_sad)111*c83a76b0SSuyog Pawar void reset_est_sad(est_sad_t *ps_est_sad)
112*c83a76b0SSuyog Pawar {
113*c83a76b0SSuyog Pawar init_est_sad(ps_est_sad, ps_est_sad->i4_use_est_intra_sad);
114*c83a76b0SSuyog Pawar }
115*c83a76b0SSuyog Pawar
116*c83a76b0SSuyog Pawar /****************************************************************************
117*c83a76b0SSuyog Pawar Function Name : get_est_sad
118*c83a76b0SSuyog Pawar Description :
119*c83a76b0SSuyog Pawar Inputs : ps_est_sad
120*c83a76b0SSuyog Pawar
121*c83a76b0SSuyog Pawar Revision History:
122*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
123*c83a76b0SSuyog Pawar *****************************************************************************/
124*c83a76b0SSuyog Pawar /*
125*c83a76b0SSuyog Pawar Get estimated SAD can be called at any point. The various use cases are:
126*c83a76b0SSuyog Pawar 1) When a I frame is getting encoded,
127*c83a76b0SSuyog Pawar - get the estimated of P => No issues since we use the last coded P frame value
128*c83a76b0SSuyog Pawar - get estimated of I => This call for two cases:
129*c83a76b0SSuyog Pawar => a) if num_ifi_encoded is less than 2
130*c83a76b0SSuyog Pawar then return the previous encoded I frame sad
131*c83a76b0SSuyog Pawar => b) if num_ifi_encoded is more than 2, then we scale
132*c83a76b0SSuyog Pawar the prev I sad by the ratio of (n-1) ifi P to n-2 ifi P
133*c83a76b0SSuyog Pawar 2) When P frame is getting encoded,
134*c83a76b0SSuyog Pawar - get the estimated of P => No issues since we use the last coded P frame value
135*c83a76b0SSuyog Pawar - get the estimated of I => Simillar to I we have two cases. To handle the b) case
136*c83a76b0SSuyog Pawar extra logic had to introduced using
137*c83a76b0SSuyog Pawar u1_is_n_1_p_frm_ifi_avg_sad_usable flag
138*c83a76b0SSuyog Pawar */
get_est_sad(est_sad_t * ps_est_sad,picture_type_e e_pic_type)139*c83a76b0SSuyog Pawar UWORD32 get_est_sad(est_sad_t *ps_est_sad, picture_type_e e_pic_type)
140*c83a76b0SSuyog Pawar {
141*c83a76b0SSuyog Pawar if(ps_est_sad->i4_use_est_intra_sad)
142*c83a76b0SSuyog Pawar {
143*c83a76b0SSuyog Pawar UWORD32 u4_estimated_sad;
144*c83a76b0SSuyog Pawar if(e_pic_type == P_PIC)
145*c83a76b0SSuyog Pawar {
146*c83a76b0SSuyog Pawar u4_estimated_sad = ps_est_sad->au4_prev_frm_sad[P_PIC];
147*c83a76b0SSuyog Pawar }
148*c83a76b0SSuyog Pawar else if(e_pic_type == B_PIC)
149*c83a76b0SSuyog Pawar {
150*c83a76b0SSuyog Pawar u4_estimated_sad = ps_est_sad->au4_prev_frm_sad[B_PIC];
151*c83a76b0SSuyog Pawar }
152*c83a76b0SSuyog Pawar else
153*c83a76b0SSuyog Pawar {
154*c83a76b0SSuyog Pawar if(ps_est_sad->i4_num_ifi_encoded < 2)
155*c83a76b0SSuyog Pawar {
156*c83a76b0SSuyog Pawar /* Only one IFI has been encoded and so use the previous I frames SAD */
157*c83a76b0SSuyog Pawar u4_estimated_sad = ps_est_sad->au4_prev_frm_sad[I_PIC];
158*c83a76b0SSuyog Pawar }
159*c83a76b0SSuyog Pawar else
160*c83a76b0SSuyog Pawar {
161*c83a76b0SSuyog Pawar /* Since the n-1 'P' frame IFI would have just accumulated the frame sads
162*c83a76b0SSuyog Pawar we average it out here */
163*c83a76b0SSuyog Pawar UWORD32 u4_n_1_p_frm_ifi_avg_sad, u4_n_2_p_frm_ifi_avg_sad;
164*c83a76b0SSuyog Pawar number_t vq_n_1_p_frm_ifi_avg_sad, vq_n_2_p_frm_ifi_avg_sad;
165*c83a76b0SSuyog Pawar number_t vq_prev_frm_sad_i;
166*c83a76b0SSuyog Pawar /* If there are frames in the current IFI start using it to estimate the I frame SAD */
167*c83a76b0SSuyog Pawar if(ps_est_sad->i4_num_p_frm_in_cur_ifi)
168*c83a76b0SSuyog Pawar {
169*c83a76b0SSuyog Pawar u4_n_1_p_frm_ifi_avg_sad =
170*c83a76b0SSuyog Pawar (ps_est_sad->u4_n_p_frm_ifi_avg_sad / ps_est_sad->i4_num_p_frm_in_cur_ifi);
171*c83a76b0SSuyog Pawar u4_n_2_p_frm_ifi_avg_sad = ps_est_sad->u4_n_1_p_frm_ifi_avg_sad;
172*c83a76b0SSuyog Pawar }
173*c83a76b0SSuyog Pawar else
174*c83a76b0SSuyog Pawar {
175*c83a76b0SSuyog Pawar u4_n_1_p_frm_ifi_avg_sad = ps_est_sad->u4_n_1_p_frm_ifi_avg_sad;
176*c83a76b0SSuyog Pawar u4_n_2_p_frm_ifi_avg_sad = ps_est_sad->u4_n_2_p_frm_ifi_avg_sad;
177*c83a76b0SSuyog Pawar }
178*c83a76b0SSuyog Pawar /* If any of the previous p frame SADs are zeros we just return the previous
179*c83a76b0SSuyog Pawar I frame SAD */
180*c83a76b0SSuyog Pawar if(u4_n_1_p_frm_ifi_avg_sad && u4_n_2_p_frm_ifi_avg_sad)
181*c83a76b0SSuyog Pawar {
182*c83a76b0SSuyog Pawar SET_VAR_Q(vq_prev_frm_sad_i, ps_est_sad->au4_prev_frm_sad[I_PIC], 0);
183*c83a76b0SSuyog Pawar SET_VAR_Q(vq_n_1_p_frm_ifi_avg_sad, u4_n_1_p_frm_ifi_avg_sad, 0);
184*c83a76b0SSuyog Pawar SET_VAR_Q(vq_n_2_p_frm_ifi_avg_sad, u4_n_2_p_frm_ifi_avg_sad, 0);
185*c83a76b0SSuyog Pawar /**************************************************************************
186*c83a76b0SSuyog Pawar Estimated SAD =
187*c83a76b0SSuyog Pawar (n-1)th intra frame interval(ifi) P frame Avg SAD *
188*c83a76b0SSuyog Pawar (prev I frame SAD / (n-2)nd intra frame interval(ifi) P frame Avg SAD)
189*c83a76b0SSuyog Pawar **************************************************************************/
190*c83a76b0SSuyog Pawar mult32_var_q(vq_prev_frm_sad_i, vq_n_1_p_frm_ifi_avg_sad, &vq_prev_frm_sad_i);
191*c83a76b0SSuyog Pawar div32_var_q(vq_prev_frm_sad_i, vq_n_2_p_frm_ifi_avg_sad, &vq_prev_frm_sad_i);
192*c83a76b0SSuyog Pawar number_t_to_word32(vq_prev_frm_sad_i, (WORD32 *)&u4_estimated_sad);
193*c83a76b0SSuyog Pawar }
194*c83a76b0SSuyog Pawar else
195*c83a76b0SSuyog Pawar {
196*c83a76b0SSuyog Pawar u4_estimated_sad = ps_est_sad->au4_prev_frm_sad[I_PIC];
197*c83a76b0SSuyog Pawar }
198*c83a76b0SSuyog Pawar }
199*c83a76b0SSuyog Pawar }
200*c83a76b0SSuyog Pawar return u4_estimated_sad;
201*c83a76b0SSuyog Pawar }
202*c83a76b0SSuyog Pawar else
203*c83a76b0SSuyog Pawar {
204*c83a76b0SSuyog Pawar return ps_est_sad->au4_prev_frm_sad[e_pic_type];
205*c83a76b0SSuyog Pawar }
206*c83a76b0SSuyog Pawar }
207*c83a76b0SSuyog Pawar /****************************************************************************
208*c83a76b0SSuyog Pawar Function Name : update_ppic_sad
209*c83a76b0SSuyog Pawar Description :
210*c83a76b0SSuyog Pawar Inputs : ps_est_sad
211*c83a76b0SSuyog Pawar
212*c83a76b0SSuyog Pawar Revision History:
213*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
214*c83a76b0SSuyog Pawar *****************************************************************************/
update_ppic_sad(est_sad_t * ps_est_sad,WORD32 i4_est_sad,WORD32 i4_prev_p_sad)215*c83a76b0SSuyog Pawar WORD32 update_ppic_sad(est_sad_t *ps_est_sad, WORD32 i4_est_sad, WORD32 i4_prev_p_sad)
216*c83a76b0SSuyog Pawar {
217*c83a76b0SSuyog Pawar i4_est_sad = ((ps_est_sad->au4_prev_frm_sad[P_PIC]) * ((i4_est_sad << 4) / i4_prev_p_sad)) >> 4;
218*c83a76b0SSuyog Pawar /* printf("i4_est_sad=%d prev_psad=%d\n",i4_est_sad,ps_est_sad->au4_prev_frm_sad[P_PIC]); */
219*c83a76b0SSuyog Pawar if(i4_est_sad > (WORD32)ps_est_sad->au4_prev_frm_sad[P_PIC])
220*c83a76b0SSuyog Pawar {
221*c83a76b0SSuyog Pawar if(4 * i4_est_sad > 5 * i4_prev_p_sad)
222*c83a76b0SSuyog Pawar i4_est_sad = (5 * i4_prev_p_sad) >> 2;
223*c83a76b0SSuyog Pawar ps_est_sad->au4_prev_frm_sad[P_PIC] = i4_est_sad;
224*c83a76b0SSuyog Pawar return 0;
225*c83a76b0SSuyog Pawar }
226*c83a76b0SSuyog Pawar return 1;
227*c83a76b0SSuyog Pawar }
228*c83a76b0SSuyog Pawar /****************************************************************************
229*c83a76b0SSuyog Pawar Function Name : update_actual_sad
230*c83a76b0SSuyog Pawar Description :
231*c83a76b0SSuyog Pawar Inputs : ps_est_sad
232*c83a76b0SSuyog Pawar
233*c83a76b0SSuyog Pawar Revision History:
234*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
235*c83a76b0SSuyog Pawar *****************************************************************************/
update_actual_sad(est_sad_t * ps_est_sad,UWORD32 u4_actual_sad,picture_type_e e_pic_type)236*c83a76b0SSuyog Pawar void update_actual_sad(est_sad_t *ps_est_sad, UWORD32 u4_actual_sad, picture_type_e e_pic_type)
237*c83a76b0SSuyog Pawar {
238*c83a76b0SSuyog Pawar ps_est_sad->au4_prev_frm_sad[e_pic_type] = u4_actual_sad;
239*c83a76b0SSuyog Pawar
240*c83a76b0SSuyog Pawar if(ps_est_sad->i4_use_est_intra_sad)
241*c83a76b0SSuyog Pawar {
242*c83a76b0SSuyog Pawar if(e_pic_type == I_PIC)
243*c83a76b0SSuyog Pawar {
244*c83a76b0SSuyog Pawar /* The requirement is to have two IFI before estimating I frame SAD */
245*c83a76b0SSuyog Pawar if(ps_est_sad->i4_num_ifi_encoded < 2)
246*c83a76b0SSuyog Pawar ps_est_sad->i4_num_ifi_encoded++;
247*c83a76b0SSuyog Pawar
248*c83a76b0SSuyog Pawar /* Calculate the average SAD */
249*c83a76b0SSuyog Pawar if(ps_est_sad->i4_num_p_frm_in_cur_ifi)
250*c83a76b0SSuyog Pawar {
251*c83a76b0SSuyog Pawar ps_est_sad->u4_n_p_frm_ifi_avg_sad /= ps_est_sad->i4_num_p_frm_in_cur_ifi;
252*c83a76b0SSuyog Pawar }
253*c83a76b0SSuyog Pawar else
254*c83a76b0SSuyog Pawar {
255*c83a76b0SSuyog Pawar ps_est_sad->u4_n_p_frm_ifi_avg_sad = 0;
256*c83a76b0SSuyog Pawar }
257*c83a76b0SSuyog Pawar /* Push the (n-1)th average SAD to the (n-2)th average SAD */
258*c83a76b0SSuyog Pawar ps_est_sad->u4_n_2_p_frm_ifi_avg_sad = ps_est_sad->u4_n_1_p_frm_ifi_avg_sad;
259*c83a76b0SSuyog Pawar /* Push the nth average SAD to the (n-1)th average SAD */
260*c83a76b0SSuyog Pawar ps_est_sad->u4_n_1_p_frm_ifi_avg_sad = ps_est_sad->u4_n_p_frm_ifi_avg_sad;
261*c83a76b0SSuyog Pawar /* Reset SAD and number of P frames */
262*c83a76b0SSuyog Pawar ps_est_sad->u4_n_p_frm_ifi_avg_sad = 0;
263*c83a76b0SSuyog Pawar ps_est_sad->i4_num_p_frm_in_cur_ifi = 0;
264*c83a76b0SSuyog Pawar }
265*c83a76b0SSuyog Pawar else
266*c83a76b0SSuyog Pawar {
267*c83a76b0SSuyog Pawar ps_est_sad->u4_n_p_frm_ifi_avg_sad += u4_actual_sad;
268*c83a76b0SSuyog Pawar ps_est_sad->i4_num_p_frm_in_cur_ifi++;
269*c83a76b0SSuyog Pawar }
270*c83a76b0SSuyog Pawar }
271*c83a76b0SSuyog Pawar }
272*c83a76b0SSuyog Pawar /****************************************************************************
273*c83a76b0SSuyog Pawar Function Name : update_prev_frame_intra_sad
274*c83a76b0SSuyog Pawar Description :
275*c83a76b0SSuyog Pawar Inputs : ps_est_sad
276*c83a76b0SSuyog Pawar
277*c83a76b0SSuyog Pawar Revision History:
278*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
279*c83a76b0SSuyog Pawar *****************************************************************************/
update_prev_frame_intra_sad(est_sad_t * ps_est_sad,WORD32 i4_intra_frm_sad)280*c83a76b0SSuyog Pawar void update_prev_frame_intra_sad(est_sad_t *ps_est_sad, WORD32 i4_intra_frm_sad)
281*c83a76b0SSuyog Pawar {
282*c83a76b0SSuyog Pawar ps_est_sad->au4_prev_frm_sad[I_PIC] = i4_intra_frm_sad;
283*c83a76b0SSuyog Pawar }
284*c83a76b0SSuyog Pawar /****************************************************************************
285*c83a76b0SSuyog Pawar Function Name : get_prev_frame_intra_sad
286*c83a76b0SSuyog Pawar Description :
287*c83a76b0SSuyog Pawar Inputs : ps_est_sad
288*c83a76b0SSuyog Pawar
289*c83a76b0SSuyog Pawar Revision History:
290*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
291*c83a76b0SSuyog Pawar *****************************************************************************/
get_prev_frame_intra_sad(est_sad_t * ps_est_sad)292*c83a76b0SSuyog Pawar WORD32 get_prev_frame_intra_sad(est_sad_t *ps_est_sad)
293*c83a76b0SSuyog Pawar {
294*c83a76b0SSuyog Pawar return ps_est_sad->au4_prev_frm_sad[I_PIC];
295*c83a76b0SSuyog Pawar }
296*c83a76b0SSuyog Pawar /****************************************************************************
297*c83a76b0SSuyog Pawar Function Name : update_prev_frame_sad
298*c83a76b0SSuyog Pawar Description :
299*c83a76b0SSuyog Pawar Inputs : ps_est_sad
300*c83a76b0SSuyog Pawar
301*c83a76b0SSuyog Pawar Revision History:
302*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
303*c83a76b0SSuyog Pawar *****************************************************************************/
update_prev_frame_sad(est_sad_t * ps_est_sad,WORD32 i4_frm_sad,picture_type_e e_pic_type)304*c83a76b0SSuyog Pawar void update_prev_frame_sad(est_sad_t *ps_est_sad, WORD32 i4_frm_sad, picture_type_e e_pic_type)
305*c83a76b0SSuyog Pawar {
306*c83a76b0SSuyog Pawar ps_est_sad->au4_prev_frm_sad[e_pic_type] = i4_frm_sad;
307*c83a76b0SSuyog Pawar }
308*c83a76b0SSuyog Pawar /****************************************************************************
309*c83a76b0SSuyog Pawar Function Name : get_prev_frame_sad
310*c83a76b0SSuyog Pawar Description :
311*c83a76b0SSuyog Pawar Inputs : ps_est_sad
312*c83a76b0SSuyog Pawar
313*c83a76b0SSuyog Pawar Revision History:
314*c83a76b0SSuyog Pawar DD MM YYYY Author(s) Changes (Describe the changes made)
315*c83a76b0SSuyog Pawar *****************************************************************************/
get_prev_frame_sad(est_sad_t * ps_est_sad,picture_type_e e_pic_type)316*c83a76b0SSuyog Pawar WORD32 get_prev_frame_sad(est_sad_t *ps_est_sad, picture_type_e e_pic_type)
317*c83a76b0SSuyog Pawar {
318*c83a76b0SSuyog Pawar return ps_est_sad->au4_prev_frm_sad[e_pic_type];
319*c83a76b0SSuyog Pawar }
320