| @@ -20,8 +20,7 @@ · 19 unmodified lines |
| 20 | 20 | */ |
| 21 | 21 | |
| 22 | 22 | #include "libavutil/opt.h" |
| 23 | | − |
| 24 | | −#include "libavcodec/avfft.h" |
| 23 | +#include "libavutil/tx.h" |
| 25 | 24 | |
| 26 | 25 | #include "audio.h" |
| 27 | 26 | #include "avfilter.h" |
| @@ -46,11 +45,12 @@ typedef struct SuperEqualizerContext { · 18 unmodified lines |
| 46 | 45 | float aa; |
| 47 | 46 | float iza; |
| 48 | 47 | float *ires, *irest; |
| 49 | | − float *fsamples; |
| 48 | + float *fsamples, *fsamples_out; |
| 50 | 49 | int winlen, tabsize; |
| 51 | 50 | |
| 52 | 51 | AVFrame *in, *out; |
| 53 | | − RDFTContext *rdft, *irdft; |
| 52 | + AVTXContext *rdft, *irdft; |
| 53 | + av_tx_fn tx_fn, itx_fn; |
| 54 | 54 | } SuperEqualizerContext; |
| 55 | 55 | |
| 56 | 56 | static const float bands[] = { |
| @@ -134,21 +134,26 @@ static void process_param(float *bc, EqParameter *param, float fs) · 77 unmodified lines |
| 134 | 134 | |
| 135 | 135 | static 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 | | − s->irdft = av_rdft_init(wb, IDFT_C2R); |
| 141 | | − if (!s->rdft || !s->irdft) |
| 142 | | − return AVERROR(ENOMEM); |
| 140 | + ret = av_tx_init(&s->rdft, &s->tx_fn, AV_TX_FLOAT_RDFT, 0, 1 << wb, &scale, 0); |
| 141 | + if (ret < 0) |
| 142 | + return ret; |
| 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 | 148 | s->aa = 96; |
| 145 | 149 | s->winlen = (1 << (wb-1))-1; |
| 146 | 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 | 153 | s->irest = av_calloc(s->tabsize, sizeof(float)); |
| 150 | 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 | 157 | return AVERROR(ENOMEM); |
| 153 | 158 | |
| 154 | 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 | 172 | const int winlen = s->winlen; |
| 168 | 173 | const int tabsize = s->tabsize; |
| 169 | | − float *nires; |
| 170 | 174 | int i; |
| 171 | 175 | |
| 172 | 176 | if (fs <= 0) |
| @@ -178,10 +182,7 @@ static void make_fir(SuperEqualizerContext *s, float *lbc, float *rbc, EqParamet · 5 unmodified lines |
| 178 | 182 | for (; i < tabsize; i++) |
| 179 | 183 | s->irest[i] = 0; |
| 180 | 184 | |
| 181 | | − av_rdft_calc(s->rdft, s->irest); |
| 182 | | − nires = s->ires; |
| 183 | | − for (i = 0; i < tabsize; i++) |
| 184 | | − nires[i] = s->irest[i]; |
| 185 | + s->tx_fn(s->rdft, s->ires, s->irest, sizeof(float)); |
| 185 | 186 | } |
| 186 | 187 | |
| 187 | 188 | static int filter_frame(AVFilterLink *inlink, AVFrame *in) |
| @@ -190,6 +191,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 2 unmodified lines |
| 190 | 191 | SuperEqualizerContext *s = ctx->priv; |
| 191 | 192 | AVFilterLink *outlink = ctx->outputs[0]; |
| 192 | 193 | const float *ires = s->ires; |
| 194 | + float *fsamples_out = s->fsamples_out; |
| 193 | 195 | float *fsamples = s->fsamples; |
| 194 | 196 | int ch, i; |
| 195 | 197 | |
| @@ -211,26 +213,24 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 15 unmodified lines |
| 211 | 213 | for (; i < s->tabsize; i++) |
| 212 | 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]; |
| 217 | | − fsamples[1] = ires[1] * fsamples[1]; |
| 218 | | − for (i = 1; i < s->tabsize / 2; i++) { |
| 218 | + for (i = 0; i <= s->tabsize / 2; i++) { |
| 219 | 219 | float re, im; |
| 220 | 220 | |
| 221 | | − re = ires[i*2 ] * fsamples[i*2] - ires[i*2+1] * fsamples[i*2+1]; |
| 222 | | − im = ires[i*2+1] * fsamples[i*2] + ires[i*2 ] * 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_out[i*2] + ires[i*2 ] * fsamples_out[i*2+1]; |
| 223 | 223 | |
| 224 | | − fsamples[i*2 ] = re; |
| 225 | | − fsamples[i*2+1] = im; |
| 224 | + fsamples_out[i*2 ] = re; |
| 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 | 230 | for (i = 0; i < s->winlen; i++) |
| 231 | | − dst[i] += fsamples[i] / s->tabsize * 2; |
| 231 | + dst[i] += fsamples[i] / s->tabsize; |
| 232 | 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 | 234 | for (i = 0; i < s->winlen; i++) |
| 235 | 235 | ptr[i] = dst[i]; |
| 236 | 236 | for (i = 0; i < s->winlen; i++) |
| @@ -302,8 +302,9 @@ static av_cold void uninit(AVFilterContext *ctx) · 65 unmodified lines |
| 302 | 302 | av_freep(&s->irest); |
| 303 | 303 | av_freep(&s->ires); |
| 304 | 304 | av_freep(&s->fsamples); |
| 305 | | − av_rdft_end(s->rdft); |
| 306 | | − av_rdft_end(s->irdft); |
| 305 | + av_freep(&s->fsamples_out); |
| 306 | + av_tx_uninit(&s->rdft); |
| 307 | + av_tx_uninit(&s->irdft); |
| 307 | 308 | } |
| 308 | 309 | |
| 309 | 310 | static const AVFilterPad superequalizer_inputs[] = { |