diff options
author | Paul B Mahol <onemda@gmail.com> | 2019-01-09 13:33:02 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2019-01-10 21:49:47 +0100 |
commit | dcae5ba322fcbd177b31bb5a26009fd6d4911ef4 (patch) | |
tree | d1a31e6e6d484a7a5d000395c0615a4e20d71299 /libavfilter/x86 | |
parent | 02b6d1dd630633ae61f1fe0b46f974a53b802690 (diff) |
avfilter: add anlmdn filter x86 SIMD optimizations
Diffstat (limited to 'libavfilter/x86')
-rw-r--r-- | libavfilter/x86/Makefile | 2 | ||||
-rw-r--r-- | libavfilter/x86/af_anlmdn.asm | 80 | ||||
-rw-r--r-- | libavfilter/x86/af_anlmdn_init.c | 35 |
3 files changed, 117 insertions, 0 deletions
diff --git a/libavfilter/x86/Makefile b/libavfilter/x86/Makefile index 6eecb94359..17499f14da 100644 --- a/libavfilter/x86/Makefile +++ b/libavfilter/x86/Makefile @@ -1,6 +1,7 @@ OBJS-$(CONFIG_SCENE_SAD) += x86/scene_sad_init.o OBJS-$(CONFIG_AFIR_FILTER) += x86/af_afir_init.o +OBJS-$(CONFIG_ANLMDN_FILTER) += x86/af_anlmdn_init.o OBJS-$(CONFIG_BLEND_FILTER) += x86/vf_blend_init.o OBJS-$(CONFIG_BWDIF_FILTER) += x86/vf_bwdif_init.o OBJS-$(CONFIG_COLORSPACE_FILTER) += x86/colorspacedsp_init.o @@ -34,6 +35,7 @@ OBJS-$(CONFIG_YADIF_FILTER) += x86/vf_yadif_init.o X86ASM-OBJS-$(CONFIG_SCENE_SAD) += x86/scene_sad.o X86ASM-OBJS-$(CONFIG_AFIR_FILTER) += x86/af_afir.o +X86ASM-OBJS-$(CONFIG_ANLMDN_FILTER) += x86/af_anlmdn.o X86ASM-OBJS-$(CONFIG_BLEND_FILTER) += x86/vf_blend.o X86ASM-OBJS-$(CONFIG_BWDIF_FILTER) += x86/vf_bwdif.o X86ASM-OBJS-$(CONFIG_COLORSPACE_FILTER) += x86/colorspacedsp.o diff --git a/libavfilter/x86/af_anlmdn.asm b/libavfilter/x86/af_anlmdn.asm new file mode 100644 index 0000000000..7986cf443c --- /dev/null +++ b/libavfilter/x86/af_anlmdn.asm @@ -0,0 +1,80 @@ +;***************************************************************************** +;* x86-optimized functions for anlmdn filter +;* Copyright (c) 2017 Paul B Mahol +;* +;* This file is part of FFmpeg. +;* +;* FFmpeg is free software; you can redistribute it and/or +;* modify it under the terms of the GNU Lesser General Public +;* License as published by the Free Software Foundation; either +;* version 2.1 of the License, or (at your option) any later version. +;* +;* FFmpeg is distributed in the hope that it will be useful, +;* but WITHOUT ANY WARRANTY; without even the implied warranty of +;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;* Lesser General Public License for more details. +;* +;* You should have received a copy of the GNU Lesser General Public +;* License along with FFmpeg; if not, write to the Free Software +;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +;****************************************************************************** + +%include "libavutil/x86/x86util.asm" + +SECTION .text + +;------------------------------------------------------------------------------ +; float ff_compute_distance_ssd(float *f1, const float *f2, ptrdiff_t len) +;------------------------------------------------------------------------------ + +INIT_XMM sse +cglobal compute_distance_ssd, 3,5,3, f1, f2, len, r, x + mov xq, lenq + shl xq, 2 + neg xq + add f1q, xq + add f2q, xq + xor xq, xq + shl lenq, 1 + add lenq, 1 + shl lenq, 2 + mov rq, lenq + and rq, mmsize - 1 + xorps m0, m0 + cmp lenq, mmsize + jl .loop1 + sub lenq, rq +ALIGN 16 + .loop0: + movups m1, [f1q + xq] + movups m2, [f2q + xq] + subps m1, m2 + mulps m1, m1 + addps m0, m1 + add xq, mmsize + cmp xq, lenq + jl .loop0 + + movhlps xmm1, xmm0 + addps xmm0, xmm1 + movss xmm1, xmm0 + shufps xmm0, xmm0, 1 + addss xmm0, xmm1 + + cmp rq, 0 + je .end + add lenq, rq + .loop1: + movss xm1, [f1q + xq] + subss xm1, [f2q + xq] + mulss xm1, xm1 + addss xm0, xm1 + add xq, 4 + cmp xq, lenq + jl .loop1 + .end: +%if ARCH_X86_64 == 0 + movss r0m, xm0 + fld dword r0m +%endif + RET diff --git a/libavfilter/x86/af_anlmdn_init.c b/libavfilter/x86/af_anlmdn_init.c new file mode 100644 index 0000000000..30eff6f644 --- /dev/null +++ b/libavfilter/x86/af_anlmdn_init.c @@ -0,0 +1,35 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include "libavutil/attributes.h" +#include "libavutil/cpu.h" +#include "libavutil/x86/cpu.h" +#include "libavfilter/af_anlmdndsp.h" + +float ff_compute_distance_ssd_sse(const float *f1, const float *f2, + ptrdiff_t len); + +av_cold void ff_anlmdn_init_x86(AudioNLMDNDSPContext *s) +{ + int cpu_flags = av_get_cpu_flags(); + + if (EXTERNAL_SSE(cpu_flags)) { + s->compute_distance_ssd = ff_compute_distance_ssd_sse; + } +} |