From 86577c2d40d29422c4b769c854df99a88c7b3c77 Mon Sep 17 00:00:00 2001
From: sunyuechi <sunyuechi@iscas.ac.cn>
Date: Tue, 28 Nov 2023 20:14:14 +0800
Subject: [PATCH 2/2] lavc/aacencdsp: R-V V abs_pow34
c910:
abs_pow34_c: 24610.7
abs_pow34_rvv_f32: 6177.7
---
libavcodec/aacenc.c | 4 +++
libavcodec/aacenc.h | 1 +
libavcodec/riscv/Makefile | 1 +
libavcodec/riscv/aacencdsp_init.c | 42 +++++++++++++++++++++++++++++++
libavcodec/riscv/aacencdsp_rvv.S | 38 ++++++++++++++++++++++++++++
5 files changed, 86 insertions(+)
create mode 100644 libavcodec/riscv/aacencdsp_init.c
create mode 100644 libavcodec/riscv/aacencdsp_rvv.S
@@ -1440,6 +1440,10 @@ void ff_aac_dsp_init(AACEncContext *s){
s->abs_pow34 = abs_pow34_v;
s->quant_bands = quantize_bands;
+#if ARCH_RISCV
+ ff_aac_dsp_init_riscv(s);
+#endif
+
#if ARCH_X86
ff_aac_dsp_init_x86(s);
#endif
@@ -155,6 +155,7 @@ typedef struct AACEncContext {
} AACEncContext;
void ff_aac_dsp_init(AACEncContext *s);
+void ff_aac_dsp_init_riscv(AACEncContext *s);
void ff_aac_dsp_init_x86(AACEncContext *s);
void ff_aac_coder_init_mips(AACEncContext *c);
void ff_quantize_band_cost_cache_init(struct AACEncContext *s);
@@ -1,4 +1,5 @@
OBJS-$(CONFIG_AAC_DECODER) += riscv/aacpsdsp_init.o riscv/sbrdsp_init.o
+OBJS-$(CONFIG_AAC_ENCODER) += riscv/aacencdsp_init.o riscv/aacencdsp_rvv.o
RVV-OBJS-$(CONFIG_AAC_DECODER) += riscv/aacpsdsp_rvv.o riscv/sbrdsp_rvv.o
OBJS-$(CONFIG_AC3DSP) += riscv/ac3dsp_init.o \
riscv/ac3dsp_rvb.o
new file mode 100644
@@ -0,0 +1,42 @@
+/*
+ * AAC encoder assembly optimizations
+ * Copyright (c) 2023 Institue of Software Chinese Academy of Sciences (ISCAS).
+ *
+ * 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/float_dsp.h"
+#include "libavutil/cpu.h"
+#include "libavcodec/aacenc.h"
+
+void ff_abs_pow34_rvv(float *out, const float *in, const int size);
+
+av_cold void ff_aac_dsp_init_riscv(AACEncContext *s)
+{
+#if HAVE_RVV
+ int flags = av_get_cpu_flags();
+
+ if (flags & AV_CPU_FLAG_RVV_F32) {
+ if (flags & AV_CPU_FLAG_RVB_ADDR) {
+ s->abs_pow34 = ff_abs_pow34_rvv;
+ }
+ }
+#endif
+}
new file mode 100644
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2023 Institue of Software Chinese Academy of Sciences (ISCAS).
+ *
+ * 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/riscv/asm.S"
+
+func ff_abs_pow34_rvv, zve32f
+1:
+ vsetvli t0, a2, e32, m4, ta, ma
+ sub a2, a2, t0
+ vle32.v v0, (a1)
+ sh2add a1, t0, a1
+ vfabs.v v0, v0
+ vfsqrt.v v4, v0
+ vfmul.vv v4, v4, v0
+ vfsqrt.v v4, v4
+ vse32.v v4, (a0)
+ sh2add a0, t0, a0
+ bnez a2, 1b
+
+ ret
+endfunc
--
2.43.0