History

Add arm asm code for processing.

Licai Guo committed 12 years ago

Commit e7cc8c21 parent 248f32424 files · +4330 −4204Browse files

Showing the changes to codec/processing/src (13 of 24 files). Show all

Unified · Split

13 files
  1. codec/processing/src/adaptivequantization/AdaptiveQuantization.cpp +5 −0
  2. codec/processing/src/adaptivequantization/AdaptiveQuantization.h +5 −0
  3. codec/processing/src/arm/adaptive_quantization.S +21 −21
  4. codec/processing/src/arm/down_sample_neon.S +69 −69
  5. codec/processing/src/arm/pixel_sad_neon.S +7 −7
  6. codec/processing/src/arm/vaa_calc_neon.S +280 −280
  7. codec/processing/src/downsample/downsample.cpp +10 −0
  8. codec/processing/src/downsample/downsample.h +13 −0
  9. codec/processing/src/downsample/downsamplefuncs.cpp +10 −0
  10. codec/processing/src/scenechangedetection/SceneChangeDetection.cpp +6 −0
  11. codec/processing/src/scenechangedetection/SceneChangeDetectionCommon.h +6 −0
  12. codec/processing/src/vaacalc/vaacalculation.cpp +9 −0
  13. codec/processing/src/vaacalc/vaacalculation.h +10 −0
