2 #include <liboil/liboilfunction.h>
3 #include <liboil/liboiltest.h>
4 #include <liboil/liboilrandom.h>
8 wavelet_test (OilTest *test)
10 int16_t *data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC1);
13 for(i=0;i<test->n;i++){
14 data[i] = oil_rand_u8();
19 rshift_test (OilTest *test)
24 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC1);
25 for(i=0;i<test->n;i++){
26 data[i] = oil_rand_s16()>>1;
29 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC2);
35 lshift_test (OilTest *test)
39 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC2);
44 combine2_test (OilTest *test)
48 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC3);
56 combine4_test (OilTest *test)
60 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC5);
70 add2_test (OilTest *test)
75 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC1);
76 for(i=0;i<test->n;i++){
77 data[i] = oil_rand_s16()>>4;
80 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC2);
81 for(i=0;i<test->n;i++){
82 data[i] = oil_rand_s16()>>4;
85 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC3);
86 for(i=0;i<test->n;i++){
87 data[i] = oil_rand_s16()>>4;
90 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC4);
95 OIL_DEFINE_CLASS_FULL (deinterleave,
96 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
97 OIL_DEFINE_CLASS (deinterleave2_s16,
98 "int16_t *d1_n, int16_t *d2_n, int16_t *s_2xn, int n");
99 OIL_DEFINE_CLASS_FULL (interleave,
100 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
101 OIL_DEFINE_CLASS (interleave2_s16,
102 "int16_t *d_2xn, int16_t *s1_n, int16_t *s2_n, int n");
103 OIL_DEFINE_CLASS_FULL (synth_daub97,
104 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
105 OIL_DEFINE_CLASS_FULL (split_daub97,
106 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
107 OIL_DEFINE_CLASS_FULL (split_approx97,
108 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
109 OIL_DEFINE_CLASS_FULL (synth_approx97,
110 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
111 OIL_DEFINE_CLASS_FULL (split_53,
112 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
113 OIL_DEFINE_CLASS_FULL (synth_53,
114 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
115 OIL_DEFINE_CLASS_FULL (split_135,
116 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
117 OIL_DEFINE_CLASS_FULL (synth_135,
118 "int16_t *d_2xn, int16_t *s_2xn, int n", wavelet_test);
119 OIL_DEFINE_CLASS_FULL (add_const_rshift_s16,
120 "int16_t *d1, int16_t *s1, int16_t *s2_2, int n", rshift_test);
121 OIL_DEFINE_CLASS_FULL (lshift_s16,
122 "int16_t *d1, int16_t *s1, int16_t *s2_1, int n", lshift_test);
123 OIL_DEFINE_CLASS (multiply_and_add_s16,
124 "int16_t *d, int16_t *src1, int16_t *src2, int16_t *src3, int n");
125 OIL_DEFINE_CLASS (multiply_and_add_s16_u8,
126 "int16_t *d, int16_t *src1, int16_t *src2, uint8_t *src3, int n");
127 OIL_DEFINE_CLASS (multiply_and_acc_6xn_s16_u8, "int16_t *i1_6xn, int is1, "
128 "int16_t *s1_6xn, int ss1, uint8_t *s2_6xn, int ss2, int n");
129 OIL_DEFINE_CLASS (multiply_and_acc_8xn_s16_u8, "int16_t *i1_8xn, int is1, "
130 "int16_t *s1_8xn, int ss1, uint8_t *s2_8xn, int ss2, int n");
131 OIL_DEFINE_CLASS (multiply_and_acc_12xn_s16_u8, "int16_t *i1_12xn, int is1, "
132 "int16_t *s1_12xn, int ss1, uint8_t *s2_12xn, int ss2, int n");
133 OIL_DEFINE_CLASS (multiply_and_acc_16xn_s16_u8, "int16_t *i1_16xn, int is1, "
134 "int16_t *s1_16xn, int ss1, uint8_t *s2_16xn, int ss2, int n");
135 OIL_DEFINE_CLASS (multiply_and_acc_24xn_s16_u8, "int16_t *i1_24xn, int is1, "
136 "int16_t *s1_24xn, int ss1, uint8_t *s2_24xn, int ss2, int n");
137 OIL_DEFINE_CLASS_FULL (combine2_8xn_u8, "uint8_t *d_8xn, int ds1, "
138 "uint8_t *s1_8xn, int ss1, uint8_t *s2_8xn, int ss2, int16_t *s3_4, int n", combine2_test);
139 OIL_DEFINE_CLASS_FULL (combine2_12xn_u8, "uint8_t *d_12xn, int ds1, "
140 "uint8_t *s1_12xn, int ss1, uint8_t *s2_12xn, int ss2, int16_t *s3_4, int n", combine2_test);
141 OIL_DEFINE_CLASS_FULL (combine2_16xn_u8, "uint8_t *d_16xn, int ds1, "
142 "uint8_t *s1_16xn, int ss1, uint8_t *s2_16xn, int ss2, int16_t *s3_4, int n", combine2_test);
143 OIL_DEFINE_CLASS_FULL (combine4_8xn_u8, "uint8_t *d_8xn, int ds1, "
144 "uint8_t *s1_8xn, int ss1, uint8_t *s2_8xn, int ss2, uint8_t *s3_8xn, "
145 "int ss3, uint8_t *s4_8xn, int ss4, int16_t *s5_6, int n", combine4_test);
146 OIL_DEFINE_CLASS_FULL (combine4_12xn_u8, "uint8_t *d_12xn, int ds1, "
147 "uint8_t *s1_12xn, int ss1, uint8_t *s2_12xn, int ss2, uint8_t *s3_12xn, "
148 "int ss3, uint8_t *s4_12xn, int ss4, int16_t *s5_6, int n", combine4_test);
149 OIL_DEFINE_CLASS_FULL (combine4_16xn_u8, "uint8_t *d_16xn, int ds1, "
150 "uint8_t *s1_16xn, int ss1, uint8_t *s2_16xn, int ss2, uint8_t *s3_16xn, "
151 "int ss3, uint8_t *s4_16xn, int ss4, int16_t *s5_6, int n", combine4_test);
152 OIL_DEFINE_CLASS_FULL (combine4_32xn_u8, "uint8_t *d_32xn, int ds1, "
153 "uint8_t *s1_16xn, int ss1, uint8_t *s2_32xn, int ss2, uint8_t *s3_32xn, "
154 "int ss3, uint8_t *s4_32xn, int ss4, int16_t *s5_6, int n", combine4_test);
155 OIL_DEFINE_CLASS_FULL (add2_rshift_add_s16, "int16_t *d, int16_t *s1, "
156 "int16_t *s2, int16_t *s3, int16_t *s4_2, int n", add2_test);
157 OIL_DEFINE_CLASS_FULL (add2_rshift_sub_s16, "int16_t *d, int16_t *s1, "
158 "int16_t *s2, int16_t *s3, int16_t *s4_2, int n", add2_test);
159 OIL_DEFINE_CLASS (avg2_8xn_u8, "uint8_t *d_8xn, int ds1, "
160 "uint8_t *s1_8xn, int ss1, uint8_t *s2_8xn, int ss2, int n");
161 OIL_DEFINE_CLASS (avg2_12xn_u8, "uint8_t *d_12xn, int ds1, "
162 "uint8_t *s1_12xn, int ss1, uint8_t *s2_12xn, int ss2, int n");
163 OIL_DEFINE_CLASS (avg2_16xn_u8, "uint8_t *d_16xn, int ds1, "
164 "uint8_t *s1_16xn, int ss1, uint8_t *s2_16xn, int ss2, int n");
165 OIL_DEFINE_CLASS (avg2_32xn_u8, "uint8_t *d_32xn, int ds1, "
166 "uint8_t *s1_32xn, int ss1, uint8_t *s2_32xn, int ss2, int n");
169 deinterleave_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
174 d_2xn[i] = s_2xn[2*i];
175 d_2xn[n + i] = s_2xn[2*i + 1];
178 OIL_DEFINE_IMPL_REF (deinterleave_ref, deinterleave);
181 deinterleave2_s16_ref (int16_t *d1_n, int16_t *d2_n, int16_t *s_2xn, int n)
186 d1_n[i] = s_2xn[2*i];
187 d2_n[i] = s_2xn[2*i + 1];
190 OIL_DEFINE_IMPL_REF (deinterleave2_s16_ref, deinterleave2_s16);
193 interleave_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
198 d_2xn[2*i] = s_2xn[i];
199 d_2xn[2*i + 1] = s_2xn[n + i];
202 OIL_DEFINE_IMPL_REF (interleave_ref, interleave);
205 interleave2_s16_ref (int16_t *d_2xn, int16_t *s1_n, int16_t *s2_n, int n)
210 d_2xn[2*i] = s1_n[i];
211 d_2xn[2*i + 1] = s2_n[i];
214 OIL_DEFINE_IMPL_REF (interleave2_s16_ref, interleave2_s16);
217 synth_daub97_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
223 d_2xn[0] = s_2xn[0] - ((1817 * s_2xn[1]) >> 11);
225 d_2xn[i] = s_2xn[i] - ((1817 * (s_2xn[i-1] + s_2xn[i+1])) >> 12);
227 for(i=1;i<n*2-2;i+=2){
228 d_2xn[i] = s_2xn[i] - ((3616 * (d_2xn[i-1] + d_2xn[i+1])) >> 12);
230 d_2xn[n*2-1] = s_2xn[n*2-1] - ((3616 * d_2xn[n*2-2]) >> 11);
233 d_2xn[0] += (217 * d_2xn[1]) >> 11;
235 d_2xn[i] += (217 * (d_2xn[i-1] + d_2xn[i+1])) >> 12;
237 for(i=1;i<n*2-2;i+=2){
238 d_2xn[i] += (6497 * (d_2xn[i-1] + d_2xn[i+1])) >> 12;
240 d_2xn[n*2-1] += (6497 * d_2xn[n*2-2]) >> 11;
242 OIL_DEFINE_IMPL_REF (synth_daub97_ref, synth_daub97);
245 split_daub97_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
251 for(i=1;i<n*2-2;i+=2){
252 d_2xn[i] = s_2xn[i] - ((6497 * (s_2xn[i-1] + s_2xn[i+1])) >> 12);
254 d_2xn[n*2-1] = s_2xn[n*2-1] - ((6497 * s_2xn[n*2-2]) >> 11);
255 d_2xn[0] = s_2xn[0] - ((217 * d_2xn[1]) >> 11);
257 d_2xn[i] = s_2xn[i] - ((217 * (d_2xn[i-1] + d_2xn[i+1])) >> 12);
261 for(i=1;i<n*2-2;i+=2){
262 d_2xn[i] += (3616 * (d_2xn[i-1] + d_2xn[i+1])) >> 12;
264 d_2xn[n*2-1] += (3616 * d_2xn[n*2-2]) >> 11;
265 d_2xn[0] += (1817 * d_2xn[1]) >> 11;
267 d_2xn[i] += (1817 * (d_2xn[i-1] + d_2xn[i+1])) >> 12;
270 OIL_DEFINE_IMPL_REF (split_daub97_ref, split_daub97);
274 split_approx97_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
280 d_2xn[1] = s_2xn[1] - s_2xn[0];
281 d_2xn[0] = s_2xn[0] + (d_2xn[1] >> 1);
284 d_2xn[1] = s_2xn[1] - ((9*(s_2xn[0] + s_2xn[2]) - (s_2xn[2] + s_2xn[2])) >> 4);
285 d_2xn[3] = s_2xn[3] - ((9*s_2xn[2] - s_2xn[0]) >> 3);
288 d_2xn[0] = s_2xn[0] + (d_2xn[1] >> 1);
289 d_2xn[2] = s_2xn[2] + ((d_2xn[1] + d_2xn[3]) >> 2);
292 d_2xn[1] = s_2xn[1] - ((9*(s_2xn[0] + s_2xn[2]) - (s_2xn[2] + s_2xn[4])) >> 4);
293 for(i=3;i<n*2-4;i+=2){
294 d_2xn[i] = s_2xn[i] - ((9*(s_2xn[i-1] + s_2xn[i+1]) - (s_2xn[i-3] + s_2xn[i+3])) >> 4);
296 d_2xn[n*2-3] = s_2xn[n*2-3] - ((9*(s_2xn[n*2-4] + s_2xn[n*2-2]) - (s_2xn[n*2-6] + s_2xn[n*2-2])) >> 4);
297 d_2xn[n*2-1] = s_2xn[n*2-1] - ((9*s_2xn[n*2-2] - s_2xn[n*2-4]) >> 3);
300 d_2xn[0] = s_2xn[0] + (d_2xn[1] >> 1);
302 d_2xn[i] = s_2xn[i] + ((d_2xn[i-1] + d_2xn[i+1]) >> 2);
307 OIL_DEFINE_IMPL_REF (split_approx97_ref, split_approx97);
310 synth_approx97_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
316 d_2xn[0] = s_2xn[0] - (s_2xn[1] >> 1);
317 d_2xn[1] = s_2xn[1] + d_2xn[0];
320 d_2xn[0] = s_2xn[0] - (s_2xn[1] >> 1);
321 d_2xn[2] = s_2xn[2] - ((s_2xn[1] + s_2xn[3]) >> 2);
324 d_2xn[1] = s_2xn[1] + ((9*(d_2xn[0] + d_2xn[2]) - (d_2xn[2] + d_2xn[2])) >> 4);
325 d_2xn[3] = s_2xn[3] + ((9*d_2xn[2] - d_2xn[0]) >> 3);
328 d_2xn[0] = s_2xn[0] - (s_2xn[1] >> 1);
330 d_2xn[i] = s_2xn[i] - ((s_2xn[i-1] + s_2xn[i+1]) >> 2);
334 d_2xn[1] = s_2xn[1] + ((9*(d_2xn[0] + d_2xn[2]) - (d_2xn[2] + d_2xn[4])) >> 4);
335 for(i=3;i<n*2-4;i+=2){
336 d_2xn[i] = s_2xn[i] + ((9*(d_2xn[i-1] + d_2xn[i+1]) - (d_2xn[i-3] + d_2xn[i+3])) >> 4);
338 d_2xn[n*2-3] = s_2xn[n*2-3] + ((9*(d_2xn[n*2-4] + d_2xn[n*2-2]) - (d_2xn[n*2-6] + d_2xn[n*2-2])) >> 4);
339 d_2xn[n*2-1] = s_2xn[n*2-1] + ((9*d_2xn[n*2-2] - d_2xn[n*2-4]) >> 3);
342 OIL_DEFINE_IMPL_REF (synth_approx97_ref, synth_approx97);
345 split_53_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
351 d_2xn[1] = s_2xn[1] - s_2xn[0];
352 d_2xn[0] = s_2xn[0] + (d_2xn[1] >> 1);
354 d_2xn[1] = s_2xn[1] - ((s_2xn[0] + s_2xn[2]) >> 1);
355 d_2xn[0] = s_2xn[0] + (d_2xn[1] >> 1);
356 for(i=2;i<n*2-2;i+=2){
357 d_2xn[i+1] = s_2xn[i+1] - ((s_2xn[i] + s_2xn[i+2]) >> 1);
358 d_2xn[i] = s_2xn[i] + ((d_2xn[i-1] + d_2xn[i+1]) >> 2);
360 d_2xn[n*2-1] = s_2xn[n*2-1] - s_2xn[n*2-2];
361 d_2xn[n*2-2] = s_2xn[n*2-2] + ((d_2xn[n*2-3] + d_2xn[n*2-1]) >> 2);
364 OIL_DEFINE_IMPL_REF (split_53_ref, split_53);
367 synth_53_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
373 d_2xn[0] = s_2xn[0] - (s_2xn[1] >> 1);
374 d_2xn[1] = s_2xn[1] + d_2xn[0];
376 d_2xn[0] = s_2xn[0] - (s_2xn[1] >> 1);
377 for(i=2;i<n*2-2;i+=2){
378 d_2xn[i] = s_2xn[i] - ((s_2xn[i-1] + s_2xn[i+1]) >> 2);
379 d_2xn[i-1] = s_2xn[i-1] + ((d_2xn[i] + d_2xn[i-2]) >> 1);
381 d_2xn[n*2-2] = s_2xn[n*2-2] - ((s_2xn[n*2-3] + s_2xn[n*2-1]) >> 2);
382 d_2xn[n*2-3] = s_2xn[n*2-3] + ((d_2xn[n*2-2] + d_2xn[n*2-4]) >> 1);
383 d_2xn[n*2-1] = s_2xn[n*2-1] + d_2xn[n*2-2];
386 OIL_DEFINE_IMPL_REF (synth_53_ref, synth_53);
390 split_135_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
396 d_2xn[1] = s_2xn[1] - (s_2xn[0]);
397 d_2xn[0] = s_2xn[0] + (d_2xn[1]>>1);
400 d_2xn[1] = s_2xn[1] - ((9*(s_2xn[0] + s_2xn[2]) - (s_2xn[2] + s_2xn[2])) >> 4);
401 d_2xn[3] = s_2xn[3] - ((9*s_2xn[2] - s_2xn[0]) >> 3);
404 d_2xn[0] = s_2xn[0] + ((9*d_2xn[1] - d_2xn[3]) >> 4);
405 d_2xn[2] = s_2xn[2] + ((9*(d_2xn[1] + d_2xn[3]) - (d_2xn[1] + d_2xn[1])) >> 5);
408 d_2xn[1] = s_2xn[1] - ((9*(s_2xn[0] + s_2xn[2]) - (s_2xn[2] + s_2xn[4])) >> 4);
409 for(i=3;i<n*2-4;i+=2){
410 d_2xn[i] = s_2xn[i] - ((9*(s_2xn[i-1] + s_2xn[i+1]) - (s_2xn[i-3] + s_2xn[i+3])) >> 4);
412 d_2xn[n*2-3] = s_2xn[n*2-3] - ((9*(s_2xn[n*2-4] + s_2xn[n*2-2]) - (s_2xn[n*2-6] + s_2xn[n*2-2])) >> 4);
413 d_2xn[n*2-1] = s_2xn[n*2-1] - ((9*s_2xn[n*2-2] - s_2xn[n*2-4]) >> 3);
416 d_2xn[0] = s_2xn[0] + ((9*d_2xn[1] - d_2xn[3]) >> 4);
417 d_2xn[2] = s_2xn[2] + ((9*(d_2xn[1] + d_2xn[3]) - (d_2xn[1] + d_2xn[5])) >> 5);
418 for(i=4;i<n*2-2;i+=2){
419 d_2xn[i] = s_2xn[i] + ((9*(d_2xn[i-1] + d_2xn[i+1]) - (d_2xn[i-3] + d_2xn[i+3])) >> 5);
421 d_2xn[n*2-2] = s_2xn[n*2-2] + ((9*(d_2xn[n*2-3] + d_2xn[n*2-1]) - (d_2xn[n*2-5] + d_2xn[n*2-1])) >> 5);
425 OIL_DEFINE_IMPL_REF (split_135_ref, split_135);
428 synth_135_ref (int16_t *d_2xn, int16_t *s_2xn, int n)
434 d_2xn[0] = s_2xn[0] - (s_2xn[1]>>1);
435 d_2xn[1] = s_2xn[1] + (d_2xn[0]);
438 d_2xn[0] = s_2xn[0] - ((9*s_2xn[1] - s_2xn[3]) >> 4);
439 d_2xn[2] = s_2xn[2] - ((9*(s_2xn[1] + s_2xn[3]) - (s_2xn[1] + s_2xn[1])) >> 5);
442 d_2xn[1] = s_2xn[1] + ((9*(d_2xn[0] + d_2xn[2]) - (d_2xn[2] + d_2xn[2])) >> 4);
443 d_2xn[3] = s_2xn[3] + ((9*d_2xn[2] - d_2xn[0]) >> 3);
446 d_2xn[0] = s_2xn[0] - ((9*s_2xn[1] - s_2xn[3]) >> 4);
447 d_2xn[2] = s_2xn[2] - ((9*(s_2xn[1] + s_2xn[3]) - (s_2xn[1] + s_2xn[5])) >> 5);
448 for(i=4;i<n*2-2;i+=2){
449 d_2xn[i] = s_2xn[i] - ((9*(s_2xn[i-1] + s_2xn[i+1]) - (s_2xn[i-3] + s_2xn[i+3])) >> 5);
451 d_2xn[n*2-2] = s_2xn[n*2-2] - ((9*(s_2xn[n*2-3] + s_2xn[n*2-1]) - (s_2xn[n*2-5] + s_2xn[n*2-1])) >> 5);
454 d_2xn[1] = s_2xn[1] + ((9*(d_2xn[0] + d_2xn[2]) - (d_2xn[2] + d_2xn[4])) >> 4);
455 for(i=3;i<n*2-4;i+=2){
456 d_2xn[i] = s_2xn[i] + ((9*(d_2xn[i-1] + d_2xn[i+1]) - (d_2xn[i-3] + d_2xn[i+3])) >> 4);
458 d_2xn[n*2-3] = s_2xn[n*2-3] + ((9*(d_2xn[n*2-4] + d_2xn[n*2-2]) - (d_2xn[n*2-6] + d_2xn[n*2-2])) >> 4);
459 d_2xn[n*2-1] = s_2xn[n*2-1] + ((9*d_2xn[n*2-2] - d_2xn[n*2-4]) >> 3);
462 OIL_DEFINE_IMPL_REF (synth_135_ref, synth_135);
468 lift_test (OilTest *test)
473 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC1);
474 for(i=0;i<test->n;i++){
475 data[i] = oil_rand_u8();
477 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC2);
478 for(i=0;i<test->n;i++){
479 data[i] = oil_rand_u8();
481 data = (int16_t *)oil_test_get_source_data (test, OIL_ARG_SRC3);
482 for(i=0;i<test->n;i++){
483 data[i] = oil_rand_u8();
487 OIL_DEFINE_CLASS_FULL (lift_add_shift1,
488 "int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int n", lift_test);
489 OIL_DEFINE_CLASS_FULL (lift_sub_shift1,
490 "int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int n", lift_test);
491 OIL_DEFINE_CLASS_FULL (lift_add_shift2,
492 "int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int n", lift_test);
493 OIL_DEFINE_CLASS_FULL (lift_sub_shift2,
494 "int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int n", lift_test);
495 OIL_DEFINE_CLASS_FULL (lift_add_mult_shift12,
496 "int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int16_t *s4_1, int n", lift_test);
497 OIL_DEFINE_CLASS_FULL (lift_sub_mult_shift12,
498 "int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int16_t *s4_1, int n", lift_test);
499 OIL_DEFINE_CLASS_FULL (lift_add_135,
500 "int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int16_t *s4, int16_t *s5, int n", lift_test);
501 OIL_DEFINE_CLASS_FULL (lift_sub_135,
502 "int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int16_t *s4, int16_t *s5, int n", lift_test);
506 lift_add_shift1_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int n)
510 d[i] = s1[i] + ((s2[i] + s3[i])>>1);
513 OIL_DEFINE_IMPL_REF (lift_add_shift1_ref, lift_add_shift1);
516 lift_sub_shift1_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int n)
520 d[i] = s1[i] - ((s2[i] + s3[i])>>1);
523 OIL_DEFINE_IMPL_REF (lift_sub_shift1_ref, lift_sub_shift1);
526 lift_add_shift2_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int n)
530 d[i] = s1[i] + ((s2[i] + s3[i])>>2);
533 OIL_DEFINE_IMPL_REF (lift_add_shift2_ref, lift_add_shift2);
536 lift_sub_shift2_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int n)
540 d[i] = s1[i] - ((s2[i] + s3[i])>>2);
543 OIL_DEFINE_IMPL_REF (lift_sub_shift2_ref, lift_sub_shift2);
546 lift_add_mult_shift12_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int16_t *s4, int n)
550 d[i] = s1[i] + ((s4[0]*(s2[i] + s3[i]))>>12);
553 OIL_DEFINE_IMPL_REF (lift_add_mult_shift12_ref, lift_add_mult_shift12);
556 lift_sub_mult_shift12_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3, int16_t *s4, int n)
560 d[i] = s1[i] - ((s4[0]*(s2[i] + s3[i]))>>12);
563 OIL_DEFINE_IMPL_REF (lift_sub_mult_shift12_ref, lift_sub_mult_shift12);
566 lift_add_135_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3,
567 int16_t *s4, int16_t *s5, int n)
571 d[i] = s1[i] + ((9*(s3[i-1] + s4[i+1]) - (s2[i-3] + s5[i+3])) >> 4);
574 OIL_DEFINE_IMPL_REF (lift_add_135_ref, lift_add_135);
577 lift_sub_135_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3,
578 int16_t *s4, int16_t *s5, int n)
582 d[i] = s1[i] - ((9*(s3[i-1] + s4[i+1]) - (s2[i-3] + s5[i+3])) >> 4);
585 OIL_DEFINE_IMPL_REF (lift_sub_135_ref, lift_sub_135);
589 add_const_rshift_s16_ref(int16_t *d1, int16_t *s1, int16_t *s3_2, int n)
593 d1[i] = (s1[i] + s3_2[0])>>s3_2[1];
596 OIL_DEFINE_IMPL_REF (add_const_rshift_s16_ref, add_const_rshift_s16);
599 lshift_s16_ref(int16_t *d1, int16_t *s1, int16_t *s3_1, int n)
603 d1[i] = s1[i]<<s3_1[0];
606 OIL_DEFINE_IMPL_REF (lshift_s16_ref, lshift_s16);
609 multiply_and_add_s16_ref (int16_t *d, int16_t *src1, int16_t *src2, int16_t *src3, int n)
613 d[i] = src1[i] + src2[i]*src3[i];
616 OIL_DEFINE_IMPL_REF (multiply_and_add_s16_ref, multiply_and_add_s16);
619 multiply_and_add_s16_u8_ref (int16_t *d, int16_t *src1, int16_t *src2,
620 uint8_t *src3, int n)
624 d[i] = src1[i] + src2[i]*src3[i];
627 OIL_DEFINE_IMPL_REF (multiply_and_add_s16_u8_ref, multiply_and_add_s16_u8);
630 multiply_and_acc_6xn_s16_u8_ref (int16_t *i1, int is1, int16_t *s1,
631 int ss1, uint8_t *s2, int ss2, int n)
636 i1[i] += s1[i]*s2[i];
638 i1 = OIL_OFFSET(i1,is1);
639 s1 = OIL_OFFSET(s1,ss1);
640 s2 = OIL_OFFSET(s2,ss2);
643 OIL_DEFINE_IMPL_REF (multiply_and_acc_6xn_s16_u8_ref,
644 multiply_and_acc_6xn_s16_u8);
647 multiply_and_acc_8xn_s16_u8_ref (int16_t *i1, int is1, int16_t *s1,
648 int ss1, uint8_t *s2, int ss2, int n)
653 i1[i] += s1[i]*s2[i];
655 i1 = OIL_OFFSET(i1,is1);
656 s1 = OIL_OFFSET(s1,ss1);
657 s2 = OIL_OFFSET(s2,ss2);
660 OIL_DEFINE_IMPL_REF (multiply_and_acc_8xn_s16_u8_ref,
661 multiply_and_acc_8xn_s16_u8);
664 multiply_and_acc_12xn_s16_u8_ref (int16_t *i1, int is1, int16_t *s1,
665 int ss1, uint8_t *s2, int ss2, int n)
670 i1[i] += s1[i]*s2[i];
672 i1 = OIL_OFFSET(i1,is1);
673 s1 = OIL_OFFSET(s1,ss1);
674 s2 = OIL_OFFSET(s2,ss2);
677 OIL_DEFINE_IMPL_REF (multiply_and_acc_12xn_s16_u8_ref,
678 multiply_and_acc_12xn_s16_u8);
681 multiply_and_acc_16xn_s16_u8_ref (int16_t *i1, int is1, int16_t *s1,
682 int ss1, uint8_t *s2, int ss2, int n)
687 i1[i] += s1[i]*s2[i];
689 i1 = OIL_OFFSET(i1,is1);
690 s1 = OIL_OFFSET(s1,ss1);
691 s2 = OIL_OFFSET(s2,ss2);
694 OIL_DEFINE_IMPL_REF (multiply_and_acc_16xn_s16_u8_ref,
695 multiply_and_acc_16xn_s16_u8);
698 multiply_and_acc_24xn_s16_u8_ref (int16_t *i1, int is1, int16_t *s1,
699 int ss1, uint8_t *s2, int ss2, int n)
704 i1[i] += s1[i]*s2[i];
706 i1 = OIL_OFFSET(i1,is1);
707 s1 = OIL_OFFSET(s1,ss1);
708 s2 = OIL_OFFSET(s2,ss2);
711 OIL_DEFINE_IMPL_REF (multiply_and_acc_24xn_s16_u8_ref,
712 multiply_and_acc_24xn_s16_u8);
715 combine4_8xn_u8_ref (uint8_t *d, int ds1,
716 uint8_t *s1, int ss1,
717 uint8_t *s2, int ss2,
718 uint8_t *s3, int ss3,
719 uint8_t *s4, int ss4,
720 int16_t *s5_6, int n)
727 x += s5_6[0] * s1[i];
728 x += s5_6[1] * s2[i];
729 x += s5_6[2] * s3[i];
730 x += s5_6[3] * s4[i];
731 d[i] = (x + s5_6[4]) >> s5_6[5];
740 OIL_DEFINE_IMPL_REF (combine4_8xn_u8_ref, combine4_8xn_u8);
743 combine4_12xn_u8_ref (uint8_t *d, int ds1,
744 uint8_t *s1, int ss1,
745 uint8_t *s2, int ss2,
746 uint8_t *s3, int ss3,
747 uint8_t *s4, int ss4,
748 int16_t *s5_6, int n)
755 x += s5_6[0] * s1[i];
756 x += s5_6[1] * s2[i];
757 x += s5_6[2] * s3[i];
758 x += s5_6[3] * s4[i];
759 d[i] = (x + s5_6[4]) >> s5_6[5];
768 OIL_DEFINE_IMPL_REF (combine4_12xn_u8_ref, combine4_12xn_u8);
771 combine4_16xn_u8_ref (uint8_t *d, int ds1,
772 uint8_t *s1, int ss1,
773 uint8_t *s2, int ss2,
774 uint8_t *s3, int ss3,
775 uint8_t *s4, int ss4,
776 int16_t *s5_6, int n)
783 x += s5_6[0] * s1[i];
784 x += s5_6[1] * s2[i];
785 x += s5_6[2] * s3[i];
786 x += s5_6[3] * s4[i];
787 d[i] = (x + s5_6[4]) >> s5_6[5];
796 OIL_DEFINE_IMPL_REF (combine4_16xn_u8_ref, combine4_16xn_u8);
799 combine4_32xn_u8_ref (uint8_t *d, int ds1,
800 uint8_t *s1, int ss1,
801 uint8_t *s2, int ss2,
802 uint8_t *s3, int ss3,
803 uint8_t *s4, int ss4,
804 int16_t *s5_6, int n)
811 x += s5_6[0] * s1[i];
812 x += s5_6[1] * s2[i];
813 x += s5_6[2] * s3[i];
814 x += s5_6[3] * s4[i];
815 d[i] = (x + s5_6[4]) >> s5_6[5];
824 OIL_DEFINE_IMPL_REF (combine4_32xn_u8_ref, combine4_32xn_u8);
827 combine2_8xn_u8_ref (uint8_t *d, int ds1,
828 uint8_t *s1, int ss1,
829 uint8_t *s2, int ss2,
830 int16_t *s3_4, int n)
837 x += s3_4[0] * s1[i];
838 x += s3_4[1] * s2[i];
839 d[i] = (x + s3_4[2]) >> s3_4[3];
846 OIL_DEFINE_IMPL_REF (combine2_8xn_u8_ref, combine2_8xn_u8);
849 combine2_12xn_u8_ref (uint8_t *d, int ds1,
850 uint8_t *s1, int ss1,
851 uint8_t *s2, int ss2,
852 int16_t *s3_4, int n)
859 x += s3_4[0] * s1[i];
860 x += s3_4[1] * s2[i];
861 d[i] = (x + s3_4[2]) >> s3_4[3];
868 OIL_DEFINE_IMPL_REF (combine2_12xn_u8_ref, combine2_12xn_u8);
871 combine2_16xn_u8_ref (uint8_t *d, int ds1,
872 uint8_t *s1, int ss1,
873 uint8_t *s2, int ss2,
874 int16_t *s3_4, int n)
881 x += s3_4[0] * s1[i];
882 x += s3_4[1] * s2[i];
883 d[i] = (x + s3_4[2]) >> s3_4[3];
890 OIL_DEFINE_IMPL_REF (combine2_16xn_u8_ref, combine2_16xn_u8);
893 add2_rshift_add_s16_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3,
894 int16_t *s4_2, int n)
898 d[i] = s1[i] + ((s2[i] + s3[i] + s4_2[0])>>s4_2[1]);
901 OIL_DEFINE_IMPL_REF (add2_rshift_add_s16_ref, add2_rshift_add_s16);
904 add2_rshift_sub_s16_ref (int16_t *d, int16_t *s1, int16_t *s2, int16_t *s3,
905 int16_t *s4_2, int n)
909 d[i] = s1[i] - ((s2[i] + s3[i] + s4_2[0])>>s4_2[1]);
912 OIL_DEFINE_IMPL_REF (add2_rshift_sub_s16_ref, add2_rshift_sub_s16);
915 avg2_8xn_u8_ref (uint8_t *d, int ds1, uint8_t *s1, int ss1,
916 uint8_t *s2, int ss2, int n)
922 d[i] = (s1[i] + s2[i] + 1)>>1;
929 OIL_DEFINE_IMPL_REF (avg2_8xn_u8_ref, avg2_8xn_u8);
932 avg2_12xn_u8_ref (uint8_t *d, int ds1, uint8_t *s1, int ss1,
933 uint8_t *s2, int ss2, int n)
939 d[i] = (s1[i] + s2[i] + 1)>>1;
946 OIL_DEFINE_IMPL_REF (avg2_12xn_u8_ref, avg2_12xn_u8);
949 avg2_16xn_u8_ref (uint8_t *d, int ds1, uint8_t *s1, int ss1,
950 uint8_t *s2, int ss2, int n)
956 d[i] = (s1[i] + s2[i] + 1)>>1;
963 OIL_DEFINE_IMPL_REF (avg2_16xn_u8_ref, avg2_16xn_u8);
966 avg2_32xn_u8_ref (uint8_t *d, int ds1, uint8_t *s1, int ss1,
967 uint8_t *s2, int ss2, int n)
973 d[i] = (s1[i] + s2[i] + 1)>>1;
980 OIL_DEFINE_IMPL_REF (avg2_32xn_u8_ref, avg2_32xn_u8);