[FFmpeg-devel] [PATCH 1/2] avfilter/af_aphaser: move wave table generation code into separate file
Paul B Mahol
onemda at gmail.com
Tue Jul 1 10:40:59 CEST 2014
Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
libavfilter/Makefile | 2 +-
libavfilter/af_aphaser.c | 72 ++-------------------------------
libavfilter/generate_wave_table.c | 84 +++++++++++++++++++++++++++++++++++++++
libavfilter/generate_wave_table.h | 33 +++++++++++++++
4 files changed, 122 insertions(+), 69 deletions(-)
create mode 100644 libavfilter/generate_wave_table.c
create mode 100644 libavfilter/generate_wave_table.h
diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index 08817ee..6acd43f 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
@@ -42,7 +42,7 @@ OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o
OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o
OBJS-$(CONFIG_APAD_FILTER) += af_apad.o
OBJS-$(CONFIG_APERMS_FILTER) += f_perms.o
-OBJS-$(CONFIG_APHASER_FILTER) += af_aphaser.o
+OBJS-$(CONFIG_APHASER_FILTER) += af_aphaser.o generate_wave_table.o
OBJS-$(CONFIG_ARESAMPLE_FILTER) += af_aresample.o
OBJS-$(CONFIG_ASELECT_FILTER) += f_select.o
OBJS-$(CONFIG_ASENDCMD_FILTER) += f_sendcmd.o
diff --git a/libavfilter/af_aphaser.c b/libavfilter/af_aphaser.c
index 119e1a3..9d8f696 100644
--- a/libavfilter/af_aphaser.c
+++ b/libavfilter/af_aphaser.c
@@ -28,12 +28,7 @@
#include "audio.h"
#include "avfilter.h"
#include "internal.h"
-
-enum WaveType {
- WAVE_SIN,
- WAVE_TRI,
- WAVE_NB,
-};
+#include "generate_wave_table.h"
typedef struct AudioPhaserContext {
const AVClass *class;
@@ -118,65 +113,6 @@ static int query_formats(AVFilterContext *ctx)
return 0;
}
-static void generate_wave_table(enum WaveType wave_type, enum AVSampleFormat sample_fmt,
- void *table, int table_size,
- double min, double max, double phase)
-{
- uint32_t i, phase_offset = phase / M_PI / 2 * table_size + 0.5;
-
- for (i = 0; i < table_size; i++) {
- uint32_t point = (i + phase_offset) % table_size;
- double d;
-
- switch (wave_type) {
- case WAVE_SIN:
- d = (sin((double)point / table_size * 2 * M_PI) + 1) / 2;
- break;
- case WAVE_TRI:
- d = (double)point * 2 / table_size;
- switch (4 * point / table_size) {
- case 0: d = d + 0.5; break;
- case 1:
- case 2: d = 1.5 - d; break;
- case 3: d = d - 1.5; break;
- }
- break;
- default:
- av_assert0(0);
- }
-
- d = d * (max - min) + min;
- switch (sample_fmt) {
- case AV_SAMPLE_FMT_FLT: {
- float *fp = (float *)table;
- *fp++ = (float)d;
- table = fp;
- continue; }
- case AV_SAMPLE_FMT_DBL: {
- double *dp = (double *)table;
- *dp++ = d;
- table = dp;
- continue; }
- }
-
- d += d < 0 ? -0.5 : 0.5;
- switch (sample_fmt) {
- case AV_SAMPLE_FMT_S16: {
- int16_t *sp = table;
- *sp++ = (int16_t)d;
- table = sp;
- continue; }
- case AV_SAMPLE_FMT_S32: {
- int32_t *ip = table;
- *ip++ = (int32_t)d;
- table = ip;
- continue; }
- default:
- av_assert0(0);
- }
- }
-}
-
#define MOD(a, b) (((a) >= (b)) ? (a) - (b) : (a))
#define PHASER_PLANAR(name, type) \
@@ -274,9 +210,9 @@ static int config_output(AVFilterLink *outlink)
if (!p->modulation_buffer || !p->delay_buffer)
return AVERROR(ENOMEM);
- generate_wave_table(p->type, AV_SAMPLE_FMT_S32,
- p->modulation_buffer, p->modulation_buffer_length,
- 1., p->delay_buffer_length, M_PI / 2.0);
+ ff_generate_wave_table(p->type, AV_SAMPLE_FMT_S32,
+ p->modulation_buffer, p->modulation_buffer_length,
+ 1., p->delay_buffer_length, M_PI / 2.0);
p->delay_pos = p->modulation_pos = 0;
diff --git a/libavfilter/generate_wave_table.c b/libavfilter/generate_wave_table.c
new file mode 100644
index 0000000..bee9c00
--- /dev/null
+++ b/libavfilter/generate_wave_table.c
@@ -0,0 +1,84 @@
+/*
+ * 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 <stdint.h>
+#include "libavutil/avassert.h"
+#include "avfilter.h"
+#include "generate_wave_table.h"
+
+void ff_generate_wave_table(enum WaveType wave_type,
+ enum AVSampleFormat sample_fmt,
+ void *table, int table_size,
+ double min, double max, double phase)
+{
+ uint32_t i, phase_offset = phase / M_PI / 2 * table_size + 0.5;
+
+ for (i = 0; i < table_size; i++) {
+ uint32_t point = (i + phase_offset) % table_size;
+ double d;
+
+ switch (wave_type) {
+ case WAVE_SIN:
+ d = (sin((double)point / table_size * 2 * M_PI) + 1) / 2;
+ break;
+ case WAVE_TRI:
+ d = (double)point * 2 / table_size;
+ switch (4 * point / table_size) {
+ case 0: d = d + 0.5; break;
+ case 1:
+ case 2: d = 1.5 - d; break;
+ case 3: d = d - 1.5; break;
+ }
+ break;
+ default:
+ av_assert0(0);
+ }
+
+ d = d * (max - min) + min;
+ switch (sample_fmt) {
+ case AV_SAMPLE_FMT_FLT: {
+ float *fp = (float *)table;
+ *fp++ = (float)d;
+ table = fp;
+ continue; }
+ case AV_SAMPLE_FMT_DBL: {
+ double *dp = (double *)table;
+ *dp++ = d;
+ table = dp;
+ continue; }
+ }
+
+ d += d < 0 ? -0.5 : 0.5;
+ switch (sample_fmt) {
+ case AV_SAMPLE_FMT_S16: {
+ int16_t *sp = table;
+ *sp++ = (int16_t)d;
+ table = sp;
+ continue; }
+ case AV_SAMPLE_FMT_S32: {
+ int32_t *ip = table;
+ *ip++ = (int32_t)d;
+ table = ip;
+ continue; }
+ default:
+ av_assert0(0);
+ }
+ }
+}
+
+
diff --git a/libavfilter/generate_wave_table.h b/libavfilter/generate_wave_table.h
new file mode 100644
index 0000000..37ea2aa
--- /dev/null
+++ b/libavfilter/generate_wave_table.h
@@ -0,0 +1,33 @@
+/*
+ * 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
+ */
+
+#ifndef AVFILTER_GENERATE_WAVE_TABLE_H
+#define AVFILTER_GENERATE_WAVE_TABLE_H
+
+enum WaveType {
+ WAVE_SIN,
+ WAVE_TRI,
+ WAVE_NB,
+};
+
+void ff_generate_wave_table(enum WaveType wave_type,
+ enum AVSampleFormat sample_fmt,
+ void *table, int table_size,
+ double min, double max, double phase);
+
+#endif /* AVFILTER_GENERATE_WAVE_TABLE_H */
--
1.7.11.2
More information about the ffmpeg-devel
mailing list