xref: /aosp_15_r20/external/libopenapv/src/oapv_sad.c (revision abb65b4b03b69e1d508d4d9a44dcf199df16e7c3)
1*abb65b4bSAndroid Build Coastguard Worker /*
2*abb65b4bSAndroid Build Coastguard Worker  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3*abb65b4bSAndroid Build Coastguard Worker  * All Rights Reserved.
4*abb65b4bSAndroid Build Coastguard Worker  *
5*abb65b4bSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*abb65b4bSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions are met:
7*abb65b4bSAndroid Build Coastguard Worker  *
8*abb65b4bSAndroid Build Coastguard Worker  * - Redistributions of source code must retain the above copyright notice,
9*abb65b4bSAndroid Build Coastguard Worker  *   this list of conditions and the following disclaimer.
10*abb65b4bSAndroid Build Coastguard Worker  *
11*abb65b4bSAndroid Build Coastguard Worker  * - Redistributions in binary form must reproduce the above copyright notice,
12*abb65b4bSAndroid Build Coastguard Worker  *   this list of conditions and the following disclaimer in the documentation
13*abb65b4bSAndroid Build Coastguard Worker  *   and/or other materials provided with the distribution.
14*abb65b4bSAndroid Build Coastguard Worker  *
15*abb65b4bSAndroid Build Coastguard Worker  * - Neither the name of the copyright owner, nor the names of its contributors
16*abb65b4bSAndroid Build Coastguard Worker  *   may be used to endorse or promote products derived from this software
17*abb65b4bSAndroid Build Coastguard Worker  *   without specific prior written permission.
18*abb65b4bSAndroid Build Coastguard Worker  *
19*abb65b4bSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*abb65b4bSAndroid Build Coastguard Worker  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*abb65b4bSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*abb65b4bSAndroid Build Coastguard Worker  * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23*abb65b4bSAndroid Build Coastguard Worker  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*abb65b4bSAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*abb65b4bSAndroid Build Coastguard Worker  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*abb65b4bSAndroid Build Coastguard Worker  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*abb65b4bSAndroid Build Coastguard Worker  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*abb65b4bSAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*abb65b4bSAndroid Build Coastguard Worker  * POSSIBILITY OF SUCH DAMAGE.
30*abb65b4bSAndroid Build Coastguard Worker  */
31*abb65b4bSAndroid Build Coastguard Worker 
32*abb65b4bSAndroid Build Coastguard Worker #include "oapv_def.h"
33*abb65b4bSAndroid Build Coastguard Worker #include <math.h>
34*abb65b4bSAndroid Build Coastguard Worker 
35*abb65b4bSAndroid Build Coastguard Worker /* SAD for 16bit **************************************************************/
oapv_sad_16b(int w,int h,void * src1,void * src2,int s_src1,int s_src2,int bit_depth)36*abb65b4bSAndroid Build Coastguard Worker int oapv_sad_16b(int w, int h, void *src1, void *src2, int s_src1, int s_src2, int bit_depth)
37*abb65b4bSAndroid Build Coastguard Worker {
38*abb65b4bSAndroid Build Coastguard Worker     u16 *s1;
39*abb65b4bSAndroid Build Coastguard Worker     s16 *s2;
40*abb65b4bSAndroid Build Coastguard Worker     int  i, j, sad;
41*abb65b4bSAndroid Build Coastguard Worker 
42*abb65b4bSAndroid Build Coastguard Worker     s1 = (u16 *)src1;
43*abb65b4bSAndroid Build Coastguard Worker     s2 = (s16 *)src2;
44*abb65b4bSAndroid Build Coastguard Worker 
45*abb65b4bSAndroid Build Coastguard Worker     sad = 0;
46*abb65b4bSAndroid Build Coastguard Worker 
47*abb65b4bSAndroid Build Coastguard Worker     for(i = 0; i < h; i++) {
48*abb65b4bSAndroid Build Coastguard Worker         for(j = 0; j < w; j++) {
49*abb65b4bSAndroid Build Coastguard Worker             sad += oapv_abs16((s16)s1[j] - (s16)s2[j]);
50*abb65b4bSAndroid Build Coastguard Worker         }
51*abb65b4bSAndroid Build Coastguard Worker         s1 += s_src1;
52*abb65b4bSAndroid Build Coastguard Worker         s2 += s_src2;
53*abb65b4bSAndroid Build Coastguard Worker     }
54*abb65b4bSAndroid Build Coastguard Worker 
55*abb65b4bSAndroid Build Coastguard Worker     return (sad >> (bit_depth - 8));
56*abb65b4bSAndroid Build Coastguard Worker }
57*abb65b4bSAndroid Build Coastguard Worker 
58*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_sad_t oapv_tbl_fn_sad_16b[2] = {
59*abb65b4bSAndroid Build Coastguard Worker     oapv_sad_16b,
60*abb65b4bSAndroid Build Coastguard Worker     NULL
61*abb65b4bSAndroid Build Coastguard Worker };
62*abb65b4bSAndroid Build Coastguard Worker 
63*abb65b4bSAndroid Build Coastguard Worker /* DIFF **********************************************************************/
oapv_diff_16b(int w,int h,void * src1,void * src2,int s_src1,int s_src2,int s_diff,s16 * diff,int bit_depth)64*abb65b4bSAndroid Build Coastguard Worker void oapv_diff_16b(int w, int h, void *src1, void *src2, int s_src1, int s_src2, int s_diff, s16 *diff, int bit_depth)
65*abb65b4bSAndroid Build Coastguard Worker {
66*abb65b4bSAndroid Build Coastguard Worker     s16 *s1;
67*abb65b4bSAndroid Build Coastguard Worker     s16 *s2;
68*abb65b4bSAndroid Build Coastguard Worker     int  i, j;
69*abb65b4bSAndroid Build Coastguard Worker 
70*abb65b4bSAndroid Build Coastguard Worker     s1 = (s16 *)src1;
71*abb65b4bSAndroid Build Coastguard Worker     s2 = (s16 *)src2;
72*abb65b4bSAndroid Build Coastguard Worker 
73*abb65b4bSAndroid Build Coastguard Worker     for(i = 0; i < h; i++) {
74*abb65b4bSAndroid Build Coastguard Worker         for(j = 0; j < w; j++) {
75*abb65b4bSAndroid Build Coastguard Worker             diff[j] = (s16)s1[j] - (s16)s2[j];
76*abb65b4bSAndroid Build Coastguard Worker         }
77*abb65b4bSAndroid Build Coastguard Worker         diff += s_diff;
78*abb65b4bSAndroid Build Coastguard Worker         s1 += s_src1;
79*abb65b4bSAndroid Build Coastguard Worker         s2 += s_src2;
80*abb65b4bSAndroid Build Coastguard Worker     }
81*abb65b4bSAndroid Build Coastguard Worker }
82*abb65b4bSAndroid Build Coastguard Worker 
83*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_diff_t oapv_tbl_fn_diff_16b[2] = {
84*abb65b4bSAndroid Build Coastguard Worker     oapv_diff_16b,
85*abb65b4bSAndroid Build Coastguard Worker     NULL
86*abb65b4bSAndroid Build Coastguard Worker };
87*abb65b4bSAndroid Build Coastguard Worker 
88*abb65b4bSAndroid Build Coastguard Worker /* SSD ***********************************************************************/
oapv_ssd_16b(int w,int h,void * src1,void * src2,int s_src1,int s_src2,int bit_depth)89*abb65b4bSAndroid Build Coastguard Worker s64 oapv_ssd_16b(int w, int h, void *src1, void *src2, int s_src1, int s_src2, int bit_depth)
90*abb65b4bSAndroid Build Coastguard Worker {
91*abb65b4bSAndroid Build Coastguard Worker     s16 *s1;
92*abb65b4bSAndroid Build Coastguard Worker     s16 *s2;
93*abb65b4bSAndroid Build Coastguard Worker     int  i, j, diff;
94*abb65b4bSAndroid Build Coastguard Worker     s64  ssd;
95*abb65b4bSAndroid Build Coastguard Worker 
96*abb65b4bSAndroid Build Coastguard Worker     s1 = (s16 *)src1;
97*abb65b4bSAndroid Build Coastguard Worker     s2 = (s16 *)src2;
98*abb65b4bSAndroid Build Coastguard Worker 
99*abb65b4bSAndroid Build Coastguard Worker     ssd = 0;
100*abb65b4bSAndroid Build Coastguard Worker 
101*abb65b4bSAndroid Build Coastguard Worker     for(i = 0; i < h; i++) {
102*abb65b4bSAndroid Build Coastguard Worker         for(j = 0; j < w; j++) {
103*abb65b4bSAndroid Build Coastguard Worker             diff = s1[j] - s2[j];
104*abb65b4bSAndroid Build Coastguard Worker             ssd += (diff * diff);
105*abb65b4bSAndroid Build Coastguard Worker         }
106*abb65b4bSAndroid Build Coastguard Worker         s1 += s_src1;
107*abb65b4bSAndroid Build Coastguard Worker         s2 += s_src2;
108*abb65b4bSAndroid Build Coastguard Worker     }
109*abb65b4bSAndroid Build Coastguard Worker     return ssd;
110*abb65b4bSAndroid Build Coastguard Worker }
111*abb65b4bSAndroid Build Coastguard Worker 
112*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_ssd_t oapv_tbl_fn_ssd_16b[2] = {
113*abb65b4bSAndroid Build Coastguard Worker     oapv_ssd_16b,
114*abb65b4bSAndroid Build Coastguard Worker     NULL
115*abb65b4bSAndroid Build Coastguard Worker };
116*abb65b4bSAndroid Build Coastguard Worker 
oapv_dc_removed_had8x8(pel * org,int s_org)117*abb65b4bSAndroid Build Coastguard Worker int oapv_dc_removed_had8x8(pel *org, int s_org)
118*abb65b4bSAndroid Build Coastguard Worker {
119*abb65b4bSAndroid Build Coastguard Worker     int  k, i, j, jj;
120*abb65b4bSAndroid Build Coastguard Worker     int  satd = 0;
121*abb65b4bSAndroid Build Coastguard Worker     int  sub[64], interm1[8][8], interm2[8][8], interm3[8][8];
122*abb65b4bSAndroid Build Coastguard Worker     pel *orgn = org;
123*abb65b4bSAndroid Build Coastguard Worker 
124*abb65b4bSAndroid Build Coastguard Worker     for(k = 0; k < 64; k += 8) {
125*abb65b4bSAndroid Build Coastguard Worker         sub[k + 0] = orgn[0];
126*abb65b4bSAndroid Build Coastguard Worker         sub[k + 1] = orgn[1];
127*abb65b4bSAndroid Build Coastguard Worker         sub[k + 2] = orgn[2];
128*abb65b4bSAndroid Build Coastguard Worker         sub[k + 3] = orgn[3];
129*abb65b4bSAndroid Build Coastguard Worker         sub[k + 4] = orgn[4];
130*abb65b4bSAndroid Build Coastguard Worker         sub[k + 5] = orgn[5];
131*abb65b4bSAndroid Build Coastguard Worker         sub[k + 6] = orgn[6];
132*abb65b4bSAndroid Build Coastguard Worker         sub[k + 7] = orgn[7];
133*abb65b4bSAndroid Build Coastguard Worker         orgn += s_org;
134*abb65b4bSAndroid Build Coastguard Worker     }
135*abb65b4bSAndroid Build Coastguard Worker 
136*abb65b4bSAndroid Build Coastguard Worker     /* horizontal */
137*abb65b4bSAndroid Build Coastguard Worker     for(j = 0; j < 8; j++) {
138*abb65b4bSAndroid Build Coastguard Worker         jj = j << 3;
139*abb65b4bSAndroid Build Coastguard Worker         interm2[j][0] = sub[jj] + sub[jj + 4];
140*abb65b4bSAndroid Build Coastguard Worker         interm2[j][1] = sub[jj + 1] + sub[jj + 5];
141*abb65b4bSAndroid Build Coastguard Worker         interm2[j][2] = sub[jj + 2] + sub[jj + 6];
142*abb65b4bSAndroid Build Coastguard Worker         interm2[j][3] = sub[jj + 3] + sub[jj + 7];
143*abb65b4bSAndroid Build Coastguard Worker         interm2[j][4] = sub[jj] - sub[jj + 4];
144*abb65b4bSAndroid Build Coastguard Worker         interm2[j][5] = sub[jj + 1] - sub[jj + 5];
145*abb65b4bSAndroid Build Coastguard Worker         interm2[j][6] = sub[jj + 2] - sub[jj + 6];
146*abb65b4bSAndroid Build Coastguard Worker         interm2[j][7] = sub[jj + 3] - sub[jj + 7];
147*abb65b4bSAndroid Build Coastguard Worker 
148*abb65b4bSAndroid Build Coastguard Worker         interm1[j][0] = interm2[j][0] + interm2[j][2];
149*abb65b4bSAndroid Build Coastguard Worker         interm1[j][1] = interm2[j][1] + interm2[j][3];
150*abb65b4bSAndroid Build Coastguard Worker         interm1[j][2] = interm2[j][0] - interm2[j][2];
151*abb65b4bSAndroid Build Coastguard Worker         interm1[j][3] = interm2[j][1] - interm2[j][3];
152*abb65b4bSAndroid Build Coastguard Worker         interm1[j][4] = interm2[j][4] + interm2[j][6];
153*abb65b4bSAndroid Build Coastguard Worker         interm1[j][5] = interm2[j][5] + interm2[j][7];
154*abb65b4bSAndroid Build Coastguard Worker         interm1[j][6] = interm2[j][4] - interm2[j][6];
155*abb65b4bSAndroid Build Coastguard Worker         interm1[j][7] = interm2[j][5] - interm2[j][7];
156*abb65b4bSAndroid Build Coastguard Worker 
157*abb65b4bSAndroid Build Coastguard Worker         interm2[j][0] = interm1[j][0] + interm1[j][1];
158*abb65b4bSAndroid Build Coastguard Worker         interm2[j][1] = interm1[j][0] - interm1[j][1];
159*abb65b4bSAndroid Build Coastguard Worker         interm2[j][2] = interm1[j][2] + interm1[j][3];
160*abb65b4bSAndroid Build Coastguard Worker         interm2[j][3] = interm1[j][2] - interm1[j][3];
161*abb65b4bSAndroid Build Coastguard Worker         interm2[j][4] = interm1[j][4] + interm1[j][5];
162*abb65b4bSAndroid Build Coastguard Worker         interm2[j][5] = interm1[j][4] - interm1[j][5];
163*abb65b4bSAndroid Build Coastguard Worker         interm2[j][6] = interm1[j][6] + interm1[j][7];
164*abb65b4bSAndroid Build Coastguard Worker         interm2[j][7] = interm1[j][6] - interm1[j][7];
165*abb65b4bSAndroid Build Coastguard Worker     }
166*abb65b4bSAndroid Build Coastguard Worker 
167*abb65b4bSAndroid Build Coastguard Worker     /* vertical */
168*abb65b4bSAndroid Build Coastguard Worker     for(i = 0; i < 8; i++) {
169*abb65b4bSAndroid Build Coastguard Worker         interm3[0][i] = interm2[0][i] + interm2[4][i];
170*abb65b4bSAndroid Build Coastguard Worker         interm3[1][i] = interm2[1][i] + interm2[5][i];
171*abb65b4bSAndroid Build Coastguard Worker         interm3[2][i] = interm2[2][i] + interm2[6][i];
172*abb65b4bSAndroid Build Coastguard Worker         interm3[3][i] = interm2[3][i] + interm2[7][i];
173*abb65b4bSAndroid Build Coastguard Worker         interm3[4][i] = interm2[0][i] - interm2[4][i];
174*abb65b4bSAndroid Build Coastguard Worker         interm3[5][i] = interm2[1][i] - interm2[5][i];
175*abb65b4bSAndroid Build Coastguard Worker         interm3[6][i] = interm2[2][i] - interm2[6][i];
176*abb65b4bSAndroid Build Coastguard Worker         interm3[7][i] = interm2[3][i] - interm2[7][i];
177*abb65b4bSAndroid Build Coastguard Worker 
178*abb65b4bSAndroid Build Coastguard Worker         interm1[0][i] = interm3[0][i] + interm3[2][i];
179*abb65b4bSAndroid Build Coastguard Worker         interm1[1][i] = interm3[1][i] + interm3[3][i];
180*abb65b4bSAndroid Build Coastguard Worker         interm1[2][i] = interm3[0][i] - interm3[2][i];
181*abb65b4bSAndroid Build Coastguard Worker         interm1[3][i] = interm3[1][i] - interm3[3][i];
182*abb65b4bSAndroid Build Coastguard Worker         interm1[4][i] = interm3[4][i] + interm3[6][i];
183*abb65b4bSAndroid Build Coastguard Worker         interm1[5][i] = interm3[5][i] + interm3[7][i];
184*abb65b4bSAndroid Build Coastguard Worker         interm1[6][i] = interm3[4][i] - interm3[6][i];
185*abb65b4bSAndroid Build Coastguard Worker         interm1[7][i] = interm3[5][i] - interm3[7][i];
186*abb65b4bSAndroid Build Coastguard Worker 
187*abb65b4bSAndroid Build Coastguard Worker         interm2[0][i] = oapv_abs(interm1[0][i] + interm1[1][i]);
188*abb65b4bSAndroid Build Coastguard Worker         interm2[1][i] = oapv_abs(interm1[0][i] - interm1[1][i]);
189*abb65b4bSAndroid Build Coastguard Worker         interm2[2][i] = oapv_abs(interm1[2][i] + interm1[3][i]);
190*abb65b4bSAndroid Build Coastguard Worker         interm2[3][i] = oapv_abs(interm1[2][i] - interm1[3][i]);
191*abb65b4bSAndroid Build Coastguard Worker         interm2[4][i] = oapv_abs(interm1[4][i] + interm1[5][i]);
192*abb65b4bSAndroid Build Coastguard Worker         interm2[5][i] = oapv_abs(interm1[4][i] - interm1[5][i]);
193*abb65b4bSAndroid Build Coastguard Worker         interm2[6][i] = oapv_abs(interm1[6][i] + interm1[7][i]);
194*abb65b4bSAndroid Build Coastguard Worker         interm2[7][i] = oapv_abs(interm1[6][i] - interm1[7][i]);
195*abb65b4bSAndroid Build Coastguard Worker     }
196*abb65b4bSAndroid Build Coastguard Worker 
197*abb65b4bSAndroid Build Coastguard Worker     satd = 0;
198*abb65b4bSAndroid Build Coastguard Worker     for(j = 1; j < 8; j++) {
199*abb65b4bSAndroid Build Coastguard Worker         satd += interm2[0][j];
200*abb65b4bSAndroid Build Coastguard Worker     }
201*abb65b4bSAndroid Build Coastguard Worker     for(i = 1; i < 8; i++) {
202*abb65b4bSAndroid Build Coastguard Worker         for(j = 0; j < 8; j++) {
203*abb65b4bSAndroid Build Coastguard Worker             satd += interm2[i][j];
204*abb65b4bSAndroid Build Coastguard Worker         }
205*abb65b4bSAndroid Build Coastguard Worker     }
206*abb65b4bSAndroid Build Coastguard Worker 
207*abb65b4bSAndroid Build Coastguard Worker     satd = ((satd + 2) >> 2);
208*abb65b4bSAndroid Build Coastguard Worker 
209*abb65b4bSAndroid Build Coastguard Worker     return satd;
210*abb65b4bSAndroid Build Coastguard Worker }