avfilter/af_aphaser: move wave table generation code into separate file
authorPaul B Mahol <onemda@gmail.com>
Thu, 26 Jun 2014 08:54:23 +0000 (08:54 +0000)
committerPaul B Mahol <onemda@gmail.com>
Thu, 3 Jul 2014 07:34:11 +0000 (07:34 +0000)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
libavfilter/Makefile
libavfilter/af_aphaser.c
libavfilter/generate_wave_table.c [new file with mode: 0644]
libavfilter/generate_wave_table.h [new file with mode: 0644]

index 08817ee..6acd43f 100644 (file)
@@ -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
index 119e1a3..9d8f696 100644 (file)
 #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 (file)
index 0000000..bee9c00
--- /dev/null
@@ -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 (file)
index 0000000..37ea2aa
--- /dev/null
@@ -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 */