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