xref: /aosp_15_r20/external/libavc/encoder/ime_distortion_metrics.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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 ******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file ime_distortion_metrics.c
24*495ae853SAndroid Build Coastguard Worker *
25*495ae853SAndroid Build Coastguard Worker * @brief
26*495ae853SAndroid Build Coastguard Worker *  This file contains definitions of routines that compute distortion
27*495ae853SAndroid Build Coastguard Worker *  between two macro/sub blocks of identical dimensions
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker *  Ittiam
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker *  - ime_sub_pel_compute_sad_16x16()
34*495ae853SAndroid Build Coastguard Worker *  - ime_calculate_sad4_prog()
35*495ae853SAndroid Build Coastguard Worker *  - ime_calculate_sad3_prog()
36*495ae853SAndroid Build Coastguard Worker *  - ime_calculate_sad2_prog()
37*495ae853SAndroid Build Coastguard Worker *  - ime_compute_sad_16x16()
38*495ae853SAndroid Build Coastguard Worker *  - ime_compute_sad_16x16_fast()
39*495ae853SAndroid Build Coastguard Worker *  - ime_compute_sad_16x16_ea8()
40*495ae853SAndroid Build Coastguard Worker *  - ime_compute_sad_8x8()
41*495ae853SAndroid Build Coastguard Worker *  - ime_compute_sad_4x4()
42*495ae853SAndroid Build Coastguard Worker *  - ime_compute_sad_16x8()
43*495ae853SAndroid Build Coastguard Worker *  - ime_compute_satqd_16x16_lumainter()
44*495ae853SAndroid Build Coastguard Worker *  - ime_compute_satqd_8x16_chroma()
45*495ae853SAndroid Build Coastguard Worker *  - ime_compute_satqd_16x16_lumaintra()
46*495ae853SAndroid Build Coastguard Worker *
47*495ae853SAndroid Build Coastguard Worker * @remarks
48*495ae853SAndroid Build Coastguard Worker *  None
49*495ae853SAndroid Build Coastguard Worker *
50*495ae853SAndroid Build Coastguard Worker *******************************************************************************
51*495ae853SAndroid Build Coastguard Worker */
52*495ae853SAndroid Build Coastguard Worker 
53*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
54*495ae853SAndroid Build Coastguard Worker /* File Includes                                                             */
55*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
56*495ae853SAndroid Build Coastguard Worker 
57*495ae853SAndroid Build Coastguard Worker /* System include files */
58*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
59*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
60*495ae853SAndroid Build Coastguard Worker #include <string.h>
61*495ae853SAndroid Build Coastguard Worker 
62*495ae853SAndroid Build Coastguard Worker /* User include files */
63*495ae853SAndroid Build Coastguard Worker #include "ime_typedefs.h"
64*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
65*495ae853SAndroid Build Coastguard Worker #include "ime_macros.h"
66*495ae853SAndroid Build Coastguard Worker #include "ime_statistics.h"
67*495ae853SAndroid Build Coastguard Worker #include "ime_platform_macros.h"
68*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
69*495ae853SAndroid Build Coastguard Worker 
70*495ae853SAndroid Build Coastguard Worker 
71*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
72*495ae853SAndroid Build Coastguard Worker /* Function Definitions                                                      */
73*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
74*495ae853SAndroid Build Coastguard Worker 
75*495ae853SAndroid Build Coastguard Worker /**
76*495ae853SAndroid Build Coastguard Worker ******************************************************************************
77*495ae853SAndroid Build Coastguard Worker *
78*495ae853SAndroid Build Coastguard Worker * @brief computes distortion (SAD) at all subpel points about the src location
79*495ae853SAndroid Build Coastguard Worker *
80*495ae853SAndroid Build Coastguard Worker * @par Description
81*495ae853SAndroid Build Coastguard Worker *   This functions computes SAD at all points at a subpel distance from the
82*495ae853SAndroid Build Coastguard Worker *   current source location.
83*495ae853SAndroid Build Coastguard Worker *
84*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
85*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
86*495ae853SAndroid Build Coastguard Worker *
87*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_ref_half_x
88*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to half pel buffer
89*495ae853SAndroid Build Coastguard Worker *
90*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_ref_half_y
91*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to half pel buffer
92*495ae853SAndroid Build Coastguard Worker *
93*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_ref_half_xy
94*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to half pel buffer
95*495ae853SAndroid Build Coastguard Worker *
96*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
97*495ae853SAndroid Build Coastguard Worker *  integer source stride
98*495ae853SAndroid Build Coastguard Worker *
99*495ae853SAndroid Build Coastguard Worker * @param[in] ref_strd
100*495ae853SAndroid Build Coastguard Worker *  integer ref stride
101*495ae853SAndroid Build Coastguard Worker *
102*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_sad
103*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
104*495ae853SAndroid Build Coastguard Worker *  pi4_sad[0] - half x
105*495ae853SAndroid Build Coastguard Worker *  pi4_sad[1] - half x - 1
106*495ae853SAndroid Build Coastguard Worker *  pi4_sad[2] - half y
107*495ae853SAndroid Build Coastguard Worker *  pi4_sad[3] - half y - 1
108*495ae853SAndroid Build Coastguard Worker *  pi4_sad[4] - half xy
109*495ae853SAndroid Build Coastguard Worker *  pi4_sad[5] - half xy - 1
110*495ae853SAndroid Build Coastguard Worker *  pi4_sad[6] - half xy - strd
111*495ae853SAndroid Build Coastguard Worker *  pi4_sad[7] - half xy - 1 - strd
112*495ae853SAndroid Build Coastguard Worker *
113*495ae853SAndroid Build Coastguard Worker * @remarks
114*495ae853SAndroid Build Coastguard Worker *
115*495ae853SAndroid Build Coastguard Worker ******************************************************************************
116*495ae853SAndroid Build Coastguard Worker */
ime_sub_pel_compute_sad_16x16(UWORD8 * pu1_src,UWORD8 * pu1_ref_half_x,UWORD8 * pu1_ref_half_y,UWORD8 * pu1_ref_half_xy,WORD32 src_strd,WORD32 ref_strd,WORD32 * pi4_sad)117*495ae853SAndroid Build Coastguard Worker void ime_sub_pel_compute_sad_16x16(UWORD8 *pu1_src,
118*495ae853SAndroid Build Coastguard Worker                                    UWORD8 *pu1_ref_half_x,
119*495ae853SAndroid Build Coastguard Worker                                    UWORD8 *pu1_ref_half_y,
120*495ae853SAndroid Build Coastguard Worker                                    UWORD8 *pu1_ref_half_xy,
121*495ae853SAndroid Build Coastguard Worker                                    WORD32 src_strd,
122*495ae853SAndroid Build Coastguard Worker                                    WORD32 ref_strd,
123*495ae853SAndroid Build Coastguard Worker                                    WORD32 *pi4_sad)
124*495ae853SAndroid Build Coastguard Worker {
125*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_ref_half_x_left = pu1_ref_half_x - 1;
126*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_ref_half_y_top = pu1_ref_half_y - ref_strd;
127*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_ref_half_xy_left = pu1_ref_half_xy - 1;
128*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_ref_half_xy_top = pu1_ref_half_xy - ref_strd;
129*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_ref_half_xy_top_left = pu1_ref_half_xy - ref_strd - 1;
130*495ae853SAndroid Build Coastguard Worker 
131*495ae853SAndroid Build Coastguard Worker     WORD32 row, col;
132*495ae853SAndroid Build Coastguard Worker 
133*495ae853SAndroid Build Coastguard Worker     memset(pi4_sad, 0, 8 * sizeof(WORD32));
134*495ae853SAndroid Build Coastguard Worker 
135*495ae853SAndroid Build Coastguard Worker     for(row = 0; row < MB_SIZE; row++)
136*495ae853SAndroid Build Coastguard Worker     {
137*495ae853SAndroid Build Coastguard Worker         for(col = 0; col < MB_SIZE; col++)
138*495ae853SAndroid Build Coastguard Worker         {
139*495ae853SAndroid Build Coastguard Worker             WORD32 src;
140*495ae853SAndroid Build Coastguard Worker             WORD32 diff;
141*495ae853SAndroid Build Coastguard Worker 
142*495ae853SAndroid Build Coastguard Worker             src = pu1_src[col];
143*495ae853SAndroid Build Coastguard Worker 
144*495ae853SAndroid Build Coastguard Worker             diff = src - pu1_ref_half_x[col];
145*495ae853SAndroid Build Coastguard Worker             pi4_sad[0] += ABS(diff);
146*495ae853SAndroid Build Coastguard Worker 
147*495ae853SAndroid Build Coastguard Worker             diff = src - pu1_ref_half_x_left[col];
148*495ae853SAndroid Build Coastguard Worker             pi4_sad[1] += ABS(diff);
149*495ae853SAndroid Build Coastguard Worker 
150*495ae853SAndroid Build Coastguard Worker             diff = src - pu1_ref_half_y[col];
151*495ae853SAndroid Build Coastguard Worker             pi4_sad[2] += ABS(diff);
152*495ae853SAndroid Build Coastguard Worker 
153*495ae853SAndroid Build Coastguard Worker             diff = src - pu1_ref_half_y_top[col];
154*495ae853SAndroid Build Coastguard Worker             pi4_sad[3] += ABS(diff);
155*495ae853SAndroid Build Coastguard Worker 
156*495ae853SAndroid Build Coastguard Worker             diff = src - pu1_ref_half_xy[col];
157*495ae853SAndroid Build Coastguard Worker             pi4_sad[4] += ABS(diff);
158*495ae853SAndroid Build Coastguard Worker 
159*495ae853SAndroid Build Coastguard Worker             diff = src - pu1_ref_half_xy_left[col];
160*495ae853SAndroid Build Coastguard Worker             pi4_sad[5] += ABS(diff);
161*495ae853SAndroid Build Coastguard Worker 
162*495ae853SAndroid Build Coastguard Worker             diff = src - pu1_ref_half_xy_top[col];
163*495ae853SAndroid Build Coastguard Worker             pi4_sad[6] += ABS(diff);
164*495ae853SAndroid Build Coastguard Worker 
165*495ae853SAndroid Build Coastguard Worker             diff = src - pu1_ref_half_xy_top_left[col];
166*495ae853SAndroid Build Coastguard Worker             pi4_sad[7] += ABS(diff);
167*495ae853SAndroid Build Coastguard Worker         }
168*495ae853SAndroid Build Coastguard Worker 
169*495ae853SAndroid Build Coastguard Worker         pu1_src += src_strd;
170*495ae853SAndroid Build Coastguard Worker 
171*495ae853SAndroid Build Coastguard Worker         pu1_ref_half_x += ref_strd;
172*495ae853SAndroid Build Coastguard Worker         pu1_ref_half_x_left += ref_strd;
173*495ae853SAndroid Build Coastguard Worker 
174*495ae853SAndroid Build Coastguard Worker         pu1_ref_half_y += ref_strd;
175*495ae853SAndroid Build Coastguard Worker         pu1_ref_half_y_top += ref_strd;
176*495ae853SAndroid Build Coastguard Worker 
177*495ae853SAndroid Build Coastguard Worker         pu1_ref_half_xy += ref_strd;
178*495ae853SAndroid Build Coastguard Worker         pu1_ref_half_xy_left += ref_strd;
179*495ae853SAndroid Build Coastguard Worker         pu1_ref_half_xy_top += ref_strd;
180*495ae853SAndroid Build Coastguard Worker         pu1_ref_half_xy_top_left += ref_strd;
181*495ae853SAndroid Build Coastguard Worker     }
182*495ae853SAndroid Build Coastguard Worker }
183*495ae853SAndroid Build Coastguard Worker 
184*495ae853SAndroid Build Coastguard Worker /**
185*495ae853SAndroid Build Coastguard Worker *******************************************************************************
186*495ae853SAndroid Build Coastguard Worker *
187*495ae853SAndroid Build Coastguard Worker * @brief compute sad
188*495ae853SAndroid Build Coastguard Worker *
189*495ae853SAndroid Build Coastguard Worker * @par Description: This function computes the sad at vertices of diamond grid
190*495ae853SAndroid Build Coastguard Worker * centered at reference pointer and at unit distance from it.
191*495ae853SAndroid Build Coastguard Worker *
192*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_ref
193*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the reference
194*495ae853SAndroid Build Coastguard Worker *
195*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_src
196*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
197*495ae853SAndroid Build Coastguard Worker *
198*495ae853SAndroid Build Coastguard Worker * @param[in] ref_strd
199*495ae853SAndroid Build Coastguard Worker *  integer reference stride
200*495ae853SAndroid Build Coastguard Worker *
201*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
202*495ae853SAndroid Build Coastguard Worker *  integer source stride
203*495ae853SAndroid Build Coastguard Worker *
204*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_sad
205*495ae853SAndroid Build Coastguard Worker *  pointer to integer array evaluated sad
206*495ae853SAndroid Build Coastguard Worker *
207*495ae853SAndroid Build Coastguard Worker * @returns  sad at all evaluated vertexes
208*495ae853SAndroid Build Coastguard Worker *
209*495ae853SAndroid Build Coastguard Worker * @remarks  none
210*495ae853SAndroid Build Coastguard Worker *
211*495ae853SAndroid Build Coastguard Worker *******************************************************************************
212*495ae853SAndroid Build Coastguard Worker */
ime_calculate_sad4_prog(UWORD8 * pu1_ref,UWORD8 * pu1_src,WORD32 ref_strd,WORD32 src_strd,WORD32 * pi4_sad)213*495ae853SAndroid Build Coastguard Worker void ime_calculate_sad4_prog(UWORD8 *pu1_ref,
214*495ae853SAndroid Build Coastguard Worker                              UWORD8 *pu1_src,
215*495ae853SAndroid Build Coastguard Worker                              WORD32 ref_strd,
216*495ae853SAndroid Build Coastguard Worker                              WORD32 src_strd,
217*495ae853SAndroid Build Coastguard Worker                              WORD32 *pi4_sad)
218*495ae853SAndroid Build Coastguard Worker {
219*495ae853SAndroid Build Coastguard Worker 
220*495ae853SAndroid Build Coastguard Worker     /* reference ptrs at unit 1 distance in diamond pattern centered at pu1_ref */
221*495ae853SAndroid Build Coastguard Worker     UWORD8 *left_ptr    = pu1_ref - 1;
222*495ae853SAndroid Build Coastguard Worker     UWORD8 *right_ptr   = pu1_ref + 1;
223*495ae853SAndroid Build Coastguard Worker     UWORD8 *top_ptr     = pu1_ref - ref_strd;
224*495ae853SAndroid Build Coastguard Worker     UWORD8 *bot_ptr     = pu1_ref + ref_strd;
225*495ae853SAndroid Build Coastguard Worker 
226*495ae853SAndroid Build Coastguard Worker     /* temp var */
227*495ae853SAndroid Build Coastguard Worker     WORD32 count2, count3;
228*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ref_buf_offset = ref_strd - MB_SIZE;
229*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_buf_offset = src_strd - MB_SIZE;
230*495ae853SAndroid Build Coastguard Worker 
231*495ae853SAndroid Build Coastguard Worker     memset(pi4_sad, 0, 4 * sizeof(WORD32));
232*495ae853SAndroid Build Coastguard Worker 
233*495ae853SAndroid Build Coastguard Worker     for(count2 = MB_SIZE; count2 > 0; count2--)
234*495ae853SAndroid Build Coastguard Worker     {
235*495ae853SAndroid Build Coastguard Worker         for(count3 = MB_SIZE; count3 > 0 ; count3--)
236*495ae853SAndroid Build Coastguard Worker         {
237*495ae853SAndroid Build Coastguard Worker             WORD32 src;
238*495ae853SAndroid Build Coastguard Worker             WORD32 diff;
239*495ae853SAndroid Build Coastguard Worker 
240*495ae853SAndroid Build Coastguard Worker             src = *pu1_src++;
241*495ae853SAndroid Build Coastguard Worker 
242*495ae853SAndroid Build Coastguard Worker             diff = src - *left_ptr++;
243*495ae853SAndroid Build Coastguard Worker             pi4_sad[0] += ABS(diff);
244*495ae853SAndroid Build Coastguard Worker 
245*495ae853SAndroid Build Coastguard Worker             diff = src - *right_ptr++;
246*495ae853SAndroid Build Coastguard Worker             pi4_sad[1] += ABS(diff);
247*495ae853SAndroid Build Coastguard Worker 
248*495ae853SAndroid Build Coastguard Worker             diff = src - *top_ptr++;
249*495ae853SAndroid Build Coastguard Worker             pi4_sad[2] += ABS(diff);
250*495ae853SAndroid Build Coastguard Worker 
251*495ae853SAndroid Build Coastguard Worker             diff = src - *bot_ptr++;
252*495ae853SAndroid Build Coastguard Worker             pi4_sad[3]  += ABS(diff);
253*495ae853SAndroid Build Coastguard Worker         }
254*495ae853SAndroid Build Coastguard Worker 
255*495ae853SAndroid Build Coastguard Worker         bot_ptr    += u4_ref_buf_offset;
256*495ae853SAndroid Build Coastguard Worker         left_ptr   += u4_ref_buf_offset;
257*495ae853SAndroid Build Coastguard Worker         right_ptr  += u4_ref_buf_offset;
258*495ae853SAndroid Build Coastguard Worker         top_ptr    += u4_ref_buf_offset;
259*495ae853SAndroid Build Coastguard Worker 
260*495ae853SAndroid Build Coastguard Worker         pu1_src += u4_cur_buf_offset;
261*495ae853SAndroid Build Coastguard Worker     }
262*495ae853SAndroid Build Coastguard Worker 
263*495ae853SAndroid Build Coastguard Worker }
264*495ae853SAndroid Build Coastguard Worker 
265*495ae853SAndroid Build Coastguard Worker /**
266*495ae853SAndroid Build Coastguard Worker *******************************************************************************
267*495ae853SAndroid Build Coastguard Worker *
268*495ae853SAndroid Build Coastguard Worker * @brief compute sad
269*495ae853SAndroid Build Coastguard Worker *
270*495ae853SAndroid Build Coastguard Worker * @par Description: This function computes the sad at vertices of diamond grid
271*495ae853SAndroid Build Coastguard Worker * centered at reference pointer and at unit distance from it.
272*495ae853SAndroid Build Coastguard Worker *
273*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_ref1, pu1_ref2, pu1_ref3
274*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the reference
275*495ae853SAndroid Build Coastguard Worker *
276*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_src
277*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
278*495ae853SAndroid Build Coastguard Worker *
279*495ae853SAndroid Build Coastguard Worker * @param[in] ref_strd
280*495ae853SAndroid Build Coastguard Worker *  integer reference stride
281*495ae853SAndroid Build Coastguard Worker *
282*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
283*495ae853SAndroid Build Coastguard Worker *  integer source stride
284*495ae853SAndroid Build Coastguard Worker *
285*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_sad
286*495ae853SAndroid Build Coastguard Worker *  pointer to integer array evaluated sad
287*495ae853SAndroid Build Coastguard Worker *
288*495ae853SAndroid Build Coastguard Worker * @returns  sad at all evaluated vertexes
289*495ae853SAndroid Build Coastguard Worker *
290*495ae853SAndroid Build Coastguard Worker * @remarks  none
291*495ae853SAndroid Build Coastguard Worker *
292*495ae853SAndroid Build Coastguard Worker *******************************************************************************
293*495ae853SAndroid Build Coastguard Worker */
ime_calculate_sad3_prog(UWORD8 * pu1_ref1,UWORD8 * pu1_ref2,UWORD8 * pu1_ref3,UWORD8 * pu1_src,WORD32 ref_strd,WORD32 src_strd,WORD32 * pi4_sad)294*495ae853SAndroid Build Coastguard Worker void ime_calculate_sad3_prog(UWORD8 *pu1_ref1,
295*495ae853SAndroid Build Coastguard Worker                              UWORD8 *pu1_ref2,
296*495ae853SAndroid Build Coastguard Worker                              UWORD8 *pu1_ref3,
297*495ae853SAndroid Build Coastguard Worker                              UWORD8 *pu1_src,
298*495ae853SAndroid Build Coastguard Worker                              WORD32 ref_strd,
299*495ae853SAndroid Build Coastguard Worker                              WORD32 src_strd,
300*495ae853SAndroid Build Coastguard Worker                              WORD32 *pi4_sad)
301*495ae853SAndroid Build Coastguard Worker {
302*495ae853SAndroid Build Coastguard Worker     /* temp var */
303*495ae853SAndroid Build Coastguard Worker     WORD32 i;
304*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ref_buf_offset = ref_strd - MB_SIZE;
305*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_buf_offset = src_strd - MB_SIZE;
306*495ae853SAndroid Build Coastguard Worker 
307*495ae853SAndroid Build Coastguard Worker     for(i = 16; i > 0; i--)
308*495ae853SAndroid Build Coastguard Worker     {
309*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref1, pi4_sad[0]);
310*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref2, pi4_sad[1]);
311*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref3, pi4_sad[2]);
312*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
313*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += 4;
314*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += 4;
315*495ae853SAndroid Build Coastguard Worker         pu1_ref3 += 4;
316*495ae853SAndroid Build Coastguard Worker 
317*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref1, pi4_sad[0]);
318*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref2, pi4_sad[1]);
319*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref3, pi4_sad[2]);
320*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
321*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += 4;
322*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += 4;
323*495ae853SAndroid Build Coastguard Worker         pu1_ref3 += 4;
324*495ae853SAndroid Build Coastguard Worker 
325*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref1, pi4_sad[0]);
326*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref2, pi4_sad[1]);
327*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref3, pi4_sad[2]);
328*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
329*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += 4;
330*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += 4;
331*495ae853SAndroid Build Coastguard Worker         pu1_ref3 += 4;
332*495ae853SAndroid Build Coastguard Worker 
333*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref1, pi4_sad[0]);
334*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref2, pi4_sad[1]);
335*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref3, pi4_sad[2]);
336*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
337*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += 4;
338*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += 4;
339*495ae853SAndroid Build Coastguard Worker         pu1_ref3 += 4;
340*495ae853SAndroid Build Coastguard Worker 
341*495ae853SAndroid Build Coastguard Worker         pu1_src += u4_cur_buf_offset;
342*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += u4_ref_buf_offset;
343*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += u4_ref_buf_offset;
344*495ae853SAndroid Build Coastguard Worker         pu1_ref3 += u4_ref_buf_offset;
345*495ae853SAndroid Build Coastguard Worker     }
346*495ae853SAndroid Build Coastguard Worker 
347*495ae853SAndroid Build Coastguard Worker }
348*495ae853SAndroid Build Coastguard Worker 
349*495ae853SAndroid Build Coastguard Worker /**
350*495ae853SAndroid Build Coastguard Worker *******************************************************************************
351*495ae853SAndroid Build Coastguard Worker *
352*495ae853SAndroid Build Coastguard Worker * @brief compute sad
353*495ae853SAndroid Build Coastguard Worker *
354*495ae853SAndroid Build Coastguard Worker * @par Description: This function computes the sad at vertices of diamond grid
355*495ae853SAndroid Build Coastguard Worker * centered at reference pointer and at unit distance from it.
356*495ae853SAndroid Build Coastguard Worker *
357*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_ref1, pu1_ref2
358*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the reference
359*495ae853SAndroid Build Coastguard Worker *
360*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_src
361*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
362*495ae853SAndroid Build Coastguard Worker *
363*495ae853SAndroid Build Coastguard Worker * @param[in] ref_strd
364*495ae853SAndroid Build Coastguard Worker *  integer reference stride
365*495ae853SAndroid Build Coastguard Worker *
366*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
367*495ae853SAndroid Build Coastguard Worker *  integer source stride
368*495ae853SAndroid Build Coastguard Worker *
369*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_sad
370*495ae853SAndroid Build Coastguard Worker *  pointer to integer array evaluated sad
371*495ae853SAndroid Build Coastguard Worker *
372*495ae853SAndroid Build Coastguard Worker * @returns  sad at all evaluated vertexes
373*495ae853SAndroid Build Coastguard Worker *
374*495ae853SAndroid Build Coastguard Worker * @remarks  none
375*495ae853SAndroid Build Coastguard Worker *
376*495ae853SAndroid Build Coastguard Worker *******************************************************************************
377*495ae853SAndroid Build Coastguard Worker */
ime_calculate_sad2_prog(UWORD8 * pu1_ref1,UWORD8 * pu1_ref2,UWORD8 * pu1_src,WORD32 ref_strd,WORD32 src_strd,WORD32 * pi4_sad)378*495ae853SAndroid Build Coastguard Worker void ime_calculate_sad2_prog(UWORD8 *pu1_ref1,
379*495ae853SAndroid Build Coastguard Worker                              UWORD8 *pu1_ref2,
380*495ae853SAndroid Build Coastguard Worker                              UWORD8 *pu1_src,
381*495ae853SAndroid Build Coastguard Worker                              WORD32 ref_strd,
382*495ae853SAndroid Build Coastguard Worker                              WORD32 src_strd,
383*495ae853SAndroid Build Coastguard Worker                              WORD32 *pi4_sad)
384*495ae853SAndroid Build Coastguard Worker {
385*495ae853SAndroid Build Coastguard Worker     /* temp var */
386*495ae853SAndroid Build Coastguard Worker     WORD32 i;
387*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ref_buf_offset = ref_strd - MB_SIZE;
388*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_buf_offset = src_strd - MB_SIZE;
389*495ae853SAndroid Build Coastguard Worker 
390*495ae853SAndroid Build Coastguard Worker     for(i = 16; i > 0; i--)
391*495ae853SAndroid Build Coastguard Worker     {
392*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref1, pi4_sad[0]);
393*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref2, pi4_sad[1]);
394*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
395*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += 4;
396*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += 4;
397*495ae853SAndroid Build Coastguard Worker 
398*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref1, pi4_sad[0]);
399*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref2, pi4_sad[1]);
400*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
401*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += 4;
402*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += 4;
403*495ae853SAndroid Build Coastguard Worker 
404*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref1, pi4_sad[0]);
405*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref2, pi4_sad[1]);
406*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
407*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += 4;
408*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += 4;
409*495ae853SAndroid Build Coastguard Worker 
410*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref1, pi4_sad[0]);
411*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_ref2, pi4_sad[1]);
412*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
413*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += 4;
414*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += 4;
415*495ae853SAndroid Build Coastguard Worker 
416*495ae853SAndroid Build Coastguard Worker         pu1_src += u4_cur_buf_offset;
417*495ae853SAndroid Build Coastguard Worker         pu1_ref1 += u4_ref_buf_offset;
418*495ae853SAndroid Build Coastguard Worker         pu1_ref2 += u4_ref_buf_offset;
419*495ae853SAndroid Build Coastguard Worker     }
420*495ae853SAndroid Build Coastguard Worker 
421*495ae853SAndroid Build Coastguard Worker }
422*495ae853SAndroid Build Coastguard Worker 
423*495ae853SAndroid Build Coastguard Worker /**
424*495ae853SAndroid Build Coastguard Worker ******************************************************************************
425*495ae853SAndroid Build Coastguard Worker *
426*495ae853SAndroid Build Coastguard Worker * @brief computes distortion (SAD) between 2 16x16 blocks
427*495ae853SAndroid Build Coastguard Worker *
428*495ae853SAndroid Build Coastguard Worker * @par   Description
429*495ae853SAndroid Build Coastguard Worker *   This functions computes SAD between 2 16x16 blocks. There is a provision
430*495ae853SAndroid Build Coastguard Worker *   for early exit if the up-to computed SAD exceeds maximum allowed SAD. To
431*495ae853SAndroid Build Coastguard Worker *   compute the distortion of the entire block set u4_max_sad to USHRT_MAX.
432*495ae853SAndroid Build Coastguard Worker *
433*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
434*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
435*495ae853SAndroid Build Coastguard Worker *
436*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_dst
437*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the destination
438*495ae853SAndroid Build Coastguard Worker *
439*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
440*495ae853SAndroid Build Coastguard Worker *  integer source stride
441*495ae853SAndroid Build Coastguard Worker *
442*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
443*495ae853SAndroid Build Coastguard Worker *  integer destination stride
444*495ae853SAndroid Build Coastguard Worker *
445*495ae853SAndroid Build Coastguard Worker * @param[in] i4_max_sad
446*495ae853SAndroid Build Coastguard Worker *  integer maximum allowed distortion
447*495ae853SAndroid Build Coastguard Worker *
448*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_mb_distortion
449*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
450*495ae853SAndroid Build Coastguard Worker *
451*495ae853SAndroid Build Coastguard Worker * @remarks
452*495ae853SAndroid Build Coastguard Worker *
453*495ae853SAndroid Build Coastguard Worker ******************************************************************************
454*495ae853SAndroid Build Coastguard Worker */
ime_compute_sad_16x16(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 src_strd,WORD32 est_strd,WORD32 i4_max_sad,WORD32 * pi4_mb_distortion)455*495ae853SAndroid Build Coastguard Worker void ime_compute_sad_16x16(UWORD8 *pu1_src,
456*495ae853SAndroid Build Coastguard Worker                            UWORD8 *pu1_est,
457*495ae853SAndroid Build Coastguard Worker                            WORD32 src_strd,
458*495ae853SAndroid Build Coastguard Worker                            WORD32 est_strd,
459*495ae853SAndroid Build Coastguard Worker                            WORD32 i4_max_sad,
460*495ae853SAndroid Build Coastguard Worker                            WORD32 *pi4_mb_distortion)
461*495ae853SAndroid Build Coastguard Worker {
462*495ae853SAndroid Build Coastguard Worker     WORD32 i4_sad = 0;
463*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_src_offset = src_strd - 16;
464*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_est_offset = est_strd - 16;
465*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
466*495ae853SAndroid Build Coastguard Worker 
467*495ae853SAndroid Build Coastguard Worker GATHER_16x16_SAD_EE_STATS(gu4_16x16_sad_ee_stats, 16);
468*495ae853SAndroid Build Coastguard Worker 
469*495ae853SAndroid Build Coastguard Worker     for(i = 16; i > 0; i--)
470*495ae853SAndroid Build Coastguard Worker     {
471*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_est, i4_sad);
472*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
473*495ae853SAndroid Build Coastguard Worker         pu1_est += 4;
474*495ae853SAndroid Build Coastguard Worker 
475*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_est, i4_sad);
476*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
477*495ae853SAndroid Build Coastguard Worker         pu1_est += 4;
478*495ae853SAndroid Build Coastguard Worker 
479*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_est, i4_sad);
480*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
481*495ae853SAndroid Build Coastguard Worker         pu1_est += 4;
482*495ae853SAndroid Build Coastguard Worker 
483*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_est, i4_sad);
484*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
485*495ae853SAndroid Build Coastguard Worker         pu1_est += 4;
486*495ae853SAndroid Build Coastguard Worker 
487*495ae853SAndroid Build Coastguard Worker         /* early exit */
488*495ae853SAndroid Build Coastguard Worker         if(i4_max_sad < i4_sad)
489*495ae853SAndroid Build Coastguard Worker         {
490*495ae853SAndroid Build Coastguard Worker 
491*495ae853SAndroid Build Coastguard Worker GATHER_16x16_SAD_EE_STATS(gu4_16x16_sad_ee_stats, 16-i);
492*495ae853SAndroid Build Coastguard Worker 
493*495ae853SAndroid Build Coastguard Worker             *pi4_mb_distortion = i4_sad;
494*495ae853SAndroid Build Coastguard Worker             return ;
495*495ae853SAndroid Build Coastguard Worker         }
496*495ae853SAndroid Build Coastguard Worker         pu1_src += u4_src_offset;
497*495ae853SAndroid Build Coastguard Worker         pu1_est += u4_est_offset;
498*495ae853SAndroid Build Coastguard Worker     }
499*495ae853SAndroid Build Coastguard Worker 
500*495ae853SAndroid Build Coastguard Worker     *pi4_mb_distortion = i4_sad;
501*495ae853SAndroid Build Coastguard Worker     return ;
502*495ae853SAndroid Build Coastguard Worker }
503*495ae853SAndroid Build Coastguard Worker 
504*495ae853SAndroid Build Coastguard Worker /**
505*495ae853SAndroid Build Coastguard Worker ******************************************************************************
506*495ae853SAndroid Build Coastguard Worker *
507*495ae853SAndroid Build Coastguard Worker * @brief computes distortion (SAD) between 2 16x16 blocks (fast mode)
508*495ae853SAndroid Build Coastguard Worker *
509*495ae853SAndroid Build Coastguard Worker * @par   Description
510*495ae853SAndroid Build Coastguard Worker *   This functions computes SAD between 2 16x16 blocks. There is a provision
511*495ae853SAndroid Build Coastguard Worker *   for early exit if the up-to computed SAD exceeds maximum allowed SAD. To
512*495ae853SAndroid Build Coastguard Worker *   compute the distortion of the entire block set u4_max_sad to USHRT_MAX.
513*495ae853SAndroid Build Coastguard Worker *
514*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
515*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
516*495ae853SAndroid Build Coastguard Worker *
517*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_dst
518*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the destination
519*495ae853SAndroid Build Coastguard Worker *
520*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
521*495ae853SAndroid Build Coastguard Worker *  integer source stride
522*495ae853SAndroid Build Coastguard Worker *
523*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
524*495ae853SAndroid Build Coastguard Worker *  integer destination stride
525*495ae853SAndroid Build Coastguard Worker *
526*495ae853SAndroid Build Coastguard Worker * @param[in] i4_max_sad
527*495ae853SAndroid Build Coastguard Worker *  integer maximum allowed distortion
528*495ae853SAndroid Build Coastguard Worker *
529*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_mb_distortion
530*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
531*495ae853SAndroid Build Coastguard Worker *
532*495ae853SAndroid Build Coastguard Worker * @remarks
533*495ae853SAndroid Build Coastguard Worker *
534*495ae853SAndroid Build Coastguard Worker ******************************************************************************
535*495ae853SAndroid Build Coastguard Worker */
ime_compute_sad_16x16_fast(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 src_strd,WORD32 est_strd,WORD32 i4_max_sad,WORD32 * pi4_mb_distortion)536*495ae853SAndroid Build Coastguard Worker void ime_compute_sad_16x16_fast(UWORD8 *pu1_src,
537*495ae853SAndroid Build Coastguard Worker                                 UWORD8 *pu1_est,
538*495ae853SAndroid Build Coastguard Worker                                 WORD32 src_strd,
539*495ae853SAndroid Build Coastguard Worker                                 WORD32 est_strd,
540*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_max_sad,
541*495ae853SAndroid Build Coastguard Worker                                 WORD32 *pi4_mb_distortion)
542*495ae853SAndroid Build Coastguard Worker {
543*495ae853SAndroid Build Coastguard Worker     WORD32 i4_sad = 0;
544*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_src_offset = 2 * src_strd - 16;
545*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_est_offset = 2 * est_strd - 16;
546*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
547*495ae853SAndroid Build Coastguard Worker 
548*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_max_sad);
549*495ae853SAndroid Build Coastguard Worker 
550*495ae853SAndroid Build Coastguard Worker     for(i = 16; i > 0; i-= 2)
551*495ae853SAndroid Build Coastguard Worker     {
552*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_est, i4_sad);
553*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
554*495ae853SAndroid Build Coastguard Worker         pu1_est += 4;
555*495ae853SAndroid Build Coastguard Worker 
556*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_est, i4_sad);
557*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
558*495ae853SAndroid Build Coastguard Worker         pu1_est += 4;
559*495ae853SAndroid Build Coastguard Worker 
560*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_est, i4_sad);
561*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
562*495ae853SAndroid Build Coastguard Worker         pu1_est += 4;
563*495ae853SAndroid Build Coastguard Worker 
564*495ae853SAndroid Build Coastguard Worker         USADA8(pu1_src, pu1_est, i4_sad);
565*495ae853SAndroid Build Coastguard Worker         pu1_src += 4;
566*495ae853SAndroid Build Coastguard Worker         pu1_est += 4;
567*495ae853SAndroid Build Coastguard Worker 
568*495ae853SAndroid Build Coastguard Worker         pu1_src += u4_src_offset;
569*495ae853SAndroid Build Coastguard Worker         pu1_est += u4_est_offset;
570*495ae853SAndroid Build Coastguard Worker     }
571*495ae853SAndroid Build Coastguard Worker 
572*495ae853SAndroid Build Coastguard Worker     *pi4_mb_distortion = (i4_sad << 1);
573*495ae853SAndroid Build Coastguard Worker     return ;
574*495ae853SAndroid Build Coastguard Worker }
575*495ae853SAndroid Build Coastguard Worker 
576*495ae853SAndroid Build Coastguard Worker /**
577*495ae853SAndroid Build Coastguard Worker ******************************************************************************
578*495ae853SAndroid Build Coastguard Worker *
579*495ae853SAndroid Build Coastguard Worker *  @brief computes distortion (SAD) between 2 8x8 blocks
580*495ae853SAndroid Build Coastguard Worker *
581*495ae853SAndroid Build Coastguard Worker *  @par   Description
582*495ae853SAndroid Build Coastguard Worker *   This functions computes SAD between 2 8x8 blocks. There is a provision
583*495ae853SAndroid Build Coastguard Worker *   for early exit if the up-to computed SAD exceeds maximum allowed SAD. To
584*495ae853SAndroid Build Coastguard Worker *   compute the distortion of the entire block set u4_max_sad to USHRT_MAX.
585*495ae853SAndroid Build Coastguard Worker *
586*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
587*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
588*495ae853SAndroid Build Coastguard Worker *
589*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_dst
590*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the destination
591*495ae853SAndroid Build Coastguard Worker *
592*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
593*495ae853SAndroid Build Coastguard Worker *  integer source stride
594*495ae853SAndroid Build Coastguard Worker *
595*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
596*495ae853SAndroid Build Coastguard Worker *  integer destination stride
597*495ae853SAndroid Build Coastguard Worker *
598*495ae853SAndroid Build Coastguard Worker * @param[in] u4_max_sad
599*495ae853SAndroid Build Coastguard Worker *  integer maximum allowed distortion
600*495ae853SAndroid Build Coastguard Worker *
601*495ae853SAndroid Build Coastguard Worker * @param[out] i4_sad
602*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
603*495ae853SAndroid Build Coastguard Worker *
604*495ae853SAndroid Build Coastguard Worker * @remarks
605*495ae853SAndroid Build Coastguard Worker *
606*495ae853SAndroid Build Coastguard Worker ******************************************************************************
607*495ae853SAndroid Build Coastguard Worker  */
ime_compute_sad_8x8(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 src_strd,WORD32 est_strd,WORD32 i4_max_sad,WORD32 * pi4_mb_distortion)608*495ae853SAndroid Build Coastguard Worker void ime_compute_sad_8x8(UWORD8 *pu1_src,
609*495ae853SAndroid Build Coastguard Worker                          UWORD8 *pu1_est,
610*495ae853SAndroid Build Coastguard Worker                          WORD32 src_strd,
611*495ae853SAndroid Build Coastguard Worker                          WORD32 est_strd,
612*495ae853SAndroid Build Coastguard Worker                          WORD32 i4_max_sad,
613*495ae853SAndroid Build Coastguard Worker                          WORD32 *pi4_mb_distortion)
614*495ae853SAndroid Build Coastguard Worker {
615*495ae853SAndroid Build Coastguard Worker     WORD32 i4_sad = 0;
616*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_src_offset = src_strd - 8;
617*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_est_offset = est_strd - 8;
618*495ae853SAndroid Build Coastguard Worker     UWORD32 i, j;
619*495ae853SAndroid Build Coastguard Worker     WORD16 temp;
620*495ae853SAndroid Build Coastguard Worker 
621*495ae853SAndroid Build Coastguard Worker     for(i = 8; i > 0; i--)
622*495ae853SAndroid Build Coastguard Worker     {
623*495ae853SAndroid Build Coastguard Worker         for(j = 8; j > 0; j--)
624*495ae853SAndroid Build Coastguard Worker         {
625*495ae853SAndroid Build Coastguard Worker             /* SAD */
626*495ae853SAndroid Build Coastguard Worker             temp = *pu1_src++ - *pu1_est++;
627*495ae853SAndroid Build Coastguard Worker             i4_sad += ABS(temp);
628*495ae853SAndroid Build Coastguard Worker         }
629*495ae853SAndroid Build Coastguard Worker         /* early exit */
630*495ae853SAndroid Build Coastguard Worker         if(i4_max_sad < i4_sad)
631*495ae853SAndroid Build Coastguard Worker         {
632*495ae853SAndroid Build Coastguard Worker             *pi4_mb_distortion = i4_sad;
633*495ae853SAndroid Build Coastguard Worker             return;
634*495ae853SAndroid Build Coastguard Worker         }
635*495ae853SAndroid Build Coastguard Worker         pu1_src += u4_src_offset;
636*495ae853SAndroid Build Coastguard Worker         pu1_est += u4_est_offset;
637*495ae853SAndroid Build Coastguard Worker     }
638*495ae853SAndroid Build Coastguard Worker     *pi4_mb_distortion = i4_sad;
639*495ae853SAndroid Build Coastguard Worker }
640*495ae853SAndroid Build Coastguard Worker 
641*495ae853SAndroid Build Coastguard Worker /**
642*495ae853SAndroid Build Coastguard Worker ******************************************************************************
643*495ae853SAndroid Build Coastguard Worker *
644*495ae853SAndroid Build Coastguard Worker *  @brief computes distortion (SAD) between 2 4x4 blocks
645*495ae853SAndroid Build Coastguard Worker *
646*495ae853SAndroid Build Coastguard Worker *  @par   Description
647*495ae853SAndroid Build Coastguard Worker *   This functions computes SAD between 2 4x4 blocks. There is a provision
648*495ae853SAndroid Build Coastguard Worker *   for early exit if the up-to computed SAD exceeds maximum allowed SAD. To
649*495ae853SAndroid Build Coastguard Worker *   compute the distortion of the entire block set u4_max_sad to USHRT_MAX.
650*495ae853SAndroid Build Coastguard Worker *
651*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
652*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
653*495ae853SAndroid Build Coastguard Worker *
654*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_dst
655*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the destination
656*495ae853SAndroid Build Coastguard Worker *
657*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
658*495ae853SAndroid Build Coastguard Worker *  integer source stride
659*495ae853SAndroid Build Coastguard Worker *
660*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
661*495ae853SAndroid Build Coastguard Worker *  integer destination stride
662*495ae853SAndroid Build Coastguard Worker *
663*495ae853SAndroid Build Coastguard Worker * @param[in] u4_max_sad
664*495ae853SAndroid Build Coastguard Worker *  integer maximum allowed distortion
665*495ae853SAndroid Build Coastguard Worker *
666*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_mb_distortion
667*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
668*495ae853SAndroid Build Coastguard Worker *
669*495ae853SAndroid Build Coastguard Worker * @remarks
670*495ae853SAndroid Build Coastguard Worker *
671*495ae853SAndroid Build Coastguard Worker ******************************************************************************
672*495ae853SAndroid Build Coastguard Worker */
ime_compute_sad_4x4(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 src_strd,WORD32 est_strd,WORD32 i4_max_sad,WORD32 * pi4_mb_distortion)673*495ae853SAndroid Build Coastguard Worker void ime_compute_sad_4x4(UWORD8 *pu1_src,
674*495ae853SAndroid Build Coastguard Worker                          UWORD8 *pu1_est,
675*495ae853SAndroid Build Coastguard Worker                          WORD32 src_strd,
676*495ae853SAndroid Build Coastguard Worker                          WORD32 est_strd,
677*495ae853SAndroid Build Coastguard Worker                          WORD32 i4_max_sad,
678*495ae853SAndroid Build Coastguard Worker                          WORD32 *pi4_mb_distortion)
679*495ae853SAndroid Build Coastguard Worker {
680*495ae853SAndroid Build Coastguard Worker     WORD32 i4_sad = 0;
681*495ae853SAndroid Build Coastguard Worker 
682*495ae853SAndroid Build Coastguard Worker     UNUSED(i4_max_sad);
683*495ae853SAndroid Build Coastguard Worker 
684*495ae853SAndroid Build Coastguard Worker     USADA8(pu1_src, pu1_est, i4_sad);
685*495ae853SAndroid Build Coastguard Worker     pu1_src += src_strd;
686*495ae853SAndroid Build Coastguard Worker     pu1_est += est_strd;
687*495ae853SAndroid Build Coastguard Worker 
688*495ae853SAndroid Build Coastguard Worker     USADA8(pu1_src, pu1_est, i4_sad);
689*495ae853SAndroid Build Coastguard Worker     pu1_src += src_strd;
690*495ae853SAndroid Build Coastguard Worker     pu1_est += est_strd;
691*495ae853SAndroid Build Coastguard Worker 
692*495ae853SAndroid Build Coastguard Worker     USADA8(pu1_src, pu1_est, i4_sad);
693*495ae853SAndroid Build Coastguard Worker     pu1_src += src_strd;
694*495ae853SAndroid Build Coastguard Worker     pu1_est += est_strd;
695*495ae853SAndroid Build Coastguard Worker 
696*495ae853SAndroid Build Coastguard Worker     USADA8(pu1_src, pu1_est, i4_sad);
697*495ae853SAndroid Build Coastguard Worker     *pi4_mb_distortion = i4_sad;
698*495ae853SAndroid Build Coastguard Worker }
699*495ae853SAndroid Build Coastguard Worker 
700*495ae853SAndroid Build Coastguard Worker /**
701*495ae853SAndroid Build Coastguard Worker ******************************************************************************
702*495ae853SAndroid Build Coastguard Worker *
703*495ae853SAndroid Build Coastguard Worker *  @brief computes distortion (SAD) between 2 16x8  blocks
704*495ae853SAndroid Build Coastguard Worker *
705*495ae853SAndroid Build Coastguard Worker *  @par   Description
706*495ae853SAndroid Build Coastguard Worker *   This functions computes SAD between 2 16x8 blocks. There is a provision
707*495ae853SAndroid Build Coastguard Worker *   for early exit if the up-to computed SAD exceeds maximum allowed SAD. To
708*495ae853SAndroid Build Coastguard Worker *   compute the distortion of the entire block set u4_max_sad to USHRT_MAX.
709*495ae853SAndroid Build Coastguard Worker *
710*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
711*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
712*495ae853SAndroid Build Coastguard Worker *
713*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_dst
714*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the destination
715*495ae853SAndroid Build Coastguard Worker *
716*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
717*495ae853SAndroid Build Coastguard Worker *  integer source stride
718*495ae853SAndroid Build Coastguard Worker *
719*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
720*495ae853SAndroid Build Coastguard Worker *  integer destination stride
721*495ae853SAndroid Build Coastguard Worker *
722*495ae853SAndroid Build Coastguard Worker * @param[in] u4_max_sad
723*495ae853SAndroid Build Coastguard Worker *  integer maximum allowed distortion
724*495ae853SAndroid Build Coastguard Worker *
725*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_mb_distortion
726*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
727*495ae853SAndroid Build Coastguard Worker *
728*495ae853SAndroid Build Coastguard Worker * @remarks
729*495ae853SAndroid Build Coastguard Worker *
730*495ae853SAndroid Build Coastguard Worker ******************************************************************************
731*495ae853SAndroid Build Coastguard Worker */
ime_compute_sad_16x8(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 src_strd,WORD32 est_strd,WORD32 i4_max_sad,WORD32 * pi4_mb_distortion)732*495ae853SAndroid Build Coastguard Worker void ime_compute_sad_16x8(UWORD8 *pu1_src,
733*495ae853SAndroid Build Coastguard Worker                           UWORD8 *pu1_est,
734*495ae853SAndroid Build Coastguard Worker                           WORD32 src_strd,
735*495ae853SAndroid Build Coastguard Worker                           WORD32 est_strd,
736*495ae853SAndroid Build Coastguard Worker                           WORD32 i4_max_sad,
737*495ae853SAndroid Build Coastguard Worker                           WORD32 *pi4_mb_distortion)
738*495ae853SAndroid Build Coastguard Worker {
739*495ae853SAndroid Build Coastguard Worker     WORD32 i4_sad = 0;
740*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_src_offset = src_strd - 16;
741*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_est_offset = est_strd - 16;
742*495ae853SAndroid Build Coastguard Worker     UWORD32 i, j;
743*495ae853SAndroid Build Coastguard Worker     WORD16 temp;
744*495ae853SAndroid Build Coastguard Worker 
745*495ae853SAndroid Build Coastguard Worker GATHER_16x8_SAD_EE_STATS(gu4_16x8_sad_ee_stats, 8);
746*495ae853SAndroid Build Coastguard Worker 
747*495ae853SAndroid Build Coastguard Worker     for(i = 8; i > 0; i--)
748*495ae853SAndroid Build Coastguard Worker     {
749*495ae853SAndroid Build Coastguard Worker         for(j = 16; j > 0; j--)
750*495ae853SAndroid Build Coastguard Worker         {
751*495ae853SAndroid Build Coastguard Worker             /* SAD */
752*495ae853SAndroid Build Coastguard Worker             temp = *pu1_src++ - *pu1_est++;
753*495ae853SAndroid Build Coastguard Worker             i4_sad += ABS(temp);
754*495ae853SAndroid Build Coastguard Worker         }
755*495ae853SAndroid Build Coastguard Worker         /* early exit */
756*495ae853SAndroid Build Coastguard Worker         if(i4_max_sad < i4_sad)
757*495ae853SAndroid Build Coastguard Worker         {
758*495ae853SAndroid Build Coastguard Worker 
759*495ae853SAndroid Build Coastguard Worker GATHER_16x8_SAD_EE_STATS(gu4_16x8_sad_ee_stats, 8-i);
760*495ae853SAndroid Build Coastguard Worker 
761*495ae853SAndroid Build Coastguard Worker             *pi4_mb_distortion = i4_sad;
762*495ae853SAndroid Build Coastguard Worker 
763*495ae853SAndroid Build Coastguard Worker             return;
764*495ae853SAndroid Build Coastguard Worker         }
765*495ae853SAndroid Build Coastguard Worker         pu1_src += u4_src_offset;
766*495ae853SAndroid Build Coastguard Worker         pu1_est += u4_est_offset;
767*495ae853SAndroid Build Coastguard Worker     }
768*495ae853SAndroid Build Coastguard Worker 
769*495ae853SAndroid Build Coastguard Worker     *pi4_mb_distortion = i4_sad;
770*495ae853SAndroid Build Coastguard Worker     return;
771*495ae853SAndroid Build Coastguard Worker 
772*495ae853SAndroid Build Coastguard Worker }
773*495ae853SAndroid Build Coastguard Worker 
774*495ae853SAndroid Build Coastguard Worker /**
775*495ae853SAndroid Build Coastguard Worker ******************************************************************************
776*495ae853SAndroid Build Coastguard Worker *
777*495ae853SAndroid Build Coastguard Worker * @brief computes distortion (SAD) between 2 16x16 blocks
778*495ae853SAndroid Build Coastguard Worker *
779*495ae853SAndroid Build Coastguard Worker * @par   Description
780*495ae853SAndroid Build Coastguard Worker *   This functions computes SAD between 2 16x16 blocks. There is a provision
781*495ae853SAndroid Build Coastguard Worker *   for early exit if the up-to computed SAD exceeds maximum allowed SAD. To
782*495ae853SAndroid Build Coastguard Worker *   compute the distortion of the entire block set u4_max_sad to USHRT_MAX.
783*495ae853SAndroid Build Coastguard Worker *
784*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
785*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
786*495ae853SAndroid Build Coastguard Worker *
787*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_dst
788*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the destination
789*495ae853SAndroid Build Coastguard Worker *
790*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
791*495ae853SAndroid Build Coastguard Worker *  integer source stride
792*495ae853SAndroid Build Coastguard Worker *
793*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
794*495ae853SAndroid Build Coastguard Worker *  integer destination stride
795*495ae853SAndroid Build Coastguard Worker *
796*495ae853SAndroid Build Coastguard Worker * @param[in] i4_max_sad
797*495ae853SAndroid Build Coastguard Worker *  integer maximum allowed distortion
798*495ae853SAndroid Build Coastguard Worker *
799*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_mb_distortion
800*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
801*495ae853SAndroid Build Coastguard Worker *
802*495ae853SAndroid Build Coastguard Worker * @remarks
803*495ae853SAndroid Build Coastguard Worker *
804*495ae853SAndroid Build Coastguard Worker ******************************************************************************
805*495ae853SAndroid Build Coastguard Worker */
ime_compute_sad_16x16_ea8(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 src_strd,WORD32 est_strd,WORD32 i4_max_sad,WORD32 * pi4_mb_distortion)806*495ae853SAndroid Build Coastguard Worker void ime_compute_sad_16x16_ea8(UWORD8 *pu1_src,
807*495ae853SAndroid Build Coastguard Worker                                UWORD8 *pu1_est,
808*495ae853SAndroid Build Coastguard Worker                                WORD32 src_strd,
809*495ae853SAndroid Build Coastguard Worker                                WORD32 est_strd,
810*495ae853SAndroid Build Coastguard Worker                                WORD32 i4_max_sad,
811*495ae853SAndroid Build Coastguard Worker                                WORD32 *pi4_mb_distortion)
812*495ae853SAndroid Build Coastguard Worker {
813*495ae853SAndroid Build Coastguard Worker     WORD32 i4_sad = 0;
814*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_src_offset = src_strd - 16;
815*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_est_offset = est_strd - 16;
816*495ae853SAndroid Build Coastguard Worker     UWORD32 i, j;
817*495ae853SAndroid Build Coastguard Worker     WORD16 temp;
818*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_temp = pu1_src + src_strd;
819*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_est_temp = pu1_est + est_strd;
820*495ae853SAndroid Build Coastguard Worker 
821*495ae853SAndroid Build Coastguard Worker     for(i = 16; i > 0; i -= 2)
822*495ae853SAndroid Build Coastguard Worker     {
823*495ae853SAndroid Build Coastguard Worker         for(j = 16; j > 0; j--)
824*495ae853SAndroid Build Coastguard Worker         {
825*495ae853SAndroid Build Coastguard Worker             /* SAD */
826*495ae853SAndroid Build Coastguard Worker             temp = *pu1_src++ - *pu1_est++;
827*495ae853SAndroid Build Coastguard Worker             i4_sad += ABS(temp);
828*495ae853SAndroid Build Coastguard Worker         }
829*495ae853SAndroid Build Coastguard Worker 
830*495ae853SAndroid Build Coastguard Worker         pu1_src += (u4_src_offset + src_strd);
831*495ae853SAndroid Build Coastguard Worker         pu1_est += (u4_est_offset + est_strd);
832*495ae853SAndroid Build Coastguard Worker 
833*495ae853SAndroid Build Coastguard Worker     }
834*495ae853SAndroid Build Coastguard Worker 
835*495ae853SAndroid Build Coastguard Worker     /* early exit */
836*495ae853SAndroid Build Coastguard Worker     if(i4_max_sad < i4_sad)
837*495ae853SAndroid Build Coastguard Worker     {
838*495ae853SAndroid Build Coastguard Worker         *pi4_mb_distortion = i4_sad;
839*495ae853SAndroid Build Coastguard Worker         return;
840*495ae853SAndroid Build Coastguard Worker     }
841*495ae853SAndroid Build Coastguard Worker 
842*495ae853SAndroid Build Coastguard Worker     pu1_src = pu1_src_temp;
843*495ae853SAndroid Build Coastguard Worker     pu1_est = pu1_est_temp;
844*495ae853SAndroid Build Coastguard Worker 
845*495ae853SAndroid Build Coastguard Worker     for(i = 16; i > 0; i -= 2)
846*495ae853SAndroid Build Coastguard Worker     {
847*495ae853SAndroid Build Coastguard Worker         for(j = 16; j > 0; j--)
848*495ae853SAndroid Build Coastguard Worker         {
849*495ae853SAndroid Build Coastguard Worker             /* SAD */
850*495ae853SAndroid Build Coastguard Worker             temp = *pu1_src++ - *pu1_est++;
851*495ae853SAndroid Build Coastguard Worker             i4_sad += ABS(temp);
852*495ae853SAndroid Build Coastguard Worker         }
853*495ae853SAndroid Build Coastguard Worker 
854*495ae853SAndroid Build Coastguard Worker         pu1_src += u4_src_offset + src_strd;
855*495ae853SAndroid Build Coastguard Worker         pu1_est += u4_est_offset + est_strd;
856*495ae853SAndroid Build Coastguard Worker     }
857*495ae853SAndroid Build Coastguard Worker 
858*495ae853SAndroid Build Coastguard Worker     *pi4_mb_distortion = i4_sad;
859*495ae853SAndroid Build Coastguard Worker     return;
860*495ae853SAndroid Build Coastguard Worker }
861*495ae853SAndroid Build Coastguard Worker 
862*495ae853SAndroid Build Coastguard Worker /**
863*495ae853SAndroid Build Coastguard Worker *******************************************************************************
864*495ae853SAndroid Build Coastguard Worker *
865*495ae853SAndroid Build Coastguard Worker * @brief This function computes SAD between two 16x16 blocks. It also computes
866*495ae853SAndroid Build Coastguard Worker * if the block will be zero after H264 transform and quant
867*495ae853SAndroid Build Coastguard Worker *
868*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
869*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
870*495ae853SAndroid Build Coastguard Worker *
871*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_est
872*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the estimated block
873*495ae853SAndroid Build Coastguard Worker *
874*495ae853SAndroid Build Coastguard Worker * @param[in] i4_src_strd
875*495ae853SAndroid Build Coastguard Worker *  source stride
876*495ae853SAndroid Build Coastguard Worker *
877*495ae853SAndroid Build Coastguard Worker * @param[in] i4_est_strd
878*495ae853SAndroid Build Coastguard Worker *  est buffer stride
879*495ae853SAndroid Build Coastguard Worker *
880*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_thrsh
881*495ae853SAndroid Build Coastguard Worker *  Threshold for each element of transformed quantized block
882*495ae853SAndroid Build Coastguard Worker *
883*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_mb_distortion
884*495ae853SAndroid Build Coastguard Worker *  evaluated sad
885*495ae853SAndroid Build Coastguard Worker *
886*495ae853SAndroid Build Coastguard Worker * @param[out] pu4_is_zero
887*495ae853SAndroid Build Coastguard Worker *  Pointer to store if the block is zero after transform and quantization
888*495ae853SAndroid Build Coastguard Worker *
889*495ae853SAndroid Build Coastguard Worker * @remarks
890*495ae853SAndroid Build Coastguard Worker *
891*495ae853SAndroid Build Coastguard Worker ******************************************************************************
892*495ae853SAndroid Build Coastguard Worker */
ime_compute_satqd_16x16_lumainter(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 i4_src_strd,WORD32 i4_est_strd,UWORD16 * pu2_thrsh,WORD32 * pi4_mb_distortion,UWORD32 * pu4_is_non_zero)893*495ae853SAndroid Build Coastguard Worker void ime_compute_satqd_16x16_lumainter(UWORD8 *pu1_src,
894*495ae853SAndroid Build Coastguard Worker                                        UWORD8 *pu1_est,
895*495ae853SAndroid Build Coastguard Worker                                        WORD32 i4_src_strd,
896*495ae853SAndroid Build Coastguard Worker                                        WORD32 i4_est_strd,
897*495ae853SAndroid Build Coastguard Worker                                        UWORD16 *pu2_thrsh,
898*495ae853SAndroid Build Coastguard Worker                                        WORD32 *pi4_mb_distortion,
899*495ae853SAndroid Build Coastguard Worker                                        UWORD32 *pu4_is_non_zero)
900*495ae853SAndroid Build Coastguard Worker {
901*495ae853SAndroid Build Coastguard Worker     WORD32 i, j;
902*495ae853SAndroid Build Coastguard Worker     WORD16 s1, s2, s3, s4;
903*495ae853SAndroid Build Coastguard Worker     WORD16 sad_1, sad_2;
904*495ae853SAndroid Build Coastguard Worker     WORD16 ls1, ls2, ls3, ls4, ls5, ls6, ls7, ls8;
905*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_lp, *pu1_est_lp;
906*495ae853SAndroid Build Coastguard Worker     UWORD32 sad = 0;
907*495ae853SAndroid Build Coastguard Worker 
908*495ae853SAndroid Build Coastguard Worker     (*pi4_mb_distortion) = 0;
909*495ae853SAndroid Build Coastguard Worker 
910*495ae853SAndroid Build Coastguard Worker     for (i = 0; i < 4; i++)
911*495ae853SAndroid Build Coastguard Worker     {
912*495ae853SAndroid Build Coastguard Worker         for (j = 0; j < 4; j++)
913*495ae853SAndroid Build Coastguard Worker         {
914*495ae853SAndroid Build Coastguard Worker             pu1_src_lp = pu1_src + 4 * j;
915*495ae853SAndroid Build Coastguard Worker             pu1_est_lp = pu1_est + 4 * j;
916*495ae853SAndroid Build Coastguard Worker 
917*495ae853SAndroid Build Coastguard Worker             s1 = ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[3] - (WORD16)pu1_est_lp[3]);
918*495ae853SAndroid Build Coastguard Worker             s4 = ABS((WORD16)pu1_src_lp[1] - (WORD16)pu1_est_lp[1]) + ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]);
919*495ae853SAndroid Build Coastguard Worker 
920*495ae853SAndroid Build Coastguard Worker             pu1_src_lp += i4_src_strd;
921*495ae853SAndroid Build Coastguard Worker             pu1_est_lp += i4_est_strd;
922*495ae853SAndroid Build Coastguard Worker 
923*495ae853SAndroid Build Coastguard Worker             s2 = ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[3] - (WORD16)pu1_est_lp[3]);
924*495ae853SAndroid Build Coastguard Worker             s3 = ABS((WORD16)pu1_src_lp[1] - (WORD16)pu1_est_lp[1]) + ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]);
925*495ae853SAndroid Build Coastguard Worker 
926*495ae853SAndroid Build Coastguard Worker             pu1_src_lp += i4_src_strd;
927*495ae853SAndroid Build Coastguard Worker             pu1_est_lp += i4_est_strd;
928*495ae853SAndroid Build Coastguard Worker 
929*495ae853SAndroid Build Coastguard Worker             s2 += ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[3] - (WORD16)pu1_est_lp[3]);
930*495ae853SAndroid Build Coastguard Worker             s3 += ABS((WORD16)pu1_src_lp[1] - (WORD16)pu1_est_lp[1]) + ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]);
931*495ae853SAndroid Build Coastguard Worker 
932*495ae853SAndroid Build Coastguard Worker             pu1_src_lp += i4_src_strd;
933*495ae853SAndroid Build Coastguard Worker             pu1_est_lp += i4_est_strd;
934*495ae853SAndroid Build Coastguard Worker 
935*495ae853SAndroid Build Coastguard Worker             s1 += ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[3] - (WORD16)pu1_est_lp[3]);
936*495ae853SAndroid Build Coastguard Worker             s4 += ABS((WORD16)pu1_src_lp[1] - (WORD16)pu1_est_lp[1]) + ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]);
937*495ae853SAndroid Build Coastguard Worker 
938*495ae853SAndroid Build Coastguard Worker             sad_1 = s1 + s2 + s3 + s4;
939*495ae853SAndroid Build Coastguard Worker 
940*495ae853SAndroid Build Coastguard Worker             if (sad == 0)
941*495ae853SAndroid Build Coastguard Worker             {
942*495ae853SAndroid Build Coastguard Worker                 sad_2 = sad_1 << 1;
943*495ae853SAndroid Build Coastguard Worker 
944*495ae853SAndroid Build Coastguard Worker                 ls1 = sad_2 - (s2 + s3);
945*495ae853SAndroid Build Coastguard Worker                 ls2 = sad_2 - (s1 + s4);
946*495ae853SAndroid Build Coastguard Worker                 ls3 = sad_2 - (s3 + s4);
947*495ae853SAndroid Build Coastguard Worker                 ls4 = sad_2 - (s3 - (s1 << 1));
948*495ae853SAndroid Build Coastguard Worker                 ls5 = sad_2 - (s4 - (s2 << 1));
949*495ae853SAndroid Build Coastguard Worker                 ls6 = sad_2 - (s1 + s2);
950*495ae853SAndroid Build Coastguard Worker                 ls7 = sad_2 - (s2 - (s4 << 1));
951*495ae853SAndroid Build Coastguard Worker                 ls8 = sad_2 - (s1 - (s3 << 1));
952*495ae853SAndroid Build Coastguard Worker 
953*495ae853SAndroid Build Coastguard Worker                 if (pu2_thrsh[8] <= sad_1 ||
954*495ae853SAndroid Build Coastguard Worker                     pu2_thrsh[0] <= ls2 || pu2_thrsh[1] <= ls1 ||
955*495ae853SAndroid Build Coastguard Worker                     pu2_thrsh[2] <= ls8 || pu2_thrsh[3] <= ls5 ||
956*495ae853SAndroid Build Coastguard Worker                     pu2_thrsh[4] <= ls6 || pu2_thrsh[5] <= ls3 ||
957*495ae853SAndroid Build Coastguard Worker                     pu2_thrsh[6] <= ls7 || pu2_thrsh[7] <= ls4) {
958*495ae853SAndroid Build Coastguard Worker                   sad = 1;
959*495ae853SAndroid Build Coastguard Worker                 }
960*495ae853SAndroid Build Coastguard Worker             }
961*495ae853SAndroid Build Coastguard Worker             (*pi4_mb_distortion) += sad_1;
962*495ae853SAndroid Build Coastguard Worker         }
963*495ae853SAndroid Build Coastguard Worker         pu1_src +=  (i4_src_strd * 4);
964*495ae853SAndroid Build Coastguard Worker         pu1_est +=  (i4_est_strd * 4);
965*495ae853SAndroid Build Coastguard Worker     }
966*495ae853SAndroid Build Coastguard Worker     *pu4_is_non_zero = sad;
967*495ae853SAndroid Build Coastguard Worker }
968*495ae853SAndroid Build Coastguard Worker 
969*495ae853SAndroid Build Coastguard Worker /**
970*495ae853SAndroid Build Coastguard Worker ******************************************************************************
971*495ae853SAndroid Build Coastguard Worker *
972*495ae853SAndroid Build Coastguard Worker * @brief computes distortion (SAD and SAQTD) between 2 16x8 (interleaved) chroma
973*495ae853SAndroid Build Coastguard Worker *  blocks
974*495ae853SAndroid Build Coastguard Worker *
975*495ae853SAndroid Build Coastguard Worker * @par Description
976*495ae853SAndroid Build Coastguard Worker *  This functions computes SAD between2 16x8 chroma blocks(interleaved).  It
977*495ae853SAndroid Build Coastguard Worker *  also checks if the SATQD, Sum of absolute transformed quantized difference
978*495ae853SAndroid Build Coastguard Worker *  between the blocks. If SAQTD is zero, it gives back zero Other wise sad is
979*495ae853SAndroid Build Coastguard Worker *  returned. There is no provison for early exit. The transform done here is
980*495ae853SAndroid Build Coastguard Worker *  the transform for chroma blocks in H264
981*495ae853SAndroid Build Coastguard Worker *
982*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
983*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
984*495ae853SAndroid Build Coastguard Worker *
985*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_dst
986*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the destination
987*495ae853SAndroid Build Coastguard Worker *
988*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
989*495ae853SAndroid Build Coastguard Worker *  integer source stride
990*495ae853SAndroid Build Coastguard Worker *
991*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
992*495ae853SAndroid Build Coastguard Worker *  integer destination stride
993*495ae853SAndroid Build Coastguard Worker *
994*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_thrsh
995*495ae853SAndroid Build Coastguard Worker *  Threshold for each element of transofrmed quantized block
996*495ae853SAndroid Build Coastguard Worker *
997*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_mb_distortion
998*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
999*495ae853SAndroid Build Coastguard Worker *
1000*495ae853SAndroid Build Coastguard Worker * @remarks
1001*495ae853SAndroid Build Coastguard Worker *
1002*495ae853SAndroid Build Coastguard Worker ******************************************************************************
1003*495ae853SAndroid Build Coastguard Worker */
ime_compute_satqd_8x16_chroma(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 src_strd,WORD32 est_strd,WORD32 max_sad,UWORD16 * thrsh)1004*495ae853SAndroid Build Coastguard Worker void ime_compute_satqd_8x16_chroma(UWORD8 *pu1_src,
1005*495ae853SAndroid Build Coastguard Worker                                    UWORD8 *pu1_est,
1006*495ae853SAndroid Build Coastguard Worker                                    WORD32 src_strd,
1007*495ae853SAndroid Build Coastguard Worker                                    WORD32 est_strd,
1008*495ae853SAndroid Build Coastguard Worker                                    WORD32 max_sad,
1009*495ae853SAndroid Build Coastguard Worker                                    UWORD16 *thrsh)
1010*495ae853SAndroid Build Coastguard Worker {
1011*495ae853SAndroid Build Coastguard Worker     WORD32 i, j, plane;
1012*495ae853SAndroid Build Coastguard Worker     WORD16 s1, s2, s3, s4;
1013*495ae853SAndroid Build Coastguard Worker     WORD16 sad_1, sad_2;
1014*495ae853SAndroid Build Coastguard Worker     WORD16 ls1, ls2, ls3, ls4, ls5, ls6, ls7, ls8;
1015*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_lp, *pu1_est_lp, *pu1_src_plane, *pu1_est_plane;
1016*495ae853SAndroid Build Coastguard Worker     WORD32 sad = 0;
1017*495ae853SAndroid Build Coastguard Worker 
1018*495ae853SAndroid Build Coastguard Worker     UNUSED(max_sad);
1019*495ae853SAndroid Build Coastguard Worker     pu1_src_plane = pu1_src;
1020*495ae853SAndroid Build Coastguard Worker     pu1_est_plane = pu1_est;
1021*495ae853SAndroid Build Coastguard Worker 
1022*495ae853SAndroid Build Coastguard Worker     for (plane = 0; plane < 2; plane++)
1023*495ae853SAndroid Build Coastguard Worker     {
1024*495ae853SAndroid Build Coastguard Worker         for (i = 0; i < 4; i++)
1025*495ae853SAndroid Build Coastguard Worker         {
1026*495ae853SAndroid Build Coastguard Worker             for (j = 0; j < 4; j++)
1027*495ae853SAndroid Build Coastguard Worker             {
1028*495ae853SAndroid Build Coastguard Worker                 pu1_src_lp = pu1_src + 8 * j;
1029*495ae853SAndroid Build Coastguard Worker                 pu1_est_lp = pu1_est + 8 * j;
1030*495ae853SAndroid Build Coastguard Worker 
1031*495ae853SAndroid Build Coastguard Worker                 s1 = ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[6] - (WORD16)pu1_est_lp[6]);
1032*495ae853SAndroid Build Coastguard Worker                 s4 = ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]) + ABS((WORD16)pu1_src_lp[4] - (WORD16)pu1_est_lp[4]);
1033*495ae853SAndroid Build Coastguard Worker 
1034*495ae853SAndroid Build Coastguard Worker                 pu1_src_lp += src_strd;
1035*495ae853SAndroid Build Coastguard Worker                 pu1_est_lp += est_strd;
1036*495ae853SAndroid Build Coastguard Worker 
1037*495ae853SAndroid Build Coastguard Worker                 s2 = ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[6] - (WORD16)pu1_est_lp[6]);
1038*495ae853SAndroid Build Coastguard Worker                 s3 = ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]) + ABS((WORD16)pu1_src_lp[4] - (WORD16)pu1_est_lp[4]);
1039*495ae853SAndroid Build Coastguard Worker 
1040*495ae853SAndroid Build Coastguard Worker                 pu1_src_lp += src_strd;
1041*495ae853SAndroid Build Coastguard Worker                 pu1_est_lp += est_strd;
1042*495ae853SAndroid Build Coastguard Worker 
1043*495ae853SAndroid Build Coastguard Worker                 s2 += ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[6] - (WORD16)pu1_est_lp[6]);
1044*495ae853SAndroid Build Coastguard Worker                 s3 += ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]) + ABS((WORD16)pu1_src_lp[4] - (WORD16)pu1_est_lp[4]);
1045*495ae853SAndroid Build Coastguard Worker 
1046*495ae853SAndroid Build Coastguard Worker                 pu1_src_lp += src_strd;
1047*495ae853SAndroid Build Coastguard Worker                 pu1_est_lp += est_strd;
1048*495ae853SAndroid Build Coastguard Worker 
1049*495ae853SAndroid Build Coastguard Worker                 s1 += ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[6] - (WORD16)pu1_est_lp[6]);
1050*495ae853SAndroid Build Coastguard Worker                 s4 += ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]) + ABS((WORD16)pu1_src_lp[4] - (WORD16)pu1_est_lp[4]);
1051*495ae853SAndroid Build Coastguard Worker 
1052*495ae853SAndroid Build Coastguard Worker                 sad_1 = s1 + s2 + s3 + s4;
1053*495ae853SAndroid Build Coastguard Worker                 sad_2 = sad_1 << 1;
1054*495ae853SAndroid Build Coastguard Worker 
1055*495ae853SAndroid Build Coastguard Worker                 ls1 = sad_2 - (s2 + s3);
1056*495ae853SAndroid Build Coastguard Worker                 ls2 = sad_2 - (s1 + s4);
1057*495ae853SAndroid Build Coastguard Worker                 ls3 = sad_2 - (s3 + s4);
1058*495ae853SAndroid Build Coastguard Worker                 ls4 = sad_2 - (s3 - (s1 << 1));
1059*495ae853SAndroid Build Coastguard Worker                 ls5 = sad_2 - (s4 - (s2 << 1));
1060*495ae853SAndroid Build Coastguard Worker                 ls6 = sad_2 - (s1 + s2);
1061*495ae853SAndroid Build Coastguard Worker                 ls7 = sad_2 - (s2 - (s4 << 1));
1062*495ae853SAndroid Build Coastguard Worker                 ls8 = sad_2 - (s1 - (s3 << 1));
1063*495ae853SAndroid Build Coastguard Worker 
1064*495ae853SAndroid Build Coastguard Worker                 if (thrsh[1] > ls1 && thrsh[2] > sad_1 && thrsh[3] > ls2 &&
1065*495ae853SAndroid Build Coastguard Worker                     thrsh[4] > ls3 && thrsh[5] > ls4 && thrsh[6] > ls3 && thrsh[7] > ls5 &&
1066*495ae853SAndroid Build Coastguard Worker                     thrsh[8] > sad_1 && thrsh[9] > ls1 && thrsh[10] > sad_1 && thrsh[11] > ls2 &&
1067*495ae853SAndroid Build Coastguard Worker                     thrsh[12] > ls6 && thrsh[13] > ls7 && thrsh[14] > ls6 && thrsh[15] > ls8)
1068*495ae853SAndroid Build Coastguard Worker                 {
1069*495ae853SAndroid Build Coastguard Worker                     /*set current sad to be zero*/
1070*495ae853SAndroid Build Coastguard Worker                 }
1071*495ae853SAndroid Build Coastguard Worker                 else
1072*495ae853SAndroid Build Coastguard Worker                     return ;
1073*495ae853SAndroid Build Coastguard Worker 
1074*495ae853SAndroid Build Coastguard Worker                 sad += sad_1;
1075*495ae853SAndroid Build Coastguard Worker             }
1076*495ae853SAndroid Build Coastguard Worker             pu1_src +=  (src_strd *4);
1077*495ae853SAndroid Build Coastguard Worker             pu1_est +=  (est_strd *4);
1078*495ae853SAndroid Build Coastguard Worker         }
1079*495ae853SAndroid Build Coastguard Worker         if (sad < (thrsh[0] << 1))
1080*495ae853SAndroid Build Coastguard Worker             sad = 0;
1081*495ae853SAndroid Build Coastguard Worker         else
1082*495ae853SAndroid Build Coastguard Worker             return;
1083*495ae853SAndroid Build Coastguard Worker 
1084*495ae853SAndroid Build Coastguard Worker         pu1_src = pu1_src_plane + 1;
1085*495ae853SAndroid Build Coastguard Worker         pu1_est = pu1_est_plane + 1;
1086*495ae853SAndroid Build Coastguard Worker     }
1087*495ae853SAndroid Build Coastguard Worker     return ;
1088*495ae853SAndroid Build Coastguard Worker }
1089*495ae853SAndroid Build Coastguard Worker 
1090*495ae853SAndroid Build Coastguard Worker /**
1091*495ae853SAndroid Build Coastguard Worker ******************************************************************************
1092*495ae853SAndroid Build Coastguard Worker *
1093*495ae853SAndroid Build Coastguard Worker * @brief computes distortion (SAD and SAQTD) between 2 16x16 blocks
1094*495ae853SAndroid Build Coastguard Worker *
1095*495ae853SAndroid Build Coastguard Worker * @par   Description
1096*495ae853SAndroid Build Coastguard Worker *  This functions computes SAD between2 16x8 chroma blocks(interleaved).  It
1097*495ae853SAndroid Build Coastguard Worker *  also checks if the SATQD, Sum of absolute transformed quantized difference
1098*495ae853SAndroid Build Coastguard Worker *  between the blocks. If SAQTD is zero, it gives back zero Other wise sad is
1099*495ae853SAndroid Build Coastguard Worker *  returned. There is no provison for early exit. The transform done here is the
1100*495ae853SAndroid Build Coastguard Worker *  transform for intra 16x16 blocks in H264
1101*495ae853SAndroid Build Coastguard Worker *
1102*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
1103*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the source
1104*495ae853SAndroid Build Coastguard Worker *
1105*495ae853SAndroid Build Coastguard Worker * @param[out] pu1_dst
1106*495ae853SAndroid Build Coastguard Worker *  UWORD8 pointer to the destination
1107*495ae853SAndroid Build Coastguard Worker *
1108*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
1109*495ae853SAndroid Build Coastguard Worker *  integer source stride
1110*495ae853SAndroid Build Coastguard Worker *
1111*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
1112*495ae853SAndroid Build Coastguard Worker *  integer destination stride
1113*495ae853SAndroid Build Coastguard Worker *
1114*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_thrsh
1115*495ae853SAndroid Build Coastguard Worker *  Threshold for each element of transofrmed quantized block
1116*495ae853SAndroid Build Coastguard Worker *
1117*495ae853SAndroid Build Coastguard Worker * @param[out] pi4_mb_distortion
1118*495ae853SAndroid Build Coastguard Worker *  integer evaluated sad
1119*495ae853SAndroid Build Coastguard Worker *
1120*495ae853SAndroid Build Coastguard Worker * @remarks
1121*495ae853SAndroid Build Coastguard Worker *
1122*495ae853SAndroid Build Coastguard Worker ******************************************************************************
1123*495ae853SAndroid Build Coastguard Worker */
ime_compute_satqd_16x16_lumaintra(UWORD8 * pu1_src,UWORD8 * pu1_est,WORD32 src_strd,WORD32 est_strd,WORD32 max_sad,UWORD16 * thrsh,WORD32 * pi4_mb_distortion,UWORD8 * sig_nz_sad)1124*495ae853SAndroid Build Coastguard Worker void ime_compute_satqd_16x16_lumaintra(UWORD8 *pu1_src,
1125*495ae853SAndroid Build Coastguard Worker                                        UWORD8 *pu1_est,
1126*495ae853SAndroid Build Coastguard Worker                                        WORD32 src_strd,
1127*495ae853SAndroid Build Coastguard Worker                                        WORD32 est_strd,
1128*495ae853SAndroid Build Coastguard Worker                                        WORD32 max_sad,
1129*495ae853SAndroid Build Coastguard Worker                                        UWORD16 *thrsh,
1130*495ae853SAndroid Build Coastguard Worker                                        WORD32 *pi4_mb_distortion,
1131*495ae853SAndroid Build Coastguard Worker                                        UWORD8 *sig_nz_sad)
1132*495ae853SAndroid Build Coastguard Worker {
1133*495ae853SAndroid Build Coastguard Worker     UWORD32 i, j;
1134*495ae853SAndroid Build Coastguard Worker     WORD16 s1[4], s2[4], s3[4], s4[4], sad[4];
1135*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_src_lp, *pu1_est_lp;
1136*495ae853SAndroid Build Coastguard Worker     UWORD8 *sig_sad_dc;
1137*495ae853SAndroid Build Coastguard Worker     UWORD32 nz_sad_sig = 0;
1138*495ae853SAndroid Build Coastguard Worker 
1139*495ae853SAndroid Build Coastguard Worker     UNUSED(max_sad);
1140*495ae853SAndroid Build Coastguard Worker     *pi4_mb_distortion = 0;
1141*495ae853SAndroid Build Coastguard Worker     sig_sad_dc = sig_nz_sad;
1142*495ae853SAndroid Build Coastguard Worker     sig_nz_sad++;
1143*495ae853SAndroid Build Coastguard Worker 
1144*495ae853SAndroid Build Coastguard Worker     for (i = 0; i < 4; i++)
1145*495ae853SAndroid Build Coastguard Worker     {
1146*495ae853SAndroid Build Coastguard Worker         for (j = 0; j < 4; j++)
1147*495ae853SAndroid Build Coastguard Worker         {
1148*495ae853SAndroid Build Coastguard Worker             pu1_src_lp = pu1_src + 4 * j;
1149*495ae853SAndroid Build Coastguard Worker             pu1_est_lp = pu1_est + 4 * j;
1150*495ae853SAndroid Build Coastguard Worker 
1151*495ae853SAndroid Build Coastguard Worker             s1[j] = ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[3] - (WORD16)pu1_est_lp[3]);
1152*495ae853SAndroid Build Coastguard Worker             s4[j] = ABS((WORD16)pu1_src_lp[1] - (WORD16)pu1_est_lp[1]) + ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]);
1153*495ae853SAndroid Build Coastguard Worker 
1154*495ae853SAndroid Build Coastguard Worker             pu1_src_lp += src_strd;
1155*495ae853SAndroid Build Coastguard Worker             pu1_est_lp += est_strd;
1156*495ae853SAndroid Build Coastguard Worker 
1157*495ae853SAndroid Build Coastguard Worker             s2[j] = ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[3] - (WORD16)pu1_est_lp[3]);
1158*495ae853SAndroid Build Coastguard Worker             s3[j] = ABS((WORD16)pu1_src_lp[1] - (WORD16)pu1_est_lp[1]) + ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]);
1159*495ae853SAndroid Build Coastguard Worker 
1160*495ae853SAndroid Build Coastguard Worker             pu1_src_lp += src_strd;
1161*495ae853SAndroid Build Coastguard Worker             pu1_est_lp += est_strd;
1162*495ae853SAndroid Build Coastguard Worker 
1163*495ae853SAndroid Build Coastguard Worker             s2[j] += ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[3] - (WORD16)pu1_est_lp[3]);
1164*495ae853SAndroid Build Coastguard Worker             s3[j] += ABS((WORD16)pu1_src_lp[1] - (WORD16)pu1_est_lp[1]) + ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]);
1165*495ae853SAndroid Build Coastguard Worker 
1166*495ae853SAndroid Build Coastguard Worker             pu1_src_lp += src_strd;
1167*495ae853SAndroid Build Coastguard Worker             pu1_est_lp += est_strd;
1168*495ae853SAndroid Build Coastguard Worker 
1169*495ae853SAndroid Build Coastguard Worker             s1[j] += ABS((WORD16)pu1_src_lp[0] - (WORD16)pu1_est_lp[0]) + ABS((WORD16)pu1_src_lp[3] - (WORD16)pu1_est_lp[3]);
1170*495ae853SAndroid Build Coastguard Worker             s4[j] += ABS((WORD16)pu1_src_lp[1] - (WORD16)pu1_est_lp[1]) + ABS((WORD16)pu1_src_lp[2] - (WORD16)pu1_est_lp[2]);
1171*495ae853SAndroid Build Coastguard Worker 
1172*495ae853SAndroid Build Coastguard Worker             sad[j] = ((s1[j] + s2[j] + s3[j] + s4[j]) << 1);
1173*495ae853SAndroid Build Coastguard Worker         }
1174*495ae853SAndroid Build Coastguard Worker 
1175*495ae853SAndroid Build Coastguard Worker         for (j = 0; j < 4; j++)
1176*495ae853SAndroid Build Coastguard Worker         {
1177*495ae853SAndroid Build Coastguard Worker 
1178*495ae853SAndroid Build Coastguard Worker             if (thrsh[1] > (sad[j] - (s2[j] + s3[j])) && thrsh[2] > (sad[j] >> 1)
1179*495ae853SAndroid Build Coastguard Worker                 && thrsh[3] > (sad[j] - (s1[j] + s4[j])) &&
1180*495ae853SAndroid Build Coastguard Worker 
1181*495ae853SAndroid Build Coastguard Worker                 thrsh[4] > (sad[j] - (s3[j] + s4[j]))
1182*495ae853SAndroid Build Coastguard Worker                 && thrsh[5] > (sad[j] - (s3[j] - (s1[j] << 1)))
1183*495ae853SAndroid Build Coastguard Worker                 && thrsh[6] > (sad[j] - (s3[j] + s4[j]))
1184*495ae853SAndroid Build Coastguard Worker                 && thrsh[7] > (sad[j] - (s4[j] - (s2[j] << 1))) &&
1185*495ae853SAndroid Build Coastguard Worker 
1186*495ae853SAndroid Build Coastguard Worker                 thrsh[8] > (sad[j] >> 1)
1187*495ae853SAndroid Build Coastguard Worker                 && thrsh[9] > (sad[j] - (s2[j] + s3[j]))
1188*495ae853SAndroid Build Coastguard Worker                 && thrsh[10] > (sad[j] >> 1)
1189*495ae853SAndroid Build Coastguard Worker                 && thrsh[11] > (sad[j] - (s1[j] + s4[j])) &&
1190*495ae853SAndroid Build Coastguard Worker 
1191*495ae853SAndroid Build Coastguard Worker                 thrsh[12] > (sad[j] - (s1[j] + s2[j]))
1192*495ae853SAndroid Build Coastguard Worker                 && thrsh[13] > (sad[j] - (s2[j] - (s4[j] << 1)))
1193*495ae853SAndroid Build Coastguard Worker                 && thrsh[14] > (sad[j] - (s1[j] + s2[j]))
1194*495ae853SAndroid Build Coastguard Worker                 && thrsh[15] > (sad[j] - (s1[j] - (s3[j] << 1))))
1195*495ae853SAndroid Build Coastguard Worker             {
1196*495ae853SAndroid Build Coastguard Worker                 //sad[j] = 0;   /*set current sad to be zero*/
1197*495ae853SAndroid Build Coastguard Worker                 sig_nz_sad[j] = 0;/*Signal that the sad is zero*/
1198*495ae853SAndroid Build Coastguard Worker             }
1199*495ae853SAndroid Build Coastguard Worker             else
1200*495ae853SAndroid Build Coastguard Worker             {
1201*495ae853SAndroid Build Coastguard Worker                 sig_nz_sad[j] = 1;/*signal that sad is non zero*/
1202*495ae853SAndroid Build Coastguard Worker                 nz_sad_sig = 1;
1203*495ae853SAndroid Build Coastguard Worker             }
1204*495ae853SAndroid Build Coastguard Worker 
1205*495ae853SAndroid Build Coastguard Worker             (*pi4_mb_distortion) += (sad[j] >> 1);
1206*495ae853SAndroid Build Coastguard Worker             //if ((*pi4_mb_distortion) >= max_sad)return; /*return or some thing*/
1207*495ae853SAndroid Build Coastguard Worker         }
1208*495ae853SAndroid Build Coastguard Worker 
1209*495ae853SAndroid Build Coastguard Worker         sig_nz_sad += 4;
1210*495ae853SAndroid Build Coastguard Worker         pu1_src += (src_strd * 4);
1211*495ae853SAndroid Build Coastguard Worker         pu1_est += (est_strd * 4);
1212*495ae853SAndroid Build Coastguard Worker     }
1213*495ae853SAndroid Build Coastguard Worker 
1214*495ae853SAndroid Build Coastguard Worker     if ((*pi4_mb_distortion) < thrsh[0] << 2)
1215*495ae853SAndroid Build Coastguard Worker     {
1216*495ae853SAndroid Build Coastguard Worker         *sig_sad_dc = 0;
1217*495ae853SAndroid Build Coastguard Worker         if (nz_sad_sig == 0)
1218*495ae853SAndroid Build Coastguard Worker             (*pi4_mb_distortion) = 0;
1219*495ae853SAndroid Build Coastguard Worker     }
1220*495ae853SAndroid Build Coastguard Worker     else
1221*495ae853SAndroid Build Coastguard Worker     {
1222*495ae853SAndroid Build Coastguard Worker         *sig_sad_dc = 1;
1223*495ae853SAndroid Build Coastguard Worker     }
1224*495ae853SAndroid Build Coastguard Worker }
1225*495ae853SAndroid Build Coastguard Worker 
1226*495ae853SAndroid Build Coastguard Worker 
1227