[vlc-commits] [Git][videolan/vlc][master] riscv: add RV-V accelerated audio volume module

Hugo Beauzée-Luyssen (@chouquette) gitlab at videolan.org
Fri Feb 4 11:54:58 UTC 2022



Hugo Beauzée-Luyssen pushed to branch master at VideoLAN / VLC


Commits:
d08f5798 by Rémi Denis-Courmont at 2022-02-04T11:09:42+00:00
riscv: add RV-V accelerated audio volume module

- - - - -


4 changed files:

- modules/Makefile.am
- + modules/isa/riscv/Makefile.am
- + modules/isa/riscv/mixer.c
- + modules/isa/riscv/rvv_amplify.S


Changes:

=====================================
modules/Makefile.am
=====================================
@@ -32,6 +32,7 @@ include hw/vaapi/Makefile.am
 include hw/vdpau/Makefile.am
 include hw/mmal/Makefile.am
 include isa/arm/Makefile.am
+include isa/riscv/Makefile.am
 include keystore/Makefile.am
 include logger/Makefile.am
 include lua/Makefile.am


=====================================
modules/isa/riscv/Makefile.am
=====================================
@@ -0,0 +1,9 @@
+riscvdir = $(pluginsdir)/riscv
+
+libvolume_rvv_plugin_la_SOURCES = isa/riscv/mixer.c isa/riscv/rvv_amplify.S
+libvolume_rvv_plugin_la_LIBADD = $(AM_LIBADD) $(LIBM)
+
+if HAVE_RVV
+riscv_LTLIBRARIES = \
+	libvolume_rvv_plugin.la
+endif


