@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,1489 @@
1
+ /*!
2
+ **********************************************************************************
3
+ * Copyright (c) 2022 Loongson Technology Corporation Limited
4
+ * Contributed by Lu Wang <wanglu@loongson.cn>
5
+ * Jin Bo <jinbo@loongson.cn>
6
+ *
7
+ * \copy
8
+ * Copyright (c) 2013, Cisco Systems
9
+ * All rights reserved.
10
+ *
11
+ * Redistribution and use in source and binary forms, with or without
12
+ * modification, are permitted provided that the following conditions
13
+ * are met:
14
+ *
15
+ * * Redistributions of source code must retain the above copyright
16
+ * notice, this list of conditions and the following disclaimer.
17
+ *
18
+ * * Redistributions in binary form must reproduce the above copyright
19
+ * notice, this list of conditions and the following disclaimer in
20
+ * the documentation and/or other materials provided with the
21
+ * distribution.
22
+ *
23
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ * POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ * \file deblock_lsx.c
37
+ *
38
+ * \brief Loongson optimization
39
+ *
40
+ * \date 22/2/2022 Created
41
+ *
42
+ **********************************************************************************
43
+ */
44
+
45
+ #include <stdint.h>
46
+ #include "loongson_intrinsics.h"
47
+
48
+ void DeblockLumaLt4V_lsx (uint8_t* pPix, int32_t iStrideX,
49
+ int32_t iAlpha, int32_t iBeta, int8_t* pTc) {
50
+ __m128i p0, p1, p2, q0, q1, q2;
51
+ __m128i p0_l, p1_l, p2_l, q0_l, q1_l, q2_l;
52
+ __m128i p0_h, p1_h, p2_h, q0_h, q1_h, q2_h;
53
+ __m128i t0, t1, t2, t3, t;
54
+ __m128i t0_l, t0_h, t1_l, t1_h, t2_l, t2_h;
55
+ __m128i iTc, iTc0, negiTc, negiTc0, f, flags;
56
+ __m128i iTc_l, iTc_h, negiTc_l, negiTc_h;
57
+ __m128i iTc0_l, iTc0_h, negiTc0_l, negiTc0_h;
58
+ __m128i bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0;
59
+
60
+ __m128i zero = __lsx_vldi(0);
61
+ __m128i alpha = __lsx_vreplgr2vr_b(iAlpha);
62
+ __m128i beta = __lsx_vreplgr2vr_b(iBeta);
63
+ __m128i shuf = {0x0101010100000000, 0x0303030302020202};
64
+ __m128i not_255 = {0xff00ff00ff00ff00, 0xff00ff00ff00ff00};
65
+ int32_t iStrideX_x0 = 0;
66
+ int32_t iStrideX_x2 = iStrideX << 1;
67
+ int32_t iStrideX_x3 = iStrideX_x2 + iStrideX;
68
+
69
+ iTc0 = __lsx_vldx(pTc, 0);
70
+ iTc0 = __lsx_vshuf_b(iTc0, iTc0, shuf);
71
+ negiTc0 = __lsx_vneg_b(iTc0);
72
+ iTc = iTc0;
73
+
74
+ DUP4_ARG2(__lsx_vldx, pPix, -iStrideX, pPix, -iStrideX_x2, pPix, -iStrideX_x3,
75
+ pPix, iStrideX_x0, p0, p1, p2, q0);
76
+ DUP2_ARG2(__lsx_vldx, pPix, iStrideX, pPix, iStrideX_x2, q1, q2);
77
+
78
+ DUP4_ARG2(__lsx_vabsd_bu, p0, q0, p1, p0, q1, q0, p2, p0,
79
+ bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0);
80
+ bDetaQ2Q0 = __lsx_vabsd_bu(q2, q0);
81
+ DUP4_ARG2(__lsx_vslt_bu, bDetaP0Q0, alpha, bDetaP1P0, beta, bDetaQ1Q0, beta,
82
+ bDetaP2P0, beta, bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0);
83
+ bDetaQ2Q0 = __lsx_vslt_bu(bDetaQ2Q0, beta);
84
+
85
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, p2, zero, q0,
86
+ p0_l, p1_l, p2_l, q0_l);
87
+ DUP2_ARG2(__lsx_vilvl_b, zero, q1, zero, q2, q1_l, q2_l);
88
+ DUP4_ARG2(__lsx_vilvh_b, zero, p0, zero, p1, zero, p2, zero, q0,
89
+ p0_h, p1_h, p2_h, q0_h);
90
+ DUP2_ARG2(__lsx_vilvh_b, zero, q1, zero, q2, q1_h, q2_h);
91
+
92
+ DUP2_ARG2(__lsx_vand_v, bDetaP0Q0, bDetaP1P0, f, bDetaQ1Q0, f, f);
93
+ flags = __lsx_vsle_b(zero, iTc0);
94
+ DUP2_ARG2(__lsx_vand_v, f, flags, flags, bDetaP2P0, flags, flags);
95
+ flags = __lsx_vandi_b(flags, 1);
96
+ iTc = __lsx_vadd_b(iTc, flags);
97
+ flags = __lsx_vsle_b(zero, iTc0);
98
+ DUP2_ARG2(__lsx_vand_v, f, flags, flags, bDetaQ2Q0, flags, flags);
99
+ flags = __lsx_vandi_b(flags, 1);
100
+ iTc = __lsx_vadd_b(iTc, flags);
101
+ negiTc = __lsx_vneg_b(iTc);
102
+
103
+ flags = __lsx_vslt_b(iTc0, zero);
104
+ iTc0_l = __lsx_vilvl_b(flags, iTc0);
105
+ iTc0_h = __lsx_vilvh_b(flags, iTc0);
106
+ flags = __lsx_vslt_b(negiTc0, zero);
107
+ negiTc0_l = __lsx_vilvl_b(flags, negiTc0);
108
+ negiTc0_h = __lsx_vilvh_b(flags, negiTc0);
109
+
110
+ flags = __lsx_vslt_b(iTc, zero);
111
+ iTc_l = __lsx_vilvl_b(flags, iTc);
112
+ iTc_h = __lsx_vilvh_b(flags, iTc);
113
+ flags = __lsx_vslt_b(negiTc, zero);
114
+ negiTc_l = __lsx_vilvl_b(flags, negiTc);
115
+ negiTc_h = __lsx_vilvh_b(flags, negiTc);
116
+
117
+ t0_l = __lsx_vadd_h(p0_l, q0_l);
118
+ t0_l = __lsx_vaddi_hu(t0_l, 1);
119
+ t0_l = __lsx_vsrai_h(t0_l, 1);
120
+ t0_l = __lsx_vadd_h(p2_l, t0_l);
121
+ t = __lsx_vslli_h(p1_l, 1);
122
+ t0_l = __lsx_vsub_h(t0_l, t);
123
+ t0_l = __lsx_vsrai_h(t0_l, 1);
124
+ t0_l = __lsx_vmin_h(iTc0_l, t0_l);
125
+ t0_l = __lsx_vmax_h(negiTc0_l, t0_l);
126
+ t0_l = __lsx_vadd_h(p1_l, t0_l);
127
+
128
+ t1_l = __lsx_vadd_h(p0_l, q0_l);
129
+ t1_l = __lsx_vaddi_hu(t1_l, 1);
130
+ t1_l = __lsx_vsrai_h(t1_l, 1);
131
+ t1_l = __lsx_vadd_h(q2_l, t1_l);
132
+ t = __lsx_vslli_h(q1_l, 1);
133
+ t1_l = __lsx_vsub_h(t1_l, t);
134
+ t1_l = __lsx_vsrai_h(t1_l, 1);
135
+ t1_l = __lsx_vmin_h(iTc0_l, t1_l);
136
+ t1_l = __lsx_vmax_h(negiTc0_l, t1_l);
137
+ t1_l = __lsx_vadd_h(q1_l, t1_l);
138
+
139
+ t0_h = __lsx_vadd_h(p0_h, q0_h);
140
+ t0_h = __lsx_vaddi_hu(t0_h, 1);
141
+ t0_h = __lsx_vsrai_h(t0_h, 1);
142
+ t0_h = __lsx_vadd_h(p2_h, t0_h);
143
+ t = __lsx_vslli_h(p1_h, 1);
144
+ t0_h = __lsx_vsub_h(t0_h, t);
145
+ t0_h = __lsx_vsrai_h(t0_h, 1);
146
+ t0_h = __lsx_vmin_h(iTc0_h, t0_h);
147
+ t0_h = __lsx_vmax_h(negiTc0_h, t0_h);
148
+ t0_h = __lsx_vadd_h(p1_h, t0_h);
149
+
150
+ t1_h = __lsx_vadd_h(p0_h, q0_h);
151
+ t1_h = __lsx_vaddi_hu(t1_h, 1);
152
+ t1_h = __lsx_vsrai_h(t1_h, 1);
153
+ t1_h = __lsx_vadd_h(q2_h, t1_h);
154
+ t = __lsx_vslli_h(q1_h, 1);
155
+ t1_h = __lsx_vsub_h(t1_h, t);
156
+ t1_h = __lsx_vsrai_h(t1_h, 1);
157
+ t1_h = __lsx_vmin_h(iTc0_h, t1_h);
158
+ t1_h = __lsx_vmax_h(negiTc0_h, t1_h);
159
+ t1_h = __lsx_vadd_h(q1_h, t1_h);
160
+
161
+ t2_l = __lsx_vsub_h(q0_l, p0_l);
162
+ t2_l = __lsx_vslli_h(t2_l, 2);
163
+ t2_l = __lsx_vadd_h(t2_l, p1_l);
164
+ t2_l = __lsx_vsub_h(t2_l, q1_l);
165
+ t2_l = __lsx_vaddi_hu(t2_l, 4);
166
+ t2_l = __lsx_vsrai_h(t2_l, 3);
167
+ t2_l = __lsx_vmin_h(iTc_l, t2_l);
168
+ t2_l = __lsx_vmax_h(negiTc_l, t2_l);
169
+
170
+ t2_h = __lsx_vsub_h(q0_h, p0_h);
171
+ t2_h = __lsx_vslli_h(t2_h, 2);
172
+ t2_h = __lsx_vadd_h(t2_h, p1_h);
173
+ t2_h = __lsx_vsub_h(t2_h, q1_h);
174
+ t2_h = __lsx_vaddi_hu(t2_h, 4);
175
+ t2_h = __lsx_vsrai_h(t2_h, 3);
176
+ t2_h = __lsx_vmin_h(iTc_h, t2_h);
177
+ t2_h = __lsx_vmax_h(negiTc_h, t2_h);
178
+
179
+ p0_l = __lsx_vadd_h(p0_l, t2_l);
180
+ p1_l = __lsx_vand_v(p0_l, not_255);
181
+ p2_l = __lsx_vsle_h(zero, p0_l);
182
+ flags = __lsx_vseq_h(p1_l, zero);
183
+ p0_l = __lsx_vand_v(p0_l, flags);
184
+ flags = __lsx_vnor_v(flags,flags);
185
+ p2_l = __lsx_vand_v(p2_l, flags);
186
+ p0_l = __lsx_vadd_h(p0_l, p2_l);
187
+
188
+ q0_l = __lsx_vsub_h(q0_l, t2_l);
189
+ q1_l = __lsx_vand_v(q0_l, not_255);
190
+ q2_l = __lsx_vsle_h(zero, q0_l);
191
+ flags = __lsx_vseq_h(q1_l, zero);
192
+ q0_l = __lsx_vand_v(q0_l, flags);
193
+ flags = __lsx_vnor_v(flags, flags);
194
+ q2_l = __lsx_vand_v(q2_l, flags);
195
+ q0_l = __lsx_vadd_h(q0_l, q2_l);
196
+
197
+ p0_h = __lsx_vadd_h(p0_h, t2_h);
198
+ p1_h = __lsx_vand_v(p0_h, not_255);
199
+ p2_h = __lsx_vsle_h(zero, p0_h);
200
+ flags = __lsx_vseq_h(p1_h, zero);
201
+ p0_h = __lsx_vand_v(p0_h, flags);
202
+ flags = __lsx_vnor_v(flags, flags);
203
+ p2_h = __lsx_vand_v(p2_h, flags);
204
+ p0_h = __lsx_vadd_h(p0_h, p2_h);
205
+
206
+ q0_h = __lsx_vsub_h(q0_h, t2_h);
207
+ q1_h = __lsx_vand_v(q0_h, not_255);
208
+ q2_h = __lsx_vsle_h(zero, q0_h);
209
+ flags = __lsx_vseq_h(q1_h, zero);
210
+ q0_h = __lsx_vand_v(q0_h, flags);
211
+ flags = __lsx_vnor_v(flags, flags);
212
+ q2_h = __lsx_vand_v(q2_h, flags);
213
+ q0_h = __lsx_vadd_h(q0_h, q2_h);
214
+
215
+ DUP4_ARG2(__lsx_vpickev_b, t0_h, t0_l, t1_h, t1_l,
216
+ p0_h, p0_l, q0_h, q0_l, t0, t1, t2, t3);
217
+
218
+ flags = __lsx_vsle_b(zero, iTc0);
219
+ flags = __lsx_vand_v(flags, f);
220
+ t2 = __lsx_vand_v(t2, flags);
221
+ t = __lsx_vnor_v(flags,flags);
222
+ p0 = __lsx_vand_v(p0, t);
223
+ p0 = __lsx_vadd_b(t2, p0);
224
+ t3 = __lsx_vand_v(t3, flags);
225
+ t = __lsx_vnor_v(flags,flags);
226
+ q0 = __lsx_vand_v(q0, t);
227
+ q0 = __lsx_vadd_b(t3, q0);
228
+
229
+ DUP2_ARG2(__lsx_vand_v, flags, bDetaP2P0, t0, t, t, t0);
230
+ t = __lsx_vnor_v(t, t);
231
+ p1 = __lsx_vand_v(p1, t);
232
+ p1 = __lsx_vadd_b(t0, p1);
233
+ DUP2_ARG2(__lsx_vand_v, flags, bDetaQ2Q0, t1, t, t, t1);
234
+ t = __lsx_vnor_v(t, t);
235
+ q1 = __lsx_vand_v(q1, t);
236
+ q1 = __lsx_vadd_b(t1, q1);
237
+
238
+ __lsx_vstx(p1, pPix, -iStrideX_x2);
239
+ __lsx_vstx(p0, pPix, -iStrideX);
240
+ __lsx_vstx(q0, pPix, iStrideX_x0);
241
+ __lsx_vstx(q1, pPix, iStrideX);
242
+ }
243
+
244
+ void DeblockLumaLt4H_lsx (uint8_t* pPix, int32_t iStrideY,
245
+ int32_t iAlpha, int32_t iBeta, int8_t* pTc) {
246
+ __m128i p0, p1, p2, q0, q1, q2;
247
+ __m128i p0_l, p1_l, p2_l, q0_l, q1_l, q2_l;
248
+ __m128i p0_h, p1_h, p2_h, q0_h, q1_h, q2_h;
249
+ __m128i t0, t1, t2, t3, t;
250
+ __m128i t0_l, t0_h, t1_l, t1_h, t2_l, t2_h;
251
+ __m128i iTc, iTc0, negiTc, negiTc0, f, flags;
252
+ __m128i iTc_l, iTc_h, negiTc_l, negiTc_h;
253
+ __m128i iTc0_l, iTc0_h, negiTc0_l, negiTc0_h;
254
+ __m128i bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0;
255
+
256
+ __m128i zero = __lsx_vldi(0);
257
+ __m128i alpha = __lsx_vreplgr2vr_b(iAlpha);
258
+ __m128i beta = __lsx_vreplgr2vr_b(iBeta);
259
+ __m128i shuf = {0x0101010100000000, 0x0303030302020202};
260
+ __m128i not_255 = {0xff00ff00ff00ff00, 0xff00ff00ff00ff00};
261
+ int32_t iStrideY_x0 = 0;
262
+ int32_t iStrideY_x2 = iStrideY << 1;
263
+ int32_t iStrideY_x3 = iStrideY_x2 + iStrideY;
264
+ int32_t iStrideY_x4 = iStrideY << 2;
265
+
266
+ iTc0 = __lsx_vldx(pTc, 0);
267
+ iTc0 = __lsx_vshuf_b(iTc0, iTc0, shuf);
268
+ negiTc0 = __lsx_vneg_b(iTc0);
269
+ iTc = iTc0;
270
+
271
+ pPix -= 3;
272
+ DUP4_ARG2(__lsx_vldx, pPix, iStrideY_x0, pPix, iStrideY, pPix, iStrideY_x2,
273
+ pPix, iStrideY_x3, p0_l, p1_l, p2_l, q0_l);
274
+ pPix += iStrideY_x4;
275
+ DUP4_ARG2(__lsx_vldx, pPix, iStrideY_x0, pPix, iStrideY, pPix, iStrideY_x2,
276
+ pPix, iStrideY_x3, p0_h, p1_h, p2_h, q0_h);
277
+ pPix += iStrideY_x4;
278
+ DUP4_ARG2(__lsx_vldx, pPix, iStrideY_x0, pPix, iStrideY, pPix, iStrideY_x2,
279
+ pPix, iStrideY_x3, q1_l, q2_l, t0_l, t1_l);
280
+ pPix += iStrideY_x4;
281
+ DUP4_ARG2(__lsx_vldx, pPix, iStrideY_x0, pPix, iStrideY, pPix, iStrideY_x2,
282
+ pPix, iStrideY_x3, q1_h, q2_h, t0_h, t1_h);
283
+ LSX_TRANSPOSE16x8_B(p0_l, p1_l, p2_l, q0_l, p0_h, p1_h, p2_h, q0_h, q1_l, q2_l,
284
+ t0_l, t1_l, q1_h, q2_h, t0_h, t1_h, p2, p1, p0, q0, q1, q2,
285
+ t, f);
286
+
287
+ DUP4_ARG2(__lsx_vabsd_bu, p0, q0, p1, p0, q1, q0, p2, p0,
288
+ bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0);
289
+ bDetaQ2Q0 = __lsx_vabsd_bu(q2, q0);
290
+ DUP4_ARG2(__lsx_vslt_bu, bDetaP0Q0, alpha, bDetaP1P0, beta, bDetaQ1Q0, beta,
291
+ bDetaP2P0, beta, bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0);
292
+ bDetaQ2Q0 = __lsx_vslt_bu(bDetaQ2Q0, beta);
293
+
294
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, p2, zero, q0,
295
+ p0_l, p1_l, p2_l, q0_l);
296
+ DUP2_ARG2(__lsx_vilvl_b, zero, q1, zero, q2, q1_l, q2_l);
297
+ DUP4_ARG2(__lsx_vilvh_b, zero, p0, zero, p1, zero, p2, zero, q0,
298
+ p0_h, p1_h, p2_h, q0_h);
299
+ DUP2_ARG2(__lsx_vilvh_b, zero, q1, zero, q2, q1_h, q2_h);
300
+
301
+ DUP2_ARG2(__lsx_vand_v, bDetaP0Q0, bDetaP1P0, f, bDetaQ1Q0, f, f);
302
+ flags = __lsx_vsle_b(zero, iTc0);
303
+ DUP2_ARG2(__lsx_vand_v, f, flags, flags, bDetaP2P0, flags, flags);
304
+ flags = __lsx_vandi_b(flags, 1);
305
+ iTc = __lsx_vadd_b(iTc, flags);
306
+ flags = __lsx_vsle_b(zero, iTc0);
307
+ DUP2_ARG2(__lsx_vand_v, f, flags, flags, bDetaQ2Q0, flags, flags);
308
+ flags = __lsx_vandi_b(flags, 1);
309
+ iTc = __lsx_vadd_b(iTc, flags);
310
+ negiTc = __lsx_vneg_b(iTc);
311
+
312
+ flags = __lsx_vslt_b(iTc0, zero);
313
+ iTc0_l = __lsx_vilvl_b(flags, iTc0);
314
+ iTc0_h = __lsx_vilvh_b(flags, iTc0);
315
+ flags = __lsx_vslt_b(negiTc0, zero);
316
+ negiTc0_l = __lsx_vilvl_b(flags, negiTc0);
317
+ negiTc0_h = __lsx_vilvh_b(flags, negiTc0);
318
+
319
+ flags = __lsx_vslt_b(iTc, zero);
320
+ iTc_l = __lsx_vilvl_b(flags, iTc);
321
+ iTc_h = __lsx_vilvh_b(flags, iTc);
322
+ flags = __lsx_vslt_b(negiTc, zero);
323
+ negiTc_l = __lsx_vilvl_b(flags, negiTc);
324
+ negiTc_h = __lsx_vilvh_b(flags, negiTc);
325
+
326
+ t0_l = __lsx_vadd_h(p0_l, q0_l);
327
+ t0_l = __lsx_vaddi_hu(t0_l, 1);
328
+ t0_l = __lsx_vsrai_h(t0_l, 1);
329
+ t0_l = __lsx_vadd_h(p2_l, t0_l);
330
+ t = __lsx_vslli_h(p1_l, 1);
331
+ t0_l = __lsx_vsub_h(t0_l, t);
332
+ t0_l = __lsx_vsrai_h(t0_l, 1);
333
+ t0_l = __lsx_vmin_h(iTc0_l, t0_l);
334
+ t0_l = __lsx_vmax_h(negiTc0_l, t0_l);
335
+ t0_l = __lsx_vadd_h(p1_l, t0_l);
336
+
337
+ t1_l = __lsx_vadd_h(p0_l, q0_l);
338
+ t1_l = __lsx_vaddi_hu(t1_l, 1);
339
+ t1_l = __lsx_vsrai_h(t1_l, 1);
340
+ t1_l = __lsx_vadd_h(q2_l, t1_l);
341
+ t = __lsx_vslli_h(q1_l, 1);
342
+ t1_l = __lsx_vsub_h(t1_l, t);
343
+ t1_l = __lsx_vsrai_h(t1_l, 1);
344
+ t1_l = __lsx_vmin_h(iTc0_l, t1_l);
345
+ t1_l = __lsx_vmax_h(negiTc0_l, t1_l);
346
+ t1_l = __lsx_vadd_h(q1_l, t1_l);
347
+
348
+ t0_h = __lsx_vadd_h(p0_h, q0_h);
349
+ t0_h = __lsx_vaddi_hu(t0_h, 1);
350
+ t0_h = __lsx_vsrai_h(t0_h, 1);
351
+ t0_h = __lsx_vadd_h(p2_h, t0_h);
352
+ t = __lsx_vslli_h(p1_h, 1);
353
+ t0_h = __lsx_vsub_h(t0_h, t);
354
+ t0_h = __lsx_vsrai_h(t0_h, 1);
355
+ t0_h = __lsx_vmin_h(iTc0_h, t0_h);
356
+ t0_h = __lsx_vmax_h(negiTc0_h, t0_h);
357
+ t0_h = __lsx_vadd_h(p1_h, t0_h);
358
+
359
+ t1_h = __lsx_vadd_h(p0_h, q0_h);
360
+ t1_h = __lsx_vaddi_hu(t1_h, 1);
361
+ t1_h = __lsx_vsrai_h(t1_h, 1);
362
+ t1_h = __lsx_vadd_h(q2_h, t1_h);
363
+ t = __lsx_vslli_h(q1_h, 1);
364
+ t1_h = __lsx_vsub_h(t1_h, t);
365
+ t1_h = __lsx_vsrai_h(t1_h, 1);
366
+ t1_h = __lsx_vmin_h(iTc0_h, t1_h);
367
+ t1_h = __lsx_vmax_h(negiTc0_h, t1_h);
368
+ t1_h = __lsx_vadd_h(q1_h, t1_h);
369
+
370
+ t2_l = __lsx_vsub_h(q0_l, p0_l);
371
+ t2_l = __lsx_vslli_h(t2_l, 2);
372
+ t2_l = __lsx_vadd_h(t2_l, p1_l);
373
+ t2_l = __lsx_vsub_h(t2_l, q1_l);
374
+ t2_l = __lsx_vaddi_hu(t2_l, 4);
375
+ t2_l = __lsx_vsrai_h(t2_l, 3);
376
+ t2_l = __lsx_vmin_h(iTc_l, t2_l);
377
+ t2_l = __lsx_vmax_h(negiTc_l, t2_l);
378
+
379
+ t2_h = __lsx_vsub_h(q0_h, p0_h);
380
+ t2_h = __lsx_vslli_h(t2_h, 2);
381
+ t2_h = __lsx_vadd_h(t2_h, p1_h);
382
+ t2_h = __lsx_vsub_h(t2_h, q1_h);
383
+ t2_h = __lsx_vaddi_hu(t2_h, 4);
384
+ t2_h = __lsx_vsrai_h(t2_h, 3);
385
+ t2_h = __lsx_vmin_h(iTc_h, t2_h);
386
+ t2_h = __lsx_vmax_h(negiTc_h, t2_h);
387
+
388
+ p0_l = __lsx_vadd_h(p0_l, t2_l);
389
+ p1_l = __lsx_vand_v(p0_l, not_255);
390
+ p2_l = __lsx_vsle_h(zero, p0_l);
391
+ flags = __lsx_vseq_h(p1_l, zero);
392
+ p0_l = __lsx_vand_v(p0_l, flags);
393
+ flags = __lsx_vnor_v(flags,flags);
394
+ p2_l = __lsx_vand_v(p2_l, flags);
395
+ p0_l = __lsx_vadd_h(p0_l, p2_l);
396
+
397
+ q0_l = __lsx_vsub_h(q0_l, t2_l);
398
+ q1_l = __lsx_vand_v(q0_l, not_255);
399
+ q2_l = __lsx_vsle_h(zero, q0_l);
400
+ flags = __lsx_vseq_h(q1_l, zero);
401
+ q0_l = __lsx_vand_v(q0_l, flags);
402
+ flags = __lsx_vnor_v(flags, flags);
403
+ q2_l = __lsx_vand_v(q2_l, flags);
404
+ q0_l = __lsx_vadd_h(q0_l, q2_l);
405
+
406
+ p0_h = __lsx_vadd_h(p0_h, t2_h);
407
+ p1_h = __lsx_vand_v(p0_h, not_255);
408
+ p2_h = __lsx_vsle_h(zero, p0_h);
409
+ flags = __lsx_vseq_h(p1_h, zero);
410
+ p0_h = __lsx_vand_v(p0_h, flags);
411
+ flags = __lsx_vnor_v(flags, flags);
412
+ p2_h = __lsx_vand_v(p2_h, flags);
413
+ p0_h = __lsx_vadd_h(p0_h, p2_h);
414
+
415
+ q0_h = __lsx_vsub_h(q0_h, t2_h);
416
+ q1_h = __lsx_vand_v(q0_h, not_255);
417
+ q2_h = __lsx_vsle_h(zero, q0_h);
418
+ flags = __lsx_vseq_h(q1_h, zero);
419
+ q0_h = __lsx_vand_v(q0_h, flags);
420
+ flags = __lsx_vnor_v(flags, flags);
421
+ q2_h = __lsx_vand_v(q2_h, flags);
422
+ q0_h = __lsx_vadd_h(q0_h, q2_h);
423
+
424
+ DUP4_ARG2(__lsx_vpickev_b, t0_h, t0_l, t1_h, t1_l,
425
+ p0_h, p0_l, q0_h, q0_l, t0, t1, t2, t3);
426
+
427
+ flags = __lsx_vsle_b(zero, iTc0);
428
+ flags = __lsx_vand_v(flags, f);
429
+ t2 = __lsx_vand_v(t2, flags);
430
+ t = __lsx_vnor_v(flags,flags);
431
+ p0 = __lsx_vand_v(p0, t);
432
+ p0 = __lsx_vadd_b(t2, p0);
433
+ t3 = __lsx_vand_v(t3, flags);
434
+ t = __lsx_vnor_v(flags,flags);
435
+ q0 = __lsx_vand_v(q0, t);
436
+ q0 = __lsx_vadd_b(t3, q0);
437
+
438
+ DUP2_ARG2(__lsx_vand_v, flags, bDetaP2P0, t0, t, t, t0);
439
+ t = __lsx_vnor_v(t, t);
440
+ p1 = __lsx_vand_v(p1, t);
441
+ p1 = __lsx_vadd_b(t0, p1);
442
+ DUP2_ARG2(__lsx_vand_v, flags, bDetaQ2Q0, t1, t, t, t1);
443
+ t = __lsx_vnor_v(t, t);
444
+ q1 = __lsx_vand_v(q1, t);
445
+ q1 = __lsx_vadd_b(t1, q1);
446
+
447
+ DUP2_ARG2(__lsx_vilvl_b, p0, p1, q1, q0, t0, t2);
448
+ DUP2_ARG2(__lsx_vilvh_b, p0, p1, q1, q0, t1, t3);
449
+ DUP2_ARG2(__lsx_vilvl_h, t2, t0, t3, t1, p0, p2);
450
+ DUP2_ARG2(__lsx_vilvh_h, t2, t0, t3, t1, p1, q0);
451
+
452
+ pPix -= iStrideY_x4;
453
+ pPix -= iStrideY_x4;
454
+ pPix -= iStrideY_x4 - 1;
455
+ __lsx_vstelm_w(p0, pPix, 0, 0);
456
+ __lsx_vstelm_w(p0, pPix + iStrideY, 0, 1);
457
+ __lsx_vstelm_w(p0, pPix + iStrideY_x2, 0, 2);
458
+ __lsx_vstelm_w(p0, pPix + iStrideY_x3, 0, 3);
459
+ pPix += iStrideY_x4;
460
+ __lsx_vstelm_w(p1, pPix, 0, 0);
461
+ __lsx_vstelm_w(p1, pPix + iStrideY, 0, 1);
462
+ __lsx_vstelm_w(p1, pPix + iStrideY_x2, 0, 2);
463
+ __lsx_vstelm_w(p1, pPix + iStrideY_x3, 0, 3);
464
+ pPix += iStrideY_x4;
465
+ __lsx_vstelm_w(p2, pPix, 0, 0);
466
+ __lsx_vstelm_w(p2, pPix + iStrideY, 0, 1);
467
+ __lsx_vstelm_w(p2, pPix + iStrideY_x2, 0, 2);
468
+ __lsx_vstelm_w(p2, pPix + iStrideY_x3, 0, 3);
469
+ pPix += iStrideY_x4;
470
+ __lsx_vstelm_w(q0, pPix, 0, 0);
471
+ __lsx_vstelm_w(q0, pPix + iStrideY, 0, 1);
472
+ __lsx_vstelm_w(q0, pPix + iStrideY_x2, 0, 2);
473
+ __lsx_vstelm_w(q0, pPix + iStrideY_x3, 0, 3);
474
+ }
475
+
476
+ void DeblockLumaEq4V_lsx(uint8_t *pPix, int32_t iStride, int32_t iAlpha,
477
+ int32_t iBeta) {
478
+ int32_t iStride0 = 0;
479
+ int32_t iStride_x2 = iStride << 1;
480
+ int32_t iStride_x3 = iStride + iStride_x2;
481
+ int32_t iStride_x4 = iStride << 2;
482
+ __m128i p0, p1, p2, p3, q0, q1, q2, q3;
483
+ __m128i p0_l, p1_l, p2_l, p3_l, q0_l, q1_l, q2_l, q3_l;
484
+ __m128i p0_h, p1_h, p2_h, p3_h, q0_h, q1_h, q2_h, q3_h;
485
+ __m128i t0, t1, t2, t0_con1, s0, s1, s2, s0_con1;
486
+ __m128i alpha, beta;
487
+ __m128i iDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0;
488
+ __m128i mask0, mask1;
489
+
490
+ DUP4_ARG2(__lsx_vldx,
491
+ pPix, -iStride_x4,
492
+ pPix, -iStride_x3,
493
+ pPix, -iStride_x2,
494
+ pPix, -iStride,
495
+ p3, p2, p1, p0);
496
+ DUP4_ARG2(__lsx_vldx,
497
+ pPix, iStride_x3,
498
+ pPix, iStride_x2,
499
+ pPix, iStride,
500
+ pPix, iStride0,
501
+ q3, q2, q1, q0);
502
+ alpha = __lsx_vreplgr2vr_b(iAlpha);
503
+ beta = __lsx_vreplgr2vr_b(iBeta);
504
+ iDetaP0Q0 = __lsx_vabsd_bu(p0, q0);
505
+ DUP4_ARG2(__lsx_vabsd_bu,
506
+ p1, p0,
507
+ q1, q0,
508
+ p2, p0,
509
+ q2, q0,
510
+ bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0);
511
+ DUP4_ARG2(__lsx_vslt_bu,
512
+ bDetaP1P0, beta,
513
+ bDetaQ1Q0, beta,
514
+ bDetaP2P0, beta,
515
+ bDetaQ2Q0, beta,
516
+ bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0);
517
+ DUP4_ARG2(__lsx_vsllwil_hu_bu,
518
+ p0, 0,
519
+ p1, 0,
520
+ p2, 0,
521
+ p3, 0,
522
+ p0_l, p1_l, p2_l, p3_l);
523
+ DUP4_ARG1(__lsx_vexth_hu_bu,
524
+ p0,
525
+ p1,
526
+ p2,
527
+ p3,
528
+ p0_h, p1_h, p2_h, p3_h);
529
+ DUP4_ARG2(__lsx_vsllwil_hu_bu,
530
+ q0, 0,
531
+ q1, 0,
532
+ q2, 0,
533
+ q3, 0,
534
+ q0_l, q1_l, q2_l, q3_l);
535
+ DUP4_ARG1(__lsx_vexth_hu_bu,
536
+ q0,
537
+ q1,
538
+ q2,
539
+ q3,
540
+ q0_h, q1_h, q2_h, q3_h);
541
+ //(iDetaP0Q0 < iAlpha) && bDetaP1P0 && bDetaQ1Q0
542
+ mask0 = __lsx_vslt_bu(iDetaP0Q0, alpha);
543
+ mask0 &= bDetaP1P0;
544
+ mask0 &= bDetaQ1Q0;
545
+ //iDetaP0Q0 < ((iAlpha >> 2) + 2)
546
+ mask1 = __lsx_vsrli_b(alpha, 2);
547
+ mask1 = __lsx_vaddi_bu(mask1, 2);
548
+ mask1 = __lsx_vslt_bu(iDetaP0Q0, mask1);
549
+ //low part
550
+ //p0
551
+ t0 = __lsx_vadd_h(__lsx_vslli_h(p1_l, 1), p2_l);
552
+ t0 = __lsx_vadd_h(__lsx_vslli_h(p0_l, 1), t0);
553
+ t0 = __lsx_vadd_h(__lsx_vslli_h(q0_l, 1), t0);
554
+ t0 = __lsx_vadd_h(q1_l, t0);
555
+ t0 = __lsx_vsrari_h(t0, 3);
556
+ //p1
557
+ t1 = __lsx_vadd_h(p2_l, p1_l);
558
+ t1 = __lsx_vadd_h(p0_l, t1);
559
+ t1 = __lsx_vadd_h(q0_l, t1);
560
+ t1 = __lsx_vsrari_h(t1, 2);
561
+ //p2
562
+ t2 = __lsx_vadd_h(__lsx_vslli_h(p3_l, 1), p2_l);
563
+ t2 = __lsx_vadd_h(__lsx_vslli_h(p2_l, 1), t2);
564
+ t2 = __lsx_vadd_h(p1_l, t2);
565
+ t2 = __lsx_vadd_h(p0_l, t2);
566
+ t2 = __lsx_vadd_h(q0_l, t2);
567
+ t2 = __lsx_vsrari_h(t2, 3);
568
+ //p0 condition 1
569
+ t0_con1 = __lsx_vadd_h(__lsx_vslli_h(p1_l, 1), p0_l);
570
+ t0_con1 = __lsx_vadd_h(q1_l, t0_con1);
571
+ t0_con1 = __lsx_vsrari_h(t0_con1, 2);
572
+ //q0
573
+ s0 = __lsx_vadd_h(__lsx_vslli_h(p0_l, 1), p1_l);
574
+ s0 = __lsx_vadd_h(__lsx_vslli_h(q0_l, 1), s0);
575
+ s0 = __lsx_vadd_h(__lsx_vslli_h(q1_l, 1), s0);
576
+ s0 = __lsx_vadd_h(q2_l, s0);
577
+ s0 = __lsx_vsrari_h(s0, 3);
578
+ //q1
579
+ s1 = __lsx_vadd_h(p0_l, q0_l);
580
+ s1 = __lsx_vadd_h(q1_l, s1);
581
+ s1 = __lsx_vadd_h(q2_l, s1);
582
+ s1 = __lsx_vsrari_h(s1, 2);
583
+ //q2
584
+ s2 = __lsx_vadd_h(__lsx_vslli_h(q3_l, 1), q2_l);
585
+ s2 = __lsx_vadd_h(__lsx_vslli_h(q2_l, 1), s2);
586
+ s2 = __lsx_vadd_h(q1_l, s2);
587
+ s2 = __lsx_vadd_h(q0_l, s2);
588
+ s2 = __lsx_vadd_h(p0_l, s2);
589
+ s2 = __lsx_vsrari_h(s2, 3);
590
+ //q0 condition 1
591
+ s0_con1 = __lsx_vadd_h(__lsx_vslli_h(q1_l, 1), q0_l);
592
+ s0_con1 = __lsx_vadd_h(p1_l, s0_con1);
593
+ s0_con1 = __lsx_vsrari_h(s0_con1, 2);
594
+ //move back
595
+ p0_l = t0; p1_l = t1; p2_l = t2;
596
+ q0_l = s0; q1_l = s1; q2_l = s2;
597
+ p3_l = t0_con1; q3_l = s0_con1;
598
+
599
+ //high part
600
+ //p0
601
+ t0 = __lsx_vadd_h(__lsx_vslli_h(p1_h, 1), p2_h);
602
+ t0 = __lsx_vadd_h(__lsx_vslli_h(p0_h, 1), t0);
603
+ t0 = __lsx_vadd_h(__lsx_vslli_h(q0_h, 1), t0);
604
+ t0 = __lsx_vadd_h(q1_h, t0);
605
+ t0 = __lsx_vsrari_h(t0, 3);
606
+ //p1
607
+ t1 = __lsx_vadd_h(p2_h, p1_h);
608
+ t1 = __lsx_vadd_h(p0_h, t1);
609
+ t1 = __lsx_vadd_h(q0_h, t1);
610
+ t1 = __lsx_vsrari_h(t1, 2);
611
+ //p2
612
+ t2 = __lsx_vadd_h(__lsx_vslli_h(p3_h, 1), p2_h);
613
+ t2 = __lsx_vadd_h(__lsx_vslli_h(p2_h, 1), t2);
614
+ t2 = __lsx_vadd_h(p1_h, t2);
615
+ t2 = __lsx_vadd_h(p0_h, t2);
616
+ t2 = __lsx_vadd_h(q0_h, t2);
617
+ t2 = __lsx_vsrari_h(t2, 3);
618
+ //p0 condition 1
619
+ t0_con1 = __lsx_vadd_h(__lsx_vslli_h(p1_h, 1), p0_h);
620
+ t0_con1 = __lsx_vadd_h(q1_h, t0_con1);
621
+ t0_con1 = __lsx_vsrari_h(t0_con1, 2);
622
+ //q0
623
+ s0 = __lsx_vadd_h(__lsx_vslli_h(p0_h, 1), p1_h);
624
+ s0 = __lsx_vadd_h(__lsx_vslli_h(q0_h, 1), s0);
625
+ s0 = __lsx_vadd_h(__lsx_vslli_h(q1_h, 1), s0);
626
+ s0 = __lsx_vadd_h(q2_h, s0);
627
+ s0 = __lsx_vsrari_h(s0, 3);
628
+ //q1
629
+ s1 = __lsx_vadd_h(p0_h, q0_h);
630
+ s1 = __lsx_vadd_h(q1_h, s1);
631
+ s1 = __lsx_vadd_h(q2_h, s1);
632
+ s1 = __lsx_vsrari_h(s1, 2);
633
+ //q2
634
+ s2 = __lsx_vadd_h(__lsx_vslli_h(q3_h, 1), q2_h);
635
+ s2 = __lsx_vadd_h(__lsx_vslli_h(q2_h, 1), s2);
636
+ s2 = __lsx_vadd_h(q1_h, s2);
637
+ s2 = __lsx_vadd_h(q0_h, s2);
638
+ s2 = __lsx_vadd_h(p0_h, s2);
639
+ s2 = __lsx_vsrari_h(s2, 3);
640
+ //q0 condition 1
641
+ s0_con1 = __lsx_vadd_h(__lsx_vslli_h(q1_h, 1), q0_h);
642
+ s0_con1 = __lsx_vadd_h(p1_h, s0_con1);
643
+ s0_con1 = __lsx_vsrari_h(s0_con1, 2);
644
+ //move back
645
+ p0_h = t0; p1_h = t1; p2_h = t2;
646
+ q0_h = s0; q1_h = s1; q2_h = s2;
647
+ p3_h = t0_con1; q3_h = s0_con1;
648
+
649
+ //pack low part and high part
650
+ DUP4_ARG2(__lsx_vpickev_b,
651
+ p0_h, p0_l,
652
+ p1_h, p1_l,
653
+ p2_h, p2_l,
654
+ q0_h, q0_l,
655
+ t0, t1, t2, s0);
656
+ DUP4_ARG2(__lsx_vpickev_b,
657
+ q1_h, q1_l,
658
+ q2_h, q2_l,
659
+ p3_h, p3_l,
660
+ q3_h, q3_l,
661
+ s1, s2, t0_con1, s0_con1);
662
+ t0 = t0 & mask0 & mask1 & bDetaP2P0;
663
+ t0 = __lsx_vadd_b(t0, t0_con1 & mask0 & mask1 & (~bDetaP2P0));
664
+ t0 = __lsx_vadd_b(t0, t0_con1 & mask0 & (~mask1));
665
+ t1 = t1 & mask0 & mask1 & bDetaP2P0;
666
+ t2 = t2 & mask0 & mask1 & bDetaP2P0;
667
+ s0 = s0 & mask0 & mask1 & bDetaQ2Q0;
668
+ s0 = __lsx_vadd_b(s0, s0_con1 & mask0 & mask1 & (~bDetaQ2Q0));
669
+ s0 = __lsx_vadd_b(s0, s0_con1 & mask0 & (~mask1));
670
+ s1 = s1 & mask0 & mask1 & bDetaQ2Q0;
671
+ s2 = s2 & mask0 & mask1 & bDetaQ2Q0;
672
+ p0 = __lsx_vadd_b(t0, p0 & (~mask0));
673
+ p1 = __lsx_vadd_b(t1, p1 & ~(mask0 & mask1 & bDetaP2P0));
674
+ p2 = __lsx_vadd_b(t2, p2 & ~(mask0 & mask1 & bDetaP2P0));
675
+ q0 = __lsx_vadd_b(s0, q0 & (~mask0));
676
+ q1 = __lsx_vadd_b(s1, q1 & ~(mask0 & mask1 & bDetaQ2Q0));
677
+ q2 = __lsx_vadd_b(s2, q2 & ~(mask0 & mask1 & bDetaQ2Q0));
678
+ //Store back
679
+ __lsx_vstx(p2, pPix, -iStride_x3);
680
+ __lsx_vstx(p1, pPix, -iStride_x2);
681
+ __lsx_vstx(p0, pPix, -iStride);
682
+ __lsx_vstx(q0, pPix, iStride0);
683
+ __lsx_vstx(q1, pPix, iStride);
684
+ __lsx_vstx(q2, pPix, iStride_x2);
685
+ }
686
+
687
+ void DeblockLumaEq4H_lsx (uint8_t* pPix, int32_t iStrideY, int32_t iAlpha, int32_t iBeta) {
688
+ __m128i p0, p1, p2, p3, q0, q1, q2, q3;
689
+ __m128i p0_l, p1_l, p2_l, p3_l, q0_l, q1_l, q2_l, q3_l;
690
+ __m128i p0_h, p1_h, p2_h, p3_h, q0_h, q1_h, q2_h, q3_h;
691
+ __m128i t0, t1, t2, t3, t4, t5, t6, t7, temp;
692
+ __m128i t0_l, t0_h, t1_l, t1_h, t2_l, t2_h;
693
+ __m128i t3_l, t3_h, t4_l, t4_h, t5_l, t5_h;
694
+ __m128i t6_l, t6_h, t7_l, t7_h;
695
+ __m128i f0, f1, f2, f3, fn;
696
+ __m128i bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0;
697
+
698
+ __m128i zero = __lsx_vldi(0);
699
+ __m128i alpha = __lsx_vreplgr2vr_b(iAlpha);
700
+ __m128i beta = __lsx_vreplgr2vr_b(iBeta);
701
+ int32_t iStrideY_x0 = 0;
702
+ int32_t iStrideY_x2 = iStrideY << 1;
703
+ int32_t iStrideY_x3 = iStrideY_x2 + iStrideY;
704
+ int32_t iStrideY_x4 = iStrideY << 2;
705
+
706
+ // Load data from pPix
707
+ pPix -= 4;
708
+ DUP4_ARG2(__lsx_vldx, pPix, iStrideY_x0, pPix, iStrideY, pPix, iStrideY_x2,
709
+ pPix, iStrideY_x3, p0_l, p1_l, p2_l, q0_l);
710
+ pPix += iStrideY_x4;
711
+ DUP4_ARG2(__lsx_vldx, pPix, iStrideY_x0, pPix, iStrideY, pPix, iStrideY_x2,
712
+ pPix, iStrideY_x3, p0_h, p1_h, p2_h, q0_h);
713
+ pPix += iStrideY_x4;
714
+ DUP4_ARG2(__lsx_vldx, pPix, iStrideY_x0, pPix, iStrideY, pPix, iStrideY_x2,
715
+ pPix, iStrideY_x3, q1_l, q2_l, t0_l, t1_l);
716
+ pPix += iStrideY_x4;
717
+ DUP4_ARG2(__lsx_vldx, pPix, iStrideY_x0, pPix, iStrideY, pPix, iStrideY_x2,
718
+ pPix, iStrideY_x3, q1_h, q2_h, t0_h, t1_h);
719
+ LSX_TRANSPOSE16x8_B(p0_l, p1_l, p2_l, q0_l, p0_h, p1_h, p2_h, q0_h, q1_l, q2_l,
720
+ t0_l, t1_l, q1_h, q2_h, t0_h, t1_h, p3, p2, p1, p0, q0, q1,
721
+ q2, q3);
722
+
723
+ // Calculate condition mask
724
+ bDetaP0Q0 = __lsx_vabsd_bu(p0, q0);
725
+ DUP4_ARG2(__lsx_vabsd_bu, p1, p0, q1, q0, p2, p0, q2, q0,
726
+ bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0);
727
+ DUP4_ARG2(__lsx_vslt_bu, bDetaP1P0, beta, bDetaQ1Q0, beta, bDetaP2P0, beta,
728
+ bDetaQ2Q0, beta, bDetaP1P0, bDetaQ1Q0, bDetaP2P0, bDetaQ2Q0);
729
+
730
+ // Unsigned extend p0, p1, p2, p3, q0, q1, q2, q3 from 8 bits to 16 bits
731
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, p2, zero, q0,
732
+ p0_l, p1_l, p2_l, q0_l);
733
+ DUP4_ARG2(__lsx_vilvh_b, zero, p0, zero, p1, zero, p2, zero, q0,
734
+ p0_h, p1_h, p2_h, q0_h);
735
+ DUP2_ARG2(__lsx_vilvl_b, zero, q1, zero, q2, q1_l, q2_l);
736
+ DUP2_ARG2(__lsx_vilvh_b, zero, q1, zero, q2, q1_h, q2_h);
737
+ DUP2_ARG2(__lsx_vilvl_b, zero, p3, zero, q3, p3_l, q3_l);
738
+ DUP2_ARG2(__lsx_vilvh_b, zero, p3, zero, q3, p3_h, q3_h);
739
+
740
+ // Calculate the low part
741
+ // (p2 + (p1 * (1 << 1)) + (p0 * (1 << 1)) + (q0 * (1 << 1)) + q1 + 4) >> 3
742
+ t0_l = __lsx_vslli_h(p1_l, 1);
743
+ t0_l = __lsx_vadd_h(t0_l, p2_l);
744
+ temp = __lsx_vslli_h(p0_l, 1);
745
+ t0_l = __lsx_vadd_h(t0_l, temp);
746
+ temp = __lsx_vslli_h(q0_l, 1);
747
+ t0_l = __lsx_vadd_h(t0_l, temp);
748
+ t0_l = __lsx_vadd_h(t0_l, q1_l);
749
+ t0_l = __lsx_vaddi_hu(t0_l, 4);
750
+ t0_l = __lsx_vsrai_h(t0_l, 3);
751
+
752
+ // (p2 + p1 + p0 + q0 + 2) >> 2
753
+ t1_l = __lsx_vadd_h(p2_l, p1_l);
754
+ t1_l = __lsx_vadd_h(t1_l, p0_l);
755
+ t1_l = __lsx_vadd_h(t1_l, q0_l);
756
+ t1_l = __lsx_vaddi_hu(t1_l, 2);
757
+ t1_l = __lsx_vsrai_h(t1_l, 2);
758
+
759
+ // ((p3 * (1 << 1)) + p2 + (p2 * (1 << 1)) + p1 + p0 + q0 + 4) >> 3
760
+ t2_l = __lsx_vslli_h(p3_l, 1);
761
+ t2_l = __lsx_vadd_h(t2_l, p2_l);
762
+ temp = __lsx_vslli_h(p2_l, 1);
763
+ t2_l = __lsx_vadd_h(t2_l, temp);
764
+ t2_l = __lsx_vadd_h(t2_l, p1_l);
765
+ t2_l = __lsx_vadd_h(t2_l, p0_l);
766
+ t2_l = __lsx_vadd_h(t2_l, q0_l);
767
+ t2_l = __lsx_vaddi_hu(t2_l, 4);
768
+ t2_l = __lsx_vsrai_h(t2_l, 3);
769
+
770
+ // ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2
771
+ t3_l = __lsx_vslli_h(p1_l, 1);
772
+ t3_l = __lsx_vadd_h(t3_l, p0_l);
773
+ t3_l = __lsx_vadd_h(t3_l, q1_l);
774
+ t3_l = __lsx_vaddi_hu(t3_l, 2);
775
+ t3_l = __lsx_vsrai_h(t3_l, 2);
776
+
777
+ // (p1 + (p0 * (1 << 1)) + (q0 * (1 << 1)) + (q1 * (1 << 1)) + q2 + 4) >> 3
778
+ t4_l = __lsx_vslli_h(p0_l, 1);
779
+ t4_l = __lsx_vadd_h(t4_l, p1_l);
780
+ temp = __lsx_vslli_h(q0_l, 1);
781
+ t4_l = __lsx_vadd_h(t4_l, temp);
782
+ temp = __lsx_vslli_h(q1_l, 1);
783
+ t4_l = __lsx_vadd_h(t4_l, temp);
784
+ t4_l = __lsx_vadd_h(t4_l, q2_l);
785
+ t4_l = __lsx_vaddi_hu(t4_l, 4);
786
+ t4_l = __lsx_vsrai_h(t4_l, 3);
787
+
788
+ // (p0 + q0 + q1 + q2 + 2) >> 2
789
+ t5_l = __lsx_vadd_h(p0_l, q0_l);
790
+ t5_l = __lsx_vadd_h(t5_l, q1_l);
791
+ t5_l = __lsx_vadd_h(t5_l, q2_l);
792
+ t5_l = __lsx_vaddi_hu(t5_l, 2);
793
+ t5_l = __lsx_vsrai_h(t5_l, 2);
794
+
795
+ // ((q3 * (1 << 1)) + q2 + (q2 * (1 << 1)) + q1 + q0 + p0 + 4) >> 3
796
+ t6_l = __lsx_vslli_h(q3_l, 1);
797
+ t6_l = __lsx_vadd_h(t6_l, q2_l);
798
+ temp = __lsx_vslli_h(q2_l, 1);
799
+ t6_l = __lsx_vadd_h(t6_l, temp);
800
+ t6_l = __lsx_vadd_h(t6_l, q1_l);
801
+ t6_l = __lsx_vadd_h(t6_l, q0_l);
802
+ t6_l = __lsx_vadd_h(t6_l, p0_l);
803
+ t6_l = __lsx_vaddi_hu(t6_l, 4);
804
+ t6_l = __lsx_vsrai_h(t6_l, 3);
805
+
806
+ // ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2
807
+ t7_l = __lsx_vslli_h(q1_l, 1);
808
+ t7_l = __lsx_vadd_h(t7_l, q0_l);
809
+ t7_l = __lsx_vadd_h(t7_l, p1_l);
810
+ t7_l = __lsx_vaddi_hu(t7_l, 2);
811
+ t7_l = __lsx_vsrai_h(t7_l, 2);
812
+
813
+ // Calculate the high part
814
+ // (p2 + (p1 * (1 << 1)) + (p0 * (1 << 1)) + (q0 * (1 << 1)) + q1 + 4) >> 3
815
+ t0_h = __lsx_vslli_h(p1_h, 1);
816
+ t0_h = __lsx_vadd_h(t0_h, p2_h);
817
+ temp = __lsx_vslli_h(p0_h, 1);
818
+ t0_h = __lsx_vadd_h(t0_h, temp);
819
+ temp = __lsx_vslli_h(q0_h, 1);
820
+ t0_h = __lsx_vadd_h(t0_h, temp);
821
+ t0_h = __lsx_vadd_h(t0_h, q1_h);
822
+ t0_h = __lsx_vaddi_hu(t0_h, 4);
823
+ t0_h = __lsx_vsrai_h(t0_h, 3);
824
+
825
+ // (p2 + p1 + p0 + q0 + 2) >> 2
826
+ t1_h = __lsx_vadd_h(p2_h, p1_h);
827
+ t1_h = __lsx_vadd_h(t1_h, p0_h);
828
+ t1_h = __lsx_vadd_h(t1_h, q0_h);
829
+ t1_h = __lsx_vaddi_hu(t1_h, 2);
830
+ t1_h = __lsx_vsrai_h(t1_h, 2);
831
+
832
+ // ((p3 * (1 << 1)) + p2 + (p2 * (1 << 1)) + p1 + p0 + q0 + 4) >> 3
833
+ t2_h = __lsx_vslli_h(p3_h, 1);
834
+ t2_h = __lsx_vadd_h(t2_h, p2_h);
835
+ temp = __lsx_vslli_h(p2_h, 1);
836
+ t2_h = __lsx_vadd_h(t2_h, temp);
837
+ t2_h = __lsx_vadd_h(t2_h, p1_h);
838
+ t2_h = __lsx_vadd_h(t2_h, p0_h);
839
+ t2_h = __lsx_vadd_h(t2_h, q0_h);
840
+ t2_h = __lsx_vaddi_hu(t2_h, 4);
841
+ t2_h = __lsx_vsrai_h(t2_h, 3);
842
+
843
+ // ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2
844
+ t3_h = __lsx_vslli_h(p1_h, 1);
845
+ t3_h = __lsx_vadd_h(t3_h, p0_h);
846
+ t3_h = __lsx_vadd_h(t3_h, q1_h);
847
+ t3_h = __lsx_vaddi_hu(t3_h, 2);
848
+ t3_h = __lsx_vsrai_h(t3_h, 2);
849
+
850
+ // (p1 + (p0 * (1 << 1)) + (q0 * (1 << 1)) + (q1 * (1 << 1)) + q2 + 4) >> 3
851
+ t4_h = __lsx_vslli_h(p0_h, 1);
852
+ t4_h = __lsx_vadd_h(t4_h, p1_h);
853
+ temp = __lsx_vslli_h(q0_h, 1);
854
+ t4_h = __lsx_vadd_h(t4_h, temp);
855
+ temp = __lsx_vslli_h(q1_h, 1);
856
+ t4_h = __lsx_vadd_h(t4_h, temp);
857
+ t4_h = __lsx_vadd_h(t4_h, q2_h);
858
+ t4_h = __lsx_vaddi_hu(t4_h, 4);
859
+ t4_h = __lsx_vsrai_h(t4_h, 3);
860
+
861
+ // (p0 + q0 + q1 + q2 + 2) >> 2
862
+ t5_h = __lsx_vadd_h(p0_h, q0_h);
863
+ t5_h = __lsx_vadd_h(t5_h, q1_h);
864
+ t5_h = __lsx_vadd_h(t5_h, q2_h);
865
+ t5_h = __lsx_vaddi_hu(t5_h, 2);
866
+ t5_h = __lsx_vsrai_h(t5_h, 2);
867
+
868
+ // ((q3 * (1 << 1)) + q2 + (q2 * (1 << 1)) + q1 + q0 + p0 + 4) >> 3
869
+ t6_h = __lsx_vslli_h(q3_h, 1);
870
+ t6_h = __lsx_vadd_h(t6_h, q2_h);
871
+ temp = __lsx_vslli_h(q2_h, 1);
872
+ t6_h = __lsx_vadd_h(t6_h, temp);
873
+ t6_h = __lsx_vadd_h(t6_h, q1_h);
874
+ t6_h = __lsx_vadd_h(t6_h, q0_h);
875
+ t6_h = __lsx_vadd_h(t6_h, p0_h);
876
+ t6_h = __lsx_vaddi_hu(t6_h, 4);
877
+ t6_h = __lsx_vsrai_h(t6_h, 3);
878
+
879
+ // ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2
880
+ t7_h = __lsx_vslli_h(q1_h, 1);
881
+ t7_h = __lsx_vadd_h(t7_h, q0_h);
882
+ t7_h = __lsx_vadd_h(t7_h, p1_h);
883
+ t7_h = __lsx_vaddi_hu(t7_h, 2);
884
+ t7_h = __lsx_vsrai_h(t7_h, 2);
885
+
886
+ // Combined low and high
887
+ DUP4_ARG2(__lsx_vpickev_b, t0_h, t0_l, t1_h, t1_l, t2_h, t2_l,
888
+ t3_h, t3_l, t0, t1, t2, t3);
889
+ DUP4_ARG2(__lsx_vpickev_b, t4_h, t4_l, t5_h, t5_l, t6_h, t6_l,
890
+ t7_h, t7_l, t4, t5, t6, t7);
891
+
892
+ f0 = __lsx_vslt_bu(bDetaP0Q0, alpha);
893
+ f0 = __lsx_vand_v(f0, bDetaP1P0);
894
+ f0 = __lsx_vand_v(f0, bDetaQ1Q0);
895
+
896
+ f1 = __lsx_vsrli_b(alpha, 2);
897
+ f1 = __lsx_vaddi_bu(f1, 2);
898
+ f1 = __lsx_vslt_bu(bDetaP0Q0, f1);
899
+
900
+ // t0
901
+ f2 = __lsx_vand_v(f0, f1);
902
+ fn = __lsx_vand_v(f2, bDetaP2P0);
903
+ f3 = __lsx_vand_v(fn, t0);
904
+ f2 = __lsx_vnor_v(bDetaP2P0, bDetaP2P0);
905
+ fn = __lsx_vand_v(f0, f2);
906
+ fn = __lsx_vand_v(fn, f1);
907
+ t0 = __lsx_vand_v(fn, t3);
908
+ t0 = __lsx_vadd_b(f3, t0);
909
+ fn = __lsx_vnor_v(f1, f1);
910
+ fn = __lsx_vand_v(fn, f0);
911
+ f3 = __lsx_vand_v(fn, t3);
912
+ t0 = __lsx_vadd_b(f3, t0);
913
+
914
+ // t1
915
+ f2 = __lsx_vand_v(f0, f1);
916
+ f2 = __lsx_vand_v(f2, bDetaP2P0);
917
+ t1 = __lsx_vand_v(f2, t1);
918
+
919
+ // t2
920
+ f2 = __lsx_vand_v(f0, f1);
921
+ f2 = __lsx_vand_v(f2, bDetaP2P0);
922
+ t2 = __lsx_vand_v(f2, t2);
923
+
924
+ // t3
925
+ f2 = __lsx_vand_v(f0, f1);
926
+ fn = __lsx_vand_v(f2, bDetaQ2Q0);
927
+ f3 = __lsx_vand_v(fn, t4);
928
+ fn = __lsx_vnor_v(bDetaQ2Q0, bDetaQ2Q0);
929
+ fn = __lsx_vand_v(fn, f2);
930
+ t3 = __lsx_vand_v(fn, t7);
931
+ t3 = __lsx_vadd_b(f3, t3);
932
+ fn = __lsx_vnor_v(f1, f1);
933
+ fn = __lsx_vand_v(fn, f0);
934
+ f3 = __lsx_vand_v(fn, t7);
935
+ t3 = __lsx_vadd_b(f3, t3);
936
+
937
+ // t4
938
+ f2 = __lsx_vand_v(f0, f1);
939
+ f2 = __lsx_vand_v(f2, bDetaQ2Q0);
940
+ t4 = __lsx_vand_v(f2, t5);
941
+
942
+ // t5
943
+ f2 = __lsx_vand_v(f0, f1);
944
+ f2 = __lsx_vand_v(f2, bDetaQ2Q0);
945
+ t5 = __lsx_vand_v(f2, t6);
946
+
947
+ // p0
948
+ fn = __lsx_vnor_v(f0, f0);
949
+ p0 = __lsx_vand_v(fn, p0);
950
+ p0 = __lsx_vadd_b(p0, t0);
951
+
952
+ // p1
953
+ f2 = __lsx_vand_v(f0, f1);
954
+ f2 = __lsx_vand_v(f2, bDetaP2P0);
955
+ fn = __lsx_vnor_v(f2, f2);
956
+ p1 = __lsx_vand_v(fn, p1);
957
+ p1 = __lsx_vadd_b(t1, p1);
958
+
959
+ // p2
960
+ f2 = __lsx_vand_v(f0, f1);
961
+ f2 = __lsx_vand_v(f2, bDetaP2P0);
962
+ fn = __lsx_vnor_v(f2, f2);
963
+ p2 = __lsx_vand_v(fn, p2);
964
+ p2 = __lsx_vadd_b(t2, p2);
965
+
966
+ // q0
967
+ fn = __lsx_vnor_v(f0, f0);
968
+ q0 = __lsx_vand_v(fn, q0);
969
+ q0 = __lsx_vadd_b(q0, t3);
970
+
971
+ // q1
972
+ f2 = __lsx_vand_v(f0, f1);
973
+ f2 = __lsx_vand_v(f2, bDetaQ2Q0);
974
+ fn = __lsx_vnor_v(f2, f2);
975
+ q1 = __lsx_vand_v(fn, q1);
976
+ q1 = __lsx_vadd_b(q1, t4);
977
+
978
+ // q2
979
+ f2 = __lsx_vand_v(f0, f1);
980
+ f2 = __lsx_vand_v(f2, bDetaQ2Q0);
981
+ fn = __lsx_vnor_v(f2, f2);
982
+ q2 = __lsx_vand_v(fn, q2);
983
+ q2 = __lsx_vadd_b(q2, t5);
984
+
985
+ DUP2_ARG2(__lsx_vilvl_b, p1, p2, q0, p0, t0, t1);
986
+ DUP2_ARG2(__lsx_vilvh_b, p1, p2, q0, p0, t2, t3);
987
+
988
+ DUP2_ARG2(__lsx_vilvl_h, t1, t0, t3, t2, p0, p1);
989
+ DUP2_ARG2(__lsx_vilvh_h, t1, t0, t3, t2, p2, p3);
990
+
991
+ t1 = __lsx_vilvl_b(q2, q1);
992
+ t2 = __lsx_vilvh_b(q2, q1);
993
+
994
+ // Store data to pPix
995
+ pPix -= iStrideY_x4;
996
+ pPix -= iStrideY_x4;
997
+ pPix -= iStrideY_x4;
998
+ pPix += 1;
999
+ __lsx_vstelm_w(p0, pPix, 0, 0);
1000
+ __lsx_vstelm_w(p0, pPix + iStrideY, 0, 1);
1001
+ __lsx_vstelm_w(p0, pPix + iStrideY_x2, 0, 2);
1002
+ __lsx_vstelm_w(p0, pPix + iStrideY_x3, 0, 3);
1003
+ pPix += iStrideY_x4;
1004
+ __lsx_vstelm_w(p2, pPix, 0, 0);
1005
+ __lsx_vstelm_w(p2, pPix + iStrideY, 0, 1);
1006
+ __lsx_vstelm_w(p2, pPix + iStrideY_x2, 0, 2);
1007
+ __lsx_vstelm_w(p2, pPix + iStrideY_x3, 0, 3);
1008
+ pPix += iStrideY_x4;
1009
+ __lsx_vstelm_w(p1, pPix, 0, 0);
1010
+ __lsx_vstelm_w(p1, pPix + iStrideY, 0, 1);
1011
+ __lsx_vstelm_w(p1, pPix + iStrideY_x2, 0, 2);
1012
+ __lsx_vstelm_w(p1, pPix + iStrideY_x3, 0, 3);
1013
+ pPix += iStrideY_x4;
1014
+ __lsx_vstelm_w(p3, pPix, 0, 0);
1015
+ __lsx_vstelm_w(p3, pPix + iStrideY, 0, 1);
1016
+ __lsx_vstelm_w(p3, pPix + iStrideY_x2, 0, 2);
1017
+ __lsx_vstelm_w(p3, pPix + iStrideY_x3, 0, 3);
1018
+
1019
+ pPix -= iStrideY_x4;
1020
+ pPix -= iStrideY_x4;
1021
+ pPix -= iStrideY_x4;
1022
+ pPix += 4;
1023
+ __lsx_vstelm_h(t1, pPix, 0, 0);
1024
+ __lsx_vstelm_h(t1, pPix + iStrideY, 0, 1);
1025
+ __lsx_vstelm_h(t1, pPix + iStrideY_x2, 0, 2);
1026
+ __lsx_vstelm_h(t1, pPix + iStrideY_x3, 0, 3);
1027
+ pPix += iStrideY_x4;
1028
+ __lsx_vstelm_h(t1, pPix, 0, 4);
1029
+ __lsx_vstelm_h(t1, pPix + iStrideY, 0, 5);
1030
+ __lsx_vstelm_h(t1, pPix + iStrideY_x2, 0, 6);
1031
+ __lsx_vstelm_h(t1, pPix + iStrideY_x3, 0, 7);
1032
+ pPix += iStrideY_x4;
1033
+ __lsx_vstelm_h(t2, pPix, 0, 0);
1034
+ __lsx_vstelm_h(t2, pPix + iStrideY, 0, 1);
1035
+ __lsx_vstelm_h(t2, pPix + iStrideY_x2, 0, 2);
1036
+ __lsx_vstelm_h(t2, pPix + iStrideY_x3, 0, 3);
1037
+ pPix += iStrideY_x4;
1038
+ __lsx_vstelm_h(t2, pPix, 0, 4);
1039
+ __lsx_vstelm_h(t2, pPix + iStrideY, 0, 5);
1040
+ __lsx_vstelm_h(t2, pPix + iStrideY_x2, 0, 6);
1041
+ __lsx_vstelm_h(t2, pPix + iStrideY_x3, 0, 7);
1042
+ }
1043
+
1044
+ void DeblockChromaLt4V_lsx (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX,
1045
+ int32_t iAlpha, int32_t iBeta, int8_t* pTc) {
1046
+ __m128i p0, p1, q0, q1, t0, t1, tp;
1047
+ __m128i p0_l, p1_l, p2_l, q0_l, q1_l, q2_l;
1048
+ __m128i iTc0, negiTc0, iTc0_l, negiTc0_l;
1049
+ __m128i flags, flag, iDeta_l;
1050
+ __m128i bDetaP0Q0, bDetaP1P0, bDetaQ1Q0;
1051
+
1052
+ __m128i zero = __lsx_vldi(0);
1053
+ __m128i alpha = __lsx_vreplgr2vr_b(iAlpha);
1054
+ __m128i beta = __lsx_vreplgr2vr_b(iBeta);
1055
+ __m128i shuf = {0x0303020201010000, 0x0};
1056
+ __m128i not_255 = {0xff00ff00ff00ff00, 0xff00ff00ff00ff00};
1057
+
1058
+ int32_t iStrideX_x0 = 0;
1059
+ int32_t iStrideX_x2 = iStrideX << 1;
1060
+
1061
+ iTc0 = __lsx_vldx(pTc, 0);
1062
+ iTc0 = __lsx_vshuf_b(iTc0, iTc0, shuf);
1063
+ negiTc0 = __lsx_vneg_b(iTc0);
1064
+
1065
+ flag = __lsx_vslt_b(iTc0, zero);
1066
+ iTc0_l = __lsx_vilvl_b(flag, iTc0);
1067
+ flag = __lsx_vslt_b(negiTc0, zero);
1068
+ negiTc0_l = __lsx_vilvl_b(flag, negiTc0);
1069
+
1070
+ // Load data from pPixCb
1071
+ DUP4_ARG2(__lsx_vldx, pPixCb, -iStrideX, pPixCb, -iStrideX_x2, pPixCb,
1072
+ iStrideX_x0, pPixCb, iStrideX, p0, p1, q0, q1);
1073
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, q0, zero, q1,
1074
+ p0_l, p1_l, q0_l, q1_l);
1075
+ // Calculate condition mask
1076
+ DUP2_ARG2(__lsx_vabsd_bu, p0, q0, p1, p0, bDetaP0Q0, bDetaP1P0);
1077
+ bDetaQ1Q0 = __lsx_vabsd_bu(q1, q0);
1078
+ DUP2_ARG2(__lsx_vslt_bu, bDetaP0Q0, alpha, bDetaP1P0, beta, bDetaP0Q0, bDetaP1P0);
1079
+ bDetaQ1Q0 = __lsx_vslt_bu(bDetaQ1Q0, beta);
1080
+ DUP2_ARG2(__lsx_vand_v, bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, flags, flags, flags);
1081
+
1082
+ // Calculate the low part
1083
+ // WELS_CLIP3 ((((q0 - p0) * (1 << 2)) + (p1 - q1) + 4) >> 3, -iTc0, iTc0)
1084
+ iDeta_l = __lsx_vsub_h(q0_l, p0_l);
1085
+ iDeta_l = __lsx_vslli_h(iDeta_l, 2);
1086
+ iDeta_l = __lsx_vadd_h(iDeta_l, p1_l);
1087
+ iDeta_l = __lsx_vsub_h(iDeta_l, q1_l);
1088
+ iDeta_l = __lsx_vaddi_hu(iDeta_l, 4);
1089
+ iDeta_l = __lsx_vsrai_h(iDeta_l, 3);
1090
+ iDeta_l = __lsx_vmin_h(iTc0_l, iDeta_l);
1091
+ iDeta_l = __lsx_vmax_h(negiTc0_l, iDeta_l);
1092
+
1093
+ // WelsClip1 (p0 + iDeta)
1094
+ p0_l = __lsx_vadd_h(p0_l, iDeta_l);
1095
+ p1_l = __lsx_vand_v(p0_l, not_255);
1096
+ p2_l = __lsx_vsle_h(zero, p0_l);
1097
+ flag = __lsx_vseq_h(p1_l, zero);
1098
+ p0_l = __lsx_vand_v(p0_l, flag);
1099
+ flag = __lsx_vnor_v(flag,flag);
1100
+ p2_l = __lsx_vand_v(p2_l, flag);
1101
+ p0_l = __lsx_vadd_h(p0_l, p2_l);
1102
+
1103
+ // WelsClip1 (q0 - iDeta)
1104
+ q0_l = __lsx_vsub_h(q0_l, iDeta_l);
1105
+ q1_l = __lsx_vand_v(q0_l, not_255);
1106
+ q2_l = __lsx_vsle_h(zero, q0_l);
1107
+ flag = __lsx_vseq_h(q1_l, zero);
1108
+ q0_l = __lsx_vand_v(q0_l, flag);
1109
+ flag = __lsx_vnor_v(flag, flag);
1110
+ q2_l = __lsx_vand_v(q2_l, flag);
1111
+ q0_l = __lsx_vadd_h(q0_l, q2_l);
1112
+
1113
+ DUP2_ARG2(__lsx_vpickev_b, zero, p0_l, zero, q0_l, t0, t1);
1114
+ flag = __lsx_vsle_b(zero, iTc0);
1115
+ flag = __lsx_vand_v(flag, flags);
1116
+ t0 = __lsx_vand_v(t0, flag);
1117
+ tp = __lsx_vnor_v(flag,flag);
1118
+ p0 = __lsx_vand_v(p0, tp);
1119
+ p0 = __lsx_vadd_b(t0, p0);
1120
+ t1 = __lsx_vand_v(t1, flag);
1121
+ tp = __lsx_vnor_v(flag,flag);
1122
+ q0 = __lsx_vand_v(q0, tp);
1123
+ q0 = __lsx_vadd_b(t1, q0);
1124
+
1125
+ // Store data to pPixCb
1126
+ __lsx_vstelm_d(p0, pPixCb - iStrideX, 0, 0);
1127
+ __lsx_vstelm_d(q0, pPixCb, 0, 0);
1128
+
1129
+ // Load data from pPixCr
1130
+ DUP4_ARG2(__lsx_vldx, pPixCr, -iStrideX, pPixCr, -iStrideX_x2, pPixCr,
1131
+ iStrideX_x0, pPixCr, iStrideX, p0, p1, q0, q1);
1132
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, q0, zero, q1,
1133
+ p0_l, p1_l, q0_l, q1_l);
1134
+ // Calculate condition mask
1135
+ DUP2_ARG2(__lsx_vabsd_bu, p0, q0, p1, p0, bDetaP0Q0, bDetaP1P0);
1136
+ bDetaQ1Q0 = __lsx_vabsd_bu(q1, q0);
1137
+ DUP2_ARG2(__lsx_vslt_bu, bDetaP0Q0, alpha, bDetaP1P0, beta, bDetaP0Q0, bDetaP1P0);
1138
+ bDetaQ1Q0 = __lsx_vslt_bu(bDetaQ1Q0, beta);
1139
+ DUP2_ARG2(__lsx_vand_v, bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, flags, flags, flags);
1140
+
1141
+ // Calculate the low part
1142
+ // WELS_CLIP3 ((((q0 - p0) * (1 << 2)) + (p1 - q1) + 4) >> 3, -iTc0, iTc0)
1143
+ iDeta_l = __lsx_vsub_h(q0_l, p0_l);
1144
+ iDeta_l = __lsx_vslli_h(iDeta_l, 2);
1145
+ iDeta_l = __lsx_vadd_h(iDeta_l, p1_l);
1146
+ iDeta_l = __lsx_vsub_h(iDeta_l, q1_l);
1147
+ iDeta_l = __lsx_vaddi_hu(iDeta_l, 4);
1148
+ iDeta_l = __lsx_vsrai_h(iDeta_l, 3);
1149
+ iDeta_l = __lsx_vmin_h(iTc0_l, iDeta_l);
1150
+ iDeta_l = __lsx_vmax_h(negiTc0_l, iDeta_l);
1151
+
1152
+ // WelsClip1 (p0 + iDeta)
1153
+ p0_l = __lsx_vadd_h(p0_l, iDeta_l);
1154
+ p1_l = __lsx_vand_v(p0_l, not_255);
1155
+ p2_l = __lsx_vsle_h(zero, p0_l);
1156
+ flag = __lsx_vseq_h(p1_l, zero);
1157
+ p0_l = __lsx_vand_v(p0_l, flag);
1158
+ flag = __lsx_vnor_v(flag,flag);
1159
+ p2_l = __lsx_vand_v(p2_l, flag);
1160
+ p0_l = __lsx_vadd_h(p0_l, p2_l);
1161
+
1162
+ // WelsClip1 (q0 - iDeta)
1163
+ q0_l = __lsx_vsub_h(q0_l, iDeta_l);
1164
+ q1_l = __lsx_vand_v(q0_l, not_255);
1165
+ q2_l = __lsx_vsle_h(zero, q0_l);
1166
+ flag = __lsx_vseq_h(q1_l, zero);
1167
+ q0_l = __lsx_vand_v(q0_l, flag);
1168
+ flag = __lsx_vnor_v(flag, flag);
1169
+ q2_l = __lsx_vand_v(q2_l, flag);
1170
+ q0_l = __lsx_vadd_h(q0_l, q2_l);
1171
+
1172
+ DUP2_ARG2(__lsx_vpickev_b, zero, p0_l, zero, q0_l, t0, t1);
1173
+ flag = __lsx_vsle_b(zero, iTc0);
1174
+ flag = __lsx_vand_v(flag, flags);
1175
+ t0 = __lsx_vand_v(t0, flag);
1176
+ tp = __lsx_vnor_v(flag,flag);
1177
+ p0 = __lsx_vand_v(p0, tp);
1178
+ p0 = __lsx_vadd_b(t0, p0);
1179
+ t1 = __lsx_vand_v(t1, flag);
1180
+ tp = __lsx_vnor_v(flag,flag);
1181
+ q0 = __lsx_vand_v(q0, tp);
1182
+ q0 = __lsx_vadd_b(t1, q0);
1183
+
1184
+ // Store data to pPixCr
1185
+ __lsx_vstelm_d(p0, pPixCr - iStrideX, 0, 0);
1186
+ __lsx_vstelm_d(q0, pPixCr, 0, 0);
1187
+ }
1188
+
1189
+ void DeblockChromaLt4H_lsx (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideY,
1190
+ int32_t iAlpha, int32_t iBeta, int8_t* pTc) {
1191
+ __m128i p0, p1, q0, q1, t0, t1, t2, t3, tp;
1192
+ __m128i p0_l, p1_l, p2_l, q0_l, q1_l, q2_l;
1193
+ __m128i iTc0, negiTc0, iTc0_l, negiTc0_l;
1194
+ __m128i flags, flag, iDeta_l;
1195
+ __m128i bDetaP0Q0, bDetaP1P0, bDetaQ1Q0;
1196
+
1197
+ __m128i zero = __lsx_vldi(0);
1198
+ __m128i alpha = __lsx_vreplgr2vr_b(iAlpha);
1199
+ __m128i beta = __lsx_vreplgr2vr_b(iBeta);
1200
+ __m128i shuf = {0x0303020201010000, 0x0};
1201
+ __m128i not_255 = {0xff00ff00ff00ff00, 0xff00ff00ff00ff00};
1202
+
1203
+ int32_t iStrideY_x0 = 0;
1204
+ int32_t iStrideY_x2 = iStrideY << 1;
1205
+ int32_t iStrideY_x3 = iStrideY_x2 + iStrideY;
1206
+ int32_t iStrideY_x4 = iStrideY << 2;
1207
+
1208
+ iTc0 = __lsx_vldx(pTc, 0);
1209
+ iTc0 = __lsx_vshuf_b(iTc0, iTc0, shuf);
1210
+ negiTc0 = __lsx_vneg_b(iTc0);
1211
+
1212
+ flag = __lsx_vslt_b(iTc0, zero);
1213
+ iTc0_l = __lsx_vilvl_b(flag, iTc0);
1214
+ flag = __lsx_vslt_b(negiTc0, zero);
1215
+ negiTc0_l = __lsx_vilvl_b(flag, negiTc0);
1216
+
1217
+ // Load data from pPixCb
1218
+ pPixCb -= 2;
1219
+ DUP4_ARG2(__lsx_vldx, pPixCb, iStrideY_x0, pPixCb, iStrideY, pPixCb,
1220
+ iStrideY_x2, pPixCb, iStrideY_x3, p1, p0, q0, q1);
1221
+ pPixCb += iStrideY_x4;
1222
+ DUP4_ARG2(__lsx_vldx, pPixCb, iStrideY_x0, pPixCb, iStrideY, pPixCb,
1223
+ iStrideY_x2, pPixCb, iStrideY_x3, t0, t1, t2, t3);
1224
+ LSX_TRANSPOSE8x4_B(p1, p0, q0, q1, t0, t1, t2, t3, p1, p0, q0, q1);
1225
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, q0, zero, q1,
1226
+ p0_l, p1_l, q0_l, q1_l);
1227
+
1228
+ // Calculate condition mask
1229
+ DUP2_ARG2(__lsx_vabsd_bu, p0, q0, p1, p0, bDetaP0Q0, bDetaP1P0);
1230
+ bDetaQ1Q0 = __lsx_vabsd_bu(q1, q0);
1231
+ DUP2_ARG2(__lsx_vslt_bu, bDetaP0Q0, alpha, bDetaP1P0, beta, bDetaP0Q0, bDetaP1P0);
1232
+ bDetaQ1Q0 = __lsx_vslt_bu(bDetaQ1Q0, beta);
1233
+ DUP2_ARG2(__lsx_vand_v, bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, flags, flags, flags);
1234
+
1235
+ // Calculate the low part
1236
+ // WELS_CLIP3 ((((q0 - p0) * (1 << 2)) + (p1 - q1) + 4) >> 3, -iTc0, iTc0)
1237
+ iDeta_l = __lsx_vsub_h(q0_l, p0_l);
1238
+ iDeta_l = __lsx_vslli_h(iDeta_l, 2);
1239
+ iDeta_l = __lsx_vadd_h(iDeta_l, p1_l);
1240
+ iDeta_l = __lsx_vsub_h(iDeta_l, q1_l);
1241
+ iDeta_l = __lsx_vaddi_hu(iDeta_l, 4);
1242
+ iDeta_l = __lsx_vsrai_h(iDeta_l, 3);
1243
+ iDeta_l = __lsx_vmin_h(iTc0_l, iDeta_l);
1244
+ iDeta_l = __lsx_vmax_h(negiTc0_l, iDeta_l);
1245
+
1246
+ // WelsClip1 (p0 + iDeta)
1247
+ p0_l = __lsx_vadd_h(p0_l, iDeta_l);
1248
+ p1_l = __lsx_vand_v(p0_l, not_255);
1249
+ p2_l = __lsx_vsle_h(zero, p0_l);
1250
+ flag = __lsx_vseq_h(p1_l, zero);
1251
+ p0_l = __lsx_vand_v(p0_l, flag);
1252
+ flag = __lsx_vnor_v(flag,flag);
1253
+ p2_l = __lsx_vand_v(p2_l, flag);
1254
+ p0_l = __lsx_vadd_h(p0_l, p2_l);
1255
+
1256
+ // WelsClip1 (q0 - iDeta)
1257
+ q0_l = __lsx_vsub_h(q0_l, iDeta_l);
1258
+ q1_l = __lsx_vand_v(q0_l, not_255);
1259
+ q2_l = __lsx_vsle_h(zero, q0_l);
1260
+ flag = __lsx_vseq_h(q1_l, zero);
1261
+ q0_l = __lsx_vand_v(q0_l, flag);
1262
+ flag = __lsx_vnor_v(flag, flag);
1263
+ q2_l = __lsx_vand_v(q2_l, flag);
1264
+ q0_l = __lsx_vadd_h(q0_l, q2_l);
1265
+
1266
+ DUP2_ARG2(__lsx_vpickev_b, zero, p0_l, zero, q0_l, t0, t1);
1267
+ flag = __lsx_vsle_b(zero, iTc0);
1268
+ flag = __lsx_vand_v(flag, flags);
1269
+ t0 = __lsx_vand_v(t0, flag);
1270
+ tp = __lsx_vnor_v(flag,flag);
1271
+ p0 = __lsx_vand_v(p0, tp);
1272
+ p0 = __lsx_vadd_b(t0, p0);
1273
+ t1 = __lsx_vand_v(t1, flag);
1274
+ tp = __lsx_vnor_v(flag,flag);
1275
+ q0 = __lsx_vand_v(q0, tp);
1276
+ q0 = __lsx_vadd_b(t1, q0);
1277
+ p0 = __lsx_vilvl_b(q0, p0);
1278
+
1279
+ // Store data to pPixCb
1280
+ pPixCb -= iStrideY_x4 - 1;
1281
+ __lsx_vstelm_h(p0, pPixCb, 0, 0);
1282
+ __lsx_vstelm_h(p0, pPixCb + iStrideY, 0, 1);
1283
+ __lsx_vstelm_h(p0, pPixCb + iStrideY_x2, 0, 2);
1284
+ __lsx_vstelm_h(p0, pPixCb + iStrideY_x3, 0, 3);
1285
+ pPixCb += iStrideY_x4;
1286
+ __lsx_vstelm_h(p0, pPixCb, 0, 4);
1287
+ __lsx_vstelm_h(p0, pPixCb + iStrideY, 0, 5);
1288
+ __lsx_vstelm_h(p0, pPixCb + iStrideY_x2, 0, 6);
1289
+ __lsx_vstelm_h(p0, pPixCb + iStrideY_x3, 0, 7);
1290
+
1291
+ // Load data from pPixCr
1292
+ pPixCr -= 2;
1293
+ DUP4_ARG2(__lsx_vldx, pPixCr, iStrideY_x0, pPixCr, iStrideY, pPixCr,
1294
+ iStrideY_x2, pPixCr, iStrideY_x3, p1, p0, q0, q1);
1295
+ pPixCr += iStrideY_x4;
1296
+ DUP4_ARG2(__lsx_vldx, pPixCr, iStrideY_x0, pPixCr, iStrideY, pPixCr,
1297
+ iStrideY_x2, pPixCr, iStrideY_x3, t0, t1, t2, t3);
1298
+ LSX_TRANSPOSE8x4_B(p1, p0, q0, q1, t0, t1, t2, t3, p1, p0, q0, q1);
1299
+
1300
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, q0, zero, q1,
1301
+ p0_l, p1_l, q0_l, q1_l);
1302
+ DUP2_ARG2(__lsx_vabsd_bu, p0, q0, p1, p0, bDetaP0Q0, bDetaP1P0);
1303
+ bDetaQ1Q0 = __lsx_vabsd_bu(q1, q0);
1304
+ DUP2_ARG2(__lsx_vslt_bu, bDetaP0Q0, alpha, bDetaP1P0, beta, bDetaP0Q0, bDetaP1P0);
1305
+ bDetaQ1Q0 = __lsx_vslt_bu(bDetaQ1Q0, beta);
1306
+ DUP2_ARG2(__lsx_vand_v, bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, flags, flags, flags);
1307
+
1308
+ // Calculate the low part
1309
+ // WELS_CLIP3 ((((q0 - p0) * (1 << 2)) + (p1 - q1) + 4) >> 3, -iTc0, iTc0)
1310
+ iDeta_l = __lsx_vsub_h(q0_l, p0_l);
1311
+ iDeta_l = __lsx_vslli_h(iDeta_l, 2);
1312
+ iDeta_l = __lsx_vadd_h(iDeta_l, p1_l);
1313
+ iDeta_l = __lsx_vsub_h(iDeta_l, q1_l);
1314
+ iDeta_l = __lsx_vaddi_hu(iDeta_l, 4);
1315
+ iDeta_l = __lsx_vsrai_h(iDeta_l, 3);
1316
+ iDeta_l = __lsx_vmin_h(iTc0_l, iDeta_l);
1317
+ iDeta_l = __lsx_vmax_h(negiTc0_l, iDeta_l);
1318
+
1319
+ // WelsClip1 (p0 + iDeta)
1320
+ p0_l = __lsx_vadd_h(p0_l, iDeta_l);
1321
+ p1_l = __lsx_vand_v(p0_l, not_255);
1322
+ p2_l = __lsx_vsle_h(zero, p0_l);
1323
+ flag = __lsx_vseq_h(p1_l, zero);
1324
+ p0_l = __lsx_vand_v(p0_l, flag);
1325
+ flag = __lsx_vnor_v(flag,flag);
1326
+ p2_l = __lsx_vand_v(p2_l, flag);
1327
+ p0_l = __lsx_vadd_h(p0_l, p2_l);
1328
+
1329
+ // WelsClip1 (q0 - iDeta)
1330
+ q0_l = __lsx_vsub_h(q0_l, iDeta_l);
1331
+ q1_l = __lsx_vand_v(q0_l, not_255);
1332
+ q2_l = __lsx_vsle_h(zero, q0_l);
1333
+ flag = __lsx_vseq_h(q1_l, zero);
1334
+ q0_l = __lsx_vand_v(q0_l, flag);
1335
+ flag = __lsx_vnor_v(flag, flag);
1336
+ q2_l = __lsx_vand_v(q2_l, flag);
1337
+ q0_l = __lsx_vadd_h(q0_l, q2_l);
1338
+
1339
+ DUP2_ARG2(__lsx_vpickev_b, zero, p0_l, zero, q0_l, t0, t1);
1340
+ flag = __lsx_vsle_b(zero, iTc0);
1341
+ flag = __lsx_vand_v(flag, flags);
1342
+ t0 = __lsx_vand_v(t0, flag);
1343
+ tp = __lsx_vnor_v(flag,flag);
1344
+ p0 = __lsx_vand_v(p0, tp);
1345
+ p0 = __lsx_vadd_b(t0, p0);
1346
+ t1 = __lsx_vand_v(t1, flag);
1347
+ tp = __lsx_vnor_v(flag,flag);
1348
+ q0 = __lsx_vand_v(q0, tp);
1349
+ q0 = __lsx_vadd_b(t1, q0);
1350
+ p0 = __lsx_vilvl_b(q0, p0);
1351
+
1352
+ // Store data to pPixCr
1353
+ pPixCr -= iStrideY_x4 - 1;
1354
+ __lsx_vstelm_h(p0, pPixCr, 0, 0);
1355
+ __lsx_vstelm_h(p0, pPixCr + iStrideY, 0, 1);
1356
+ __lsx_vstelm_h(p0, pPixCr + iStrideY_x2, 0, 2);
1357
+ __lsx_vstelm_h(p0, pPixCr + iStrideY_x3, 0, 3);
1358
+ pPixCr += iStrideY_x4;
1359
+ __lsx_vstelm_h(p0, pPixCr, 0, 4);
1360
+ __lsx_vstelm_h(p0, pPixCr + iStrideY, 0, 5);
1361
+ __lsx_vstelm_h(p0, pPixCr + iStrideY_x2, 0, 6);
1362
+ __lsx_vstelm_h(p0, pPixCr + iStrideY_x3, 0, 7);
1363
+ }
1364
+
1365
+ void DeblockChromaEq4H_lsx (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideY,
1366
+ int32_t iAlpha, int32_t iBeta) {
1367
+ __m128i p0, p1, q0, q1, t0, t1, t2, t3, tp;
1368
+ __m128i p0_l, p1_l, p2_l, q0_l, q1_l, q2_l;
1369
+ __m128i bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, flags;
1370
+
1371
+ __m128i zero = __lsx_vldi(0);
1372
+ __m128i alpha = __lsx_vreplgr2vr_b(iAlpha);
1373
+ __m128i beta = __lsx_vreplgr2vr_b(iBeta);
1374
+
1375
+ int32_t iStrideY_x0 = 0;
1376
+ int32_t iStrideY_x2 = iStrideY << 1;
1377
+ int32_t iStrideY_x3 = iStrideY_x2 + iStrideY;
1378
+ int32_t iStrideY_x4 = iStrideY << 2;
1379
+
1380
+ // Load data from pPixCb
1381
+ pPixCb -= 2;
1382
+ DUP4_ARG2(__lsx_vldx, pPixCb, iStrideY_x0, pPixCb, iStrideY, pPixCb,
1383
+ iStrideY_x2, pPixCb, iStrideY_x3, p1, p0, q0, q1);
1384
+ pPixCb += iStrideY_x4;
1385
+ DUP4_ARG2(__lsx_vldx, pPixCb, iStrideY_x0, pPixCb, iStrideY, pPixCb,
1386
+ iStrideY_x2, pPixCb, iStrideY_x3, t0, t1, t2, t3);
1387
+ LSX_TRANSPOSE8x4_B(p1, p0, q0, q1, t0, t1, t2, t3, p1, p0, q0, q1);
1388
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, q0, zero, q1,
1389
+ p0_l, p1_l, q0_l, q1_l);
1390
+
1391
+ // Calculate condition mask
1392
+ DUP2_ARG2(__lsx_vabsd_bu, p0, q0, p1, p0, bDetaP0Q0, bDetaP1P0);
1393
+ bDetaQ1Q0 = __lsx_vabsd_bu(q1, q0);
1394
+ DUP2_ARG2(__lsx_vslt_bu, bDetaP0Q0, alpha, bDetaP1P0, beta, bDetaP0Q0, bDetaP1P0);
1395
+ bDetaQ1Q0 = __lsx_vslt_bu(bDetaQ1Q0, beta);
1396
+ DUP2_ARG2(__lsx_vand_v, bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, flags, flags, flags);
1397
+
1398
+ // ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2
1399
+ p2_l = __lsx_vslli_h(p1_l, 1);
1400
+ p2_l = __lsx_vadd_h(p2_l, p0_l);
1401
+ p2_l = __lsx_vadd_h(p2_l, q1_l);
1402
+ p2_l = __lsx_vaddi_hu(p2_l, 2);
1403
+ p2_l = __lsx_vsrai_h(p2_l, 2);
1404
+
1405
+ // ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2
1406
+ q2_l = __lsx_vslli_h(q1_l, 1);
1407
+ q2_l = __lsx_vadd_h(q2_l, q0_l);
1408
+ q2_l = __lsx_vadd_h(q2_l, p1_l);
1409
+ q2_l = __lsx_vaddi_hu(q2_l, 2);
1410
+ q2_l = __lsx_vsrai_h(q2_l, 2);
1411
+
1412
+ DUP2_ARG2(__lsx_vpickev_b, zero, p2_l, zero, q2_l, t0, t1);
1413
+ t0 = __lsx_vand_v(t0, flags);
1414
+ tp = __lsx_vnor_v(flags,flags);
1415
+ p0 = __lsx_vand_v(p0, tp);
1416
+ p0 = __lsx_vadd_b(t0, p0);
1417
+ t1 = __lsx_vand_v(t1, flags);
1418
+ tp = __lsx_vnor_v(flags,flags);
1419
+ q0 = __lsx_vand_v(q0, tp);
1420
+ q0 = __lsx_vadd_b(t1, q0);
1421
+ p0 = __lsx_vilvl_b(q0, p0);
1422
+
1423
+ // Store data to pPixCb
1424
+ pPixCb -= iStrideY_x4 - 1;
1425
+ __lsx_vstelm_h(p0, pPixCb, 0, 0);
1426
+ __lsx_vstelm_h(p0, pPixCb + iStrideY, 0, 1);
1427
+ __lsx_vstelm_h(p0, pPixCb + iStrideY_x2, 0, 2);
1428
+ __lsx_vstelm_h(p0, pPixCb + iStrideY_x3, 0, 3);
1429
+ pPixCb += iStrideY_x4;
1430
+ __lsx_vstelm_h(p0, pPixCb, 0, 4);
1431
+ __lsx_vstelm_h(p0, pPixCb + iStrideY, 0, 5);
1432
+ __lsx_vstelm_h(p0, pPixCb + iStrideY_x2, 0, 6);
1433
+ __lsx_vstelm_h(p0, pPixCb + iStrideY_x3, 0, 7);
1434
+
1435
+ // Load data from pPixCr
1436
+ pPixCr -= 2;
1437
+ DUP4_ARG2(__lsx_vldx, pPixCr, iStrideY_x0, pPixCr, iStrideY, pPixCr,
1438
+ iStrideY_x2, pPixCr, iStrideY_x3, p1, p0, q0, q1);
1439
+ pPixCr += iStrideY_x4;
1440
+ DUP4_ARG2(__lsx_vldx, pPixCr, iStrideY_x0, pPixCr, iStrideY, pPixCr,
1441
+ iStrideY_x2, pPixCr, iStrideY_x3, t0, t1, t2, t3);
1442
+ LSX_TRANSPOSE8x4_B(p1, p0, q0, q1, t0, t1, t2, t3, p1, p0, q0, q1);
1443
+ DUP4_ARG2(__lsx_vilvl_b, zero, p0, zero, p1, zero, q0, zero, q1,
1444
+ p0_l, p1_l, q0_l, q1_l);
1445
+
1446
+ // Calculate condition mask
1447
+ DUP2_ARG2(__lsx_vabsd_bu, p0, q0, p1, p0, bDetaP0Q0, bDetaP1P0);
1448
+ bDetaQ1Q0 = __lsx_vabsd_bu(q1, q0);
1449
+ DUP2_ARG2(__lsx_vslt_bu, bDetaP0Q0, alpha, bDetaP1P0, beta, bDetaP0Q0, bDetaP1P0);
1450
+ bDetaQ1Q0 = __lsx_vslt_bu(bDetaQ1Q0, beta);
1451
+ DUP2_ARG2(__lsx_vand_v, bDetaP0Q0, bDetaP1P0, bDetaQ1Q0, flags, flags, flags);
1452
+
1453
+ // ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2
1454
+ p2_l = __lsx_vslli_h(p1_l, 1);
1455
+ p2_l = __lsx_vadd_h(p2_l, p0_l);
1456
+ p2_l = __lsx_vadd_h(p2_l, q1_l);
1457
+ p2_l = __lsx_vaddi_hu(p2_l, 2);
1458
+ p2_l = __lsx_vsrai_h(p2_l, 2);
1459
+
1460
+ // ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2
1461
+ q2_l = __lsx_vslli_h(q1_l, 1);
1462
+ q2_l = __lsx_vadd_h(q2_l, q0_l);
1463
+ q2_l = __lsx_vadd_h(q2_l, p1_l);
1464
+ q2_l = __lsx_vaddi_hu(q2_l, 2);
1465
+ q2_l = __lsx_vsrai_h(q2_l, 2);
1466
+
1467
+ DUP2_ARG2(__lsx_vpickev_b, zero, p2_l, zero, q2_l, t0, t1);
1468
+ t0 = __lsx_vand_v(t0, flags);
1469
+ tp = __lsx_vnor_v(flags,flags);
1470
+ p0 = __lsx_vand_v(p0, tp);
1471
+ p0 = __lsx_vadd_b(t0, p0);
1472
+ t1 = __lsx_vand_v(t1, flags);
1473
+ tp = __lsx_vnor_v(flags,flags);
1474
+ q0 = __lsx_vand_v(q0, tp);
1475
+ q0 = __lsx_vadd_b(t1, q0);
1476
+ p0 = __lsx_vilvl_b(q0, p0);
1477
+
1478
+ // Store data to pPixCr
1479
+ pPixCr -= iStrideY_x4 - 1;
1480
+ __lsx_vstelm_h(p0, pPixCr, 0, 0);
1481
+ __lsx_vstelm_h(p0, pPixCr + iStrideY, 0, 1);
1482
+ __lsx_vstelm_h(p0, pPixCr + iStrideY_x2, 0, 2);
1483
+ __lsx_vstelm_h(p0, pPixCr + iStrideY_x3, 0, 3);
1484
+ pPixCr += iStrideY_x4;
1485
+ __lsx_vstelm_h(p0, pPixCr, 0, 4);
1486
+ __lsx_vstelm_h(p0, pPixCr + iStrideY, 0, 5);
1487
+ __lsx_vstelm_h(p0, pPixCr + iStrideY_x2, 0, 6);
1488
+ __lsx_vstelm_h(p0, pPixCr + iStrideY_x3, 0, 7);
1489
+ }