@scrypted/libav 1.0.180 → 1.0.181

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/_openh264install/include/wels/codec_api.h +592 -0
  2. package/_openh264install/include/wels/codec_app_def.h +820 -0
  3. package/_openh264install/include/wels/codec_def.h +216 -0
  4. package/_openh264install/include/wels/codec_ver.h +15 -0
  5. package/_openh264install/lib/libopenh264.a +0 -0
  6. package/_openh264install/lib/pkgconfig/openh264.pc +10 -0
  7. package/binding.gyp +3 -0
  8. package/openh264/.reviewboardrc +3 -0
  9. package/openh264/.travis.yml +42 -0
  10. package/openh264/CODING_STYLE +8 -0
  11. package/openh264/CONTRIBUTORS +55 -0
  12. package/openh264/LICENSE +23 -0
  13. package/openh264/Makefile +408 -0
  14. package/openh264/README.md +197 -0
  15. package/openh264/RELEASES +467 -0
  16. package/openh264/SECURITY.md +16 -0
  17. package/openh264/autotest/codec_comparision/run_MultiCodecComparision.sh +431 -0
  18. package/openh264/autotest/performanceTest/android/run_AutoTest_android.sh +180 -0
  19. package/openh264/autotest/performanceTest/ios/fruitstrap +0 -0
  20. package/openh264/autotest/performanceTest/ios/iFileTransfer +0 -0
  21. package/openh264/autotest/performanceTest/ios/run_AutoTest_ios.sh +193 -0
  22. package/openh264/autotest/performanceTest/ios/uiascript.js +19 -0
  23. package/openh264/autotest/performanceTest/parsePerfData.sh +107 -0
  24. package/openh264/autotest/performanceTest/run_perfTest.sh +122 -0
  25. package/openh264/autotest/unitTest/android/run_AutoTest_android.sh +112 -0
  26. package/openh264/autotest/unitTest/ios/run_AutoTest_ios.sh +167 -0
  27. package/openh264/autotest/unitTest/run_ParseUTxml.sh +70 -0
  28. package/openh264/autotest/unitTest/run_unitTest.sh +98 -0
  29. package/openh264/build.gradle +30 -0
  30. package/openh264/code-coverage.sh +6 -0
  31. package/openh264/codec/api/meson.build +1 -0
  32. package/openh264/codec/api/wels/codec_api.h +592 -0
  33. package/openh264/codec/api/wels/codec_app_def.h +820 -0
  34. package/openh264/codec/api/wels/codec_def.h +216 -0
  35. package/openh264/codec/api/wels/codec_ver.h +15 -0
  36. package/openh264/codec/api/wels/meson.build +9 -0
  37. package/openh264/codec/common/arm/arm_arch_common_macro.S +83 -0
  38. package/openh264/codec/common/arm/copy_mb_neon.S +161 -0
  39. package/openh264/codec/common/arm/deblocking_neon.S +857 -0
  40. package/openh264/codec/common/arm/expand_picture_neon.S +154 -0
  41. package/openh264/codec/common/arm/intra_pred_common_neon.S +82 -0
  42. package/openh264/codec/common/arm/mc_neon.S +2283 -0
  43. package/openh264/codec/common/arm64/arm_aarch64_common.h +85 -0
  44. package/openh264/codec/common/arm64/arm_arch64_common_macro.S +79 -0
  45. package/openh264/codec/common/arm64/copy_mb_aarch64_neon.S +202 -0
  46. package/openh264/codec/common/arm64/deblocking_aarch64_neon.S +852 -0
  47. package/openh264/codec/common/arm64/expand_picture_aarch64_neon.S +150 -0
  48. package/openh264/codec/common/arm64/intra_pred_common_aarch64_neon.S +58 -0
  49. package/openh264/codec/common/arm64/mc_aarch64_neon.S +2614 -0
  50. package/openh264/codec/common/generate_version.sh +28 -0
  51. package/openh264/codec/common/inc/WelsList.h +287 -0
  52. package/openh264/codec/common/inc/WelsLock.h +97 -0
  53. package/openh264/codec/common/inc/WelsTask.h +75 -0
  54. package/openh264/codec/common/inc/WelsTaskThread.h +83 -0
  55. package/openh264/codec/common/inc/WelsThread.h +106 -0
  56. package/openh264/codec/common/inc/WelsThreadLib.h +151 -0
  57. package/openh264/codec/common/inc/WelsThreadPool.h +124 -0
  58. package/openh264/codec/common/inc/asmdefs_mmi.h +345 -0
  59. package/openh264/codec/common/inc/copy_mb.h +103 -0
  60. package/openh264/codec/common/inc/cpu.h +81 -0
  61. package/openh264/codec/common/inc/cpu_core.h +103 -0
  62. package/openh264/codec/common/inc/crt_util_safe_x.h +104 -0
  63. package/openh264/codec/common/inc/deblocking_common.h +124 -0
  64. package/openh264/codec/common/inc/expand_pic.h +107 -0
  65. package/openh264/codec/common/inc/golomb_common.h +166 -0
  66. package/openh264/codec/common/inc/intra_pred_common.h +86 -0
  67. package/openh264/codec/common/inc/loongson_intrinsics.h +1919 -0
  68. package/openh264/codec/common/inc/ls_defines.h +130 -0
  69. package/openh264/codec/common/inc/macros.h +329 -0
  70. package/openh264/codec/common/inc/mc.h +407 -0
  71. package/openh264/codec/common/inc/measure_time.h +88 -0
  72. package/openh264/codec/common/inc/memory_align.h +116 -0
  73. package/openh264/codec/common/inc/msa_macros.h +2393 -0
  74. package/openh264/codec/common/inc/sad_common.h +139 -0
  75. package/openh264/codec/common/inc/typedefs.h +86 -0
  76. package/openh264/codec/common/inc/utils.h +95 -0
  77. package/openh264/codec/common/inc/version.h +10 -0
  78. package/openh264/codec/common/inc/version_gen.h.template +6 -0
  79. package/openh264/codec/common/inc/welsCodecTrace.h +64 -0
  80. package/openh264/codec/common/inc/wels_common_defs.h +373 -0
  81. package/openh264/codec/common/inc/wels_const_common.h +63 -0
  82. package/openh264/codec/common/loongarch/copy_mb_lsx.c +194 -0
  83. package/openh264/codec/common/loongarch/deblock_lsx.c +1489 -0
  84. package/openh264/codec/common/loongarch/intra_pred_com_lasx.c +112 -0
  85. package/openh264/codec/common/loongarch/intra_pred_com_lsx.c +91 -0
  86. package/openh264/codec/common/loongarch/mc_chroma_lsx.c +192 -0
  87. package/openh264/codec/common/loongarch/mc_horver_lsx.c +654 -0
  88. package/openh264/codec/common/loongarch/satd_sad_lasx.c +568 -0
  89. package/openh264/codec/common/meson.build +84 -0
  90. package/openh264/codec/common/mips/copy_mb_mmi.c +477 -0
  91. package/openh264/codec/common/mips/copy_mb_msa.c +80 -0
  92. package/openh264/codec/common/mips/deblock_mmi.c +2826 -0
  93. package/openh264/codec/common/mips/deblock_msa.c +1024 -0
  94. package/openh264/codec/common/mips/expand_picture_mmi.c +673 -0
  95. package/openh264/codec/common/mips/intra_pred_com_mmi.c +548 -0
  96. package/openh264/codec/common/mips/satd_sad_mmi.c +2154 -0
  97. package/openh264/codec/common/targets.mk +136 -0
  98. package/openh264/codec/common/x86/asm_inc.asm +743 -0
  99. package/openh264/codec/common/x86/cpuid.asm +263 -0
  100. package/openh264/codec/common/x86/dct.asm +1036 -0
  101. package/openh264/codec/common/x86/deblock.asm +848 -0
  102. package/openh264/codec/common/x86/expand_picture.asm +728 -0
  103. package/openh264/codec/common/x86/intra_pred_com.asm +117 -0
  104. package/openh264/codec/common/x86/mb_copy.asm +615 -0
  105. package/openh264/codec/common/x86/mc_chroma.asm +313 -0
  106. package/openh264/codec/common/x86/mc_luma.asm +4490 -0
  107. package/openh264/codec/common/x86/satd_sad.asm +2734 -0
  108. package/openh264/codec/common/x86/vaa.asm +411 -0
  109. package/openh264/codec/console/common/inc/read_config.h +68 -0
  110. package/openh264/codec/console/common/meson.build +12 -0
  111. package/openh264/codec/console/common/targets.mk +20 -0
  112. package/openh264/codec/console/dec/inc/d3d9_utils.h +148 -0
  113. package/openh264/codec/console/dec/meson.build +15 -0
  114. package/openh264/codec/console/dec/targets.mk +20 -0
  115. package/openh264/codec/console/enc/meson.build +9 -0
  116. package/openh264/codec/console/enc/targets.mk +19 -0
  117. package/openh264/codec/console/meson.build +3 -0
  118. package/openh264/codec/decoder/core/arm/block_add_neon.S +129 -0
  119. package/openh264/codec/decoder/core/arm/intra_pred_neon.S +635 -0
  120. package/openh264/codec/decoder/core/arm64/block_add_aarch64_neon.S +131 -0
  121. package/openh264/codec/decoder/core/arm64/intra_pred_aarch64_neon.S +524 -0
  122. package/openh264/codec/decoder/core/inc/au_parser.h +199 -0
  123. package/openh264/codec/decoder/core/inc/bit_stream.h +62 -0
  124. package/openh264/codec/decoder/core/inc/cabac_decoder.h +111 -0
  125. package/openh264/codec/decoder/core/inc/deblocking.h +118 -0
  126. package/openh264/codec/decoder/core/inc/dec_frame.h +156 -0
  127. package/openh264/codec/decoder/core/inc/dec_golomb.h +344 -0
  128. package/openh264/codec/decoder/core/inc/decode_mb_aux.h +83 -0
  129. package/openh264/codec/decoder/core/inc/decode_slice.h +104 -0
  130. package/openh264/codec/decoder/core/inc/decoder.h +186 -0
  131. package/openh264/codec/decoder/core/inc/decoder_context.h +590 -0
  132. package/openh264/codec/decoder/core/inc/decoder_core.h +206 -0
  133. package/openh264/codec/decoder/core/inc/error_code.h +222 -0
  134. package/openh264/codec/decoder/core/inc/error_concealment.h +68 -0
  135. package/openh264/codec/decoder/core/inc/fmo.h +114 -0
  136. package/openh264/codec/decoder/core/inc/get_intra_predictor.h +191 -0
  137. package/openh264/codec/decoder/core/inc/manage_dec_ref.h +62 -0
  138. package/openh264/codec/decoder/core/inc/mb_cache.h +80 -0
  139. package/openh264/codec/decoder/core/inc/memmgr_nal_unit.h +66 -0
  140. package/openh264/codec/decoder/core/inc/mv_pred.h +195 -0
  141. package/openh264/codec/decoder/core/inc/nal_prefix.h +56 -0
  142. package/openh264/codec/decoder/core/inc/nalu.h +79 -0
  143. package/openh264/codec/decoder/core/inc/parameter_sets.h +217 -0
  144. package/openh264/codec/decoder/core/inc/parse_mb_syn_cabac.h +89 -0
  145. package/openh264/codec/decoder/core/inc/parse_mb_syn_cavlc.h +137 -0
  146. package/openh264/codec/decoder/core/inc/pic_queue.h +62 -0
  147. package/openh264/codec/decoder/core/inc/picture.h +112 -0
  148. package/openh264/codec/decoder/core/inc/rec_mb.h +104 -0
  149. package/openh264/codec/decoder/core/inc/slice.h +208 -0
  150. package/openh264/codec/decoder/core/inc/vlc_decoder.h +177 -0
  151. package/openh264/codec/decoder/core/inc/wels_common_basis.h +317 -0
  152. package/openh264/codec/decoder/core/inc/wels_const.h +65 -0
  153. package/openh264/codec/decoder/core/inc/wels_decoder_thread.h +170 -0
  154. package/openh264/codec/decoder/core/loongarch/mb_aux_lsx.c +296 -0
  155. package/openh264/codec/decoder/core/mips/dct_mmi.c +786 -0
  156. package/openh264/codec/decoder/core/x86/dct.asm +72 -0
  157. package/openh264/codec/decoder/core/x86/intra_pred.asm +1456 -0
  158. package/openh264/codec/decoder/meson.build +69 -0
  159. package/openh264/codec/decoder/plus/inc/welsDecoderExt.h +170 -0
  160. package/openh264/codec/decoder/targets.mk +115 -0
  161. package/openh264/codec/encoder/core/arm/intra_pred_neon.S +589 -0
  162. package/openh264/codec/encoder/core/arm/intra_pred_sad_3_opt_neon.S +735 -0
  163. package/openh264/codec/encoder/core/arm/memory_neon.S +62 -0
  164. package/openh264/codec/encoder/core/arm/pixel_neon.S +882 -0
  165. package/openh264/codec/encoder/core/arm/reconstruct_neon.S +903 -0
  166. package/openh264/codec/encoder/core/arm/svc_motion_estimation.S +366 -0
  167. package/openh264/codec/encoder/core/arm64/intra_pred_aarch64_neon.S +505 -0
  168. package/openh264/codec/encoder/core/arm64/intra_pred_sad_3_opt_aarch64_neon.S +611 -0
  169. package/openh264/codec/encoder/core/arm64/memory_aarch64_neon.S +63 -0
  170. package/openh264/codec/encoder/core/arm64/pixel_aarch64_neon.S +621 -0
  171. package/openh264/codec/encoder/core/arm64/reconstruct_aarch64_neon.S +717 -0
  172. package/openh264/codec/encoder/core/arm64/svc_motion_estimation_aarch64_neon.S +350 -0
  173. package/openh264/codec/encoder/core/inc/as264_common.h +138 -0
  174. package/openh264/codec/encoder/core/inc/au_set.h +152 -0
  175. package/openh264/codec/encoder/core/inc/deblocking.h +92 -0
  176. package/openh264/codec/encoder/core/inc/decode_mb_aux.h +112 -0
  177. package/openh264/codec/encoder/core/inc/dq_map.h +58 -0
  178. package/openh264/codec/encoder/core/inc/encode_mb_aux.h +199 -0
  179. package/openh264/codec/encoder/core/inc/encoder.h +148 -0
  180. package/openh264/codec/encoder/core/inc/encoder_context.h +240 -0
  181. package/openh264/codec/encoder/core/inc/extern.h +124 -0
  182. package/openh264/codec/encoder/core/inc/get_intra_predictor.h +186 -0
  183. package/openh264/codec/encoder/core/inc/mb_cache.h +141 -0
  184. package/openh264/codec/encoder/core/inc/md.h +181 -0
  185. package/openh264/codec/encoder/core/inc/mt_defs.h +91 -0
  186. package/openh264/codec/encoder/core/inc/mv_pred.h +191 -0
  187. package/openh264/codec/encoder/core/inc/nal_encap.h +143 -0
  188. package/openh264/codec/encoder/core/inc/param_svc.h +576 -0
  189. package/openh264/codec/encoder/core/inc/parameter_sets.h +181 -0
  190. package/openh264/codec/encoder/core/inc/paraset_strategy.h +310 -0
  191. package/openh264/codec/encoder/core/inc/picture.h +137 -0
  192. package/openh264/codec/encoder/core/inc/picture_handle.h +66 -0
  193. package/openh264/codec/encoder/core/inc/rc.h +284 -0
  194. package/openh264/codec/encoder/core/inc/ref_list_mgr_svc.h +148 -0
  195. package/openh264/codec/encoder/core/inc/sample.h +154 -0
  196. package/openh264/codec/encoder/core/inc/set_mb_syn_cabac.h +127 -0
  197. package/openh264/codec/encoder/core/inc/set_mb_syn_cavlc.h +92 -0
  198. package/openh264/codec/encoder/core/inc/slice.h +212 -0
  199. package/openh264/codec/encoder/core/inc/slice_multi_threading.h +97 -0
  200. package/openh264/codec/encoder/core/inc/stat.h +102 -0
  201. package/openh264/codec/encoder/core/inc/svc_base_layer_md.h +102 -0
  202. package/openh264/codec/encoder/core/inc/svc_enc_frame.h +136 -0
  203. package/openh264/codec/encoder/core/inc/svc_enc_golomb.h +123 -0
  204. package/openh264/codec/encoder/core/inc/svc_enc_macroblock.h +82 -0
  205. package/openh264/codec/encoder/core/inc/svc_enc_slice_segment.h +212 -0
  206. package/openh264/codec/encoder/core/inc/svc_encode_mb.h +63 -0
  207. package/openh264/codec/encoder/core/inc/svc_encode_slice.h +184 -0
  208. package/openh264/codec/encoder/core/inc/svc_mode_decision.h +94 -0
  209. package/openh264/codec/encoder/core/inc/svc_motion_estimate.h +369 -0
  210. package/openh264/codec/encoder/core/inc/svc_set_mb_syn.h +70 -0
  211. package/openh264/codec/encoder/core/inc/svc_set_mb_syn_cavlc.h +67 -0
  212. package/openh264/codec/encoder/core/inc/vlc_encoder.h +92 -0
  213. package/openh264/codec/encoder/core/inc/wels_common_basis.h +160 -0
  214. package/openh264/codec/encoder/core/inc/wels_const.h +174 -0
  215. package/openh264/codec/encoder/core/inc/wels_func_ptr_def.h +300 -0
  216. package/openh264/codec/encoder/core/inc/wels_preprocess.h +251 -0
  217. package/openh264/codec/encoder/core/inc/wels_task_base.h +79 -0
  218. package/openh264/codec/encoder/core/inc/wels_task_encoder.h +142 -0
  219. package/openh264/codec/encoder/core/inc/wels_task_management.h +135 -0
  220. package/openh264/codec/encoder/core/inc/wels_transpose_matrix.h +58 -0
  221. package/openh264/codec/encoder/core/loongarch/dct_lasx.c +452 -0
  222. package/openh264/codec/encoder/core/loongarch/get_intra_predictor_lsx.c +166 -0
  223. package/openh264/codec/encoder/core/loongarch/quant_lsx.c +153 -0
  224. package/openh264/codec/encoder/core/loongarch/sample_lasx.c +87 -0
  225. package/openh264/codec/encoder/core/loongarch/svc_motion_estimate_lsx.c +104 -0
  226. package/openh264/codec/encoder/core/mips/dct_mmi.c +529 -0
  227. package/openh264/codec/encoder/core/mips/quant_mmi.c +553 -0
  228. package/openh264/codec/encoder/core/mips/score_mmi.c +324 -0
  229. package/openh264/codec/encoder/core/x86/coeff.asm +695 -0
  230. package/openh264/codec/encoder/core/x86/dct.asm +108 -0
  231. package/openh264/codec/encoder/core/x86/intra_pred.asm +1129 -0
  232. package/openh264/codec/encoder/core/x86/matrix_transpose.asm +395 -0
  233. package/openh264/codec/encoder/core/x86/memzero.asm +132 -0
  234. package/openh264/codec/encoder/core/x86/quant.asm +507 -0
  235. package/openh264/codec/encoder/core/x86/sample_sc.asm +1829 -0
  236. package/openh264/codec/encoder/core/x86/score.asm +363 -0
  237. package/openh264/codec/encoder/meson.build +98 -0
  238. package/openh264/codec/encoder/plus/inc/welsEncoderExt.h +129 -0
  239. package/openh264/codec/encoder/targets.mk +146 -0
  240. package/openh264/codec/meson.build +9 -0
  241. package/openh264/codec/processing/interface/IWelsVP.h +310 -0
  242. package/openh264/codec/processing/meson.build +71 -0
  243. package/openh264/codec/processing/targets.mk +117 -0
  244. package/openh264/docs/doxygen/Doxyfile +1865 -0
  245. package/openh264/docs/doxygen/Home.rest +25 -0
  246. package/openh264/docs/doxygen/ISVCDecoder.rest +19 -0
  247. package/openh264/docs/doxygen/ISVCEncoder.rest +16 -0
  248. package/openh264/docs/doxygen/UsageExampleForDecoder.rest +10 -0
  249. package/openh264/docs/doxygen/UsageExampleForEncoder.rest +15 -0
  250. package/openh264/docs/doxygen2rst.py +619 -0
  251. package/openh264/gmpopenh264.info +4 -0
  252. package/openh264/gradlew +172 -0
  253. package/openh264/meson.build +218 -0
  254. package/openh264/meson_options.txt +1 -0
  255. package/openh264/module/RefCounted.h +141 -0
  256. package/openh264/module/gmp-openh264.cpp +1196 -0
  257. package/openh264/module/targets.mk +14 -0
  258. package/openh264/module/task_utils.h +38 -0
  259. package/openh264/module/task_utils.py +207 -0
  260. package/openh264/module/task_utils_generated.h +2087 -0
  261. package/openh264/openh264.def +7 -0
  262. package/openh264/openh264.pc.in +10 -0
  263. package/openh264/openh264.rc +61 -0
  264. package/openh264/openh264.rc.template +61 -0
  265. package/openh264/res/Adobe_PDF_sample_a_1024x768_50Frms.264 +0 -0
  266. package/openh264/res/BA1_FT_C.264 +0 -0
  267. package/openh264/res/BA1_Sony_D.jsv +0 -0
  268. package/openh264/res/BAMQ1_JVC_C.264 +0 -0
  269. package/openh264/res/BAMQ2_JVC_C.264 +0 -0
  270. package/openh264/res/BANM_MW_D.264 +0 -0
  271. package/openh264/res/BASQP1_Sony_C.jsv +0 -0
  272. package/openh264/res/BA_MW_D.264 +0 -0
  273. package/openh264/res/BA_MW_D_IDR_LOST.264 +0 -0
  274. package/openh264/res/BA_MW_D_P_LOST.264 +0 -0
  275. package/openh264/res/CI1_FT_B.264 +0 -0
  276. package/openh264/res/CI_MW_D.264 +0 -0
  277. package/openh264/res/CVFC1_Sony_C.jsv +0 -0
  278. package/openh264/res/CVPCMNL1_SVA_C.264 +0 -0
  279. package/openh264/res/CiscoVT2people_160x96_6fps.yuv +1 -0
  280. package/openh264/res/CiscoVT2people_320x192_12fps.yuv +1 -0
  281. package/openh264/res/Cisco_Absolute_Power_1280x720_30fps.yuv +3607 -0
  282. package/openh264/res/Cisco_Adobe_PDF_sample_a_1024x768_CAVLC_Bframe_9.264 +0 -0
  283. package/openh264/res/Cisco_Men_whisper_640x320_CABAC_Bframe_9.264 +0 -0
  284. package/openh264/res/Cisco_Men_whisper_640x320_CAVLC_Bframe_9.264 +0 -0
  285. package/openh264/res/Error_I_P.264 +0 -0
  286. package/openh264/res/LS_SVA_D.264 +0 -0
  287. package/openh264/res/MIDR_MW_D.264 +0 -0
  288. package/openh264/res/MPS_MW_A.264 +0 -0
  289. package/openh264/res/MR1_BT_A.h264 +0 -0
  290. package/openh264/res/MR1_MW_A.264 +0 -0
  291. package/openh264/res/MR2_MW_A.264 +0 -0
  292. package/openh264/res/MR2_TANDBERG_E.264 +0 -0
  293. package/openh264/res/NL1_Sony_D.jsv +0 -0
  294. package/openh264/res/NLMQ1_JVC_C.264 +0 -0
  295. package/openh264/res/NLMQ2_JVC_C.264 +0 -0
  296. package/openh264/res/NRF_MW_E.264 +0 -0
  297. package/openh264/res/QCIF_2P_I_allIPCM.264 +0 -0
  298. package/openh264/res/SVA_BA1_B.264 +0 -0
  299. package/openh264/res/SVA_BA2_D.264 +0 -0
  300. package/openh264/res/SVA_Base_B.264 +0 -0
  301. package/openh264/res/SVA_CL1_E.264 +0 -0
  302. package/openh264/res/SVA_FM1_E.264 +0 -0
  303. package/openh264/res/SVA_NL1_B.264 +0 -0
  304. package/openh264/res/SVA_NL2_E.264 +0 -0
  305. package/openh264/res/SarVui.264 +0 -0
  306. package/openh264/res/Static.264 +0 -0
  307. package/openh264/res/Static_152_100.yuv +1 -0
  308. package/openh264/res/VID_1280x544_cabac_temporal_direct.264 +0 -0
  309. package/openh264/res/VID_1280x544_cavlc_temporal_direct.264 +0 -0
  310. package/openh264/res/VID_1280x720_cabac_temporal_direct.264 +0 -0
  311. package/openh264/res/VID_1280x720_cavlc_temporal_direct.264 +0 -0
  312. package/openh264/res/VID_1920x1080_cabac_temporal_direct.264 +0 -0
  313. package/openh264/res/VID_1920x1080_cavlc_temporal_direct.264 +0 -0
  314. package/openh264/res/Zhling_1280x720.264 +0 -0
  315. package/openh264/res/jm_1080p_allslice.264 +0 -0
  316. package/openh264/res/sps_subsetsps_bothVUI.264 +0 -0
  317. package/openh264/res/test_cif_I_CABAC_PCM.264 +0 -0
  318. package/openh264/res/test_cif_I_CABAC_slice.264 +0 -0
  319. package/openh264/res/test_cif_P_CABAC_slice.264 +0 -0
  320. package/openh264/res/test_qcif_cabac.264 +0 -0
  321. package/openh264/res/test_scalinglist_jm.264 +0 -0
  322. package/openh264/res/test_vd_1d.264 +0 -0
  323. package/openh264/res/test_vd_rc.264 +0 -0
  324. package/openh264/run_Test.sh +91 -0
  325. package/openh264/settings.gradle +4 -0
  326. package/openh264/subprojects/gtest.wrap +10 -0
  327. package/openh264/testbin/AutoBuild_Windows_VS2008.bat +59 -0
  328. package/openh264/testbin/CmdLineExample.sh +7 -0
  329. package/openh264/testbin/CmdLineReadMe +22 -0
  330. package/openh264/testbin/layer2.cfg +37 -0
  331. package/openh264/testbin/layer2_arbitrary_res.cfg +37 -0
  332. package/openh264/testbin/layer2_vd.cfg +38 -0
  333. package/openh264/testbin/layer2_vd_rc.cfg +38 -0
  334. package/openh264/testbin/welsenc.cfg +71 -0
  335. package/openh264/testbin/welsenc_arbitrary_res.cfg +70 -0
  336. package/openh264/testbin/welsenc_ios.cfg +71 -0
  337. package/openh264/testbin/welsenc_vd_1d.cfg +70 -0
  338. package/openh264/testbin/welsenc_vd_rc.cfg +69 -0
  339. package/openh264/ut.def +2 -0
  340. package/package.json +1 -1
