diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 08817ee391..6acd43f213 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 119e1a385e..9d8f696bd5 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 0000000000..bee9c0098a --- /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 +#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 0000000000..37ea2aa799 --- /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 */