codec/processing/src/adaptivequantization/AdaptiveQuantization.cpp+5−0
@@ -231,6 +231,11 @@ void CAdaptiveQuantization::WelsInitVarFunc (PVarFunc& pfVar, int32_t iCpuFlag) · 230 unmodified lines
231231 pfVar = SampleVariance16x16_sse2;
232232 }
233233 #endif
234+#ifdef HAVE_NEON
235+ if (iCpuFlag & WELS_CPU_NEON) {
236+ pfVar = SampleVariance16x16_neon;
237+ }
238+#endif
234239 }
235240
236241 void SampleVariance16x16_c (uint8_t* pRefY, int32_t iRefStride, uint8_t* pSrcY, int32_t iSrcStride,
codec/processing/src/adaptivequantization/AdaptiveQuantization.h+5−0
@@ -62,6 +62,11 @@ VarFunc SampleVariance16x16_sse2; · 61 unmodified lines
6262 WELSVP_EXTERN_C_END
6363 #endif
6464
65+#ifdef HAVE_NEON
66+WELSVP_EXTERN_C_BEGIN
67+VarFunc SampleVariance16x16_neon;
68+WELSVP_EXTERN_C_END
69+#endif
6570
6671 class CAdaptiveQuantization : public IStrategy {
6772 public:
codec/processing/src/arm/adaptive_quantization.S+21−21
@@ -35,7 +35,7 @@ · 34 unmodified lines
3535 #include "arm_arch_common_macro.S"
3636
3737 #ifdef APPLE_IOS
38−.macro SQR_ADD_16BYTES
38+.macro SQR_ADD_16BYTES
3939 vmull.u8 q3, $0, $0
4040 vmull.u8 q8, $1, $1
4141 vpadal.u16 $2, q3
@@ -51,23 +51,23 @@ · 9 unmodified lines
5151 #endif
5252
5353
54−WELS_ASM_FUNC_BEGIN pixel_var_16x16_neon
54+WELS_ASM_FUNC_BEGIN SampleVariance16x16_neon
5555 stmdb sp!, {r4}
5656
5757 vld1.8 {q15}, [r0], r1 //save the ref data (16bytes)
5858 vld1.8 {q14}, [r2], r3 //save the src data (16bytes)
59−
60−
61− vabd.u8 q13, q14, q15
59+
60+
61+ vabd.u8 q13, q14, q15
6262 vmull.u8 q12, d27, d27
6363 vmull.u8 q11, d26, d26
6464 vaddl.u16 q12, d24, d25
6565 vpadal.u16 q12, q11 //sqr
6666
67− vaddl.u8 q13, d26, d27 //sum
68−
67+ vaddl.u8 q13, d26, d27 //sum
68+
6969 vaddl.u8 q10, d28, d29 //sum_cur
70−
70+
7171 vmull.u8 q9, d29, d29
7272 vmull.u8 q8, d28, d28
7373 vaddl.u16 q9, d18, d19 //sqr_cur
@@ -78,35 +78,35 @@ pixel_var_16x16_loop0: · 4 unmodified lines
7878
7979 vld1.8 {q0}, [r0], r1 //save the ref data (16bytes)
8080 vld1.8 {q1}, [r2], r3 //save the src data (16bytes)
81−
81+
8282 vabd.u8 q2, q0, q1
83−
83+
8484 //q10 save sum_cur
8585 vpadal.u8 q10, q1
8686
8787 //q12 save sqr
8888 SQR_ADD_16BYTES d4, d5, q12
89−
89+
9090 //q13 save sum
9191 vpadal.u8 q13, q2
9292
9393 subs r4, #1
94−
95− //q9 save sqr_cur
96− SQR_ADD_16BYTES d2, d3, q9
97−
98− bne pixel_var_16x16_loop0
99−
94+
95+ //q9 save sqr_cur
96+ SQR_ADD_16BYTES d2, d3, q9
97+
98+ bne pixel_var_16x16_loop0
99+
100100 vadd.u16 d0, d26, d27 //sum
101− vadd.u16 d1, d20, d21 //sum_cur
101+ vadd.u16 d1, d20, d21 //sum_cur
102102 vpaddl.u16 q0, q0
103103 vadd.u32 d2, d24, d25 //sqr
104104 vadd.u32 d3, d18, d19 //sqr_cur
105105 vpadd.u32 d0, d0, d1
106106 vpadd.u32 d1, d2, d3
107−
107+
108108 ldr r4, [sp, #4]
109−
109+
110110 vshr.u32 q0, q0, #8
111111 vmul.u32 d0, d0
112112 vsub.u32 d0, d1, d0
@@ -117,4 +117,4 @@ pixel_var_16x16_loop0: · 4 unmodified lines
117117
118118 WELS_ASM_FUNC_END
119119
120−#endif
120+#endif
codec/processing/src/arm/down_sample_neon.S+69−69
@@ -35,29 +35,29 @@ · 34 unmodified lines
3535 #include "arm_arch_common_macro.S"
3636
3737
38−WELS_ASM_FUNC_BEGIN comp_ds_bilinear_neon
38+WELS_ASM_FUNC_BEGIN DyadicBilinearDownsampler_neon
3939 stmdb sp!, {r4-r8, lr}
40−
40+
4141 //Get the width and height
4242 ldr r4, [sp, #24] //src_width
4343 ldr r5, [sp, #28] //src_height
44−
44+
4545 //Initialize the register
4646 mov r6, r2
4747 mov r8, r0
4848 mov lr, #0
49− lsr r5, #1
50−
49+ lsr r5, #1
50+
5151 //Save the tailer for the unasigned size
5252 mla r7, r1, r5, r0
5353 vld1.32 {q15}, [r7]
54−
54+
5555 add r7, r2, r3
5656 //processing a colume data
57−comp_ds_bilinear_loop0:
57+comp_ds_bilinear_loop0:
5858
5959 vld1.8 {q0,q1}, [r2]!
60− vld1.8 {q2,q3}, [r7]!
60+ vld1.8 {q2,q3}, [r7]!
6161 vpaddl.u8 q0, q0
6262 vpaddl.u8 q1, q1
6363 vpaddl.u8 q2, q2
@@ -70,9 +70,9 @@ comp_ds_bilinear_loop0: · 6 unmodified lines
7070 vrhadd.u16 q1, q3
7171 vmovn.u16 d0, q0
7272 vmovn.u16 d1, q1
73− vst1.32 {q0}, [r0]!
73+ vst1.32 {q0}, [r0]!
7474 add lr, #32
75−
75+
7676 cmp lr, r4
7777 movcs lr, #0
7878 addcs r6, r3, lsl #1
@@ -82,10 +82,10 @@ comp_ds_bilinear_loop0: · 3 unmodified lines
8282 movcs r0, r8
8383 subscs r5, #1
8484 bne comp_ds_bilinear_loop0
85−
85+
8686 //restore the tailer for the unasigned size
8787 vst1.32 {q15}, [r0]
88−
88+
8989 ldmia sp!, {r4-r8,lr}
9090 WELS_ASM_FUNC_END
9191
@@ -96,29 +96,29 @@ WELS_ASM_FUNC_BEGIN comp_ds_bilinear_w_x8_neon · 4 unmodified lines
9696 //Get the width and height
9797 ldr r4, [sp, #20] //src_width
9898 ldr r5, [sp, #24] //src_height
99−
99+
100100 //Get the difference
101− sub lr, r3, r4
101+ sub lr, r3, r4
102102 sub r1, r1, r4, lsr #1
103−
103+
104104 lsr r5, #1
105−
105+
106106 //processing a colume data
107−comp_ds_bilinear_w_x8_loop0:
108−
107+comp_ds_bilinear_w_x8_loop0:
108+
109109 lsr r6, r4, #3
110110 add r7, r2, r3
111111 //processing a line data
112112 comp_ds_bilinear_w_x8_loop1:
113−
113+
114114 vld1.8 {d0}, [r2]!
115− vld1.8 {d1}, [r7]!
115+ vld1.8 {d1}, [r7]!
116116 vpaddl.u8 q0, q0
117117 vrshr.u16 q0, #1
118118 vrhadd.u16 d0, d1
119−
119+
120120 vmovn.u16 d0, q0
121− vst1.32 {d0[0]}, [r0]!
121+ vst1.32 {d0[0]}, [r0]!
122122 subs r6, #1
123123 bne comp_ds_bilinear_w_x8_loop1
124124
@@ -126,7 +126,7 @@ comp_ds_bilinear_w_x8_loop1: · 1 unmodified line
126126 add r0, r1
127127 subs r5, #1
128128 bne comp_ds_bilinear_w_x8_loop0
129−
129+
130130 ldmia sp!, {r4-r7,lr}
131131 WELS_ASM_FUNC_END
132132
@@ -137,31 +137,31 @@ WELS_ASM_FUNC_BEGIN comp_ds_bilinear_w_x16_neon · 4 unmodified lines
137137 //Get the width and height
138138 ldr r4, [sp, #20] //src_width
139139 ldr r5, [sp, #24] //src_height
140−
140+
141141 //Get the difference
142− sub lr, r3, r4
142+ sub lr, r3, r4
143143 sub r1, r1, r4, lsr #1
144−
144+
145145 lsr r5, #1
146−
146+
147147 //processing a colume data
148−comp_ds_bilinear_w_x16_loop0:
149−
148+comp_ds_bilinear_w_x16_loop0:
149+
150150 lsr r6, r4, #4
151151 add r7, r2, r3
152152 //processing a line data
153153 comp_ds_bilinear_w_x16_loop1:
154−
154+
155155 vld1.8 {q0}, [r2]!
156− vld1.8 {q1}, [r7]!
156+ vld1.8 {q1}, [r7]!
157157 vpaddl.u8 q0, q0
158158 vpaddl.u8 q1, q1
159159 vrshr.u16 q0, #1
160160 vrshr.u16 q1, #1
161161 vrhadd.u16 q0, q1
162−
162+
163163 vmovn.u16 d0, q0
164− vst1.32 {d0}, [r0]!
164+ vst1.32 {d0}, [r0]!
165165 subs r6, #1
166166 bne comp_ds_bilinear_w_x16_loop1
167167
@@ -169,34 +169,34 @@ comp_ds_bilinear_w_x16_loop1: · 1 unmodified line
169169 add r0, r1
170170 subs r5, #1
171171 bne comp_ds_bilinear_w_x16_loop0
172−
172+
173173 ldmia sp!, {r4-r7,lr}
174174 WELS_ASM_FUNC_END
175175
176176
177−WELS_ASM_FUNC_BEGIN comp_ds_bilinear_w_x32_neon
177+WELS_ASM_FUNC_BEGIN DyadicBilinearDownsamplerWidthx32_neon
178178 stmdb sp!, {r4-r7, lr}
179179
180180 //Get the width and height
181181 ldr r4, [sp, #20] //src_width
182182 ldr r5, [sp, #24] //src_height
183−
183+
184184 //Get the difference
185− sub lr, r3, r4
185+ sub lr, r3, r4
186186 sub r1, r1, r4, lsr #1
187−
187+
188188 lsr r5, #1
189−
189+
190190 //processing a colume data
191−comp_ds_bilinear_w_x32_loop0:
192−
191+comp_ds_bilinear_w_x32_loop0:
192+
193193 lsr r6, r4, #5
194194 add r7, r2, r3
195195 //processing a line data
196196 comp_ds_bilinear_w_x32_loop1:
197−
197+
198198 vld1.8 {q0,q1}, [r2]!
199− vld1.8 {q2,q3}, [r7]!
199+ vld1.8 {q2,q3}, [r7]!
200200 vpaddl.u8 q0, q0
201201 vpaddl.u8 q1, q1
202202 vpaddl.u8 q2, q2
@@ -207,10 +207,10 @@ comp_ds_bilinear_w_x32_loop1: · 4 unmodified lines
207207 vrshr.u16 q3, #1
208208 vrhadd.u16 q0, q2
209209 vrhadd.u16 q1, q3
210−
210+
211211 vmovn.u16 d0, q0
212212 vmovn.u16 d1, q1
213− vst1.32 {q0}, [r0]!
213+ vst1.32 {q0}, [r0]!
214214 subs r6, #1
215215 bne comp_ds_bilinear_w_x32_loop1
216216
@@ -218,14 +218,14 @@ comp_ds_bilinear_w_x32_loop1: · 1 unmodified line
218218 add r0, r1
219219 subs r5, #1
220220 bne comp_ds_bilinear_w_x32_loop0
221−
221+
222222 ldmia sp!, {r4-r7,lr}
223223 WELS_ASM_FUNC_END
224224
225225
226−WELS_ASM_FUNC_BEGIN general_ds_bilinear_accurate_neon
226+WELS_ASM_FUNC_BEGIN GeneralBilinearAccurateDownsampler_neon
227227 stmdb sp!, {r4-r12, lr}
228−
228+
229229 //Get the data from stack
230230 ldr r4, [sp, #40] //the addr of src
231231 ldr r5, [sp, #44] //the value of src_stride
@@ -245,11 +245,11 @@ WELS_ASM_FUNC_BEGIN general_ds_bilinear_accurate_neon · 13 unmodified lines
245245 and r9, r7, r10 // r9 vinc(scaleY mod 32767)
246246 mov r11, #-1
247247 mul r11, r9 // r11 -vinc
248−
248+
249249 vdup.s16 d2, r9
250250 vdup.s16 d3, r11
251251 vext.8 d5, d3, d2, #4 // vinc vinc -vinc -vinc
252−
252+
253253 mov r11, #0x40000000
254254 mov r12, #0x4000
255255 sub r12, #1
@@ -261,13 +261,13 @@ WELS_ASM_FUNC_BEGIN general_ds_bilinear_accurate_neon · 5 unmodified lines
261261 sub r11, #1
262262 vdup.s16 d9, r11
263263 vext.8 d7, d9, d8, #4 //init v 16384 16384 16383 16383
264−
265− veor q14, q14
266− sub r1, r2 // stride - width
264+
265+ veor q14, q14
266+ sub r1, r2 // stride - width
267267 mov r8, #16384 // yInverse
268268 sub r3, #1
269−
270−_HEIGHT:
269+
270+_HEIGHT:
271271 ldr r4, [sp, #40] //the addr of src
272272 mov r11, r8
273273 lsr r11, #15
@@ -275,8 +275,8 @@ _HEIGHT: · 1 unmodified line
275275 add r11, r4 // get current row address
276276 mov r12, r11
277277 add r12, r5
278−
279− mov r9, #16384 // xInverse
278+
279+ mov r9, #16384 // xInverse
280280 sub r10, r2, #1
281281 vmov.s16 d6, d1
282282
@@ -288,21 +288,21 @@ _WIDTH: · 5 unmodified lines
288288 add r4, r12,lr
289289 vld2.8 {d28[4],d29[4]}, [r4] //q14: 000d000b000c000a;
290290 vzip.32 d28, d29 //q14: 000d000c000b000a;
291−
292− vmull.u16 q13, d6, d7 //q13: init u * init v
291+
292+ vmull.u16 q13, d6, d7 //q13: init u * init v
293293 vmull.u32 q12, d26,d28
294294 vmlal.u32 q12, d27,d29
295295 vqadd.u64 d24, d24,d25
296296 vrshr.u64 d24, #30
297297
298298 vst1.8 {d24[0]}, [r0]!
299− add r9, r6
299+ add r9, r6
300300 vadd.u16 d6, d0 // inc u
301301 vshl.u16 d6, #1
302302 vshr.u16 d6, #1
303303 subs r10, #1
304304 bne _WIDTH
305−
305+
306306 WIDTH_END:
307307 lsr r9, #15
308308 add r4,r11,r9
@@ -317,26 +317,26 @@ WIDTH_END: · 8 unmodified lines
317317 subs r3, #1
318318 bne _HEIGHT
319319
320−LAST_ROW:
320+LAST_ROW:
321321 ldr r4, [sp, #40] //the addr of src
322322 lsr r8, #15
323323 mul r8, r5
324− add r4, r8 // get current row address
324+ add r4, r8 // get current row address
325325 mov r9, #16384
326326
327327 _LAST_ROW_WIDTH:
328328 mov r11, r9
329329 lsr r11, #15
330−
330+
331331 add r3, r4,r11
332332 vld1.8 {d0[0]}, [r3]
333− vst1.8 {d0[0]}, [r0]
334− add r0, #1
335− add r9, r6
333+ vst1.8 {d0[0]}, [r0]
334+ add r0, #1
335+ add r9, r6
336336 subs r2, #1
337337 bne _LAST_ROW_WIDTH
338−
338+
339339 ldmia sp!, {r4-r12, lr}
340340 WELS_ASM_FUNC_END
341341
342−#endif
342+#endif
codec/processing/src/arm/pixel_sad_neon.S+7−7
@@ -35,24 +35,24 @@ · 34 unmodified lines
3535 #include "arm_arch_common_macro.S"
3636
3737
38−WELS_ASM_FUNC_BEGIN pixel_sad_8x8_neon
38+WELS_ASM_FUNC_BEGIN WelsSampleSad8x8_neon
3939 stmdb sp!, {lr}
4040 //Loading a horizontal line data (8 bytes)
41− vld1.8 {d0}, [r0], r1
41+ vld1.8 {d0}, [r0], r1
4242 vld1.8 {d1}, [r2], r3
43−
43+
4444 //Do the SAD for 8 bytes
4545 vabdl.u8 q1, d0, d1
46−
46+
4747 mov lr, #7
4848 pixel_sad_8x8_loop0:
4949
5050 //Loading a horizontal line data (8 bytes)
51− vld1.8 {d0}, [r0], r1
51+ vld1.8 {d0}, [r0], r1
5252 vld1.8 {d1}, [r2], r3
5353
5454 subs lr, #1
55−
55+
5656 //Do the SAD for 8 bytes
5757 vabal.u8 q1, d0, d1
5858 bne pixel_sad_8x8_loop0
@@ -65,4 +65,4 @@ pixel_sad_8x8_loop0: · 6 unmodified lines
6565 ldmia sp!, {lr}
6666 WELS_ASM_FUNC_END
6767
68−#endif
68+#endif
codec/processing/src/arm/vaa_calc_neon.S+280−280
@@ -36,29 +36,29 @@ · 35 unmodified lines
3636
3737 #ifdef APPLE_IOS
3838
39−.macro ABS_SUB_SUM_16BYTES
39+.macro ABS_SUB_SUM_16BYTES
4040 vld1.32 {q15}, [$0], $2
4141 vld1.32 {q14}, [$1], $2
4242 vabal.u8 $3, d30, d28
4343 vabal.u8 $4, d31, d29
4444 .endm
4545
46−.macro ABS_SUB_SUM_8x16BYTES
46+.macro ABS_SUB_SUM_8x16BYTES
4747 vld1.32 {q15}, [$0], $2
4848 vld1.32 {q14}, [$1], $2
4949 vabdl.u8 $3, d30, d28
5050 vabdl.u8 $4, d31, d29
51−
51+
52+ ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
5253 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
5354 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
5455 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
5556 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
56− ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
5757 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
5858 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
5959 .endm
6060
61−.macro SAD_8X16BITS
61+.macro SAD_8X16BITS
6262 vadd.u16 d31, $0, $1
6363 vpaddl.u16 d31, d31
6464 vpaddl.u32 $2, d31
@@ -73,17 +73,17 @@ · 8 unmodified lines
7373 vabal.u8 \arg4, d31, d29
7474 .endm
7575
76−.macro ABS_SUB_SUM_8x16BYTES arg0, arg1, arg2, arg3, arg4
76+.macro ABS_SUB_SUM_8x16BYTES arg0, arg1, arg2, arg3, arg4
7777 vld1.32 {q15}, [\arg0], \arg2
7878 vld1.32 {q14}, [\arg1], \arg2
7979 vabdl.u8 \arg3, d30, d28
8080 vabdl.u8 \arg4, d31, d29
81−
81+
82+ ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
8283 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
8384 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
8485 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
8586 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
86− ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
8787 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
8888 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
8989 .endm
@@ -96,67 +96,67 @@ · 6 unmodified lines
9696 #endif
9797
9898
99−WELS_ASM_FUNC_BEGIN vaa_calc_sad_neon
99+WELS_ASM_FUNC_BEGIN VAACalcSad_neon
100+
101+ stmdb sp!, {r4-r8}
100102
101− stmdb sp!, {r4-r8}
102−
103103 ldr r4, [sp, #20] //load pic_stride
104104 ldr r5, [sp, #28] //load psad8x8
105−
105+
106106 //Initial the Q4 register for save the "psadframe"
107107 vmov.s64 q4, #0
108−
108+
109109 //Get the jump distance to use on loop codes
110110 lsl r8, r4, #4
111111 sub r7, r8, #16 //R7 keep the 16*pic_stride-16
112112 sub r8, r2 //R8 keep the 16*pic_stride-pic_width
113−
113+
114114 vaa_calc_sad_loop0:
115115
116116 //R6 keep the pic_width
117117 mov r6, r2
118−
119−vaa_calc_sad_loop1:
118+
119+vaa_calc_sad_loop1:
120120
121121 //Process the 16x16 bytes
122122 ABS_SUB_SUM_8x16BYTES r0, r1, r4, q0, q1
123123 ABS_SUB_SUM_8x16BYTES r0, r1, r4, q2, q3
124−
124+
125125 //Do the SAD
126126 SAD_8X16BITS d0, d1, d0
127127 SAD_8X16BITS d2, d3, d1
128128 SAD_8X16BITS d4, d5, d2
129− SAD_8X16BITS d6, d7, d3
130−
129+ SAD_8X16BITS d6, d7, d3
130+
131131 //Write to "psad8x8" buffer
132− vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r5]!
133−
132+ vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r5]!
133+
134134
135135 //Adjust the input address
136136 sub r0, r7
137137 sub r1, r7
138−
138+
139139 subs r6, #16
140−
141− //Save to calculate "psadframe"
140+
141+ //Save to calculate "psadframe"
142142 vadd.u32 q0, q1
143143 vadd.u32 q4, q0
144−
144+
145145 bne vaa_calc_sad_loop1
146−
146+
147147 //Adjust the input address
148148 add r0, r8
149149 add r1, r8
150−
150+
151151 subs r3, #16
152− bne vaa_calc_sad_loop0
153−
152+ bne vaa_calc_sad_loop0
153+
154154 ldr r6, [sp, #24] //load psadframe
155155 vadd.u32 d8, d9
156156 vst1.32 {d8[0]}, [r6]
157−
157+
158158 ldmia sp!, {r4-r8}
159−
159+
160160 WELS_ASM_FUNC_END
161161
162162
@@ -164,12 +164,12 @@ WELS_ASM_FUNC_END · 1 unmodified line
164164 .macro SAD_SD_MAD_16BYTES
165165 vld1.32 {q0}, [$0], $2
166166 vld1.32 {q1}, [$1], $2
167−
167+
168168 vpadal.u8 $3, q0
169169 vpadal.u8 $4, q1
170−
171− vabd.u8 q0, q0, q1
172− vmax.u8 $5, q0
170+
171+ vabd.u8 q0, q0, q1
172+ vmax.u8 $5, q0
173173 vpadal.u8 $6, q0
174174 .endm
175175
@@ -177,13 +177,13 @@ WELS_ASM_FUNC_END · 1 unmodified line
177177 vld1.32 {q0}, [$0], $2
178178 vld1.32 {q1}, [$1], $2
179179
180− vpaddl.u8 q2, q0
180+ vpaddl.u8 q2, q0
181181 vpaddl.u8 q3, q1
182−
183− vabd.u8 $3, q0, q1
182+
183+ vabd.u8 $3, q0, q1
184184 vpaddl.u8 $4, $3 //abs_diff
185185
186−
186+
187187 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
188188 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
189189 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
@@ -191,7 +191,7 @@ WELS_ASM_FUNC_END · 1 unmodified line
191191 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
192192 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
193193 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
194−
194+
195195 vsub.u16 $5, q2, q3
196196 .endm
197197
@@ -203,18 +203,18 @@ WELS_ASM_FUNC_END · 5 unmodified lines
203203 vpaddl.u16 $3, $3
204204 vpaddl.u32 $3, $3
205205 vpaddl.s16 $4, $4
206− vpaddl.s32 $4, $4
206+ vpaddl.s32 $4, $4
207207 .endm
208208 #else
209−.macro SAD_SD_MAD_16BYTES arg0, arg1, arg2, arg3, arg4, arg5, arg6
209+.macro SAD_SD_MAD_16BYTES arg0, arg1, arg2, arg3, arg4, arg5, arg6
210210 vld1.32 {q0}, [\arg0], \arg2
211211 vld1.32 {q1}, [\arg1], \arg2
212−
212+
213213 vpadal.u8 \arg3, q0
214214 vpadal.u8 \arg4, q1
215−
216− vabd.u8 q0, q0, q1
217− vmax.u8 \arg5, q0
215+
216+ vabd.u8 q0, q0, q1
217+ vmax.u8 \arg5, q0
218218 vpadal.u8 \arg6, q0
219219 .endm
220220
@@ -222,13 +222,13 @@ WELS_ASM_FUNC_END · 1 unmodified line
222222 vld1.32 {q0}, [\arg0], \arg2
223223 vld1.32 {q1}, [\arg1], \arg2
224224
225− vpaddl.u8 q2, q0
225+ vpaddl.u8 q2, q0
226226 vpaddl.u8 q3, q1
227−
228− vabd.u8 \arg3, q0, q1
227+
228+ vabd.u8 \arg3, q0, q1
229229 vpaddl.u8 \arg4, \arg3 //abs_diff
230230
231−
231+
232232 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
233233 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
234234 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
@@ -236,7 +236,7 @@ WELS_ASM_FUNC_END · 1 unmodified line
236236 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
237237 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
238238 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
239−
239+
240240 vsub.u16 \arg5, q2, q3
241241 .endm
242242
@@ -248,69 +248,69 @@ WELS_ASM_FUNC_END · 5 unmodified lines
248248 vpaddl.u16 \arg3, \arg3
249249 vpaddl.u32 \arg3, \arg3
250250 vpaddl.s16 \arg4, \arg4
251− vpaddl.s32 \arg4, \arg4
251+ vpaddl.s32 \arg4, \arg4
252252 .endm
253253 #endif
254254
255−WELS_ASM_FUNC_BEGIN vaa_calc_sad_bgd_neon
255+WELS_ASM_FUNC_BEGIN VAACalcSadBgd_neon
256256
257257 stmdb sp!, {r4-r10}
258−
258+
259259 ldr r4, [sp, #28] //load pic_stride
260260 ldr r5, [sp, #36] //load psad8x8
261261 ldr r6, [sp, #40] //load psd8x8
262262 ldr r7, [sp, #44] //load pmad8x8
263−
263+
264264 //Initial the Q4 register for save the "psadframe"
265265 vmov.s64 q15, #0
266−
266+
267267 //Get the jump distance to use on loop codes
268268 lsl r10, r4, #4
269269 sub r9, r10, #16 //R9 keep the 16*pic_stride-16
270270 sub r10, r2 //R10 keep the 16*pic_stride-pic_width
271−
271+
272272 vaa_calc_sad_bgd_loop0:
273273
274274 //R6 keep the pic_width
275275 mov r8, r2
276−
277−vaa_calc_sad_bgd_loop1:
276+
277+vaa_calc_sad_bgd_loop1:
278278
279279 //Process the 16x16 bytes pmad psad psd
280280 SAD_SD_MAD_8x16BYTES r0, r1, r4, q13, q11, q9
281281 SAD_SD_MAD_8x16BYTES r0, r1, r4, q14, q12, q10
282−
282+
283283 SAD_SD_MAD_CALC d26, d27, d16, q11, q9
284− SAD_SD_MAD_CALC d28, d29, d17, q12, q10
284+ SAD_SD_MAD_CALC d28, d29, d17, q12, q10
285285
286286 //Write to "psad8x8" buffer
287− vst4.32 {d22[0],d23[0],d24[0],d25[0]}, [r5]!
287+ vst4.32 {d22[0],d23[0],d24[0],d25[0]}, [r5]!
288288 //Adjust the input address
289289 sub r0, r9
290290 sub r1, r9
291291 //Write to "psd8x8" buffer
292− vst4.32 {d18[0],d19[0],d20[0],d21[0]}, [r6]!
292+ vst4.32 {d18[0],d19[0],d20[0],d21[0]}, [r6]!
293293 subs r8, #16
294294 //Write to "pmad8x8" buffer
295− vst2.16 {d16[0],d17[0]}, [r7]!
296− //Save to calculate "psadframe"
295+ vst2.16 {d16[0],d17[0]}, [r7]!
296+ //Save to calculate "psadframe"
297297 vadd.u32 q11, q12
298298 vadd.u32 q15, q11
299−
299+
300300 bne vaa_calc_sad_bgd_loop1
301−
301+
302302 //Adjust the input address
303303 add r0, r10
304304 add r1, r10
305−
305+
306306 subs r3, #16
307− bne vaa_calc_sad_bgd_loop0
308−
307+ bne vaa_calc_sad_bgd_loop0
308+
309309 ldr r8, [sp, #32] //load psadframe
310310 vadd.u32 d30, d31
311− vst1.32 {d30[0]}, [r8]
311+ vst1.32 {d30[0]}, [r8]
312312 ldmia sp!, {r4-r10}
313−
313+
314314 WELS_ASM_FUNC_END
315315
316316
@@ -318,7 +318,7 @@ WELS_ASM_FUNC_END · 1 unmodified line
318318 .macro SSD_MUL_SUM_16BYTES_RESET
319319 vmull.u8 $3, $0, $0
320320 vpaddl.u16 $2, $3
321−
321+
322322 vmull.u8 $3, $1, $1
323323 vpadal.u16 $2, $3
324324 .endm
@@ -326,71 +326,71 @@ WELS_ASM_FUNC_END · 1 unmodified line
326326 .macro SSD_MUL_SUM_16BYTES
327327 vmull.u8 $3, $0, $0
328328 vpadal.u16 $2, $3
329−
329+
330330 vmull.u8 $3, $1, $1
331331 vpadal.u16 $2, $3
332332 .endm
333333
334334 .macro SAD_SSD_BGD_16
335335 vld1.8 {q0}, [$0], $2 //load cur_row
336−
336+
337337 vpadal.u8 q3, q0 //add cur_row together
338338 vpadal.u8 q4, q1 //add ref_row together
339−
339+
340340 vabd.u8 q2, q0, q1 //abs_diff
341−
341+
342342 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16
343−
343+
344344 vpadal.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
345−
345+
346346 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
347−
347+
348348 vld1.8 {q1}, [$1], $2 //load ref_row
349349 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
350−
350+
351351 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
352352 .endm
353353
354354 //the last row of a 16x16 block
355355 .macro SAD_SSD_BGD_16_end
356356 vld1.8 {q0}, [$0], $1 //load cur_row
357−
357+
358358 vpadal.u8 q3, q0 //add cur_row together
359359 vpadal.u8 q4, q1 //add ref_row together
360−
360+
361361 vabd.u8 q2, q0, q1 //abs_diff
362−
362+
363363 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16
364−
364+
365365 vpadal.u8 $2, q2 //l_sad for 16 bytes reset for every 8x16
366−
366+
367367 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
368−
368+
369369 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
370−
370+
371371 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
372372 .endm
373373
374374 //for the begin of a 8x16 block, use some instructions to reset the register
375375 .macro SAD_SSD_BGD_16_RESET_8x8
376376 vld1.8 {q0}, [$0], $2 //load cur_row
377−
377+
378378 vpaddl.u8 q3, q0 //add cur_row together
379379 vpaddl.u8 q4, q1 //add ref_row together
380−
380+
381381 vabd.u8 q2, q0, q1 //abs_diff
382−
382+
383383 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16
384−
384+
385385 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
386−
387−
386+
387+
388388 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
389−
389+
390390 vld1.8 {q1}, [$1], $2 //load ref_row
391−
391+
392392 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
393−
393+
394394 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
395395 .endm
396396
@@ -398,18 +398,18 @@ WELS_ASM_FUNC_END · 1 unmodified line
398398 .macro SAD_SSD_BGD_16_RESET_16x16
399399 vld1.8 {q0}, [$0], $2 //load cur_row
400400 vld1.8 {q1}, [$1], $2 //load ref_row
401−
401+
402402 vpaddl.u8 q3, q0 //add cur_row together
403403 vpaddl.u8 q4, q1 //add ref_row together
404−
404+
405405 vabd.u8 q2, q0, q1 //abs_diff
406−
406+
407407 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16
408−
408+
409409 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
410−
410+
411411 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
412−
412+
413413 vld1.8 {q1}, [$1], $2 //load ref_row
414414
415415 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16
@@ -419,24 +419,24 @@ WELS_ASM_FUNC_END · 3 unmodified lines
419419
420420 //for each 8x16 block
421421 .macro SAD_SSD_BGD_CALC_8x16
422−
422+
423423 vpmax.u8 d10, d10, d11 //4 numbers
424424 vpmax.u8 d10, d10, d10 //2 numbers
425425 vpmax.u8 d10, d10, d10 //1 number1
426−
426+
427427 vmov $0, d10 //d26 d27 keeps the l_mad
428−
428+
429429 //p_sd8x8 fix me
430− vpaddl.u16 q3, q3
430+ vpaddl.u16 q3, q3
431431 vpaddl.u16 q4, q4
432−
432+
433433 vsub.i32 $1, q3, q4
434434 vpaddl.u32 $1, $1
435−
435+
436436 //psad8x8
437437 vpaddl.u16 $2, $2
438438 vpaddl.u32 $2, $2
439−
439+
440440 //psadframe
441441 vadd.i32 q12, $2
442442 .endm
@@ -451,9 +451,9 @@ WELS_ASM_FUNC_END · 8 unmodified lines
451451 SAD_SSD_BGD_16 $0, $1, $2, q6
452452 SAD_SSD_BGD_16 $0, $1, $2, q6
453453 SAD_SSD_BGD_16 $0, $1, $2, q6
454−
454+
455455 SAD_SSD_BGD_CALC_8x16 d26, q14, q6
456−
456+
457457 //for another 8x16
458458 SAD_SSD_BGD_16_RESET_8x8 $0, $1, $2, q7
459459 SAD_SSD_BGD_16 $0, $1, $2, q7
@@ -463,20 +463,20 @@ WELS_ASM_FUNC_END · 3 unmodified lines
463463 SAD_SSD_BGD_16 $0, $1, $2, q7
464464 SAD_SSD_BGD_16 $0, $1, $2, q7
465465 SAD_SSD_BGD_16_end $0, $2, q7
466−
466+
467467 SAD_SSD_BGD_CALC_8x16 d27, q15, q7
468468 .endm
469469
470−.macro SSD_SAD_SD_MAD_PADDL
470+.macro SSD_SAD_SD_MAD_PADDL
471471 vpaddl.s16 $0, $0
472− vpaddl.s32 $0, $0
473− vadd.i32 $1, $1, $2
472+ vpaddl.s32 $0, $0
473+ vadd.i32 $1, $1, $2
474474 .endm
475475 #else
476476 .macro SSD_MUL_SUM_16BYTES_RESET arg0, arg1, arg2, arg3
477477 vmull.u8 \arg3, \arg0, \arg0
478478 vpaddl.u16 \arg2, \arg3
479−
479+
480480 vmull.u8 \arg3, \arg1, \arg1
481481 vpadal.u16 \arg2, \arg3
482482 .endm
@@ -484,71 +484,71 @@ WELS_ASM_FUNC_END · 1 unmodified line
484484 .macro SSD_MUL_SUM_16BYTES arg0, arg1, arg2, arg3
485485 vmull.u8 \arg3, \arg0, \arg0
486486 vpadal.u16 \arg2, \arg3
487−
487+
488488 vmull.u8 \arg3, \arg1, \arg1
489489 vpadal.u16 \arg2, \arg3
490490 .endm
491491
492492 .macro SAD_SSD_BGD_16 arg0, arg1, arg2, arg3
493493 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
494−
494+
495495 vpadal.u8 q3, q0 //add cur_row together
496496 vpadal.u8 q4, q1 //add ref_row together
497−
497+
498498 vabd.u8 q2, q0, q1 //abs_diff
499−
499+
500500 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16
501−
501+
502502 vpadal.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
503−
503+
504504 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
505−
505+
506506 vld1.8 {q1}, [\arg1], \arg2 //load ref_row
507507 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
508−
508+
509509 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
510510 .endm
511511
512512 //the last row of a 16x16 block
513513 .macro SAD_SSD_BGD_16_end arg0, arg1, arg2
514514 vld1.8 {q0}, [\arg0], \arg1 //load cur_row
515−
515+
516516 vpadal.u8 q3, q0 //add cur_row together
517517 vpadal.u8 q4, q1 //add ref_row together
518−
518+
519519 vabd.u8 q2, q0, q1 //abs_diff
520−
520+
521521 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16
522−
522+
523523 vpadal.u8 \arg2, q2 //l_sad for 16 bytes reset for every 8x16
524−
524+
525525 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
526−
526+
527527 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
528−
528+
529529 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
530530 .endm
531531
532532 //for the begin of a 8x16 block, use some instructions to reset the register
533533 .macro SAD_SSD_BGD_16_RESET_8x8 arg0, arg1, arg2, arg3
534534 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
535−
535+
536536 vpaddl.u8 q3, q0 //add cur_row together
537537 vpaddl.u8 q4, q1 //add ref_row together
538−
538+
539539 vabd.u8 q2, q0, q1 //abs_diff
540−
540+
541541 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16
542−
542+
543543 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
544−
545−
544+
545+
546546 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
547−
547+
548548 vld1.8 {q1}, [\arg1], \arg2 //load ref_row
549−
549+
550550 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
551−
551+
552552 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
553553 .endm
554554
@@ -556,18 +556,18 @@ WELS_ASM_FUNC_END · 1 unmodified line
556556 .macro SAD_SSD_BGD_16_RESET_16x16 arg0, arg1, arg2, arg3
557557 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
558558 vld1.8 {q1}, [\arg1], \arg2 //load ref_row
559−
559+
560560 vpaddl.u8 q3, q0 //add cur_row together
561561 vpaddl.u8 q4, q1 //add ref_row together
562−
562+
563563 vabd.u8 q2, q0, q1 //abs_diff
564−
564+
565565 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16
566−
566+
567567 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
568−
568+
569569 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
570−
570+
571571 vld1.8 {q1}, [\arg1], \arg2 //load ref_row
572572
573573 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16
@@ -577,24 +577,24 @@ WELS_ASM_FUNC_END · 3 unmodified lines
577577
578578 //for each 8x16 block
579579 .macro SAD_SSD_BGD_CALC_8x16 arg0, arg1, arg2
580−
580+
581581 vpmax.u8 d10, d10, d11 //4 numbers
582582 vpmax.u8 d10, d10, d10 //2 numbers
583583 vpmax.u8 d10, d10, d10 //1 number1
584−
584+
585585 vmov \arg0, d10 //d26 d27 keeps the l_mad
586−
586+
587587 //p_sd8x8
588− vpaddl.u16 q3, q3
588+ vpaddl.u16 q3, q3
589589 vpaddl.u16 q4, q4
590−
590+
591591 vsub.i32 \arg1, q3, q4
592592 vpaddl.u32 \arg1, \arg1
593−
593+
594594 //psad8x8
595595 vpaddl.u16 \arg2, \arg2
596596 vpaddl.u32 \arg2, \arg2
597−
597+
598598 //psadframe
599599 vadd.i32 q12, \arg2
600600 .endm
@@ -609,9 +609,9 @@ WELS_ASM_FUNC_END · 8 unmodified lines
609609 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
610610 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
611611 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
612−
612+
613613 SAD_SSD_BGD_CALC_8x16 d26, q14, q6
614−
614+
615615 //for another 8x16
616616 SAD_SSD_BGD_16_RESET_8x8 \arg0, \arg1, \arg2, q7
617617 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
@@ -621,160 +621,160 @@ WELS_ASM_FUNC_END · 3 unmodified lines
621621 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
622622 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
623623 SAD_SSD_BGD_16_end \arg0, \arg2, q7
624−
624+
625625 SAD_SSD_BGD_CALC_8x16 d27, q15, q7
626626 .endm
627627
628−.macro SSD_SAD_SD_MAD_PADDL arg0, arg1, arg2
628+.macro SSD_SAD_SD_MAD_PADDL arg0, arg1, arg2
629629 vpaddl.s16 \arg0, \arg0
630− vpaddl.s32 \arg0, \arg0
631− vadd.i32 \arg1, \arg1, \arg2
630+ vpaddl.s32 \arg0, \arg0
631+ vadd.i32 \arg1, \arg1, \arg2
632632 .endm
633633 #endif
634634
635635
636−WELS_ASM_FUNC_BEGIN vaa_calc_sad_ssd_bgd_neon
636+WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon
637637 stmdb sp!, {r0-r12, r14}
638−
638+
639639 ldr r4, [sp, #56] //r4 keeps the pic_stride
640−
640+
641641 sub r5, r4, #1
642642 lsl r5, r5, #4 //r5 keeps the little step
643−
643+
644644 lsl r6, r4, #4
645645 sub r6, r2, r6 //r6 keeps the big step
646−
647−
646+
647+
648648 ldr r8, [sp, #64]//psad8x8
649649 ldr r9, [sp, #68]//psum16x16
650650 ldr r10, [sp, #72]//psqsum16x16
651651 ldr r11, [sp, #76]//psqdiff16x16
652652 ldr r12, [sp, #80]//p_sd8x8
653653 ldr r14, [sp, #84]//p_mad8x8
654−
654+
655655 vmov.i8 q12, #0
656−
656+
657657 vaa_calc_sad_ssd_bgd_height_loop:
658658
659659 mov r7, r2
660660 vaa_calc_sad_ssd_bgd_width_loop:
661−
661+
662662 //l_sd q14&q15, l_mad q13, l_sad q6 & q7, l_sqdiff q8, l_sum q9, l_sqsum q10
663663 SAD_SSD_BGD_16x16 r0,r1,r4
664−
664+
665665 //psad8x8
666666 vst4.32 {d12[0], d13[0], d14[0], d15[0]}, [r8]!
667−
667+
668668 sub r0, r0, r5 //jump to next 16x16
669669 sub r1, r1, r5 //jump to next 16x16
670−
670+
671671 //p_sd8x8
672672 vst4.32 {d28[0], d29[0],d30[0], d31[0]}, [r12]!
673673
674674 //p_mad8x8
675675 vst2.16 {d26[0], d27[0]}, [r14]!
676−
676+
677677 //psqdiff16x16
678− vpaddl.s32 q8, q8
678+ vpaddl.s32 q8, q8
679679 vadd.i32 d16, d16, d17
680−
680+
681681 vst1.32 {d16[0]}, [r11]! //psqdiff16x16
682−
682+
683683 //psum16x16
684684 SSD_SAD_SD_MAD_PADDL q9, d18, d19
685685 vst1.32 {d18[0]}, [r9]! //psum16x16
686686
687687 //psqsum16x16
688− vpaddl.s32 q10, q10
689− vadd.i32 d20, d20, d21
688+ vpaddl.s32 q10, q10
689+ vadd.i32 d20, d20, d21
690690 vst1.32 {d20[0]}, [r10]! //psqsum16x16
691−
691+
692692 subs r7, #16
693−
693+
694694 bne vaa_calc_sad_ssd_bgd_width_loop
695−
695+
696696 sub r0, r0, r6 //jump to next 16 x width
697697 sub r1, r1, r6 //jump to next 16 x width
698−
698+
699699 subs r3, #16
700700 bne vaa_calc_sad_ssd_bgd_height_loop
701−
701+
702702 //psadframe
703703 ldr r7, [sp, #60]//psadframe
704−
704+
705705 vadd.i32 d24, d24, d25
706706 vst1.32 {d24[0]}, [r7]
707−
707+
708708 ldmia sp!, {r0-r12, r14}
709−
709+
710710 WELS_ASM_FUNC_END
711711
712712
713713 #ifdef APPLE_IOS
714714 .macro SAD_VAR_16
715715 vld1.8 {q0}, [$0], $2 //load cur_row
716−
716+
717717 vpadal.u8 q3, q0 //add cur_row together
718718 vpadal.u8 q4, q1 //add ref_row together
719−
719+
720720 vabd.u8 q2, q0, q1 //abs_diff
721−
721+
722722 vpadal.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
723−
723+
724724 vld1.8 {q1}, [$1], $2
725−
725+
726726 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
727−
727+
728728 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
729729 .endm
730730
731731 .macro SAD_VAR_16_END
732732 vld1.8 {q0}, [$0], $1 //load cur_row
733−
733+
734734 vpadal.u8 q3, q0 //add cur_row together
735735 vpadal.u8 q4, q1 //add ref_row together
736−
736+
737737 vabd.u8 q2, q0, q1 //abs_diff
738−
738+
739739 vpadal.u8 $2, q2 //l_sad for 16 bytes reset for every 8x16
740−
740+
741741 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
742−
742+
743743 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
744744 .endm
745745
746746 .macro SAD_VAR_16_RESET_16x16
747747 vld1.8 {q0}, [$0], $2 //load cur_row
748748 vld1.8 {q1}, [$1], $2
749−
749+
750750 vpaddl.u8 q3, q0 //add cur_row together
751751 vpaddl.u8 q4, q1 //add ref_row together
752−
752+
753753 vabd.u8 q2, q0, q1 //abs_diff
754−
754+
755755 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
756−
756+
757757 vld1.8 {q1}, [$1], $2
758−
758+
759759 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16
760−
760+
761761 SSD_MUL_SUM_16BYTES_RESET d0,d1, q10, q11
762762 .endm
763763
764764 .macro SAD_VAR_16_RESET_8x8
765765 vld1.8 {q0}, [$0], $2 //load cur_row
766−
766+
767767 vpaddl.u8 q3, q0 //add cur_row together
768768 vpaddl.u8 q4, q1 //add ref_row together
769−
769+
770770 vabd.u8 q2, q0, q1 //abs_diff
771−
771+
772772 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
773−
773+
774774 vld1.8 {q1}, [$1], $2
775−
775+
776776 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
777−
777+
778778 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
779779 .endm
780780
@@ -788,7 +788,7 @@ WELS_ASM_FUNC_END · 7 unmodified lines
788788 SAD_VAR_16 $0, $1, $2, q6
789789 SAD_VAR_16 $0, $1, $2, q6
790790 SAD_VAR_16 $0, $1, $2, q6
791−
791+
792792 vpaddl.u16 q6, q6
793793 vpaddl.u32 q6, q6
794794 vadd.i32 q12, q6
@@ -802,42 +802,42 @@ WELS_ASM_FUNC_END · 7 unmodified lines
802802 SAD_VAR_16 $0, $1, $2, q7
803803 SAD_VAR_16 $0, $1, $2, q7
804804 SAD_VAR_16_END $0, $2, q7
805−
805+
806806 vpaddl.u16 q7, q7
807807 vpaddl.u32 q7, q7
808−
808+
809809 vadd.i32 q12, q7
810810 .endm
811811 #else
812812 .macro SAD_VAR_16 arg0, arg1, arg2, arg3
813813 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
814−
814+
815815 vpadal.u8 q3, q0 //add cur_row together
816816 vpadal.u8 q4, q1 //add ref_row together
817−
817+
818818 vabd.u8 q2, q0, q1 //abs_diff
819−
819+
820820 vpadal.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
821−
821+
822822 vld1.8 {q1}, [\arg1], \arg2
823−
823+
824824 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
825−
825+
826826 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
827827 .endm
828828
829829 .macro SAD_VAR_16_END arg0, arg1, arg2
830830 vld1.8 {q0}, [\arg0], \arg1 //load cur_row
831−
831+
832832 vpadal.u8 q3, q0 //add cur_row together
833833 vpadal.u8 q4, q1 //add ref_row together
834−
834+
835835 vabd.u8 q2, q0, q1 //abs_diff
836−
836+
837837 vpadal.u8 \arg2, q2 //l_sad for 16 bytes reset for every 8x16
838−
838+
839839 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
840−
840+
841841 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
842842 .endm
843843
@@ -845,35 +845,35 @@ WELS_ASM_FUNC_END · 1 unmodified line
845845 .macro SAD_VAR_16_RESET_16x16 arg0, arg1, arg2, arg3
846846 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
847847 vld1.8 {q1}, [\arg1], \arg2
848−
848+
849849 vpaddl.u8 q3, q0 //add cur_row together
850850 vpaddl.u8 q4, q1 //add ref_row together
851−
851+
852852 vabd.u8 q2, q0, q1 //abs_diff
853−
853+
854854 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
855−
855+
856856 vld1.8 {q1}, [\arg1], \arg2
857−
857+
858858 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16
859−
859+
860860 SSD_MUL_SUM_16BYTES_RESET d0,d1, q10, q11
861861 .endm
862862
863863 .macro SAD_VAR_16_RESET_8x8 arg0, arg1, arg2, arg3
864864 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
865−
865+
866866 vpaddl.u8 q3, q0 //add cur_row together
867867 vpaddl.u8 q4, q1 //add ref_row together
868−
868+
869869 vabd.u8 q2, q0, q1 //abs_diff
870−
870+
871871 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
872−
872+
873873 vld1.8 {q1}, [\arg1], \arg2
874−
874+
875875 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
876−
876+
877877 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
878878 .endm
879879
@@ -887,7 +887,7 @@ WELS_ASM_FUNC_END · 7 unmodified lines
887887 SAD_VAR_16 \arg0, \arg1, \arg2, q6
888888 SAD_VAR_16 \arg0, \arg1, \arg2, q6
889889 SAD_VAR_16 \arg0, \arg1, \arg2, q6
890−
890+
891891 vpaddl.u16 q6, q6
892892 vpaddl.u32 q6, q6
893893 vadd.i32 q12, q6
@@ -901,26 +901,26 @@ WELS_ASM_FUNC_END · 7 unmodified lines
901901 SAD_VAR_16 \arg0, \arg1, \arg2, q7
902902 SAD_VAR_16 \arg0, \arg1, \arg2, q7
903903 SAD_VAR_16_END \arg0, \arg2, q7
904−
904+
905905 vpaddl.u16 q7, q7
906906 vpaddl.u32 q7, q7
907−
907+
908908 vadd.i32 q12, q7
909909 .endm
910910 #endif
911911
912912
913−WELS_ASM_FUNC_BEGIN vaa_calc_sad_var_neon
913+WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon
914914 stmdb sp!, {r4-r11}
915−
915+
916916 ldr r4, [sp, #32] //r4 keeps the pic_stride
917−
917+
918918 sub r5, r4, #1
919919 lsl r5, r5, #4 //r5 keeps the little step
920−
920+
921921 lsl r6, r4, #4
922922 sub r6, r2, r6 //r6 keeps the big step
923−
923+
924924 ldr r7, [sp, #36] //psadframe
925925 ldr r8, [sp, #40] //psad8x8
926926 ldr r9, [sp, #44] //psum16x16
@@ -936,25 +936,25 @@ vaa_calc_sad_var_width_loop: · 9 unmodified lines
936936 SAD_VAR_16x16 r0,r1,r4
937937 //psad8x8
938938 vst4.32 {d12[0], d13[0], d14[0], d15[0]}, [r8]!
939−
939+
940940 sub r0, r0, r5 //jump to next 16x16
941941 sub r1, r1, r5 //jump to next 16x16
942−
942+
943943 //psum16x16
944944 SSD_SAD_SD_MAD_PADDL q9, d18, d19
945945 vst1.32 {d18[0]}, [r9]! //psum16x16
946−
946+
947947 //psqsum16x16
948− vpaddl.s32 q10, q10
948+ vpaddl.s32 q10, q10
949949 subs r11, #16
950− vadd.i32 d20, d20, d21
950+ vadd.i32 d20, d20, d21
951951 vst1.32 {d20[0]}, [r10]! //psqsum16x16
952−
952+
953953 bne vaa_calc_sad_var_width_loop
954−
954+
955955 sub r0, r0, r6 //jump to next 16 x width
956956 sub r1, r1, r6 //jump to next 16 x width
957−
957+
958958 subs r3, #16
959959 bne vaa_calc_sad_var_height_loop
960960
@@ -968,25 +968,25 @@ WELS_ASM_FUNC_END · 7 unmodified lines
968968 #ifdef APPLE_IOS
969969 .macro SAD_SSD_16
970970 SAD_VAR_16 $0, $1, $2, $3
971−
971+
972972 SSD_MUL_SUM_16BYTES d4,d5,q8, q11
973973 .endm
974974
975975 .macro SAD_SSD_16_END
976976 SAD_VAR_16_END $0, $1, $2, $3
977−
977+
978978 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
979979 .endm
980980
981981 .macro SAD_SSD_16_RESET_16x16
982982 SAD_VAR_16_RESET_16x16 $0, $1, $2, $3
983−
983+
984984 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
985985 .endm
986986
987987 .macro SAD_SSD_16_RESET_8x8
988988 SAD_VAR_16_RESET_8x8 $0, $1, $2, $3
989−
989+
990990 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
991991 .endm
992992
@@ -1000,7 +1000,7 @@ WELS_ASM_FUNC_END · 7 unmodified lines
10001000 SAD_SSD_16 $0, $1, $2, q6
10011001 SAD_SSD_16 $0, $1, $2, q6
10021002 SAD_SSD_16 $0, $1, $2, q6
1003−
1003+
10041004 vpaddl.u16 q6, q6
10051005 vpaddl.u32 q6, q6
10061006 vadd.i32 q12, q6
@@ -1014,34 +1014,34 @@ WELS_ASM_FUNC_END · 7 unmodified lines
10141014 SAD_SSD_16 $0, $1, $2, q7
10151015 SAD_SSD_16 $0, $1, $2, q7
10161016 SAD_SSD_16_END $0, $2, q7
1017−
1017+
10181018 vpaddl.u16 q7, q7
10191019 vpaddl.u32 q7, q7
1020−
1020+
10211021 vadd.i32 q12, q7
10221022 .endm
10231023 #else
10241024 .macro SAD_SSD_16 arg0, arg1, arg2, arg3
10251025 SAD_VAR_16 \arg0, \arg1, \arg2, \arg3
1026−
1026+
10271027 SSD_MUL_SUM_16BYTES d4,d5,q8, q11
10281028 .endm
10291029
10301030 .macro SAD_SSD_16_END arg0, arg1, arg2, arg3
10311031 SAD_VAR_16_END \arg0, \arg1, \arg2, \arg3
1032−
1032+
10331033 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
10341034 .endm
10351035
10361036 .macro SAD_SSD_16_RESET_16x16 arg0, arg1, arg2, arg3
10371037 SAD_VAR_16_RESET_16x16 \arg0, \arg1, \arg2, \arg3
1038−
1038+
10391039 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
10401040 .endm
10411041
10421042 .macro SAD_SSD_16_RESET_8x8 arg0, arg1, arg2, arg3
10431043 SAD_VAR_16_RESET_8x8 \arg0, \arg1, \arg2, \arg3
1044−
1044+
10451045 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
10461046 .endm
10471047
@@ -1055,7 +1055,7 @@ WELS_ASM_FUNC_END · 7 unmodified lines
10551055 SAD_SSD_16 \arg0, \arg1, \arg2, q6
10561056 SAD_SSD_16 \arg0, \arg1, \arg2, q6
10571057 SAD_SSD_16 \arg0, \arg1, \arg2, q6
1058−
1058+
10591059 vpaddl.u16 q6, q6
10601060 vpaddl.u32 q6, q6
10611061 vadd.i32 q12, q6
@@ -1069,26 +1069,26 @@ WELS_ASM_FUNC_END · 7 unmodified lines
10691069 SAD_SSD_16 \arg0, \arg1, \arg2, q7
10701070 SAD_SSD_16 \arg0, \arg1, \arg2, q7
10711071 SAD_SSD_16_END \arg0, \arg2, q7
1072−
1072+
10731073 vpaddl.u16 q7, q7
10741074 vpaddl.u32 q7, q7
1075−
1075+
10761076 vadd.i32 q12, q7
10771077 .endm
10781078 #endif
10791079
10801080
1081−WELS_ASM_FUNC_BEGIN vaa_calc_sad_ssd_neon
1081+WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon
10821082 stmdb sp!, {r4-r12}
10831083
10841084 ldr r4, [sp, #36] //r4 keeps the pic_stride
1085−
1085+
10861086 sub r5, r4, #1
10871087 lsl r5, r5, #4 //r5 keeps the little step
1088−
1088+
10891089 lsl r6, r4, #4
10901090 sub r6, r2, r6 //r6 keeps the big step
1091−
1091+
10921092 ldr r7, [sp, #40] //psadframe
10931093 ldr r8, [sp, #44] //psad8x8
10941094 ldr r9, [sp, #48] //psum16x16
@@ -1105,32 +1105,32 @@ vaa_calc_sad_ssd_width_loop: · 10 unmodified lines
11051105 SAD_SSD_16x16 r0,r1,r4
11061106 //psad8x8
11071107 vst4.32 {d12[0], d13[0], d14[0], d15[0]}, [r8]!
1108−
1108+
11091109 sub r0, r0, r5 //jump to next 16x16
11101110 sub r1, r1, r5 //jump to next 16x16
1111−
1111+
11121112 //psum16x16
11131113 vpaddl.s16 q9, q9
1114− vpaddl.s32 q9, q9
1114+ vpaddl.s32 q9, q9
11151115 vadd.i32 d18, d18, d19
11161116 vst1.32 {d18[0]}, [r9]! //psum16x16
11171117
11181118 //psqsum16x16
1119− vpaddl.s32 q10, q10
1120− vadd.i32 d20, d20, d21
1119+ vpaddl.s32 q10, q10
1120+ vadd.i32 d20, d20, d21
11211121 vst1.32 {d20[0]}, [r10]! //psqsum16x16
1122−
1122+
11231123 //psqdiff16x16
1124− vpaddl.s32 q8, q8
1124+ vpaddl.s32 q8, q8
11251125 vadd.i32 d16, d16, d17
11261126 subs r12, #16
11271127 vst1.32 {d16[0]}, [r11]! //psqdiff16x16
1128−
1128+
11291129 bne vaa_calc_sad_ssd_width_loop
1130−
1130+
11311131 sub r0, r0, r6 //jump to next 16 x width
11321132 sub r1, r1, r6 //jump to next 16 x width
1133−
1133+
11341134 subs r3, #16
11351135 bne vaa_calc_sad_ssd_height_loop
11361136
@@ -1140,4 +1140,4 @@ vaa_calc_sad_ssd_width_loop: · 3 unmodified lines
11401140 ldmia sp!, {r4-r12}
11411141 WELS_ASM_FUNC_END
11421142
1143−#endif
1143+#endif
codec/processing/src/downsample/downsample.cpp+10−0
@@ -75,6 +75,16 @@ void CDownsampling::InitDownsampleFuncs (SDownsampleFuncs& sDownsampleFunc, int · 74 unmodified lines
7575 }
7676 #endif//X86_ASM
7777
78+#if defined(HAVE_NEON)
79+ if (iCpuFlag & WELS_CPU_NEON) {
80+ sDownsampleFunc.pfHalfAverage[0] = DyadicBilinearDownsamplerWidthx32_neon;
81+ sDownsampleFunc.pfHalfAverage[1] = DyadicBilinearDownsampler_neon;
82+ sDownsampleFunc.pfHalfAverage[2] = DyadicBilinearDownsampler_neon;
83+ sDownsampleFunc.pfHalfAverage[3] = DyadicBilinearDownsampler_neon;
84+ sDownsampleFunc.pfGeneralRatioChroma = GeneralBilinearAccurateDownsamplerWrap_neon;
85+ sDownsampleFunc.pfGeneralRatioLuma = GeneralBilinearAccurateDownsamplerWrap_neon;
86+ }
87+#endif
7888 }
7989
8090 EResult CDownsampling::Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pDstPixMap) {
codec/processing/src/downsample/downsample.h+13−0
@@ -103,7 +103,20 @@ void GeneralBilinearAccurateDownsampler_sse2 (uint8_t* pDst, const int32_t kiDst · 102 unmodified lines
103103 WELSVP_EXTERN_C_END
104104 #endif
105105
106+#ifdef HAVE_NEON
107+WELSVP_EXTERN_C_BEGIN
108+// iSrcWidth no limitation
109+HalveDownsampleFunc DyadicBilinearDownsampler_neon;
110+// iSrcWidth = x32 pixels
111+HalveDownsampleFunc DyadicBilinearDownsamplerWidthx32_neon;
112+
113+GeneralDownsampleFunc GeneralBilinearAccurateDownsamplerWrap_neon;
114+
115+void GeneralBilinearAccurateDownsampler_neon( uint8_t* pDst, const int32_t kiDstStride, const int32_t kiDstWidth, const int32_t kiDstHeight,
116+ uint8_t* pSrc, const int32_t kiSrcStride, const uint32_t kuiScaleX, const uint32_t kuiScaleY);
106117
118+WELSVP_EXTERN_C_END
119+#endif
107120
108121
109122 class CDownsampling : public IStrategy {
codec/processing/src/downsample/downsamplefuncs.cpp+10−0
@@ -229,4 +229,14 @@ void GeneralBilinearAccurateDownsampler_c (uint8_t* pDst, const int32_t kiDstStr · 228 unmodified lines
229229 //}
230230 #endif //X86_ASM
231231
232+#ifdef HAVE_NEON
233+void GeneralBilinearAccurateDownsamplerWrap_neon(uint8_t* pDst, const int32_t kiDstStride, const int32_t kiDstWidth, const int32_t kiDstHeight,
234+ uint8_t* pSrc, const int32_t kiSrcStride, const int32_t kiSrcWidth, const int32_t kiSrcHeight) {
235+ const int32_t kiScaleBit = 15;
236+ const uint32_t kuiScale = (1 << kiScaleBit);
237+ uint32_t uiScalex = (uint32_t)((float)kiSrcWidth / (float)kiDstWidth * kuiScale);
238+ uint32_t uiScaley = (uint32_t)((float)kiSrcHeight / (float)kiDstHeight * kuiScale);
239+ GeneralBilinearAccurateDownsampler_neon(pDst, kiDstStride, kiDstWidth, kiDstHeight, pSrc, kiSrcStride, uiScalex, uiScaley);
240+}
241+#endif
232242 WELSVP_NAMESPACE_END
codec/processing/src/scenechangedetection/SceneChangeDetection.cpp+6−0
@@ -130,6 +130,12 @@ void CSceneChangeDetection::InitSadFuncs (SadFuncPtr& pfSad, int32_t iCpuFlag) · 129 unmodified lines
130130 pfSad = WelsSampleSad8x8_sse21;
131131 }
132132 #endif
133+
134+#ifdef HAVE_NEON
135+ if (iCpuFlag & WELS_CPU_NEON) {
136+ pfSad = WelsSampleSad8x8_neon;
137+ }
138+#endif
133139 }
134140
135141
codec/processing/src/scenechangedetection/SceneChangeDetectionCommon.h+6−0
@@ -60,6 +60,12 @@ SadFunc WelsSampleSad8x8_sse21; · 59 unmodified lines
6060 WELSVP_EXTERN_C_END
6161 #endif
6262
63+#ifdef HAVE_NEON
64+WELSVP_EXTERN_C_BEGIN
65+SadFunc WelsSampleSad8x8_neon;
66+WELSVP_EXTERN_C_END
67+#endif
68+
6369 WELSVP_NAMESPACE_END
6470
6571 #endif
codec/processing/src/vaacalc/vaacalculation.cpp+9−0
@@ -65,6 +65,15 @@ void CVAACalculation::InitVaaFuncs (SVaaFuncs& sVaaFuncs, int32_t iCpuFlag) { · 64 unmodified lines
6565 sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_sse2;
6666 }
6767 #endif//X86_ASM
68+#ifdef HAVE_NEON
69+ if ((iCpuFlag & WELS_CPU_NEON) == WELS_CPU_NEON) {
70+ sVaaFuncs.pfVAACalcSad = VAACalcSad_neon;
71+ sVaaFuncs.pfVAACalcSadBgd = VAACalcSadBgd_neon;
72+ sVaaFuncs.pfVAACalcSadSsd = VAACalcSadSsd_neon;
73+ sVaaFuncs.pfVAACalcSadSsdBgd = VAACalcSadSsdBgd_neon;
74+ sVaaFuncs.pfVAACalcSadVar = VAACalcSadVar_neon;
75+ }
76+#endif//X86_ASM
6877 }
6978
7079 EResult CVAACalculation::Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap) {
codec/processing/src/vaacalc/vaacalculation.h+10−0
@@ -103,6 +103,16 @@ VAACalcSadSsdFunc VAACalcSadSsd_sse2; · 102 unmodified lines
103103 WELSVP_EXTERN_C_END
104104 #endif
105105
106+#ifdef HAVE_NEON
107+WELSVP_EXTERN_C_BEGIN
108+VAACalcSadBgdFunc VAACalcSadBgd_neon;
109+VAACalcSadSsdBgdFunc VAACalcSadSsdBgd_neon;
110+VAACalcSadFunc VAACalcSad_neon;
111+VAACalcSadVarFunc VAACalcSadVar_neon;
112+VAACalcSadSsdFunc VAACalcSadSsd_neon;
113+WELSVP_EXTERN_C_END
114+#endif
115+
106116 class CVAACalculation : public IStrategy {
107117 public:
108118 CVAACalculation (int32_t iCpuFlag);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t