]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/af_aphaser.c
Merge commit '1e9a93bfca2c2f43a07e01f2ef9fd5cbafe6c22d'
[ffmpeg] / libavfilter / af_aphaser.c
index 119e1a385e21fb171bb85209b3f515b12853de54..9d8f696bd5a3eb5d4f97d461a7bb0ec3679ff629 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;