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 }