=====================================
modules/isa/riscv/mixer.c
=====================================
@@ -0,0 +1,134 @@
+/*****************************************************************************
+ * mixer.c: RISC-V V audio volume mixer module
+ *****************************************************************************
+ * Copyright (C) 2012, 2022 Rémi Denis-Courmont
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <assert.h>
+#include <math.h>
+#include <stdint.h>
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_cpu.h>
+#include <vlc_aout.h>
+#include <vlc_aout_volume.h>
+
+void rvv_amplify_f32(void *, const void *, size_t, float);
+void rvv_amplify_f64(void *, const void *, size_t, double);
+void rvv_amplify_i16(void *, const void *, size_t, uint16_t);
+void rvv_amplify_i32(void *, const void *, size_t, uint32_t);
+void rvv_amplify_u8(void *, const void *, size_t, uint8_t);
+
+static void AmplifyFloat(audio_volume_t *volume, block_t *block, float amp)
+{
+    void *buf = block->p_buffer;
+
+    if (amp != 1.f)
+        rvv_amplify_f32(buf, buf, block->i_buffer, amp);
+
+    (void) volume;
+}
+
+static void AmplifyDouble(audio_volume_t *volume, block_t *block, float amp)
+{
+    void *buf = block->p_buffer;
+
+    if (amp != 1.f)
+        rvv_amplify_f64(buf, buf, block->i_buffer, amp);
+
+    (void) volume;
+}
+
+static void AmplifyShort(audio_volume_t *volume, block_t *block, float amp)
+{
+    void *buf = block->p_buffer;
+    uint_fast16_t fixed_amp = lroundf(ldexpf(amp, 16));
+
+    if (amp != 1.f)
+        rvv_amplify_i16(buf, buf, block->i_buffer, fixed_amp);
+
+    (void) volume;
+}
+
+static void AmplifyInt(audio_volume_t *volume, block_t *block, float amp)
+{
+    void *buf = block->p_buffer;
+    uint_fast32_t fixed_amp = lroundf(ldexpf(amp, 32));
+
+    if (amp != 1.f)
+        rvv_amplify_i32(buf, buf, block->i_buffer, fixed_amp);
+
+    (void) volume;
+}
+
+static void AmplifyByte(audio_volume_t *volume, block_t *block, float amp)
+{
+    void *buf = block->p_buffer;
+    uint_fast8_t fixed_amp = lroundf(ldexpf(amp, 8));
+
+    if (amp != 1.f)
+        rvv_amplify_u8(buf, buf, block->i_buffer, fixed_amp);
+
+    (void) volume;
+}
+
+static int Probe(vlc_object_t *obj)
+{
+    audio_volume_t *volume = (audio_volume_t *)obj;
+
+    if (!vlc_CPU_RV_V())
+        return VLC_ENOTSUP;
+
+    switch (volume->format) {
+        case VLC_CODEC_FL32:
+            volume->amplify = AmplifyFloat;
+            break;
+
+        case VLC_CODEC_FL64:
+            volume->amplify = AmplifyDouble;
+            break;
+
+        case VLC_CODEC_S16N:
+            volume->amplify = AmplifyShort;
+            break;
+
+        case VLC_CODEC_S32N:
+            volume->amplify = AmplifyInt;
+            break;
+
+        case VLC_CODEC_U8:
+            volume->amplify = AmplifyByte;
+            break;
+
+        default:
+            return VLC_ENOTSUP;
+    }
+
+    return VLC_SUCCESS;
+}
+
+vlc_module_begin()
+    set_subcategory(SUBCAT_AUDIO_AFILTER)
+    set_description("RISC-V V optimisation for audio volume")
+    set_capability("audio volume", 20)
+    set_callback(Probe)
+vlc_module_end()


=====================================
modules/isa/riscv/rvv_amplify.S
=====================================
@@ -0,0 +1,103 @@
+/*****************************************************************************
+ * amplify.S: RISC-V V software amplification
+ ******************************************************************************
+ * Copyright (C) 2022 Rémi Denis-Courmont
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+	.option	arch, +v
+	.text
+	.align 2
+
+	.globl	rvv_amplify_f32
+	.type	rvv_amplify_f32, %function
+rvv_amplify_f32:
+	srli	a2, a2, 2
+#if defined (__riscv_float_abi_soft)
+	fmv.w.x	fa0, a3
+#endif
+1:	vsetvli	t0, a2, e32, m8, ta, ma
+	slli	t1, t0, 2
+	vle32.v	v16, (a1)
+	add	a1, a1, t1
+	vfmul.vf	v16, v16, fa0
+	sub	a2, a2, t0
+	vse32.v	v16, (a0)
+	add	a0, a0, t1
+	bnez	a2, 1b
+	ret
+
+	.globl	rvv_amplify_f64
+	.type	rvv_amplify_f64, %function
+rvv_amplify_f64:
+	srli	a2, a2, 3
+#if defined (__riscv_float_abi_soft) || defined (__riscv_float_abi_single)
+	fmv.d.x	fa0, a3
+#endif
+1:	vsetvli	t0, a2, e64, m8, ta, ma
+	slli	t1, t0, 3
+	vle64.v	v16, (a1)
+	add	a1, a1, t1
+	vfmul.vf	v16, v16, fa0
+	sub	a2, a2, t0
+	vse64.v	v16, (a0)
+	add	a0, a0, t1
+	bnez	a2, 1b
+	ret
+
+	.globl	rvv_amplify_i16
+	.type	rvv_amplify_i16, %function
+rvv_amplify_i16:
+	srli	a2, a2, 1
+1:	vsetvli	t0, a2, e16, m8, ta, ma
+	slli	t1, t0, 1
+	vle16.v	v16, (a1)
+	add	a1, a1, t1
+	vmulhsu.vx	v16, v16, a3
+	sub	a2, a2, t0
+	vse16.v	v16, (a0)
+	add	a0, a0, t1
+	bnez	a2, 1b
+	ret
+
+	.globl	rvv_amplify_i32
+	.type	rvv_amplify_i32, %function
+rvv_amplify_i32:
+	srli	a2, a2, 2
+1:	vsetvli	t0, a2, e32, m8, ta, ma
+	slli	t1, t0, 2
+	vle32.v	v16, (a1)
+	add	a1, a1, t1
+	vmulhsu.vx	v16, v16, a3
+	sub	a2, a2, t0
+	vse32.v	v16, (a0)
+	add	a0, a0, t1
+	bnez	a2, 1b
+	ret
+
+	.globl	rvv_amplify_u8
+	.type	rvv_amplify_u8, %function
+rvv_amplify_u8:
+1:	vsetvli	t0, a2, e8, m8, ta, ma
+	vle8.v	v16, (a1)
+	add	a1, a1, t0
+	vmulhu.vx	v16, v16, a3
+	sub	a2, a2, t0
+	vse8.v	v16, (a0)
+	add	a0, a0, t0
+	bnez	a2, 1b
+	ret
+



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/d08f57985a2ad97739429351cc10599edbcf8259

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/d08f57985a2ad97739429351cc10599edbcf8259
You're receiving this email because of your account on code.videolan.org.




More information about the vlc-commits mailing list