@@ -0,0 +1,2283 @@
1
+ /*!
2
+ * \copy
3
+ * Copyright (c) 2013, Cisco Systems
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions
8
+ * are met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ *
13
+ * * Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in
15
+ * the documentation and/or other materials provided with the
16
+ * distribution.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ * POSSIBILITY OF SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #ifdef HAVE_NEON
34
+ #include "arm_arch_common_macro.S"
35
+
36
+ .macro AVERAGE_TWO_8BITS arg0, arg1, arg2
37
+ // { // input:dst_d, src_d A and B; working: q13
38
+ vaddl.u8 q13, \arg2, \arg1
39
+ vrshrn.u16 \arg0, q13, #1
40
+ // }
41
+ .endm
42
+
43
+ .macro FILTER_6TAG_8BITS arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
44
+ // { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
45
+ vaddl.u8 q12, \arg0, \arg5 //q12=src[-2]+src[3]
46
+ vaddl.u8 q13, \arg2, \arg3 //src[0]+src[1]
47
+ vmla.u16 q12, q13, \arg7 //q12 += 20*(src[0]+src[1]), 2 cycles
48
+ vaddl.u8 q13, \arg1, \arg4 //src[-1]+src[2]
49
+ vmls.s16 q12, q13, \arg8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
50
+ vqrshrun.s16 \arg6, q12, #5
51
+ // }
52
+ .endm
53
+
54
+ .macro FILTER_SINGLE_TAG_8BITS arg0, arg1,arg2, arg3, arg4 // when width=17/9, used
55
+ // { // input: src_d{Y[0][1][2][3][4][5]X, the even of working_q2}
56
+ vrev64.8 \arg2, \arg0 // X[5][4][3][2][1][0]O
57
+ vaddl.u8 \arg3, \arg0, \arg2 // each 16bits, *[50][41][32][23][14][05]*
58
+ vmul.s16 \arg0, \arg2, \arg1 // 0+1*[50]-5*[41]+20[32]
59
+ vpadd.s16 \arg0, \arg0, \arg0
60
+ vpadd.s16 \arg0, \arg0, \arg0
61
+ vqrshrun.s16 \arg0, \arg4, #5
62
+ // }
63
+ .endm
64
+
65
+ .macro FILTER_6TAG_8BITS_AVERAGE_WITH_0 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
66
+ // { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
67
+ vaddl.u8 q12, \arg0, \arg5 //q12=src[-2]+src[3]
68
+ vaddl.u8 q13, \arg2, \arg3 //src[0]+src[1]
69
+ vmla.u16 q12, q13, \arg7 //q12 += 20*(src[0]+src[1]), 2 cycles
70
+ vaddl.u8 q13, \arg1, \arg4 //src[-1]+src[2]
71
+ vmls.s16 q12, q13, \arg8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
72
+ vqrshrun.s16 \arg6, q12, #5
73
+ vaddl.u8 q13, \arg2, \arg6
74
+ vrshrn.u16 \arg6, q13, #1
75
+ // }
76
+ .endm
77
+
78
+ .macro FILTER_6TAG_8BITS_AVERAGE_WITH_1 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
79
+ // { // input:src[-2], src[-1], src[0], src[1], src[2], src[3], dst_d, multiplier a/b; working: q12, q13
80
+ vaddl.u8 q12, \arg0, \arg5 //q12=src[-2]+src[3]
81
+ vaddl.u8 q13, \arg2, \arg3 //src[0]+src[1]
82
+ vmla.u16 q12, q13, \arg7 //q12 += 20*(src[0]+src[1]), 2 cycles
83
+ vaddl.u8 q13, \arg1, \arg4 //src[-1]+src[2]
84
+ vmls.s16 q12, q13, \arg8 //q12 -= 5*(src[-1]+src[2]), 2 cycles
85
+ vqrshrun.s16 \arg6, q12, #5
86
+ vaddl.u8 q13, \arg3, \arg6
87
+ vrshrn.u16 \arg6, q13, #1
88
+ // }
89
+ .endm
90
+
91
+ .macro FILTER_6TAG_8BITS_TO_16BITS arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
92
+ // { // input:d_src[-2], d_src[-1], d_src[0], d_src[1], d_src[2], d_src[3], dst_q, multiplier a/b; working:q13
93
+ vaddl.u8 \arg6, \arg0, \arg5 //dst_q=src[-2]+src[3]
94
+ vaddl.u8 q13, \arg2, \arg3 //src[0]+src[1]
95
+ vmla.u16 \arg6, q13, \arg7 //dst_q += 20*(src[0]+src[1]), 2 cycles
96
+ vaddl.u8 q13, \arg1, \arg4 //src[-1]+src[2]
97
+ vmls.s16 \arg6, q13, \arg8 //dst_q -= 5*(src[-1]+src[2]), 2 cycles
98
+ // }
99
+ .endm
100
+
101
+ .macro FILTER_3_IN_16BITS_TO_8BITS arg0, arg1, arg2, arg3
102
+ // { // input:a, b, c, dst_d;
103
+ vsub.s16 \arg0, \arg0, \arg1 //a-b
104
+ vshr.s16 \arg0, \arg0, #2 //(a-b)/4
105
+ vsub.s16 \arg0, \arg0, \arg1 //(a-b)/4-b
106
+ vadd.s16 \arg0, \arg0, \arg2 //(a-b)/4-b+c
107
+ vshr.s16 \arg0, \arg0, #2 //((a-b)/4-b+c)/4
108
+ vadd.s16 \arg0, \arg0, \arg2 //((a-b)/4-b+c)/4+c = (a-5*b+20*c)/16
109
+ vqrshrun.s16 \arg3, \arg0, #6 //(+32)>>6
110
+ // }
111
+ .endm
112
+
113
+ .macro UNPACK_2_16BITS_TO_ABC arg0, arg1, arg2, arg3, arg4
114
+ // { // input:q_src[-2:5], q_src[6:13](avail 8+5)/q_src[6:**](avail 4+5), dst_a, dst_b, dst_c;
115
+ vext.16 \arg4, \arg0, \arg1, #2 //src[0]
116
+ vext.16 \arg3, \arg0, \arg1, #3 //src[1]
117
+ vadd.s16 \arg4, \arg3 //c=src[0]+src[1]
118
+
119
+ vext.16 \arg3, \arg0, \arg1, #1 //src[-1]
120
+ vext.16 \arg2, \arg0, \arg1, #4 //src[2]
121
+ vadd.s16 \arg3,\arg2 //b=src[-1]+src[2]
122
+
123
+ vext.16 \arg2, \arg0, \arg1, #5 //src[3]
124
+ vadd.s16 \arg2, \arg0 //a=src[-2]+src[3]
125
+ // }
126
+ .endm
127
+
128
+ .macro UNPACK_1_IN_8x16BITS_TO_8BITS arg0, arg1,arg2, arg3
129
+ // { // each 16bits; input: d_dst, d_src[0:3] (even), d_src[4:5]+%% (odd)
130
+ vext.16 \arg3, \arg3, \arg3, #7 // 0x????, [0][1][2][3][4][5]
131
+ vrev64.16 \arg1, \arg1
132
+ vadd.u16 \arg2, \arg1 // C[2+3],B[1+4],A[0+5]
133
+ vshr.s64 \arg1, \arg2, #16
134
+ vshr.s64 \arg0, \arg2, #32 // Output: C \arg2, B \arg1, A \arg0
135
+
136
+ vsub.s16 \arg0, \arg0, \arg1 //a-b
137
+ vshr.s16 \arg0, \arg0, #2 //(a-b)/4
138
+ vsub.s16 \arg0, \arg0, \arg1 //(a-b)/4-b
139
+ vadd.s16 \arg0, \arg0, \arg2 //(a-b)/4-b+c
140
+ vshr.s16 \arg0, \arg0, #2 //((a-b)/4-b+c)/4
141
+ vadd.s16 \arg1, \arg0, \arg2 //((a-b)/4-b+c)/4+c = (a-5*b+20*c)/16
142
+ vqrshrun.s16 \arg0, \arg3, #6 //(+32)>>6
143
+ // }
144
+ .endm
145
+
146
+ WELS_ASM_FUNC_BEGIN McHorVer20WidthEq16_neon
147
+ push {r4}
148
+ ldr r4, [sp, #4]
149
+
150
+ sub r0, #2
151
+ vmov.u16 q14, #0x0014 // 20
152
+ vshr.u16 q15, q14, #2 // 5
153
+
154
+ w16_h_mc_luma_loop:
155
+ vld1.u8 {d0,d1,d2}, [r0], r1 //only use 21(16+5); q0=src[-2]
156
+ pld [r0]
157
+ pld [r0, #16]
158
+
159
+ vext.8 q2, q0, q1, #1 //q2=src[-1]
160
+ vext.8 q3, q0, q1, #2 //q3=src[0]
161
+ vext.8 q8, q0, q1, #3 //q8=src[1]
162
+ vext.8 q9, q0, q1, #4 //q9=src[2]
163
+ vext.8 q10, q0, q1, #5 //q10=src[3]
164
+
165
+ FILTER_6TAG_8BITS d0, d4, d6, d16, d18, d20, d2, q14, q15
166
+
167
+ FILTER_6TAG_8BITS d1, d5, d7, d17, d19, d21, d3, q14, q15
168
+
169
+ sub r4, #1
170
+ vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
171
+
172
+ cmp r4, #0
173
+ bne w16_h_mc_luma_loop
174
+ pop {r4}
175
+ WELS_ASM_FUNC_END
176
+
177
+
178
+ WELS_ASM_FUNC_BEGIN McHorVer20WidthEq8_neon
179
+ push {r4}
180
+ ldr r4, [sp, #4]
181
+
182
+ sub r0, #2
183
+ vmov.u16 q14, #0x0014 // 20
184
+ vshr.u16 q15, q14, #2 // 5
185
+
186
+ w8_h_mc_luma_loop:
187
+ vld1.u8 {d0,d1}, [r0], r1 //only use 13(8+5); q0=src[-2]
188
+ pld [r0]
189
+
190
+ vext.8 d2, d0, d1, #1 //d2=src[-1]
191
+ vext.8 d3, d0, d1, #2 //d3=src[0]
192
+ vext.8 d4, d0, d1, #3 //d4=src[1]
193
+ vext.8 d5, d0, d1, #4 //d5=src[2]
194
+ vext.8 d6, d0, d1, #5 //d6=src[3]
195
+
196
+ FILTER_6TAG_8BITS d0, d2, d3, d4, d5, d6, d1, q14, q15
197
+
198
+ sub r4, #1
199
+ vst1.u8 {d1}, [r2], r3
200
+
201
+ cmp r4, #0
202
+ bne w8_h_mc_luma_loop
203
+ pop {r4}
204
+ WELS_ASM_FUNC_END
205
+
206
+
207
+ WELS_ASM_FUNC_BEGIN McHorVer20WidthEq4_neon
208
+ push {r4, r5, r6}
209
+ ldr r6, [sp, #12]
210
+
211
+ sub r0, #2
212
+ vmov.u16 q14, #0x0014 // 20
213
+ vshr.u16 q15, q14, #2 // 5
214
+
215
+ w4_h_mc_luma_loop:
216
+ vld1.u8 {d0, d1}, [r0], r1 //only use 9(4+5);d0: 1st row src[-2:5]
217
+ pld [r0]
218
+ vld1.u8 {d2, d3}, [r0], r1 //d2: 2nd row src[-2:5]
219
+ pld [r0]
220
+
221
+ vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
222
+ vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
223
+ vext.8 q3, q2, q2, #1 //src[0:6 *]
224
+ vext.8 q8, q2, q2, #2 //src[1:6 * *]
225
+
226
+ vtrn.32 q3, q8 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
227
+ vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
228
+ vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
229
+ vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
230
+
231
+ FILTER_6TAG_8BITS d0, d4, d6, d7, d2, d5, d1, q14, q15
232
+
233
+ vmov r4, r5, d1
234
+ str r4, [r2], r3
235
+ str r5, [r2], r3
236
+
237
+ sub r6, #2
238
+ cmp r6, #0
239
+ bne w4_h_mc_luma_loop
240
+
241
+ pop {r4, r5, r6}
242
+ WELS_ASM_FUNC_END
243
+
244
+
245
+ WELS_ASM_FUNC_BEGIN McHorVer10WidthEq16_neon
246
+ push {r4}
247
+ ldr r4, [sp, #4]
248
+
249
+ sub r0, #2
250
+ vmov.u16 q14, #0x0014 // 20
251
+ vshr.u16 q15, q14, #2 // 5
252
+
253
+ w16_xy_10_mc_luma_loop:
254
+ vld1.u8 {d0,d1,d2}, [r0], r1 //only use 21(16+5); q0=src[-2]
255
+ pld [r0]
256
+ pld [r0, #16]
257
+
258
+ vext.8 q2, q0, q1, #1 //q2=src[-1]
259
+ vext.8 q3, q0, q1, #2 //q3=src[0]
260
+ vext.8 q8, q0, q1, #3 //q8=src[1]
261
+ vext.8 q9, q0, q1, #4 //q9=src[2]
262
+ vext.8 q10, q0, q1, #5 //q10=src[3]
263
+
264
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d4, d6, d16, d18, d20, d2, q14, q15
265
+
266
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d5, d7, d17, d19, d21, d3, q14, q15
267
+
268
+ sub r4, #1
269
+ vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
270
+
271
+ cmp r4, #0
272
+ bne w16_xy_10_mc_luma_loop
273
+ pop {r4}
274
+ WELS_ASM_FUNC_END
275
+
276
+
277
+ WELS_ASM_FUNC_BEGIN McHorVer10WidthEq8_neon
278
+ push {r4}
279
+ ldr r4, [sp, #4]
280
+
281
+ sub r0, #2
282
+ vmov.u16 q14, #0x0014 // 20
283
+ vshr.u16 q15, q14, #2 // 5
284
+
285
+ w8_xy_10_mc_luma_loop:
286
+ vld1.u8 {d0,d1}, [r0], r1 //only use 13(8+5); q0=src[-2]
287
+ pld [r0]
288
+
289
+ vext.8 d2, d0, d1, #1 //d2=src[-1]
290
+ vext.8 d3, d0, d1, #2 //d3=src[0]
291
+ vext.8 d4, d0, d1, #3 //d4=src[1]
292
+ vext.8 d5, d0, d1, #4 //d5=src[2]
293
+ vext.8 d6, d0, d1, #5 //d6=src[3]
294
+
295
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d3, d4, d5, d6, d1, q14, q15
296
+
297
+ sub r4, #1
298
+ vst1.u8 {d1}, [r2], r3
299
+
300
+ cmp r4, #0
301
+ bne w8_xy_10_mc_luma_loop
302
+ pop {r4}
303
+ WELS_ASM_FUNC_END
304
+
305
+
306
+ WELS_ASM_FUNC_BEGIN McHorVer10WidthEq4_neon
307
+ push {r4, r5, r6}
308
+ ldr r6, [sp, #12]
309
+
310
+ sub r0, #2
311
+ vmov.u16 q14, #0x0014 // 20
312
+ vshr.u16 q15, q14, #2 // 5
313
+
314
+ w4_xy_10_mc_luma_loop:
315
+ vld1.u8 {d0, d1}, [r0], r1 //only use 9(4+5);d0: 1st row src[-2:5]
316
+ pld [r0]
317
+ vld1.u8 {d2, d3}, [r0], r1 //d2: 2nd row src[-2:5]
318
+ pld [r0]
319
+
320
+ vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
321
+ vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
322
+ vext.8 q3, q2, q2, #1 //src[0:6 *]
323
+ vext.8 q8, q2, q2, #2 //src[1:6 * *]
324
+
325
+ vtrn.32 q3, q8 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
326
+ vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
327
+ vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
328
+ vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
329
+
330
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d4, d6, d7, d2, d5, d1, q14, q15
331
+
332
+ vmov r4, r5, d1
333
+ str r4, [r2], r3
334
+ str r5, [r2], r3
335
+
336
+ sub r6, #2
337
+ cmp r6, #0
338
+ bne w4_xy_10_mc_luma_loop
339
+
340
+ pop {r4, r5, r6}
341
+ WELS_ASM_FUNC_END
342
+
343
+
344
+ WELS_ASM_FUNC_BEGIN McHorVer30WidthEq16_neon
345
+ push {r4}
346
+ ldr r4, [sp, #4]
347
+
348
+ sub r0, #2
349
+ vmov.u16 q14, #0x0014 // 20
350
+ vshr.u16 q15, q14, #2 // 5
351
+
352
+ w16_xy_30_mc_luma_loop:
353
+ vld1.u8 {d0,d1,d2}, [r0], r1 //only use 21(16+5); q0=src[-2]
354
+ pld [r0]
355
+ pld [r0, #16]
356
+
357
+ vext.8 q2, q0, q1, #1 //q2=src[-1]
358
+ vext.8 q3, q0, q1, #2 //q3=src[0]
359
+ vext.8 q8, q0, q1, #3 //q8=src[1]
360
+ vext.8 q9, q0, q1, #4 //q9=src[2]
361
+ vext.8 q10, q0, q1, #5 //q10=src[3]
362
+
363
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d4, d6, d16, d18, d20, d2, q14, q15
364
+
365
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d5, d7, d17, d19, d21, d3, q14, q15
366
+
367
+ sub r4, #1
368
+ vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
369
+
370
+ cmp r4, #0
371
+ bne w16_xy_30_mc_luma_loop
372
+ pop {r4}
373
+ WELS_ASM_FUNC_END
374
+
375
+
376
+ WELS_ASM_FUNC_BEGIN McHorVer30WidthEq8_neon
377
+ push {r4}
378
+ ldr r4, [sp, #4]
379
+
380
+ sub r0, #2
381
+ vmov.u16 q14, #0x0014 // 20
382
+ vshr.u16 q15, q14, #2 // 5
383
+
384
+ w8_xy_30_mc_luma_loop:
385
+ vld1.u8 {d0,d1}, [r0], r1 //only use 13(8+5); q0=src[-2]
386
+ pld [r0]
387
+
388
+ vext.8 d2, d0, d1, #1 //d2=src[-1]
389
+ vext.8 d3, d0, d1, #2 //d3=src[0]
390
+ vext.8 d4, d0, d1, #3 //d4=src[1]
391
+ vext.8 d5, d0, d1, #4 //d5=src[2]
392
+ vext.8 d6, d0, d1, #5 //d6=src[3]
393
+
394
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d3, d4, d5, d6, d1, q14, q15
395
+
396
+ sub r4, #1
397
+ vst1.u8 {d1}, [r2], r3
398
+
399
+ cmp r4, #0
400
+ bne w8_xy_30_mc_luma_loop
401
+ pop {r4}
402
+ WELS_ASM_FUNC_END
403
+
404
+
405
+ WELS_ASM_FUNC_BEGIN McHorVer30WidthEq4_neon
406
+ push {r4, r5, r6}
407
+ ldr r6, [sp, #12]
408
+
409
+ sub r0, #2
410
+ vmov.u16 q14, #0x0014 // 20
411
+ vshr.u16 q15, q14, #2 // 5
412
+
413
+ w4_xy_30_mc_luma_loop:
414
+ vld1.u8 {d0, d1}, [r0], r1 //only use 9(4+5);d0: 1st row src[-2:5]
415
+ pld [r0]
416
+ vld1.u8 {d2, d3}, [r0], r1 //d2: 2nd row src[-2:5]
417
+ pld [r0]
418
+
419
+ vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
420
+ vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
421
+ vext.8 q3, q2, q2, #1 //src[0:6 *]
422
+ vext.8 q8, q2, q2, #2 //src[1:6 * *]
423
+
424
+ vtrn.32 q3, q8 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
425
+ vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
426
+ vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
427
+ vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
428
+
429
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d4, d6, d7, d2, d5, d1, q14, q15
430
+
431
+ vmov r4, r5, d1
432
+ str r4, [r2], r3
433
+ str r5, [r2], r3
434
+
435
+ sub r6, #2
436
+ cmp r6, #0
437
+ bne w4_xy_30_mc_luma_loop
438
+
439
+ pop {r4, r5, r6}
440
+ WELS_ASM_FUNC_END
441
+
442
+
443
+ WELS_ASM_FUNC_BEGIN McHorVer01WidthEq16_neon
444
+ push {r4}
445
+ ldr r4, [sp, #4]
446
+
447
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
448
+ pld [r0]
449
+ pld [r0, r1]
450
+ vmov.u16 q14, #0x0014 // 20
451
+ vld1.u8 {q0}, [r0], r1 //q0=src[-2]
452
+ vld1.u8 {q1}, [r0], r1 //q1=src[-1]
453
+
454
+ pld [r0]
455
+ pld [r0, r1]
456
+ vshr.u16 q15, q14, #2 // 5
457
+ vld1.u8 {q2}, [r0], r1 //q2=src[0]
458
+ vld1.u8 {q3}, [r0], r1 //q3=src[1]
459
+ vld1.u8 {q8}, [r0], r1 //q8=src[2]
460
+
461
+ w16_xy_01_luma_loop:
462
+
463
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
464
+
465
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d4, d6, d16, d18, d20, q14, q15
466
+ pld [r0]
467
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d3, d5, d7, d17, d19, d21, q14, q15
468
+ vld1.u8 {q0}, [r0], r1 //read 2nd row
469
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
470
+
471
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d4, d6, d16, d18, d0, d20, q14, q15
472
+ pld [r0]
473
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d5, d7, d17, d19, d1, d21, q14, q15
474
+ vld1.u8 {q1}, [r0], r1 //read 3rd row
475
+ vst1.u8 {q10}, [r2], r3 //write 2nd 16Byte
476
+
477
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d4, d6, d16, d18, d0, d2, d20, q14, q15
478
+ pld [r0]
479
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d5, d7, d17, d19, d1, d3, d21, q14, q15
480
+ vld1.u8 {q2}, [r0], r1 //read 4th row
481
+ vst1.u8 {q10}, [r2], r3 //write 3rd 16Byte
482
+
483
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d6, d16, d18, d0, d2, d4, d20, q14, q15
484
+ pld [r0]
485
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d7, d17, d19, d1, d3, d5, d21, q14, q15
486
+ vld1.u8 {q3}, [r0], r1 //read 5th row
487
+ vst1.u8 {q10}, [r2], r3 //write 4th 16Byte
488
+
489
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d16, d18, d0, d2, d4, d6, d20, q14, q15
490
+ pld [r0]
491
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d17, d19, d1, d3, d5, d7, d21, q14, q15
492
+ vld1.u8 {q8}, [r0], r1 //read 6th row
493
+ vst1.u8 {q10}, [r2], r3 //write 5th 16Byte
494
+
495
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d18, d0, d2, d4, d6, d16, d20, q14, q15
496
+ pld [r0]
497
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d19, d1, d3, d5, d7, d17, d21, q14, q15
498
+ vld1.u8 {q9}, [r0], r1 //read 7th row
499
+ vst1.u8 {q10}, [r2], r3 //write 6th 16Byte
500
+
501
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d4, d6, d16, d18, d20, q14, q15
502
+ pld [r0]
503
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d3, d5, d7, d17, d19, d21, q14, q15
504
+ vld1.u8 {q0}, [r0], r1 //read 8th row
505
+ vst1.u8 {q10}, [r2], r3 //write 7th 16Byte
506
+
507
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d4, d6, d16, d18, d0, d20, q14, q15
508
+ pld [r0]
509
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d5, d7, d17, d19, d1, d21, q14, q15
510
+ vst1.u8 {q10}, [r2], r3 //write 8th 16Byte
511
+
512
+ //q2, q3, q4, q5, q0 --> q0~q4
513
+ vswp q0, q8
514
+ vswp q0, q2
515
+ vmov q1, q3
516
+ vmov q3, q9 //q0~q4
517
+
518
+ sub r4, #8
519
+ cmp r4, #0
520
+ bne w16_xy_01_luma_loop
521
+ pop {r4}
522
+ WELS_ASM_FUNC_END
523
+
524
+
525
+ WELS_ASM_FUNC_BEGIN McHorVer01WidthEq8_neon
526
+ push {r4}
527
+ ldr r4, [sp, #4]
528
+
529
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
530
+ pld [r0]
531
+ pld [r0, r1]
532
+ vmov.u16 q14, #0x0014 // 20
533
+ vld1.u8 {d0}, [r0], r1 //d0=src[-2]
534
+ vld1.u8 {d1}, [r0], r1 //d1=src[-1]
535
+
536
+ pld [r0]
537
+ pld [r0, r1]
538
+ vshr.u16 q15, q14, #2 // 5
539
+ vld1.u8 {d2}, [r0], r1 //d2=src[0]
540
+ vld1.u8 {d3}, [r0], r1 //d3=src[1]
541
+
542
+ vld1.u8 {d4}, [r0], r1 //d4=src[2]
543
+ vld1.u8 {d5}, [r0], r1 //d5=src[3]
544
+
545
+ w8_xy_01_mc_luma_loop:
546
+
547
+ pld [r0]
548
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d1, d2, d3, d4, d5, d16, q14, q15
549
+ vld1.u8 {d0}, [r0], r1 //read 2nd row
550
+ vst1.u8 {d16}, [r2], r3 //write 1st 8Byte
551
+
552
+ pld [r0]
553
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d2, d3, d4, d5, d0, d16, q14, q15
554
+ vld1.u8 {d1}, [r0], r1 //read 3rd row
555
+ vst1.u8 {d16}, [r2], r3 //write 2nd 8Byte
556
+
557
+ pld [r0]
558
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d3, d4, d5, d0, d1, d16, q14, q15
559
+ vld1.u8 {d2}, [r0], r1 //read 4th row
560
+ vst1.u8 {d16}, [r2], r3 //write 3rd 8Byte
561
+
562
+ pld [r0]
563
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d4, d5, d0, d1, d2, d16, q14, q15
564
+ vld1.u8 {d3}, [r0], r1 //read 5th row
565
+ vst1.u8 {d16}, [r2], r3 //write 4th 8Byte
566
+
567
+ //d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
568
+ vswp q0, q2
569
+ vswp q1, q2
570
+
571
+ sub r4, #4
572
+ cmp r4, #0
573
+ bne w8_xy_01_mc_luma_loop
574
+
575
+ pop {r4}
576
+ WELS_ASM_FUNC_END
577
+
578
+
579
+ WELS_ASM_FUNC_BEGIN McHorVer01WidthEq4_neon
580
+ push {r4, r5, r6, r7}
581
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
582
+ pld [r0]
583
+ pld [r0, r1]
584
+ vmov.u16 q14, #0x0014 // 20
585
+ ldr r4, [r0], r1 //r4=src[-2]
586
+ ldr r5, [r0], r1 //r5=src[-1]
587
+
588
+ pld [r0]
589
+ pld [r0, r1]
590
+ vshr.u16 q15, q14, #2 // 5
591
+ ldr r6, [r0], r1 //r6=src[0]
592
+ ldr r7, [r0], r1 //r7=src[1]
593
+
594
+ vmov d0, r4, r5
595
+ vmov d1, r5, r6
596
+ vmov d2, r6, r7
597
+
598
+ ldr r4, [r0], r1 //r4=src[2]
599
+ vmov d3, r7, r4
600
+ ldr r7, [sp, #16]
601
+
602
+ w4_xy_01_mc_luma_loop:
603
+
604
+ // pld [r0]
605
+ //using reserving r4
606
+ ldr r5, [r0], r1 //r5=src[3]
607
+ ldr r6, [r0], r1 //r6=src[0]
608
+ vmov d4, r4, r5
609
+ vmov d5, r5, r6 //reserved r6
610
+
611
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d1, d2, d3, d4, d5, d16, q14, q15
612
+ vmov r4, r5, d16
613
+ str r4, [r2], r3 //write 1st 4Byte
614
+ str r5, [r2], r3 //write 2nd 4Byte
615
+
616
+ ldr r5, [r0], r1 //r5=src[1]
617
+ ldr r4, [r0], r1 //r4=src[2]
618
+ vmov d0, r6, r5
619
+ vmov d1, r5, r4 //reserved r4
620
+
621
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d3, d4, d5, d0, d1, d16, q14, q15
622
+ vmov r5, r6, d16
623
+ str r5, [r2], r3 //write 3rd 4Byte
624
+ str r6, [r2], r3 //write 4th 4Byte
625
+
626
+ //d4, d5, d0, d1 --> d0, d1, d2, d3
627
+ vmov q1, q0
628
+ vmov q0, q2
629
+
630
+ sub r7, #4
631
+ cmp r7, #0
632
+ bne w4_xy_01_mc_luma_loop
633
+
634
+ pop {r4, r5, r6, r7}
635
+ WELS_ASM_FUNC_END
636
+
637
+
638
+ WELS_ASM_FUNC_BEGIN McHorVer03WidthEq16_neon
639
+ push {r4}
640
+ ldr r4, [sp, #4]
641
+
642
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
643
+ pld [r0]
644
+ pld [r0, r1]
645
+ vmov.u16 q14, #0x0014 // 20
646
+ vld1.u8 {q0}, [r0], r1 //q0=src[-2]
647
+ vld1.u8 {q1}, [r0], r1 //q1=src[-1]
648
+
649
+ pld [r0]
650
+ pld [r0, r1]
651
+ vshr.u16 q15, q14, #2 // 5
652
+ vld1.u8 {q2}, [r0], r1 //q2=src[0]
653
+ vld1.u8 {q3}, [r0], r1 //q3=src[1]
654
+ vld1.u8 {q8}, [r0], r1 //q8=src[2]
655
+
656
+ w16_xy_03_luma_loop:
657
+
658
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
659
+
660
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d4, d6, d16, d18, d20, q14, q15
661
+ pld [r0]
662
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d3, d5, d7, d17, d19, d21, q14, q15
663
+ vld1.u8 {q0}, [r0], r1 //read 2nd row
664
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
665
+
666
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d4, d6, d16, d18, d0, d20, q14, q15
667
+ pld [r0]
668
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d5, d7, d17, d19, d1, d21, q14, q15
669
+ vld1.u8 {q1}, [r0], r1 //read 3rd row
670
+ vst1.u8 {q10}, [r2], r3 //write 2nd 16Byte
671
+
672
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d4, d6, d16, d18, d0, d2, d20, q14, q15
673
+ pld [r0]
674
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d5, d7, d17, d19, d1, d3, d21, q14, q15
675
+ vld1.u8 {q2}, [r0], r1 //read 4th row
676
+ vst1.u8 {q10}, [r2], r3 //write 3rd 16Byte
677
+
678
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d6, d16, d18, d0, d2, d4, d20, q14, q15
679
+ pld [r0]
680
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d7, d17, d19, d1, d3, d5, d21, q14, q15
681
+ vld1.u8 {q3}, [r0], r1 //read 5th row
682
+ vst1.u8 {q10}, [r2], r3 //write 4th 16Byte
683
+
684
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d16, d18, d0, d2, d4, d6, d20, q14, q15
685
+ pld [r0]
686
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d17, d19, d1, d3, d5, d7, d21, q14, q15
687
+ vld1.u8 {q8}, [r0], r1 //read 6th row
688
+ vst1.u8 {q10}, [r2], r3 //write 5th 16Byte
689
+
690
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d18, d0, d2, d4, d6, d16, d20, q14, q15
691
+ pld [r0]
692
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d19, d1, d3, d5, d7, d17, d21, q14, q15
693
+ vld1.u8 {q9}, [r0], r1 //read 7th row
694
+ vst1.u8 {q10}, [r2], r3 //write 6th 16Byte
695
+
696
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d4, d6, d16, d18, d20, q14, q15
697
+ pld [r0]
698
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d3, d5, d7, d17, d19, d21, q14, q15
699
+ vld1.u8 {q0}, [r0], r1 //read 8th row
700
+ vst1.u8 {q10}, [r2], r3 //write 7th 16Byte
701
+
702
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d4, d6, d16, d18, d0, d20, q14, q15
703
+ pld [r0]
704
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d5, d7, d17, d19, d1, d21, q14, q15
705
+ vst1.u8 {q10}, [r2], r3 //write 8th 16Byte
706
+
707
+ //q2, q3, q8, q9, q0 --> q0~q8
708
+ vswp q0, q8
709
+ vswp q0, q2
710
+ vmov q1, q3
711
+ vmov q3, q9 //q0~q8
712
+
713
+ sub r4, #8
714
+ cmp r4, #0
715
+ bne w16_xy_03_luma_loop
716
+ pop {r4}
717
+ WELS_ASM_FUNC_END
718
+
719
+
720
+ WELS_ASM_FUNC_BEGIN McHorVer03WidthEq8_neon
721
+ push {r4}
722
+ ldr r4, [sp, #4]
723
+
724
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
725
+ pld [r0]
726
+ pld [r0, r1]
727
+ vmov.u16 q14, #0x0014 // 20
728
+ vld1.u8 {d0}, [r0], r1 //d0=src[-2]
729
+ vld1.u8 {d1}, [r0], r1 //d1=src[-1]
730
+
731
+ pld [r0]
732
+ pld [r0, r1]
733
+ vshr.u16 q15, q14, #2 // 5
734
+ vld1.u8 {d2}, [r0], r1 //d2=src[0]
735
+ vld1.u8 {d3}, [r0], r1 //d3=src[1]
736
+
737
+ vld1.u8 {d4}, [r0], r1 //d4=src[2]
738
+ vld1.u8 {d5}, [r0], r1 //d5=src[3]
739
+
740
+ w8_xy_03_mc_luma_loop:
741
+
742
+ pld [r0]
743
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d1, d2, d3, d4, d5, d16, q14, q15
744
+ vld1.u8 {d0}, [r0], r1 //read 2nd row
745
+ vst1.u8 {d16}, [r2], r3 //write 1st 8Byte
746
+
747
+ pld [r0]
748
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d2, d3, d4, d5, d0, d16, q14, q15
749
+ vld1.u8 {d1}, [r0], r1 //read 3rd row
750
+ vst1.u8 {d16}, [r2], r3 //write 2nd 8Byte
751
+
752
+ pld [r0]
753
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d3, d4, d5, d0, d1, d16, q14, q15
754
+ vld1.u8 {d2}, [r0], r1 //read 4th row
755
+ vst1.u8 {d16}, [r2], r3 //write 3rd 8Byte
756
+
757
+ pld [r0]
758
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d4, d5, d0, d1, d2, d16, q14, q15
759
+ vld1.u8 {d3}, [r0], r1 //read 5th row
760
+ vst1.u8 {d16}, [r2], r3 //write 4th 8Byte
761
+
762
+ //d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
763
+ vswp q0, q2
764
+ vswp q1, q2
765
+
766
+ sub r4, #4
767
+ cmp r4, #0
768
+ bne w8_xy_03_mc_luma_loop
769
+
770
+ pop {r4}
771
+ WELS_ASM_FUNC_END
772
+
773
+
774
+ WELS_ASM_FUNC_BEGIN McHorVer03WidthEq4_neon
775
+ push {r4, r5, r6, r7}
776
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
777
+ pld [r0]
778
+ pld [r0, r1]
779
+ vmov.u16 q14, #0x0014 // 20
780
+ ldr r4, [r0], r1 //r4=src[-2]
781
+ ldr r5, [r0], r1 //r5=src[-1]
782
+
783
+ pld [r0]
784
+ pld [r0, r1]
785
+ vshr.u16 q15, q14, #2 // 5
786
+ ldr r6, [r0], r1 //r6=src[0]
787
+ ldr r7, [r0], r1 //r7=src[1]
788
+
789
+ vmov d0, r4, r5
790
+ vmov d1, r5, r6
791
+ vmov d2, r6, r7
792
+
793
+ ldr r4, [r0], r1 //r4=src[2]
794
+ vmov d3, r7, r4
795
+ ldr r7, [sp, #16]
796
+
797
+ w4_xy_03_mc_luma_loop:
798
+
799
+ // pld [r0]
800
+ //using reserving r4
801
+ ldr r5, [r0], r1 //r5=src[3]
802
+ ldr r6, [r0], r1 //r6=src[0]
803
+ vmov d4, r4, r5
804
+ vmov d5, r5, r6 //reserved r6
805
+
806
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d1, d2, d3, d4, d5, d16, q14, q15
807
+ vmov r4, r5, d16
808
+ str r4, [r2], r3 //write 1st 4Byte
809
+ str r5, [r2], r3 //write 2nd 4Byte
810
+
811
+ ldr r5, [r0], r1 //r5=src[1]
812
+ ldr r4, [r0], r1 //r4=src[2]
813
+ vmov d0, r6, r5
814
+ vmov d1, r5, r4 //reserved r4
815
+
816
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d3, d4, d5, d0, d1, d16, q14, q15
817
+ vmov r5, r6, d16
818
+ str r5, [r2], r3 //write 3rd 4Byte
819
+ str r6, [r2], r3 //write 4th 4Byte
820
+
821
+ //d4, d5, d0, d1 --> d0, d1, d2, d3
822
+ vmov q1, q0
823
+ vmov q0, q2
824
+
825
+ sub r7, #4
826
+ cmp r7, #0
827
+ bne w4_xy_03_mc_luma_loop
828
+
829
+ pop {r4, r5, r6, r7}
830
+ WELS_ASM_FUNC_END
831
+
832
+
833
+ WELS_ASM_FUNC_BEGIN McHorVer02WidthEq16_neon
834
+ push {r4}
835
+ ldr r4, [sp, #4]
836
+
837
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
838
+ pld [r0]
839
+ pld [r0, r1]
840
+ vmov.u16 q14, #0x0014 // 20
841
+ vld1.u8 {q0}, [r0], r1 //q0=src[-2]
842
+ vld1.u8 {q1}, [r0], r1 //q1=src[-1]
843
+
844
+ pld [r0]
845
+ pld [r0, r1]
846
+ vshr.u16 q15, q14, #2 // 5
847
+ vld1.u8 {q2}, [r0], r1 //q2=src[0]
848
+ vld1.u8 {q3}, [r0], r1 //q3=src[1]
849
+ vld1.u8 {q8}, [r0], r1 //q8=src[2]
850
+
851
+ w16_v_mc_luma_loop:
852
+
853
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
854
+
855
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
856
+ pld [r0]
857
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
858
+ vld1.u8 {q0}, [r0], r1 //read 2nd row
859
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
860
+
861
+ FILTER_6TAG_8BITS d2, d4, d6, d16, d18, d0, d20, q14, q15
862
+ pld [r0]
863
+ FILTER_6TAG_8BITS d3, d5, d7, d17, d19, d1, d21, q14, q15
864
+ vld1.u8 {q1}, [r0], r1 //read 3rd row
865
+ vst1.u8 {q10}, [r2], r3 //write 2nd 16Byte
866
+
867
+ FILTER_6TAG_8BITS d4, d6, d16, d18, d0, d2, d20, q14, q15
868
+ pld [r0]
869
+ FILTER_6TAG_8BITS d5, d7, d17, d19, d1, d3, d21, q14, q15
870
+ vld1.u8 {q2}, [r0], r1 //read 4th row
871
+ vst1.u8 {q10}, [r2], r3 //write 3rd 16Byte
872
+
873
+ FILTER_6TAG_8BITS d6, d16, d18, d0, d2, d4, d20, q14, q15
874
+ pld [r0]
875
+ FILTER_6TAG_8BITS d7, d17, d19, d1, d3, d5, d21, q14, q15
876
+ vld1.u8 {q3}, [r0], r1 //read 5th row
877
+ vst1.u8 {q10}, [r2], r3 //write 4th 16Byte
878
+
879
+ FILTER_6TAG_8BITS d16, d18, d0, d2, d4, d6, d20, q14, q15
880
+ pld [r0]
881
+ FILTER_6TAG_8BITS d17, d19, d1, d3, d5, d7, d21, q14, q15
882
+ vld1.u8 {q8}, [r0], r1 //read 6th row
883
+ vst1.u8 {q10}, [r2], r3 //write 5th 16Byte
884
+
885
+ FILTER_6TAG_8BITS d18, d0, d2, d4, d6, d16, d20, q14, q15
886
+ pld [r0]
887
+ FILTER_6TAG_8BITS d19, d1, d3, d5, d7, d17, d21, q14, q15
888
+ vld1.u8 {q9}, [r0], r1 //read 7th row
889
+ vst1.u8 {q10}, [r2], r3 //write 6th 16Byte
890
+
891
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
892
+ pld [r0]
893
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
894
+ vld1.u8 {q0}, [r0], r1 //read 8th row
895
+ vst1.u8 {q10}, [r2], r3 //write 7th 16Byte
896
+
897
+ FILTER_6TAG_8BITS d2, d4, d6, d16, d18, d0, d20, q14, q15
898
+ pld [r0]
899
+ FILTER_6TAG_8BITS d3, d5, d7, d17, d19, d1, d21, q14, q15
900
+ vst1.u8 {q10}, [r2], r3 //write 8th 16Byte
901
+
902
+ //q2, q3, q8, q9, q0 --> q0~q8
903
+ vswp q0, q8
904
+ vswp q0, q2
905
+ vmov q1, q3
906
+ vmov q3, q9 //q0~q8
907
+
908
+ sub r4, #8
909
+ cmp r4, #0
910
+ bne w16_v_mc_luma_loop
911
+ pop {r4}
912
+ WELS_ASM_FUNC_END
913
+
914
+
915
+ WELS_ASM_FUNC_BEGIN McHorVer02WidthEq8_neon
916
+ push {r4}
917
+ ldr r4, [sp, #4]
918
+
919
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
920
+ pld [r0]
921
+ pld [r0, r1]
922
+ vmov.u16 q14, #0x0014 // 20
923
+ vld1.u8 {d0}, [r0], r1 //d0=src[-2]
924
+ vld1.u8 {d1}, [r0], r1 //d1=src[-1]
925
+
926
+ pld [r0]
927
+ pld [r0, r1]
928
+ vshr.u16 q15, q14, #2 // 5
929
+ vld1.u8 {d2}, [r0], r1 //d2=src[0]
930
+ vld1.u8 {d3}, [r0], r1 //d3=src[1]
931
+
932
+ vld1.u8 {d4}, [r0], r1 //d4=src[2]
933
+ vld1.u8 {d5}, [r0], r1 //d5=src[3]
934
+
935
+ w8_v_mc_luma_loop:
936
+
937
+ pld [r0]
938
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
939
+ vld1.u8 {d0}, [r0], r1 //read 2nd row
940
+ vst1.u8 {d16}, [r2], r3 //write 1st 8Byte
941
+
942
+ pld [r0]
943
+ FILTER_6TAG_8BITS d1, d2, d3, d4, d5, d0, d16, q14, q15
944
+ vld1.u8 {d1}, [r0], r1 //read 3rd row
945
+ vst1.u8 {d16}, [r2], r3 //write 2nd 8Byte
946
+
947
+ pld [r0]
948
+ FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d16, q14, q15
949
+ vld1.u8 {d2}, [r0], r1 //read 4th row
950
+ vst1.u8 {d16}, [r2], r3 //write 3rd 8Byte
951
+
952
+ pld [r0]
953
+ FILTER_6TAG_8BITS d3, d4, d5, d0, d1, d2, d16, q14, q15
954
+ vld1.u8 {d3}, [r0], r1 //read 5th row
955
+ vst1.u8 {d16}, [r2], r3 //write 4th 8Byte
956
+
957
+ //d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
958
+ vswp q0, q2
959
+ vswp q1, q2
960
+
961
+ sub r4, #4
962
+ cmp r4, #0
963
+ bne w8_v_mc_luma_loop
964
+
965
+ pop {r4}
966
+ WELS_ASM_FUNC_END
967
+
968
+
969
+ WELS_ASM_FUNC_BEGIN McHorVer02WidthEq4_neon
970
+ push {r4, r5, r6, r7}
971
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
972
+ pld [r0]
973
+ pld [r0, r1]
974
+ vmov.u16 q14, #0x0014 // 20
975
+ ldr r4, [r0], r1 //r4=src[-2]
976
+ ldr r5, [r0], r1 //r5=src[-1]
977
+
978
+ pld [r0]
979
+ pld [r0, r1]
980
+ vshr.u16 q15, q14, #2 // 5
981
+ ldr r6, [r0], r1 //r6=src[0]
982
+ ldr r7, [r0], r1 //r7=src[1]
983
+
984
+ vmov d0, r4, r5
985
+ vmov d1, r5, r6
986
+ vmov d2, r6, r7
987
+
988
+ ldr r4, [r0], r1 //r4=src[2]
989
+ vmov d3, r7, r4
990
+ ldr r7, [sp, #16]
991
+
992
+ w4_v_mc_luma_loop:
993
+
994
+ // pld [r0]
995
+ //using reserving r4
996
+ ldr r5, [r0], r1 //r5=src[3]
997
+ ldr r6, [r0], r1 //r6=src[0]
998
+ vmov d4, r4, r5
999
+ vmov d5, r5, r6 //reserved r6
1000
+
1001
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
1002
+ vmov r4, r5, d16
1003
+ str r4, [r2], r3 //write 1st 4Byte
1004
+ str r5, [r2], r3 //write 2nd 4Byte
1005
+
1006
+ ldr r5, [r0], r1 //r5=src[1]
1007
+ ldr r4, [r0], r1 //r4=src[2]
1008
+ vmov d0, r6, r5
1009
+ vmov d1, r5, r4 //reserved r4
1010
+
1011
+ FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d16, q14, q15
1012
+ vmov r5, r6, d16
1013
+ str r5, [r2], r3 //write 3rd 4Byte
1014
+ str r6, [r2], r3 //write 4th 4Byte
1015
+
1016
+ //d4, d5, d0, d1 --> d0, d1, d2, d3
1017
+ vmov q1, q0
1018
+ vmov q0, q2
1019
+
1020
+ sub r7, #4
1021
+ cmp r7, #0
1022
+ bne w4_v_mc_luma_loop
1023
+
1024
+ pop {r4, r5, r6, r7}
1025
+ WELS_ASM_FUNC_END
1026
+
1027
+
1028
+ WELS_ASM_FUNC_BEGIN McHorVer22WidthEq16_neon
1029
+ push {r4}
1030
+ vpush {q4-q7}
1031
+ ldr r4, [sp, #68]
1032
+
1033
+ sub r0, #2 //src[-2]
1034
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
1035
+ pld [r0]
1036
+ pld [r0, r1]
1037
+
1038
+ vmov.u16 q14, #0x0014 // 20
1039
+ vld1.u8 {d0-d2}, [r0], r1 //use 21(16+5), =src[-2]
1040
+ vld1.u8 {d3-d5}, [r0], r1 //use 21(16+5), =src[-1]
1041
+
1042
+ pld [r0]
1043
+ pld [r0, r1]
1044
+ vshr.u16 q15, q14, #2 // 5
1045
+
1046
+ vld1.u8 {d6-d8}, [r0], r1 //use 21(16+5), =src[0]
1047
+ vld1.u8 {d9-d11}, [r0], r1 //use 21(16+5), =src[1]
1048
+ pld [r0]
1049
+ pld [r0, r1]
1050
+ vld1.u8 {d12-d14}, [r0], r1 //use 21(16+5), =src[2]
1051
+
1052
+ w16_hv_mc_luma_loop:
1053
+
1054
+ vld1.u8 {d15-d17}, [r0], r1 //use 21(16+5), =src[3]
1055
+ //the 1st row
1056
+ pld [r0]
1057
+ // vertical filtered into q9/q10
1058
+ FILTER_6TAG_8BITS_TO_16BITS d0, d3, d6, d9, d12, d15, q9, q14, q15 // 8 avail
1059
+ FILTER_6TAG_8BITS_TO_16BITS d1, d4, d7,d10, d13, d16,q10, q14, q15 // 8 avail
1060
+ // horizon filtered
1061
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1062
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d0 //output to q0[0]
1063
+
1064
+ // vertical filtered into q10/q11
1065
+ FILTER_6TAG_8BITS_TO_16BITS d2, d5, d8,d11, d14, d17,q11, q14, q15 // only 5 avail
1066
+ // horizon filtered
1067
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1068
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d1 //output to q0[1]
1069
+ vst1.u8 {q0}, [r2], r3 //write 16Byte
1070
+
1071
+
1072
+ vld1.u8 {d0-d2}, [r0], r1 //read 2nd row
1073
+ //the 2nd row
1074
+ pld [r0]
1075
+ // vertical filtered into q9/q10
1076
+ FILTER_6TAG_8BITS_TO_16BITS d3, d6, d9, d12, d15, d0, q9, q14, q15 // 8 avail
1077
+ FILTER_6TAG_8BITS_TO_16BITS d4, d7,d10, d13, d16, d1,q10, q14, q15 // 8 avail
1078
+ // horizon filtered
1079
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1080
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d3 //output to d3
1081
+
1082
+ // vertical filtered into q10/q11
1083
+ FILTER_6TAG_8BITS_TO_16BITS d5, d8,d11, d14, d17, d2,q11, q14, q15 // only 5 avail
1084
+ // horizon filtered
1085
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1086
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d4 //output to d4
1087
+
1088
+ vst1.u8 {d3, d4}, [r2], r3 //write 16Byte
1089
+
1090
+ vld1.u8 {d3-d5}, [r0], r1 //read 3rd row
1091
+ //the 3rd row
1092
+ pld [r0]
1093
+ // vertical filtered into q9/q10
1094
+ FILTER_6TAG_8BITS_TO_16BITS d6, d9, d12, d15, d0, d3, q9, q14, q15 // 8 avail
1095
+ FILTER_6TAG_8BITS_TO_16BITS d7,d10, d13, d16, d1, d4,q10, q14, q15 // 8 avail
1096
+ // horizon filtered
1097
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1098
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d6 //output to d6
1099
+
1100
+ // vertical filtered into q10/q11
1101
+ FILTER_6TAG_8BITS_TO_16BITS d8,d11, d14, d17, d2, d5,q11, q14, q15 // only 5 avail
1102
+ // horizon filtered
1103
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1104
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d7 //output to d7
1105
+ vst1.u8 {d6, d7}, [r2], r3 //write 16Byte
1106
+
1107
+ vld1.u8 {d6-d8}, [r0], r1 //read 4th row
1108
+ //the 4th row
1109
+ pld [r0]
1110
+ // vertical filtered into q9/q10
1111
+ FILTER_6TAG_8BITS_TO_16BITS d9, d12, d15, d0, d3, d6, q9, q14, q15 // 8 avail
1112
+ FILTER_6TAG_8BITS_TO_16BITS d10, d13, d16, d1, d4, d7,q10, q14, q15 // 8 avail
1113
+ // horizon filtered
1114
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1115
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d9 //output to d9
1116
+ // vertical filtered into q10/q11
1117
+ FILTER_6TAG_8BITS_TO_16BITS d11, d14, d17, d2, d5, d8,q11, q14, q15 // only 5 avail
1118
+ // horizon filtered
1119
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1120
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d10 //output to d10
1121
+ vst1.u8 {d9, d10}, [r2], r3 //write 16Byte
1122
+
1123
+ //d12~d17(q6~q8), d0~d8(q0~q3+d8), --> d0~d14
1124
+ vswp q0, q6
1125
+ vswp q6, q3
1126
+ vmov q5, q2
1127
+ vmov q2, q8
1128
+
1129
+ vmov d20,d8
1130
+ vmov q4, q1
1131
+ vmov q1, q7
1132
+ vmov d14,d20
1133
+
1134
+ sub r4, #4
1135
+ cmp r4, #0
1136
+ bne w16_hv_mc_luma_loop
1137
+ vpop {q4-q7}
1138
+ pop {r4}
1139
+ WELS_ASM_FUNC_END
1140
+
1141
+
1142
+ WELS_ASM_FUNC_BEGIN McHorVer22WidthEq8_neon
1143
+ push {r4}
1144
+ vpush {q4}
1145
+ ldr r4, [sp, #20]
1146
+
1147
+ sub r0, #2 //src[-2]
1148
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
1149
+ pld [r0]
1150
+ pld [r0, r1]
1151
+
1152
+ vmov.u16 q14, #0x0014 // 20
1153
+ vld1.u8 {q0}, [r0], r1 //use 13(8+5), =src[-2]
1154
+ vld1.u8 {q1}, [r0], r1 //use 13(8+5), =src[-1]
1155
+
1156
+ pld [r0]
1157
+ pld [r0, r1]
1158
+ vshr.u16 q15, q14, #2 // 5
1159
+
1160
+ vld1.u8 {q2}, [r0], r1 //use 13(8+5), =src[0]
1161
+ vld1.u8 {q3}, [r0], r1 //use 13(8+5), =src[1]
1162
+ pld [r0]
1163
+ pld [r0, r1]
1164
+ vld1.u8 {q4}, [r0], r1 //use 13(8+5), =src[2]
1165
+
1166
+ w8_hv_mc_luma_loop:
1167
+
1168
+ vld1.u8 {q8}, [r0], r1 //use 13(8+5), =src[3]
1169
+ //the 1st row
1170
+ pld [r0]
1171
+ // vertical filtered into q9/q10
1172
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d16, q9, q14, q15 // 8 avail
1173
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d17, q10, q14, q15 // 5 avail
1174
+ // horizon filtered
1175
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1176
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
1177
+ vst1.u8 d18, [r2], r3 //write 8Byte
1178
+
1179
+ vld1.u8 {q0}, [r0], r1 //read 2nd row
1180
+ //the 2nd row
1181
+ pld [r0]
1182
+ // vertical filtered into q9/q10
1183
+ FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8, d16, d0, q9, q14, q15 // 8 avail
1184
+ FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9, d17, d1, q10, q14, q15 // 5 avail
1185
+ // horizon filtered
1186
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1187
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
1188
+ vst1.u8 d18, [r2], r3 //write 8Byte
1189
+
1190
+ vld1.u8 {q1}, [r0], r1 //read 3rd row
1191
+ //the 3rd row
1192
+ pld [r0]
1193
+ // vertical filtered into q9/q10
1194
+ FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d16, d0, d2, q9, q14, q15 // 8 avail
1195
+ FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d17, d1, d3, q10, q14, q15 // 5 avail
1196
+ // horizon filtered
1197
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1198
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
1199
+ vst1.u8 d18, [r2], r3 //write 8Byte
1200
+
1201
+ vld1.u8 {q2}, [r0], r1 //read 4th row
1202
+ //the 4th row
1203
+ pld [r0]
1204
+ // vertical filtered into q9/q10
1205
+ FILTER_6TAG_8BITS_TO_16BITS d6, d8, d16, d0, d2, d4, q9, q14, q15 // 8 avail
1206
+ FILTER_6TAG_8BITS_TO_16BITS d7, d9, d17, d1, d3, d5, q10, q14, q15 // 5 avail
1207
+ // horizon filtered
1208
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1209
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
1210
+ vst1.u8 d18, [r2], r3 //write 8Byte
1211
+
1212
+ //q4~q5, q0~q2, --> q0~q4
1213
+ vswp q0, q4
1214
+ vswp q2, q4
1215
+ vmov q3, q1
1216
+ vmov q1, q8
1217
+
1218
+ sub r4, #4
1219
+ cmp r4, #0
1220
+ bne w8_hv_mc_luma_loop
1221
+ vpop {q4}
1222
+ pop {r4}
1223
+ WELS_ASM_FUNC_END
1224
+
1225
+
1226
+ WELS_ASM_FUNC_BEGIN McHorVer22WidthEq4_neon
1227
+ push {r4 ,r5, r6}
1228
+ vpush {q4-q7}
1229
+ ldr r6, [sp, #76]
1230
+
1231
+ sub r0, #2 //src[-2]
1232
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
1233
+ pld [r0]
1234
+ pld [r0, r1]
1235
+
1236
+ vmov.u16 q14, #0x0014 // 20
1237
+ vld1.u8 {q0}, [r0], r1 //use 9(4+5), =src[-2]
1238
+ vld1.u8 {q1}, [r0], r1 //use 9(4+5), =src[-1]
1239
+
1240
+ pld [r0]
1241
+ pld [r0, r1]
1242
+ vshr.u16 q15, q14, #2 // 5
1243
+
1244
+ vld1.u8 {q2}, [r0], r1 //use 9(4+5), =src[0]
1245
+ vld1.u8 {q3}, [r0], r1 //use 9(4+5), =src[1]
1246
+ pld [r0]
1247
+ pld [r0, r1]
1248
+ vld1.u8 {q4}, [r0], r1 //use 9(4+5), =src[2]
1249
+
1250
+ w4_hv_mc_luma_loop:
1251
+
1252
+ vld1.u8 {q5}, [r0], r1 //use 9(4+5), =src[3]
1253
+ vld1.u8 {q6}, [r0], r1 //use 9(4+5), =src[4]
1254
+
1255
+ //the 1st&2nd row
1256
+ pld [r0]
1257
+ pld [r0, r1]
1258
+ // vertical filtered
1259
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d10, q7, q14, q15 // 8 avail
1260
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d11, q8, q14, q15 // 1 avail
1261
+
1262
+ FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8,d10, d12, q9, q14, q15 // 8 avail
1263
+ FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9,d11, d13,q10, q14, q15 // 1 avail
1264
+ // horizon filtered
1265
+ UNPACK_2_16BITS_TO_ABC q7, q8, q11, q12, q13 //4 avail
1266
+ UNPACK_2_16BITS_TO_ABC q9,q10, q0, q7, q8 //4 avail
1267
+
1268
+ vmov d23, d0
1269
+ vmov d25, d14
1270
+ vmov d27, d16
1271
+
1272
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d22 //output to q11[0]
1273
+ vmov r4 ,r5, d22
1274
+ str r4, [r2], r3 //write 4Byte
1275
+ str r5, [r2], r3 //write 4Byte
1276
+
1277
+ //the 3rd&4th row
1278
+ vld1.u8 {q0}, [r0], r1 //use 9(4+5), =src[3]
1279
+ vld1.u8 {q1}, [r0], r1 //use 9(4+5), =src[4]
1280
+ pld [r0]
1281
+ pld [r0, r1]
1282
+ // vertical filtered
1283
+ FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d10, d12, d0, q7, q14, q15 // 8 avail
1284
+ FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d11, d13, d1, q8, q14, q15 // 1 avail
1285
+
1286
+ FILTER_6TAG_8BITS_TO_16BITS d6, d8,d10, d12, d0, d2, q9, q14, q15 // 8 avail
1287
+ FILTER_6TAG_8BITS_TO_16BITS d7, d9,d11, d13, d1, d3,q10, q14, q15 // 1 avail
1288
+ // horizon filtered
1289
+ UNPACK_2_16BITS_TO_ABC q7, q8, q11, q12, q13 //4 avail
1290
+ UNPACK_2_16BITS_TO_ABC q9,q10, q2, q7, q8 //4 avail
1291
+
1292
+ vmov d23, d4
1293
+ vmov d25, d14
1294
+ vmov d27, d16
1295
+
1296
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d22 //output to q11[0]
1297
+ vmov r4 ,r5, d22
1298
+ str r4, [r2], r3 //write 4Byte
1299
+ str r5, [r2], r3 //write 4Byte
1300
+
1301
+ //q4~q6, q0~q1, --> q0~q4
1302
+ vswp q4, q0
1303
+ vmov q3, q4
1304
+ vmov q4, q1
1305
+ vmov q1, q5
1306
+ vmov q2, q6
1307
+
1308
+ sub r6, #4
1309
+ cmp r6, #0
1310
+ bne w4_hv_mc_luma_loop
1311
+
1312
+ vpop {q4-q7}
1313
+ pop {r4, r5, r6}
1314
+ WELS_ASM_FUNC_END
1315
+
1316
+
1317
+ WELS_ASM_FUNC_BEGIN McCopyWidthEq16_neon
1318
+ push {r4}
1319
+ ldr r4, [sp, #4]
1320
+ w16_copy_loop:
1321
+ vld1.u8 {q0}, [r0], r1
1322
+ sub r4, #2
1323
+ vld1.u8 {q1}, [r0], r1
1324
+ vst1.u8 {q0}, [r2], r3
1325
+ cmp r4, #0
1326
+ vst1.u8 {q1}, [r2], r3
1327
+ bne w16_copy_loop
1328
+
1329
+ pop {r4}
1330
+ WELS_ASM_FUNC_END
1331
+
1332
+
1333
+ WELS_ASM_FUNC_BEGIN McCopyWidthEq8_neon
1334
+ push {r4}
1335
+ ldr r4, [sp, #4]
1336
+ w8_copy_loop:
1337
+ vld1.u8 {d0}, [r0], r1
1338
+ vld1.u8 {d1}, [r0], r1
1339
+ vst1.u8 {d0}, [r2], r3
1340
+ vst1.u8 {d1}, [r2], r3
1341
+ sub r4, #2
1342
+ cmp r4, #0
1343
+ bne w8_copy_loop
1344
+
1345
+ pop {r4}
1346
+ WELS_ASM_FUNC_END
1347
+
1348
+
1349
+ WELS_ASM_FUNC_BEGIN McCopyWidthEq4_neon
1350
+ push {r4, r5, r6}
1351
+ ldr r4, [sp, #12]
1352
+ w4_copy_loop:
1353
+ ldr r5, [r0], r1
1354
+ ldr r6, [r0], r1
1355
+ str r5, [r2], r3
1356
+ str r6, [r2], r3
1357
+
1358
+ sub r4, #2
1359
+ cmp r4, #0
1360
+ bne w4_copy_loop
1361
+
1362
+ pop {r4, r5, r6}
1363
+ WELS_ASM_FUNC_END
1364
+
1365
+
1366
+ WELS_ASM_FUNC_BEGIN PixelAvgWidthEq16_neon
1367
+ push {r4}
1368
+ ldr r4, [sp, #4]
1369
+ w16_pix_avg_loop:
1370
+ vld1.u8 {q0}, [r2]!
1371
+ vld1.u8 {q1}, [r3]!
1372
+ vld1.u8 {q2}, [r2]!
1373
+ vld1.u8 {q3}, [r3]!
1374
+
1375
+ vld1.u8 {q8}, [r2]!
1376
+ vld1.u8 {q9}, [r3]!
1377
+ vld1.u8 {q10}, [r2]!
1378
+ vld1.u8 {q11}, [r3]!
1379
+
1380
+ AVERAGE_TWO_8BITS d0, d0, d2
1381
+ AVERAGE_TWO_8BITS d1, d1, d3
1382
+ vst1.u8 {q0}, [r0], r1
1383
+
1384
+ AVERAGE_TWO_8BITS d4, d4, d6
1385
+ AVERAGE_TWO_8BITS d5, d5, d7
1386
+ vst1.u8 {q2}, [r0], r1
1387
+
1388
+ AVERAGE_TWO_8BITS d16, d16, d18
1389
+ AVERAGE_TWO_8BITS d17, d17, d19
1390
+ vst1.u8 {q8}, [r0], r1
1391
+
1392
+ AVERAGE_TWO_8BITS d20, d20, d22
1393
+ AVERAGE_TWO_8BITS d21, d21, d23
1394
+ vst1.u8 {q10}, [r0], r1
1395
+
1396
+ sub r4, #4
1397
+ cmp r4, #0
1398
+ bne w16_pix_avg_loop
1399
+
1400
+ pop {r4}
1401
+ WELS_ASM_FUNC_END
1402
+
1403
+
1404
+ WELS_ASM_FUNC_BEGIN PixelAvgWidthEq8_neon
1405
+ push {r4, r5}
1406
+ ldr r4, [sp, #8]
1407
+ mov r5, #16
1408
+ w8_pix_avg_loop:
1409
+
1410
+ vld1.u8 {d0}, [r2], r5
1411
+ vld1.u8 {d2}, [r3], r5
1412
+ vld1.u8 {d1}, [r2], r5
1413
+ vld1.u8 {d3}, [r3], r5
1414
+
1415
+ AVERAGE_TWO_8BITS d0, d0, d2
1416
+ AVERAGE_TWO_8BITS d1, d1, d3
1417
+ vst1.u8 {d0}, [r0], r1
1418
+ vst1.u8 {d1}, [r0], r1
1419
+
1420
+ vld1.u8 {d4}, [r2], r5
1421
+ vld1.u8 {d6}, [r3], r5
1422
+ vld1.u8 {d5}, [r2], r5
1423
+ vld1.u8 {d7}, [r3], r5
1424
+
1425
+ AVERAGE_TWO_8BITS d4, d4, d6
1426
+ AVERAGE_TWO_8BITS d5, d5, d7
1427
+ vst1.u8 {d4}, [r0], r1
1428
+ vst1.u8 {d5}, [r0], r1
1429
+
1430
+ sub r4, #4
1431
+ cmp r4, #0
1432
+ bne w8_pix_avg_loop
1433
+
1434
+ pop {r4, r5}
1435
+ WELS_ASM_FUNC_END
1436
+
1437
+
1438
+ WELS_ASM_FUNC_BEGIN PixelAvgWidthEq4_neon
1439
+ push {r4-r8}
1440
+ ldr r4, [sp, #20]
1441
+ w4_pix_avg_loop:
1442
+
1443
+ ldr r5, [r2]
1444
+ ldr r6, [r2, #16]
1445
+ ldr r7, [r3]
1446
+ ldr r8, [r3, #16]
1447
+ add r2, #32
1448
+ add r3, #32
1449
+
1450
+ vmov d0, r5, r6
1451
+ vmov d1, r7, r8
1452
+ AVERAGE_TWO_8BITS d0, d0, d1
1453
+ vmov r5, r6, d0
1454
+
1455
+ str r5, [r0], r1
1456
+ str r6, [r0], r1
1457
+
1458
+ sub r4, #2
1459
+ cmp r4, #0
1460
+ bne w4_pix_avg_loop
1461
+
1462
+ pop {r4-r8}
1463
+ WELS_ASM_FUNC_END
1464
+
1465
+ WELS_ASM_FUNC_BEGIN McChromaWidthEq8_neon
1466
+ push {r4, r5}
1467
+ ldr r4, [sp, #8]
1468
+ ldr r5, [sp, #12]
1469
+ // normal case: {cA*src[x] + cB*src[x+1]} + {cC*src[x+stride] + cD*srcp[x+stride+1]}
1470
+ // we can opti it by adding vert only/ hori only cases, to be continue
1471
+ vld1.u8 {d31}, [r4] //load A/B/C/D
1472
+ vld1.u8 {q0}, [r0], r1 //src[x]
1473
+
1474
+ vdup.u8 d28, d31[0] //A
1475
+ vdup.u8 d29, d31[1] //B
1476
+ vdup.u8 d30, d31[2] //C
1477
+ vdup.u8 d31, d31[3] //D
1478
+
1479
+ vext.u8 d1, d0, d1, #1 //src[x+1]
1480
+
1481
+ w8_mc_chroma_loop: // each two pxl row
1482
+ vld1.u8 {q1}, [r0], r1 //src[x+stride]
1483
+ vld1.u8 {q2}, [r0], r1 //src[x+2*stride]
1484
+ vext.u8 d3, d2, d3, #1 //src[x+stride+1]
1485
+ vext.u8 d5, d4, d5, #1 //src[x+2*stride+1]
1486
+
1487
+ vmull.u8 q3, d0, d28 //(src[x] * A)
1488
+ vmlal.u8 q3, d1, d29 //+=(src[x+1] * B)
1489
+ vmlal.u8 q3, d2, d30 //+=(src[x+stride] * C)
1490
+ vmlal.u8 q3, d3, d31 //+=(src[x+stride+1] * D)
1491
+ vrshrn.u16 d6, q3, #6
1492
+ vst1.u8 d6, [r2], r3
1493
+
1494
+ vmull.u8 q3, d2, d28 //(src[x] * A)
1495
+ vmlal.u8 q3, d3, d29 //+=(src[x+1] * B)
1496
+ vmlal.u8 q3, d4, d30 //+=(src[x+stride] * C)
1497
+ vmlal.u8 q3, d5, d31 //+=(src[x+stride+1] * D)
1498
+ vrshrn.u16 d6, q3, #6
1499
+ vst1.u8 d6, [r2], r3
1500
+
1501
+ vmov q0, q2
1502
+ sub r5, #2
1503
+ cmp r5, #0
1504
+ bne w8_mc_chroma_loop
1505
+
1506
+ pop {r4, r5}
1507
+ WELS_ASM_FUNC_END
1508
+
1509
+
1510
+ WELS_ASM_FUNC_BEGIN McChromaWidthEq4_neon
1511
+
1512
+ push {r4, r5, r6}
1513
+ ldr r4, [sp, #12]
1514
+ ldr r6, [sp, #16]
1515
+ // normal case: {cA*src[x] + cB*src[x+1]} + {cC*src[x+stride] + cD*srcp[x+stride+1]}
1516
+ // we can opti it by adding vert only/ hori only cases, to be continue
1517
+ vld1.u8 {d31}, [r4] //load A/B/C/D
1518
+
1519
+ vdup.u8 d28, d31[0] //A
1520
+ vdup.u8 d29, d31[1] //B
1521
+ vdup.u8 d30, d31[2] //C
1522
+ vdup.u8 d31, d31[3] //D
1523
+
1524
+ w4_mc_chroma_loop: // each two pxl row
1525
+ vld1.u8 {d0}, [r0], r1 //a::src[x]
1526
+ vld1.u8 {d2}, [r0], r1 //b::src[x+stride]
1527
+ vld1.u8 {d4}, [r0] //c::src[x+2*stride]
1528
+
1529
+ vshr.u64 d1, d0, #8
1530
+ vshr.u64 d3, d2, #8
1531
+ vshr.u64 d5, d4, #8
1532
+
1533
+ vmov q3, q1 //b::[0:7]+b::[1~8]
1534
+ vtrn.32 q0, q1 //d0{a::[0:3]+b::[0:3]}; d1{a::[1:4]+b::[1:4]}
1535
+ vtrn.32 q3, q2 //d6{b::[0:3]+c::[0:3]}; d7{b::[1:4]+c::[1:4]}
1536
+
1537
+ vmull.u8 q1, d0, d28 //(src[x] * A)
1538
+ vmlal.u8 q1, d1, d29 //+=(src[x+1] * B)
1539
+ vmlal.u8 q1, d6, d30 //+=(src[x+stride] * C)
1540
+ vmlal.u8 q1, d7, d31 //+=(src[x+stride+1] * D)
1541
+
1542
+ vrshrn.u16 d2, q1, #6
1543
+ vmov r4, r5, d2
1544
+ str r4, [r2], r3
1545
+ str r5, [r2], r3
1546
+
1547
+ sub r6, #2
1548
+ cmp r6, #0
1549
+ bne w4_mc_chroma_loop
1550
+
1551
+ pop {r4, r5, r6}
1552
+ WELS_ASM_FUNC_END
1553
+
1554
+ WELS_ASM_FUNC_BEGIN McHorVer20Width17_neon
1555
+ push {r4-r5}
1556
+ mov r4, #20
1557
+ mov r5, #1
1558
+ sub r4, r4, r4, lsl #(16-2)
1559
+ lsl r5, #16
1560
+ ror r4, #16
1561
+ vmov d3, r5, r4 // 0x0014FFFB00010000
1562
+
1563
+ sub r3, #16
1564
+ ldr r4, [sp, #8]
1565
+
1566
+ sub r0, #2
1567
+ vmov.u16 q14, #0x0014 // 20
1568
+ vshr.u16 q15, q14, #2 // 5
1569
+
1570
+ w17_h_mc_luma_loop:
1571
+ vld1.u8 {d0,d1,d2}, [r0], r1 //only use 22(17+5); q0=src[-2]
1572
+
1573
+ vext.8 q2, q0, q1, #1 //q2=src[-1]
1574
+ vext.8 q3, q0, q1, #2 //q3=src[0]
1575
+ vext.8 q8, q0, q1, #3 //q8=src[1]
1576
+ vext.8 q9, q0, q1, #4 //q9=src[2]
1577
+ vext.8 q10, q0, q1, #5 //q10=src[3]
1578
+
1579
+ FILTER_6TAG_8BITS d0, d4, d6, d16, d18, d20, d22, q14, q15
1580
+
1581
+ FILTER_6TAG_8BITS d1, d5, d7, d17, d19, d21, d23, q14, q15
1582
+
1583
+ vst1.u8 {d22, d23}, [r2]! //write [0:15] Byte
1584
+
1585
+ vsli.64 d2, d2, #8 // [0][1][2][3][4][5]XO-->O[0][1][2][3][4][5]X
1586
+ FILTER_SINGLE_TAG_8BITS d2, d3, d22, q11, q1
1587
+
1588
+ vst1.u8 {d2[0]}, [r2], r3 //write 16th Byte
1589
+
1590
+ sub r4, #1
1591
+ cmp r4, #0
1592
+ bne w17_h_mc_luma_loop
1593
+ pop {r4-r5}
1594
+ WELS_ASM_FUNC_END
1595
+
1596
+
1597
+ WELS_ASM_FUNC_BEGIN McHorVer20Width9_neon
1598
+ push {r4-r5}
1599
+ mov r4, #20
1600
+ mov r5, #1
1601
+ sub r4, r4, r4, lsl #(16-2)
1602
+ lsl r5, #16
1603
+ ror r4, #16
1604
+ vmov d7, r5, r4 // 0x0014FFFB00010000
1605
+
1606
+ sub r3, #8
1607
+ ldr r4, [sp, #8]
1608
+
1609
+ sub r0, #2
1610
+ vmov.u16 q14, #0x0014 // 20
1611
+ vshr.u16 q15, q14, #2 // 5
1612
+
1613
+ w9_h_mc_luma_loop:
1614
+ vld1.u8 {d0,d1}, [r0], r1 //only use 14(9+5); q0=src[-2]
1615
+ pld [r0]
1616
+
1617
+ vext.8 d2, d0, d1, #1 //d2=src[-1]
1618
+ vext.8 d3, d0, d1, #2 //d3=src[0]
1619
+ vext.8 d4, d0, d1, #3 //d4=src[1]
1620
+ vext.8 d5, d0, d1, #4 //d5=src[2]
1621
+ vext.8 d6, d0, d1, #5 //d6=src[3]
1622
+
1623
+ FILTER_6TAG_8BITS d0, d2, d3, d4, d5, d6, d16, q14, q15
1624
+
1625
+ sub r4, #1
1626
+ vst1.u8 {d16}, [r2]! //write [0:7] Byte
1627
+
1628
+ vsli.64 d2, d1, #8 // [0][1][2][3][4][5]XO-->O[0][1][2][3][4][5]X
1629
+ FILTER_SINGLE_TAG_8BITS d2, d7, d18, q9, q1
1630
+ vst1.u8 {d2[0]}, [r2], r3 //write 8th Byte
1631
+
1632
+ cmp r4, #0
1633
+ bne w9_h_mc_luma_loop
1634
+ pop {r4-r5}
1635
+ WELS_ASM_FUNC_END
1636
+
1637
+
1638
+ WELS_ASM_FUNC_BEGIN McHorVer20Width5_neon
1639
+ push {r4}
1640
+ sub r3, #4
1641
+ sub r0, #2
1642
+ ldr r4, [sp, #4]
1643
+ vmov.u16 q14, #0x0014 // 20
1644
+ vshr.u16 q15, q14, #2 // 5
1645
+
1646
+ w5_h_mc_luma_loop:
1647
+ vld1.u8 {d0,d1}, [r0], r1 //only use 10(5+5); q0=src[-2]
1648
+ pld [r0]
1649
+
1650
+ vext.8 d2, d0, d1, #1 //d2=src[-1]
1651
+ vext.8 d3, d0, d1, #2 //d3=src[0]
1652
+ vext.8 d4, d0, d1, #3 //d4=src[1]
1653
+ vext.8 d5, d0, d1, #4 //d5=src[2]
1654
+ vext.8 d6, d0, d1, #5 //d6=src[3]
1655
+
1656
+ FILTER_6TAG_8BITS d0, d2, d3, d4, d5, d6, d16, q14, q15
1657
+
1658
+ sub r4, #1
1659
+ vst1.u32 {d16[0]}, [r2]! //write [0:3] Byte
1660
+ vst1.u8 {d16[4]}, [r2], r3 //write 5th Byte
1661
+
1662
+ cmp r4, #0
1663
+ bne w5_h_mc_luma_loop
1664
+ pop {r4}
1665
+ WELS_ASM_FUNC_END
1666
+
1667
+
1668
+ WELS_ASM_FUNC_BEGIN McHorVer02Height17_neon
1669
+ push {r4}
1670
+ ldr r4, [sp, #4]
1671
+
1672
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
1673
+ pld [r0]
1674
+ pld [r0, r1]
1675
+ vmov.u16 q14, #0x0014 // 20
1676
+ vld1.u8 {q0}, [r0], r1 //q0=src[-2]
1677
+ vld1.u8 {q1}, [r0], r1 //q1=src[-1]
1678
+
1679
+ pld [r0]
1680
+ pld [r0, r1]
1681
+ vshr.u16 q15, q14, #2 // 5
1682
+ vld1.u8 {q2}, [r0], r1 //q2=src[0]
1683
+ vld1.u8 {q3}, [r0], r1 //q3=src[1]
1684
+ vld1.u8 {q8}, [r0], r1 //q8=src[2]
1685
+
1686
+ w17_v_mc_luma_loop:
1687
+
1688
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
1689
+
1690
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
1691
+ pld [r0]
1692
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
1693
+ vld1.u8 {q0}, [r0], r1 //read 2nd row
1694
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
1695
+
1696
+ FILTER_6TAG_8BITS d2, d4, d6, d16, d18, d0, d20, q14, q15
1697
+ pld [r0]
1698
+ FILTER_6TAG_8BITS d3, d5, d7, d17, d19, d1, d21, q14, q15
1699
+ vld1.u8 {q1}, [r0], r1 //read 3rd row
1700
+ vst1.u8 {q10}, [r2], r3 //write 2nd 16Byte
1701
+
1702
+ FILTER_6TAG_8BITS d4, d6, d16, d18, d0, d2, d20, q14, q15
1703
+ pld [r0]
1704
+ FILTER_6TAG_8BITS d5, d7, d17, d19, d1, d3, d21, q14, q15
1705
+ vld1.u8 {q2}, [r0], r1 //read 4th row
1706
+ vst1.u8 {q10}, [r2], r3 //write 3rd 16Byte
1707
+
1708
+ FILTER_6TAG_8BITS d6, d16, d18, d0, d2, d4, d20, q14, q15
1709
+ pld [r0]
1710
+ FILTER_6TAG_8BITS d7, d17, d19, d1, d3, d5, d21, q14, q15
1711
+ vld1.u8 {q3}, [r0], r1 //read 5th row
1712
+ vst1.u8 {q10}, [r2], r3 //write 4th 16Byte
1713
+
1714
+ FILTER_6TAG_8BITS d16, d18, d0, d2, d4, d6, d20, q14, q15
1715
+ pld [r0]
1716
+ FILTER_6TAG_8BITS d17, d19, d1, d3, d5, d7, d21, q14, q15
1717
+ vld1.u8 {q8}, [r0], r1 //read 6th row
1718
+ vst1.u8 {q10}, [r2], r3 //write 5th 16Byte
1719
+
1720
+ FILTER_6TAG_8BITS d18, d0, d2, d4, d6, d16, d20, q14, q15
1721
+ pld [r0]
1722
+ FILTER_6TAG_8BITS d19, d1, d3, d5, d7, d17, d21, q14, q15
1723
+ vld1.u8 {q9}, [r0], r1 //read 7th row
1724
+ vst1.u8 {q10}, [r2], r3 //write 6th 16Byte
1725
+
1726
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
1727
+ pld [r0]
1728
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
1729
+ vld1.u8 {q0}, [r0], r1 //read 8th row
1730
+ vst1.u8 {q10}, [r2], r3 //write 7th 16Byte
1731
+
1732
+ FILTER_6TAG_8BITS d2, d4, d6, d16, d18, d0, d20, q14, q15
1733
+ pld [r0]
1734
+ FILTER_6TAG_8BITS d3, d5, d7, d17, d19, d1, d21, q14, q15
1735
+ vst1.u8 {q10}, [r2], r3 //write 8th 16Byte
1736
+
1737
+ //q2, q3, q8, q9, q0 --> q0~q8
1738
+ vswp q0, q8
1739
+ vswp q0, q2
1740
+ vmov q1, q3
1741
+ vmov q3, q9 //q0~q8
1742
+
1743
+ sub r4, #8
1744
+ cmp r4, #1
1745
+ bne w17_v_mc_luma_loop
1746
+ // the last 16Bytes
1747
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
1748
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
1749
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
1750
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
1751
+
1752
+ pop {r4}
1753
+ WELS_ASM_FUNC_END
1754
+
1755
+
1756
+ WELS_ASM_FUNC_BEGIN McHorVer02Height9_neon
1757
+ push {r4}
1758
+ ldr r4, [sp, #4]
1759
+
1760
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
1761
+ pld [r0]
1762
+ pld [r0, r1]
1763
+ vmov.u16 q14, #0x0014 // 20
1764
+ vld1.u8 {d0}, [r0], r1 //d0=src[-2]
1765
+ vld1.u8 {d1}, [r0], r1 //d1=src[-1]
1766
+
1767
+ pld [r0]
1768
+ pld [r0, r1]
1769
+ vshr.u16 q15, q14, #2 // 5
1770
+ vld1.u8 {d2}, [r0], r1 //d2=src[0]
1771
+ vld1.u8 {d3}, [r0], r1 //d3=src[1]
1772
+
1773
+ vld1.u8 {d4}, [r0], r1 //d4=src[2]
1774
+ vld1.u8 {d5}, [r0], r1 //d5=src[3]
1775
+
1776
+ w9_v_mc_luma_loop:
1777
+
1778
+ pld [r0]
1779
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
1780
+ vld1.u8 {d0}, [r0], r1 //read 2nd row
1781
+ vst1.u8 {d16}, [r2], r3 //write 1st 8Byte
1782
+
1783
+ pld [r0]
1784
+ FILTER_6TAG_8BITS d1, d2, d3, d4, d5, d0, d16, q14, q15
1785
+ vld1.u8 {d1}, [r0], r1 //read 3rd row
1786
+ vst1.u8 {d16}, [r2], r3 //write 2nd 8Byte
1787
+
1788
+ pld [r0]
1789
+ FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d16, q14, q15
1790
+ vld1.u8 {d2}, [r0], r1 //read 4th row
1791
+ vst1.u8 {d16}, [r2], r3 //write 3rd 8Byte
1792
+
1793
+ pld [r0]
1794
+ FILTER_6TAG_8BITS d3, d4, d5, d0, d1, d2, d16, q14, q15
1795
+ vld1.u8 {d3}, [r0], r1 //read 5th row
1796
+ vst1.u8 {d16}, [r2], r3 //write 4th 8Byte
1797
+
1798
+ //d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
1799
+ vswp q0, q2
1800
+ vswp q1, q2
1801
+
1802
+ sub r4, #4
1803
+ cmp r4, #1
1804
+ bne w9_v_mc_luma_loop
1805
+
1806
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
1807
+ vst1.u8 {d16}, [r2], r3 //write last 8Byte
1808
+
1809
+ pop {r4}
1810
+ WELS_ASM_FUNC_END
1811
+
1812
+
1813
+ WELS_ASM_FUNC_BEGIN McHorVer02Height5_neon
1814
+ push {r4}
1815
+ ldr r4, [sp, #4]
1816
+
1817
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride]
1818
+ pld [r0]
1819
+ pld [r0, r1]
1820
+ vmov.u16 q14, #0x0014 // 20
1821
+ vld1.u8 {d0}, [r0], r1 //d0=src[-2]
1822
+ vld1.u8 {d1}, [r0], r1 //d1=src[-1]
1823
+
1824
+ pld [r0]
1825
+ pld [r0, r1]
1826
+ vshr.u16 q15, q14, #2 // 5
1827
+ vld1.u8 {d2}, [r0], r1 //d2=src[0]
1828
+ vld1.u8 {d3}, [r0], r1 //d3=src[1]
1829
+
1830
+ vld1.u8 {d4}, [r0], r1 //d4=src[2]
1831
+ vld1.u8 {d5}, [r0], r1 //d5=src[3]
1832
+
1833
+ w5_v_mc_luma_loop:
1834
+
1835
+ pld [r0]
1836
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
1837
+ vld1.u8 {d0}, [r0], r1 //read 2nd row
1838
+ vst1.u32 {d16[0]}, [r2], r3 //write 1st 4Byte
1839
+
1840
+ pld [r0]
1841
+ FILTER_6TAG_8BITS d1, d2, d3, d4, d5, d0, d16, q14, q15
1842
+ vld1.u8 {d1}, [r0], r1 //read 3rd row
1843
+ vst1.u32 {d16[0]}, [r2], r3 //write 2nd 4Byte
1844
+
1845
+ pld [r0]
1846
+ FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d16, q14, q15
1847
+ vld1.u8 {d2}, [r0], r1 //read 4th row
1848
+ vst1.u32 {d16[0]}, [r2], r3 //write 3rd 4Byte
1849
+
1850
+ pld [r0]
1851
+ FILTER_6TAG_8BITS d3, d4, d5, d0, d1, d2, d16, q14, q15
1852
+ vld1.u8 {d3}, [r0], r1 //read 5th row
1853
+ vst1.u32 {d16[0]}, [r2], r3 //write 4th 8Byte
1854
+
1855
+ //d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
1856
+ vswp q0, q2
1857
+ vswp q1, q2
1858
+
1859
+ sub r4, #4
1860
+ cmp r4, #1
1861
+ bne w5_v_mc_luma_loop
1862
+
1863
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
1864
+ vst1.u32 {d16[0]}, [r2], r3 //write last 4Byte
1865
+
1866
+ pop {r4}
1867
+ WELS_ASM_FUNC_END
1868
+
1869
+
1870
+ WELS_ASM_FUNC_BEGIN McHorVer22Width17_neon
1871
+ push {r4}
1872
+ vpush {q4-q7}
1873
+ ldr r4, [sp, #68]
1874
+
1875
+ sub r0, #2 //src[-2]
1876
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
1877
+ pld [r0]
1878
+ pld [r0, r1]
1879
+
1880
+ vmov.u16 q14, #0x0014 // 20
1881
+ vld1.u8 {d0-d2}, [r0], r1 //use 21(17+5), =src[-2]
1882
+ vld1.u8 {d3-d5}, [r0], r1 //use 21(17+5), =src[-1]
1883
+
1884
+ pld [r0]
1885
+ pld [r0, r1]
1886
+ vshr.u16 q15, q14, #2 // 5
1887
+
1888
+ vld1.u8 {d6-d8}, [r0], r1 //use 21(17+5), =src[0]
1889
+ vld1.u8 {d9-d11}, [r0], r1 //use 21(17+5), =src[1]
1890
+ pld [r0]
1891
+ pld [r0, r1]
1892
+ vld1.u8 {d12-d14}, [r0], r1 //use 21(17+5), =src[2]
1893
+ sub r3, #16
1894
+
1895
+ w17_hv_mc_luma_loop:
1896
+
1897
+ vld1.u8 {d15-d17}, [r0], r1 //use 21(17+5), =src[3]
1898
+ //the 1st row
1899
+ pld [r0]
1900
+ // vertical filtered into q9/q10
1901
+ FILTER_6TAG_8BITS_TO_16BITS d0, d3, d6, d9, d12, d15, q9, q14, q15 // 8 avail
1902
+ FILTER_6TAG_8BITS_TO_16BITS d1, d4, d7,d10, d13, d16,q10, q14, q15 // 8 avail
1903
+ // horizon filtered
1904
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1905
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d0 //output to q0[0]
1906
+ // vertical filtered into q10/q11
1907
+ FILTER_6TAG_8BITS_TO_16BITS d2, d5, d8,d11, d14, d17,q11, q14, q15 // only 6 avail
1908
+ // horizon filtered
1909
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1910
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d1 //output to q0[1]
1911
+ vst1.u8 {d0, d1}, [r2]! //write 16Byte
1912
+ UNPACK_1_IN_8x16BITS_TO_8BITS d2, d22, d23, q11 //output to d2[0]
1913
+ vst1.u8 {d2[0]}, [r2], r3 //write 16th Byte
1914
+
1915
+ vld1.u8 {d0-d2}, [r0], r1 //read 2nd row
1916
+ //the 2nd row
1917
+ pld [r0]
1918
+ // vertical filtered into q9/q10
1919
+ FILTER_6TAG_8BITS_TO_16BITS d3, d6, d9, d12, d15, d0, q9, q14, q15 // 8 avail
1920
+ FILTER_6TAG_8BITS_TO_16BITS d4, d7,d10, d13, d16, d1,q10, q14, q15 // 8 avail
1921
+ // horizon filtered
1922
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1923
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d3 //output to d3
1924
+ // vertical filtered into q10/q11
1925
+ FILTER_6TAG_8BITS_TO_16BITS d5, d8,d11, d14, d17, d2,q11, q14, q15 // only 6 avail
1926
+ // horizon filtered
1927
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1928
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d4 //output to d4
1929
+ vst1.u8 {d3, d4}, [r2]! //write 16Byte
1930
+ UNPACK_1_IN_8x16BITS_TO_8BITS d5, d22, d23, q11 //output to d5[0]
1931
+ vst1.u8 {d5[0]}, [r2], r3 //write 16th Byte
1932
+
1933
+ vld1.u8 {d3-d5}, [r0], r1 //read 3rd row
1934
+ //the 3rd row
1935
+ pld [r0]
1936
+ // vertical filtered into q9/q10
1937
+ FILTER_6TAG_8BITS_TO_16BITS d6, d9, d12, d15, d0, d3, q9, q14, q15 // 8 avail
1938
+ FILTER_6TAG_8BITS_TO_16BITS d7,d10, d13, d16, d1, d4,q10, q14, q15 // 8 avail
1939
+ // horizon filtered
1940
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1941
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d6 //output to d6
1942
+ // vertical filtered into q10/q11
1943
+ FILTER_6TAG_8BITS_TO_16BITS d8,d11, d14, d17, d2, d5,q11, q14, q15 // only 6 avail
1944
+ // horizon filtered
1945
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1946
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d7 //output to d7
1947
+ vst1.u8 {d6, d7}, [r2]! //write 16Byte
1948
+ UNPACK_1_IN_8x16BITS_TO_8BITS d8, d22, d23, q11 //output to d8[0]
1949
+ vst1.u8 {d8[0]}, [r2], r3 //write 16th Byte
1950
+
1951
+ vld1.u8 {d6-d8}, [r0], r1 //read 4th row
1952
+ //the 4th row
1953
+ pld [r0]
1954
+ // vertical filtered into q9/q10
1955
+ FILTER_6TAG_8BITS_TO_16BITS d9, d12, d15, d0, d3, d6, q9, q14, q15 // 8 avail
1956
+ FILTER_6TAG_8BITS_TO_16BITS d10, d13, d16, d1, d4, d7,q10, q14, q15 // 8 avail
1957
+ // horizon filtered
1958
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1959
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d9 //output to d9
1960
+ // vertical filtered into q10/q11
1961
+ FILTER_6TAG_8BITS_TO_16BITS d11, d14, d17, d2, d5, d8,q11, q14, q15 // only 6 avail
1962
+ // horizon filtered
1963
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1964
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d10 //output to d10
1965
+ vst1.u8 {d9, d10}, [r2]! //write 16Byte
1966
+ UNPACK_1_IN_8x16BITS_TO_8BITS d11, d22, d23, q11 //output to d11[0]
1967
+ vst1.u8 {d11[0]}, [r2], r3 //write 16th Byte
1968
+
1969
+ //d12~d17(q6~q8), d0~d8(q0~q3+d8), --> d0~d14
1970
+ vswp q0, q6
1971
+ vswp q6, q3
1972
+ vmov q5, q2
1973
+ vmov q2, q8
1974
+
1975
+ vmov d20,d8
1976
+ vmov q4, q1
1977
+ vmov q1, q7
1978
+ vmov d14,d20
1979
+
1980
+ sub r4, #4
1981
+ cmp r4, #1
1982
+ bne w17_hv_mc_luma_loop
1983
+ //the last row
1984
+ vld1.u8 {d15-d17}, [r0], r1 //use 21(17+5), =src[3]
1985
+ // vertical filtered into q9/q10
1986
+ FILTER_6TAG_8BITS_TO_16BITS d0, d3, d6, d9, d12, d15, q9, q14, q15 // 8 avail
1987
+ FILTER_6TAG_8BITS_TO_16BITS d1, d4, d7,d10, d13, d16,q10, q14, q15 // 8 avail
1988
+ // horizon filtered
1989
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
1990
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d0 //output to q0[0]
1991
+ // vertical filtered into q10/q11
1992
+ FILTER_6TAG_8BITS_TO_16BITS d2, d5, d8,d11, d14, d17,q11, q14, q15 // only 6 avail
1993
+ // horizon filtered
1994
+ UNPACK_2_16BITS_TO_ABC q10, q11, q9, q12, q13
1995
+ FILTER_3_IN_16BITS_TO_8BITS q9, q12, q13, d1 //output to q0[1]
1996
+ vst1.u8 {q0}, [r2]! //write 16Byte
1997
+ UNPACK_1_IN_8x16BITS_TO_8BITS d2, d22, d23, q11 //output to d2[0]
1998
+ vst1.u8 {d2[0]}, [r2], r3 //write 16th Byte
1999
+
2000
+ vpop {q4-q7}
2001
+ pop {r4}
2002
+ WELS_ASM_FUNC_END
2003
+
2004
+
2005
+ WELS_ASM_FUNC_BEGIN McHorVer22Width9_neon
2006
+ push {r4}
2007
+ vpush {q4}
2008
+ ldr r4, [sp, #20]
2009
+
2010
+ sub r0, #2 //src[-2]
2011
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
2012
+ pld [r0]
2013
+ pld [r0, r1]
2014
+
2015
+ vmov.u16 q14, #0x0014 // 20
2016
+ vld1.u8 {q0}, [r0], r1 //use 14(9+5), =src[-2]
2017
+ vld1.u8 {q1}, [r0], r1 //use 14(9+5), =src[-1]
2018
+
2019
+ pld [r0]
2020
+ pld [r0, r1]
2021
+ vshr.u16 q15, q14, #2 // 5
2022
+
2023
+ vld1.u8 {q2}, [r0], r1 //use 14(9+5), =src[0]
2024
+ vld1.u8 {q3}, [r0], r1 //use 14(9+5), =src[1]
2025
+ pld [r0]
2026
+ pld [r0, r1]
2027
+ vld1.u8 {q4}, [r0], r1 //use 14(9+5), =src[2]
2028
+ sub r3, #8
2029
+
2030
+ w9_hv_mc_luma_loop:
2031
+
2032
+ vld1.u8 {q8}, [r0], r1 //use 14(9+5), =src[3]
2033
+ //the 1st row
2034
+ pld [r0]
2035
+ // vertical filtered into q9/q10
2036
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d16, q9, q14, q15 // 8 avail
2037
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d17, q10, q14, q15 // 6 avail
2038
+ // horizon filtered
2039
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2040
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
2041
+ vst1.u8 d18, [r2]! //write 8Byte
2042
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
2043
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
2044
+
2045
+ vld1.u8 {q0}, [r0], r1 //read 2nd row
2046
+ //the 2nd row
2047
+ pld [r0]
2048
+ // vertical filtered into q9/q10
2049
+ FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8, d16, d0, q9, q14, q15 // 8 avail
2050
+ FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9, d17, d1, q10, q14, q15 // 6 avail
2051
+ // horizon filtered
2052
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2053
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
2054
+ vst1.u8 d18, [r2]! //write 8Byte
2055
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
2056
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
2057
+
2058
+ vld1.u8 {q1}, [r0], r1 //read 3rd row
2059
+ //the 3rd row
2060
+ pld [r0]
2061
+ // vertical filtered into q9/q10
2062
+ FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d16, d0, d2, q9, q14, q15 // 8 avail
2063
+ FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d17, d1, d3, q10, q14, q15 // 6 avail
2064
+ // horizon filtered
2065
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2066
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
2067
+ vst1.u8 d18, [r2]! //write 8Byte
2068
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
2069
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
2070
+
2071
+ vld1.u8 {q2}, [r0], r1 //read 4th row
2072
+ //the 4th row
2073
+ pld [r0]
2074
+ // vertical filtered into q9/q10
2075
+ FILTER_6TAG_8BITS_TO_16BITS d6, d8, d16, d0, d2, d4, q9, q14, q15 // 8 avail
2076
+ FILTER_6TAG_8BITS_TO_16BITS d7, d9, d17, d1, d3, d5, q10, q14, q15 // 6 avail
2077
+ // horizon filtered
2078
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2079
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
2080
+ vst1.u8 d18, [r2]! //write 8Byte
2081
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
2082
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
2083
+
2084
+ //q4~q8, q0~q2, --> q0~q4
2085
+ vswp q0, q4
2086
+ vswp q2, q4
2087
+ vmov q3, q1
2088
+ vmov q1, q8
2089
+
2090
+ sub r4, #4
2091
+ cmp r4, #1
2092
+ bne w9_hv_mc_luma_loop
2093
+ //the last row
2094
+ vld1.u8 {q8}, [r0], r1 //use 14(9+5), =src[3]
2095
+ // vertical filtered into q9/q10
2096
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d16, q9, q14, q15 // 8 avail
2097
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d17, q10, q14, q15 // 6 avail
2098
+ // horizon filtered
2099
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2100
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
2101
+ vst1.u8 d18, [r2]! //write 8Byte
2102
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
2103
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
2104
+ vpop {q4}
2105
+ pop {r4}
2106
+ WELS_ASM_FUNC_END
2107
+
2108
+
2109
+ WELS_ASM_FUNC_BEGIN McHorVer22Width5_neon
2110
+ push {r4}
2111
+ vpush {q4}
2112
+ ldr r4, [sp, #20]
2113
+
2114
+ sub r0, #2 //src[-2]
2115
+ sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
2116
+ pld [r0]
2117
+ pld [r0, r1]
2118
+
2119
+ vmov.u16 q14, #0x0014 // 20
2120
+ vld1.u8 {q0}, [r0], r1 //use 10(5+5), =src[-2]
2121
+ vld1.u8 {q1}, [r0], r1 //use 10(5+5), =src[-1]
2122
+
2123
+ pld [r0]
2124
+ pld [r0, r1]
2125
+ vshr.u16 q15, q14, #2 // 5
2126
+
2127
+ vld1.u8 {q2}, [r0], r1 //use 10(5+5), =src[0]
2128
+ vld1.u8 {q3}, [r0], r1 //use 10(5+5), =src[1]
2129
+ pld [r0]
2130
+ pld [r0, r1]
2131
+ vld1.u8 {q4}, [r0], r1 //use 10(5+5), =src[2]
2132
+ sub r3, #4
2133
+
2134
+ w5_hv_mc_luma_loop:
2135
+
2136
+ vld1.u8 {q8}, [r0], r1 //use 10(5+5), =src[3]
2137
+ //the 1st row
2138
+ pld [r0]
2139
+ // vertical filtered into q9/q10
2140
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d16, q9, q14, q15
2141
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d17, q10, q14, q15
2142
+ // horizon filtered
2143
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2144
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18
2145
+ vst1.u32 {d18[0]}, [r2]! //write 4Byte
2146
+ vst1.u8 {d18[4]}, [r2], r3 //write 5th Byte
2147
+
2148
+ vld1.u8 {q0}, [r0], r1 //read 2nd row
2149
+ //the 2nd row
2150
+ pld [r0]
2151
+ // vertical filtered into q9/q10
2152
+ FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8, d16, d0, q9, q14, q15
2153
+ FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9, d17, d1, q10, q14, q15
2154
+ // horizon filtered
2155
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2156
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18
2157
+ vst1.u32 {d18[0]}, [r2]! //write 4Byte
2158
+ vst1.u8 {d18[4]}, [r2], r3 //write 5th Byte
2159
+
2160
+ vld1.u8 {q1}, [r0], r1 //read 3rd row
2161
+ //the 3rd row
2162
+ pld [r0]
2163
+ // vertical filtered into q9/q10
2164
+ FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d16, d0, d2, q9, q14, q15
2165
+ FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d17, d1, d3, q10, q14, q15
2166
+ // horizon filtered
2167
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2168
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18
2169
+ vst1.u32 {d18[0]}, [r2]! //write 4Byte
2170
+ vst1.u8 {d18[4]}, [r2], r3 //write 5th Byte
2171
+
2172
+ vld1.u8 {q2}, [r0], r1 //read 4th row
2173
+ //the 4th row
2174
+ pld [r0]
2175
+ // vertical filtered into q9/q10
2176
+ FILTER_6TAG_8BITS_TO_16BITS d6, d8, d16, d0, d2, d4, q9, q14, q15
2177
+ FILTER_6TAG_8BITS_TO_16BITS d7, d9, d17, d1, d3, d5, q10, q14, q15
2178
+ // horizon filtered
2179
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2180
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18
2181
+ vst1.u32 {d18[0]}, [r2]! //write 4Byte
2182
+ vst1.u8 {d18[4]}, [r2], r3 //write 5th Byte
2183
+
2184
+ //q4~q8, q0~q2, --> q0~q4
2185
+ vswp q0, q4
2186
+ vswp q2, q4
2187
+ vmov q3, q1
2188
+ vmov q1, q8
2189
+
2190
+ sub r4, #4
2191
+ cmp r4, #1
2192
+ bne w5_hv_mc_luma_loop
2193
+ //the last row
2194
+ vld1.u8 {q8}, [r0], r1 //use 10(5+5), =src[3]
2195
+ // vertical filtered into q9/q10
2196
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d16, q9, q14, q15
2197
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d17, q10, q14, q15
2198
+ // horizon filtered
2199
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
2200
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18
2201
+ vst1.u32 {d18[0]}, [r2]! //write 4Byte
2202
+ vst1.u8 {d18[4]}, [r2], r3 //write 5th Byte
2203
+ vpop {q4}
2204
+ pop {r4}
2205
+ WELS_ASM_FUNC_END
2206
+
2207
+
2208
+ WELS_ASM_FUNC_BEGIN PixStrideAvgWidthEq16_neon
2209
+ push {r4, r5, r6}
2210
+ ldr r4, [sp, #12]
2211
+ ldr r5, [sp, #16]
2212
+ ldr r6, [sp, #20]
2213
+
2214
+ enc_w16_pix_avg_loop:
2215
+ vld1.u8 {q0}, [r2], r3
2216
+ vld1.u8 {q1}, [r4], r5
2217
+ vld1.u8 {q2}, [r2], r3
2218
+ vld1.u8 {q3}, [r4], r5
2219
+
2220
+ vld1.u8 {q8}, [r2], r3
2221
+ vld1.u8 {q9}, [r4], r5
2222
+ vld1.u8 {q10}, [r2], r3
2223
+ vld1.u8 {q11}, [r4], r5
2224
+
2225
+ AVERAGE_TWO_8BITS d0, d0, d2
2226
+ AVERAGE_TWO_8BITS d1, d1, d3
2227
+ vst1.u8 {q0}, [r0], r1
2228
+
2229
+ AVERAGE_TWO_8BITS d4, d4, d6
2230
+ AVERAGE_TWO_8BITS d5, d5, d7
2231
+ vst1.u8 {q2}, [r0], r1
2232
+
2233
+ AVERAGE_TWO_8BITS d16, d16, d18
2234
+ AVERAGE_TWO_8BITS d17, d17, d19
2235
+ vst1.u8 {q8}, [r0], r1
2236
+
2237
+ AVERAGE_TWO_8BITS d20, d20, d22
2238
+ AVERAGE_TWO_8BITS d21, d21, d23
2239
+ vst1.u8 {q10}, [r0], r1
2240
+
2241
+ sub r6, #4
2242
+ cmp r6, #0
2243
+ bne enc_w16_pix_avg_loop
2244
+
2245
+ pop {r4, r5, r6}
2246
+ WELS_ASM_FUNC_END
2247
+
2248
+
2249
+ WELS_ASM_FUNC_BEGIN PixStrideAvgWidthEq8_neon
2250
+ push {r4, r5, r6}
2251
+ ldr r4, [sp, #12]
2252
+ ldr r5, [sp, #16]
2253
+ ldr r6, [sp, #20]
2254
+ enc_w8_pix_avg_loop:
2255
+
2256
+ vld1.u8 {d0}, [r2], r3
2257
+ vld1.u8 {d2}, [r4], r5
2258
+ vld1.u8 {d1}, [r2], r3
2259
+ vld1.u8 {d3}, [r4], r5
2260
+
2261
+ AVERAGE_TWO_8BITS d0, d0, d2
2262
+ AVERAGE_TWO_8BITS d1, d1, d3
2263
+ vst1.u8 {d0}, [r0], r1
2264
+ vst1.u8 {d1}, [r0], r1
2265
+
2266
+ vld1.u8 {d4}, [r2], r3
2267
+ vld1.u8 {d6}, [r4], r5
2268
+ vld1.u8 {d5}, [r2], r3
2269
+ vld1.u8 {d7}, [r4], r5
2270
+
2271
+ AVERAGE_TWO_8BITS d4, d4, d6
2272
+ AVERAGE_TWO_8BITS d5, d5, d7
2273
+ vst1.u8 {d4}, [r0], r1
2274
+ vst1.u8 {d5}, [r0], r1
2275
+
2276
+ sub r6, #4
2277
+ cmp r6, #0
2278
+ bne enc_w8_pix_avg_loop
2279
+
2280
+ pop {r4, r5, r6}
2281
+ WELS_ASM_FUNC_END
2282
+
2283
+ #endif