* [FFmpeg-devel] [PATCH 1/3] lavc/opusdsp: RISC-V V postfilter
2022-10-01 12:32 [FFmpeg-devel] [PATCH 0/3] RISC-V V Opus post-filter Rémi Denis-Courmont
@ 2022-10-01 12:32 ` remi
2022-10-04 21:46 ` Lynne
2022-10-01 12:32 ` [FFmpeg-devel] [PATCH 2/3] lavu/riscv: helper macro for VTYPE encoding remi
2022-10-01 12:32 ` [FFmpeg-devel] [PATCH 3/3] lavc/opusdsp: RISC-V V (256-bit vectors) postfilter remi
2 siblings, 1 reply; 5+ messages in thread
From: remi @ 2022-10-01 12:32 UTC (permalink / raw)
To: ffmpeg-devel
From: Rémi Denis-Courmont <remi@remlab.net>
This is optimised for a vector size of 128-bit. Or maybe it would be
more accurate to state that this is not properly optimised for larger
vector sizes, as they would work just fine with a smaller vector group
multiplier.
---
libavcodec/opusdsp.c | 2 ++
libavcodec/opusdsp.h | 1 +
libavcodec/riscv/Makefile | 2 ++
libavcodec/riscv/opusdsp_init.c | 38 ++++++++++++++++++++++++
libavcodec/riscv/opusdsp_rvv.S | 51 +++++++++++++++++++++++++++++++++
5 files changed, 94 insertions(+)
create mode 100644 libavcodec/riscv/opusdsp_init.c
create mode 100644 libavcodec/riscv/opusdsp_rvv.S
diff --git a/libavcodec/opusdsp.c b/libavcodec/opusdsp.c
index badcfcc884..0764d712e4 100644
--- a/libavcodec/opusdsp.c
+++ b/libavcodec/opusdsp.c
@@ -58,6 +58,8 @@ av_cold void ff_opus_dsp_init(OpusDSP *ctx)
#if ARCH_AARCH64
ff_opus_dsp_init_aarch64(ctx);
+#elif ARCH_RISCV
+ ff_opus_dsp_init_riscv(ctx);
#elif ARCH_X86
ff_opus_dsp_init_x86(ctx);
#endif
diff --git a/libavcodec/opusdsp.h b/libavcodec/opusdsp.h
index 3ea3d14bf0..c2a301e832 100644
--- a/libavcodec/opusdsp.h
+++ b/libavcodec/opusdsp.h
@@ -30,5 +30,6 @@ void ff_opus_dsp_init(OpusDSP *ctx);
void ff_opus_dsp_init_x86(OpusDSP *ctx);
void ff_opus_dsp_init_aarch64(OpusDSP *ctx);
+void ff_opus_dsp_init_riscv(OpusDSP *ctx);
#endif /* AVCODEC_OPUSDSP_H */
diff --git a/libavcodec/riscv/Makefile b/libavcodec/riscv/Makefile
index 0fb2c81c75..1edfa76ea5 100644
--- a/libavcodec/riscv/Makefile
+++ b/libavcodec/riscv/Makefile
@@ -7,6 +7,8 @@ OBJS-$(CONFIG_FMTCONVERT) += riscv/fmtconvert_init.o
RVV-OBJS-$(CONFIG_FMTCONVERT) += riscv/fmtconvert_rvv.o
OBJS-$(CONFIG_IDCTDSP) += riscv/idctdsp_init.o
RVV-OBJS-$(CONFIG_IDCTDSP) += riscv/idctdsp_rvv.o
+OBJS-$(CONFIG_OPUS_DECODER) += riscv/opusdsp_init.o
+RVV-OBJS-$(CONFIG_OPUS_DECODER) += riscv/opusdsp_rvv.o
OBJS-$(CONFIG_PIXBLOCKDSP) += riscv/pixblockdsp_init.o \
riscv/pixblockdsp_rvi.o
RVV-OBJS-$(CONFIG_PIXBLOCKDSP) += riscv/pixblockdsp_rvv.o
diff --git a/libavcodec/riscv/opusdsp_init.c b/libavcodec/riscv/opusdsp_init.c
new file mode 100644
index 0000000000..18d3892329
--- /dev/null
+++ b/libavcodec/riscv/opusdsp_init.c
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2022 Rémi Denis-Courmont.
+ *
+ * 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/riscv/cpu.h"
+#include "libavcodec/opusdsp.h"
+
+void ff_opus_postfilter_rvv(float *data, int period, float *gains, int len);
+
+av_cold void ff_opus_dsp_init_riscv(OpusDSP *d)
+{
+#if HAVE_RVV
+ int flags = av_get_cpu_flags();
+
+ if ((flags & AV_CPU_FLAG_RVV_I32) && ff_get_rv_vlenb() >= 16)
+ d->postfilter = ff_opus_postfilter_rvv;
+#endif
+}
diff --git a/libavcodec/riscv/opusdsp_rvv.S b/libavcodec/riscv/opusdsp_rvv.S
new file mode 100644
index 0000000000..f42a9c36c5
--- /dev/null
+++ b/libavcodec/riscv/opusdsp_rvv.S
@@ -0,0 +1,51 @@
+/*
+ * Copyright © 2022 Rémi Denis-Courmont.
+ *
+ * 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/riscv/asm.S"
+
+func ff_opus_postfilter_rvv, zve32f
+ addi a1, a1, 2
+ slli a1, a1, 2
+ sh2add a3, a3, a0
+ sub t0, a0, a1
+ vsetivli zero, 3, e32, m2, ta, ma
+ vle32.v v24, (a2)
+ lw t1, 4(a2)
+ vsetivli zero, 5, e32, m2, ta, ma
+ vslide1up.vx v8, v24, t1
+ lw t2, 8(a2)
+ vle32.v v16, (t0)
+ vslide1up.vx v24, v8, t2
+2:
+ lw t1, (a0)
+ vfmul.vv v8, v24, v16
+ addi a0, a0, 4
+ vmv.s.x v0, t1
+ lw t2, 20(t0)
+ vfredusum.vs v0, v8, v0
+ addi t0, t0, 4
+ vslide1down.vx v16, v16, t2
+ vmv.x.s t1, v0
+ sw t1, -4(a0)
+ bne a0, a3, 2b
+
+ ret
+endfunc
--
2.37.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/3] lavc/opusdsp: RISC-V V postfilter
2022-10-01 12:32 ` [FFmpeg-devel] [PATCH 1/3] lavc/opusdsp: RISC-V V postfilter remi
@ 2022-10-04 21:46 ` Lynne
0 siblings, 0 replies; 5+ messages in thread
From: Lynne @ 2022-10-04 21:46 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Oct 1, 2022, 14:32 by remi@remlab.net:
> From: Rémi Denis-Courmont <remi@remlab.net>
>
> This is optimised for a vector size of 128-bit. Or maybe it would be
> more accurate to state that this is not properly optimised for larger
> vector sizes, as they would work just fine with a smaller vector group
> multiplier.
> ---
> libavcodec/opusdsp.c | 2 ++
> libavcodec/opusdsp.h | 1 +
> libavcodec/riscv/Makefile | 2 ++
> libavcodec/riscv/opusdsp_init.c | 38 ++++++++++++++++++++++++
> libavcodec/riscv/opusdsp_rvv.S | 51 +++++++++++++++++++++++++++++++++
> 5 files changed, 94 insertions(+)
> create mode 100644 libavcodec/riscv/opusdsp_init.c
> create mode 100644 libavcodec/riscv/opusdsp_rvv.S
>
> diff --git a/libavcodec/opusdsp.c b/libavcodec/opusdsp.c
> index badcfcc884..0764d712e4 100644
> --- a/libavcodec/opusdsp.c
> +++ b/libavcodec/opusdsp.c
> @@ -58,6 +58,8 @@ av_cold void ff_opus_dsp_init(OpusDSP *ctx)
>
> #if ARCH_AARCH64
> ff_opus_dsp_init_aarch64(ctx);
> +#elif ARCH_RISCV
> + ff_opus_dsp_init_riscv(ctx);
> #elif ARCH_X86
> ff_opus_dsp_init_x86(ctx);
> #endif
> diff --git a/libavcodec/opusdsp.h b/libavcodec/opusdsp.h
> index 3ea3d14bf0..c2a301e832 100644
> --- a/libavcodec/opusdsp.h
> +++ b/libavcodec/opusdsp.h
> @@ -30,5 +30,6 @@ void ff_opus_dsp_init(OpusDSP *ctx);
>
> void ff_opus_dsp_init_x86(OpusDSP *ctx);
> void ff_opus_dsp_init_aarch64(OpusDSP *ctx);
> +void ff_opus_dsp_init_riscv(OpusDSP *ctx);
>
> #endif /* AVCODEC_OPUSDSP_H */
> diff --git a/libavcodec/riscv/Makefile b/libavcodec/riscv/Makefile
> index 0fb2c81c75..1edfa76ea5 100644
> --- a/libavcodec/riscv/Makefile
> +++ b/libavcodec/riscv/Makefile
> @@ -7,6 +7,8 @@ OBJS-$(CONFIG_FMTCONVERT) += riscv/fmtconvert_init.o
> RVV-OBJS-$(CONFIG_FMTCONVERT) += riscv/fmtconvert_rvv.o
> OBJS-$(CONFIG_IDCTDSP) += riscv/idctdsp_init.o
> RVV-OBJS-$(CONFIG_IDCTDSP) += riscv/idctdsp_rvv.o
> +OBJS-$(CONFIG_OPUS_DECODER) += riscv/opusdsp_init.o
> +RVV-OBJS-$(CONFIG_OPUS_DECODER) += riscv/opusdsp_rvv.o
> OBJS-$(CONFIG_PIXBLOCKDSP) += riscv/pixblockdsp_init.o \
> riscv/pixblockdsp_rvi.o
> RVV-OBJS-$(CONFIG_PIXBLOCKDSP) += riscv/pixblockdsp_rvv.o
> diff --git a/libavcodec/riscv/opusdsp_init.c b/libavcodec/riscv/opusdsp_init.c
> new file mode 100644
> index 0000000000..18d3892329
> --- /dev/null
> +++ b/libavcodec/riscv/opusdsp_init.c
> @@ -0,0 +1,38 @@
> +/*
> + * Copyright © 2022 Rémi Denis-Courmont.
> + *
> + * 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/riscv/cpu.h"
> +#include "libavcodec/opusdsp.h"
> +
> +void ff_opus_postfilter_rvv(float *data, int period, float *gains, int len);
> +
> +av_cold void ff_opus_dsp_init_riscv(OpusDSP *d)
> +{
> +#if HAVE_RVV
> + int flags = av_get_cpu_flags();
> +
> + if ((flags & AV_CPU_FLAG_RVV_I32) && ff_get_rv_vlenb() >= 16)
> + d->postfilter = ff_opus_postfilter_rvv;
> +#endif
>
Function doesn't use RVV_I32 but zve32f.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH 2/3] lavu/riscv: helper macro for VTYPE encoding
2022-10-01 12:32 [FFmpeg-devel] [PATCH 0/3] RISC-V V Opus post-filter Rémi Denis-Courmont
2022-10-01 12:32 ` [FFmpeg-devel] [PATCH 1/3] lavc/opusdsp: RISC-V V postfilter remi
@ 2022-10-01 12:32 ` remi
2022-10-01 12:32 ` [FFmpeg-devel] [PATCH 3/3] lavc/opusdsp: RISC-V V (256-bit vectors) postfilter remi
2 siblings, 0 replies; 5+ messages in thread
From: remi @ 2022-10-01 12:32 UTC (permalink / raw)
To: ffmpeg-devel
From: Rémi Denis-Courmont <remi@remlab.net>
On most cases, the vector type (VTYPE) for the RISC-V Vector extension
is supplied as an immediate value, with either of the VSETVLI or
VSETIVLI instructions. There is however a third instruction VSETVL
which takes the vector type from a general purpose register. That is so
the type can be selected at run-time.
This introduces a macro to load a (valid) vector type into a register.
The syntax follows that of VSETVLI and VSETIVLI, with element size,
group multiplier, then tail and mask policies.
---
libavutil/riscv/asm.S | 75 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 75 insertions(+)
diff --git a/libavutil/riscv/asm.S b/libavutil/riscv/asm.S
index de5e1ad0a6..f8c9f6749b 100644
--- a/libavutil/riscv/asm.S
+++ b/libavutil/riscv/asm.S
@@ -94,3 +94,78 @@
shnadd 3, \rd, \rs1, \rs2
.endm
#endif
+
+ /* Convenience macro to load a Vector type (vtype) as immediate */
+ .macro lvtypei rd, e, m=m1, tp=tu, mp=mu
+
+ .ifc \e,e8
+ .equ ei, 0
+ .else
+ .ifc \e,e16
+ .equ ei, 8
+ .else
+ .ifc \e,e32
+ .equ ei, 16
+ .else
+ .ifc \e,e64
+ .equ ei, 24
+ .else
+ .error "Unknown element type"
+ .endif
+ .endif
+ .endif
+ .endif
+
+ .ifc \m,m1
+ .equ mi, 0
+ .else
+ .ifc \m,m2
+ .equ mi, 1
+ .else
+ .ifc \m,m4
+ .equ mi, 2
+ .else
+ .ifc \m,m8
+ .equ mi, 3
+ .else
+ .ifc \m,mf8
+ .equ mi, 5
+ .else
+ .ifc \m,mf4
+ .equ mi, 6
+ .else
+ .ifc \m,mf2
+ .equ mi, 7
+ .else
+ .error "Unknown multiplier"
+ .equ mi, 3
+ .endif
+ .endif
+ .endif
+ .endif
+ .endif
+ .endif
+ .endif
+
+ .ifc \tp,tu
+ .equ tpi, 0
+ .else
+ .ifc \tp,ta
+ .equ tpi, 64
+ .else
+ .error "Unknown tail policy"
+ .endif
+ .endif
+
+ .ifc \mp,mu
+ .equ mpi, 0
+ .else
+ .ifc \mp,ma
+ .equ mpi, 128
+ .else
+ .error "Unknown mask policy"
+ .endif
+ .endif
+
+ li \rd, (ei | mi | tpi | mpi)
+ .endm
--
2.37.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH 3/3] lavc/opusdsp: RISC-V V (256-bit vectors) postfilter
2022-10-01 12:32 [FFmpeg-devel] [PATCH 0/3] RISC-V V Opus post-filter Rémi Denis-Courmont
2022-10-01 12:32 ` [FFmpeg-devel] [PATCH 1/3] lavc/opusdsp: RISC-V V postfilter remi
2022-10-01 12:32 ` [FFmpeg-devel] [PATCH 2/3] lavu/riscv: helper macro for VTYPE encoding remi
@ 2022-10-01 12:32 ` remi
2 siblings, 0 replies; 5+ messages in thread
From: remi @ 2022-10-01 12:32 UTC (permalink / raw)
To: ffmpeg-devel
From: Rémi Denis-Courmont <remi@remlab.net>
This adds a variant of the postfilter for use with 256-bit vectors (or
larger). Since the function requires 160-bit logical vectors, we can
cut the group multiplier down to just one.
The different vector type is passed via register. Unfortunately,
there is no VSETIVL instruction, so the constant vector size (5) also
needs to be passed via a register.
---
libavcodec/riscv/opusdsp_init.c | 17 ++++++++++++++---
libavcodec/riscv/opusdsp_rvv.S | 10 +++++++++-
2 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/libavcodec/riscv/opusdsp_init.c b/libavcodec/riscv/opusdsp_init.c
index 18d3892329..433b71e710 100644
--- a/libavcodec/riscv/opusdsp_init.c
+++ b/libavcodec/riscv/opusdsp_init.c
@@ -25,14 +25,25 @@
#include "libavutil/riscv/cpu.h"
#include "libavcodec/opusdsp.h"
-void ff_opus_postfilter_rvv(float *data, int period, float *gains, int len);
+void ff_opus_postfilter_rvv_32(float *data, int period, float *gains, int len);
+void ff_opus_postfilter_rvv_16(float *data, int period, float *gains, int len);
av_cold void ff_opus_dsp_init_riscv(OpusDSP *d)
{
#if HAVE_RVV
int flags = av_get_cpu_flags();
- if ((flags & AV_CPU_FLAG_RVV_I32) && ff_get_rv_vlenb() >= 16)
- d->postfilter = ff_opus_postfilter_rvv;
+ if (flags & AV_CPU_FLAG_RVV_I32)
+ switch (ff_get_rv_vlenb()) {
+ default:
+ d->postfilter = ff_opus_postfilter_rvv_32;
+ break;
+ case 16:
+ d->postfilter = ff_opus_postfilter_rvv_16;
+ break;
+ case 8:
+ case 4:
+ break;
+ }
#endif
}
diff --git a/libavcodec/riscv/opusdsp_rvv.S b/libavcodec/riscv/opusdsp_rvv.S
index f42a9c36c5..cfe332227e 100644
--- a/libavcodec/riscv/opusdsp_rvv.S
+++ b/libavcodec/riscv/opusdsp_rvv.S
@@ -21,7 +21,15 @@
#include "config.h"
#include "libavutil/riscv/asm.S"
-func ff_opus_postfilter_rvv, zve32f
+func ff_opus_postfilter_rvv_16, zve32f
+ lvtypei a5, e32, m2, ta, ma
+ j 1f
+endfunc
+
+func ff_opus_postfilter_rvv_32, zve32f
+ lvtypei a5, e32, m1, ta, ma
+1:
+ li a4, 5
addi a1, a1, 2
slli a1, a1, 2
sh2add a3, a3, a0
--
2.37.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread