| @@ -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 | |
| 56 | static const float bands[] = { | 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 | static int equ_init(SuperEqualizerContext *s, int wb) | 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 | 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 | |
| 187 | static int filter_frame(AVFilterLink *inlink, AVFrame *in) | 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 | 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 | |
| 309 | static const AVFilterPad superequalizer_inputs[] = { | 310 | static const AVFilterPad superequalizer_inputs[] = { |