History

avfilter/af_superequalizer: switch rdft to lavu/tx

Paul B Mahol committed 4 years ago

Commit 18ad9fb1 parent a6387902 files · +30 −31Browse files

Unified · Split

2 files
  1. configure +0 −2
  2. libavfilter/af_superequalizer.c +30 −29
configure+0−2
@@ -3714,8 +3714,6 @@ stereo3d_filter_deps="gpl" · 3713 unmodified lines
3714subtitles_filter_deps="avformat avcodec libass"3714subtitles_filter_deps="avformat avcodec libass"
3715super2xsai_filter_deps="gpl"3715super2xsai_filter_deps="gpl"
3716pixfmts_super2xsai_test_deps="super2xsai_filter"3716pixfmts_super2xsai_test_deps="super2xsai_filter"
3717superequalizer_filter_deps="avcodec"
3718superequalizer_filter_select="rdft"
3719tinterlace_filter_deps="gpl"3717tinterlace_filter_deps="gpl"
3720tinterlace_merge_test_deps="tinterlace_filter"3718tinterlace_merge_test_deps="tinterlace_filter"
3721tinterlace_pad_test_deps="tinterlace_filter"3719tinterlace_pad_test_deps="tinterlace_filter"
libavfilter/af_superequalizer.c+30−29
@@ -20,8 +20,7 @@ · 19 unmodified lines
20 */20 */
21 21
22#include "libavutil/opt.h"22#include "libavutil/opt.h"
23 23#include "libavutil/tx.h"
24#include "libavcodec/avfft.h"
25 24
26#include "audio.h"25#include "audio.h"
27#include "avfilter.h"26#include "avfilter.h"
@@ -46,11 +45,12 @@ typedef struct SuperEqualizerContext { · 18 unmodified lines
46 float aa;45 float aa;
47 float iza;46 float iza;
48 float *ires, *irest;47 float *ires, *irest;
49 float *fsamples;48 float *fsamples, *fsamples_out;
50 int winlen, tabsize;49 int winlen, tabsize;
51 50
52 AVFrame *in, *out;51 AVFrame *in, *out;
53 RDFTContext *rdft, *irdft;52 AVTXContext *rdft, *irdft;
53 av_tx_fn tx_fn, itx_fn;
54} SuperEqualizerContext;54} SuperEqualizerContext;
55 55
56static const float bands[] = {56static const float bands[] = {
@@ -134,21 +134,26 @@ static void process_param(float *bc, EqParameter *param, float fs) · 77 unmodified lines
134 134
135static int equ_init(SuperEqualizerContext *s, int wb)135static int equ_init(SuperEqualizerContext *s, int wb)
136{136{
137 int i,j;137 float scale = 1.f, iscale = 1.f;
138 int i, j, ret;
138 139
139 s->rdft = av_rdft_init(wb, DFT_R2C);140 ret = av_tx_init(&s->rdft, &s->tx_fn, AV_TX_FLOAT_RDFT, 0, 1 << wb, &scale, 0);
140 s->irdft = av_rdft_init(wb, IDFT_C2R);141 if (ret < 0)
141 if (!s->rdft || !s->irdft)142 return ret;
142 return AVERROR(ENOMEM);143
144 ret = av_tx_init(&s->irdft, &s->itx_fn, AV_TX_FLOAT_RDFT, 1, 1 << wb, &iscale, 0);
145 if (ret < 0)
146 return ret;
143 147
144 s->aa = 96;148 s->aa = 96;
145 s->winlen = (1 << (wb-1))-1;149 s->winlen = (1 << (wb-1))-1;
146 s->tabsize = 1 << wb;150 s->tabsize = 1 << wb;
147 151
148 s->ires = av_calloc(s->tabsize, sizeof(float));152 s->ires = av_calloc(s->tabsize + 2, sizeof(float));
149 s->irest = av_calloc(s->tabsize, sizeof(float));153 s->irest = av_calloc(s->tabsize, sizeof(float));
150 s->fsamples = av_calloc(s->tabsize, sizeof(float));154 s->fsamples = av_calloc(s->tabsize, sizeof(float));
151 if (!s->ires || !s->irest || !s->fsamples)155 s->fsamples_out = av_calloc(s->tabsize + 2, sizeof(float));
156 if (!s->ires || !s->irest || !s->fsamples || !s->fsamples_out)
152 return AVERROR(ENOMEM);157 return AVERROR(ENOMEM);
153 158
154 for (i = 0; i <= M; i++) {159 for (i = 0; i <= M; i++) {
@@ -166,7 +171,6 @@ static void make_fir(SuperEqualizerContext *s, float *lbc, float *rbc, EqParamet · 11 unmodified lines
166{171{
167 const int winlen = s->winlen;172 const int winlen = s->winlen;
168 const int tabsize = s->tabsize;173 const int tabsize = s->tabsize;
169 float *nires;
170 int i;174 int i;
171 175
172 if (fs <= 0)176 if (fs <= 0)
@@ -178,10 +182,7 @@ static void make_fir(SuperEqualizerContext *s, float *lbc, float *rbc, EqParamet · 5 unmodified lines
178 for (; i < tabsize; i++)182 for (; i < tabsize; i++)
179 s->irest[i] = 0;183 s->irest[i] = 0;
180 184
181 av_rdft_calc(s->rdft, s->irest);185 s->tx_fn(s->rdft, s->ires, s->irest, sizeof(float));
182 nires = s->ires;
183 for (i = 0; i < tabsize; i++)
184 nires[i] = s->irest[i];
185}186}
186 187
187static int filter_frame(AVFilterLink *inlink, AVFrame *in)188static int filter_frame(AVFilterLink *inlink, AVFrame *in)
@@ -190,6 +191,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 2 unmodified lines
190 SuperEqualizerContext *s = ctx->priv;191 SuperEqualizerContext *s = ctx->priv;
191 AVFilterLink *outlink = ctx->outputs[0];192 AVFilterLink *outlink = ctx->outputs[0];
192 const float *ires = s->ires;193 const float *ires = s->ires;
194 float *fsamples_out = s->fsamples_out;
193 float *fsamples = s->fsamples;195 float *fsamples = s->fsamples;
194 int ch, i;196 int ch, i;
195 197
@@ -211,26 +213,24 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 15 unmodified lines
211 for (; i < s->tabsize; i++)213 for (; i < s->tabsize; i++)
212 fsamples[i] = 0;214 fsamples[i] = 0;
213 215
214 av_rdft_calc(s->rdft, fsamples);216 s->tx_fn(s->rdft, fsamples_out, fsamples, sizeof(float));
215 217
216 fsamples[0] = ires[0] * fsamples[0];218 for (i = 0; i <= s->tabsize / 2; i++) {
217 fsamples[1] = ires[1] * fsamples[1];
218 for (i = 1; i < s->tabsize / 2; i++) {
219 float re, im;219 float re, im;
220 220
221 re = ires[i*2 ] * fsamples[i*2] - ires[i*2+1] * fsamples[i*2+1];221 re = ires[i*2 ] * fsamples_out[i*2] - ires[i*2+1] * fsamples_out[i*2+1];
222 im = ires[i*2+1] * fsamples[i*2] + ires[i*2 ] * fsamples[i*2+1];222 im = ires[i*2+1] * fsamples_out[i*2] + ires[i*2 ] * fsamples_out[i*2+1];
223 223
224 fsamples[i*2 ] = re;224 fsamples_out[i*2 ] = re;
225 fsamples[i*2+1] = im;225 fsamples_out[i*2+1] = im;
226 }226 }
227 227
228 av_rdft_calc(s->irdft, fsamples);228 s->itx_fn(s->irdft, fsamples, fsamples_out, sizeof(float));
229 229
230 for (i = 0; i < s->winlen; i++)230 for (i = 0; i < s->winlen; i++)
231 dst[i] += fsamples[i] / s->tabsize * 2;231 dst[i] += fsamples[i] / s->tabsize;
232 for (i = s->winlen; i < s->tabsize; i++)232 for (i = s->winlen; i < s->tabsize; i++)
233 dst[i] = fsamples[i] / s->tabsize * 2;233 dst[i] = fsamples[i] / s->tabsize;
234 for (i = 0; i < s->winlen; i++)234 for (i = 0; i < s->winlen; i++)
235 ptr[i] = dst[i];235 ptr[i] = dst[i];
236 for (i = 0; i < s->winlen; i++)236 for (i = 0; i < s->winlen; i++)
@@ -302,8 +302,9 @@ static av_cold void uninit(AVFilterContext *ctx) · 65 unmodified lines
302 av_freep(&s->irest);302 av_freep(&s->irest);
303 av_freep(&s->ires);303 av_freep(&s->ires);
304 av_freep(&s->fsamples);304 av_freep(&s->fsamples);
305 av_rdft_end(s->rdft);305 av_freep(&s->fsamples_out);
306 av_rdft_end(s->irdft);306 av_tx_uninit(&s->rdft);
307 av_tx_uninit(&s->irdft);
307}308}
308 309
309static const AVFilterPad superequalizer_inputs[] = {310static const AVFilterPad superequalizer_inputs[] = {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t