History

avfilter/af_surround: switch to rdft from avutil/tx

Paul B Mahol committed 4 years ago

Commit b015c101 parent f05c5292 files · +36 −30Browse files

Showing the changes to libavfilter (1 of 2 files). Show all

Unified · Split

libavfilter/af_surround.c+36−28
@@ -22,7 +22,7 @@ · 21 unmodified lines
22#include "libavutil/audio_fifo.h"22#include "libavutil/audio_fifo.h"
23#include "libavutil/channel_layout.h"23#include "libavutil/channel_layout.h"
24#include "libavutil/opt.h"24#include "libavutil/opt.h"
25#include "libavcodec/avfft.h"25#include "libavutil/tx.h"
26#include "avfilter.h"26#include "avfilter.h"
27#include "audio.h"27#include "audio.h"
28#include "filters.h"28#include "filters.h"
@@ -97,14 +97,17 @@ typedef struct AudioSurroundContext { · 68 unmodified lines
97 int nb_in_channels;97 int nb_in_channels;
98 int nb_out_channels;98 int nb_out_channels;
99 99
100 AVFrame *input_in;
100 AVFrame *input;101 AVFrame *input;
101 AVFrame *output;102 AVFrame *output;
103 AVFrame *output_out;
102 AVFrame *overlap_buffer;104 AVFrame *overlap_buffer;
103 105
104 int buf_size;106 int buf_size;
105 int hop_size;107 int hop_size;
106 AVAudioFifo *fifo;108 AVAudioFifo *fifo;
107 RDFTContext **rdft, **irdft;109 AVTXContext **rdft, **irdft;
110 av_tx_fn tx_fn, itx_fn;
108 float *window_func_lut;111 float *window_func_lut;
109 112
110 int64_t pts;113 int64_t pts;
@@ -203,7 +206,9 @@ static int config_input(AVFilterLink *inlink) · 92 unmodified lines
203 s->nb_in_channels = inlink->channels;206 s->nb_in_channels = inlink->channels;
204 207
205 for (ch = 0; ch < inlink->channels; ch++) {208 for (ch = 0; ch < inlink->channels; ch++) {
206 s->rdft[ch] = av_rdft_init(ff_log2(s->buf_size), DFT_R2C);209 float scale = 1.f;
210
211 av_tx_init(&s->rdft[ch], &s->tx_fn, AV_TX_FLOAT_RDFT, 0, s->buf_size, &scale, 0);
207 if (!s->rdft[ch])212 if (!s->rdft[ch])
208 return AVERROR(ENOMEM);213 return AVERROR(ENOMEM);
209 }214 }
@@ -240,7 +245,11 @@ static int config_input(AVFilterLink *inlink) · 30 unmodified lines
240 if (ch >= 0)245 if (ch >= 0)
241 s->input_levels[ch] *= s->lfe_in;246 s->input_levels[ch] *= s->lfe_in;
242 247
243 s->input = ff_get_audio_buffer(inlink, s->buf_size * 2);248 s->input_in = ff_get_audio_buffer(inlink, s->buf_size + 2);
249 if (!s->input_in)
250 return AVERROR(ENOMEM);
251
252 s->input = ff_get_audio_buffer(inlink, s->buf_size + 2);
244 if (!s->input)253 if (!s->input)
245 return AVERROR(ENOMEM);254 return AVERROR(ENOMEM);
246 255
@@ -266,7 +275,9 @@ static int config_output(AVFilterLink *outlink) · 19 unmodified lines
266 s->nb_out_channels = outlink->channels;275 s->nb_out_channels = outlink->channels;
267 276
268 for (ch = 0; ch < outlink->channels; ch++) {277 for (ch = 0; ch < outlink->channels; ch++) {
269 s->irdft[ch] = av_rdft_init(ff_log2(s->buf_size), IDFT_C2R);278 float iscale = 1.f;
279
280 av_tx_init(&s->irdft[ch], &s->itx_fn, AV_TX_FLOAT_RDFT, 0, s->buf_size, &iscale, 0);
270 if (!s->irdft[ch])281 if (!s->irdft[ch])
271 return AVERROR(ENOMEM);282 return AVERROR(ENOMEM);
272 }283 }
@@ -303,9 +314,10 @@ static int config_output(AVFilterLink *outlink) · 30 unmodified lines
303 if (ch >= 0)314 if (ch >= 0)
304 s->output_levels[ch] *= s->lfe_out;315 s->output_levels[ch] *= s->lfe_out;
305 316
306 s->output = ff_get_audio_buffer(outlink, s->buf_size * 2);317 s->output_out = ff_get_audio_buffer(outlink, s->buf_size + 2);
318 s->output = ff_get_audio_buffer(outlink, s->buf_size + 2);
307 s->overlap_buffer = ff_get_audio_buffer(outlink, s->buf_size * 2);319 s->overlap_buffer = ff_get_audio_buffer(outlink, s->buf_size * 2);
308 if (!s->overlap_buffer || !s->output)320 if (!s->overlap_buffer || !s->output || !s->output_out)
309 return AVERROR(ENOMEM);321 return AVERROR(ENOMEM);
310 322
311 return 0;323 return 0;
@@ -1099,7 +1111,7 @@ static void filter_stereo(AVFilterContext *ctx) · 787 unmodified lines
1099 srcl = (float *)s->input->extended_data[0];1111 srcl = (float *)s->input->extended_data[0];
1100 srcr = (float *)s->input->extended_data[1];1112 srcr = (float *)s->input->extended_data[1];
1101 1113
1102 for (n = 0; n < s->buf_size; n++) {1114 for (n = 0; n < s->buf_size / 2 + 1; n++) {
1103 float l_re = srcl[2 * n], r_re = srcr[2 * n];1115 float l_re = srcl[2 * n], r_re = srcr[2 * n];
1104 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];1116 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
1105 float c_phase = atan2f(l_im + r_im, l_re + r_re);1117 float c_phase = atan2f(l_im + r_im, l_re + r_re);
@@ -1133,7 +1145,7 @@ static void filter_surround(AVFilterContext *ctx) · 27 unmodified lines
1133 srcr = (float *)s->input->extended_data[1];1145 srcr = (float *)s->input->extended_data[1];
1134 srcc = (float *)s->input->extended_data[2];1146 srcc = (float *)s->input->extended_data[2];
1135 1147
1136 for (n = 0; n < s->buf_size; n++) {1148 for (n = 0; n < s->buf_size / 2 + 1; n++) {
1137 float l_re = srcl[2 * n], r_re = srcr[2 * n];1149 float l_re = srcl[2 * n], r_re = srcr[2 * n];
1138 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];1150 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
1139 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];1151 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
@@ -1169,7 +1181,7 @@ static void filter_2_1(AVFilterContext *ctx) · 29 unmodified lines
1169 srcr = (float *)s->input->extended_data[1];1181 srcr = (float *)s->input->extended_data[1];
1170 srclfe = (float *)s->input->extended_data[2];1182 srclfe = (float *)s->input->extended_data[2];
1171 1183
1172 for (n = 0; n < s->buf_size; n++) {1184 for (n = 0; n < s->buf_size / 2 + 1; n++) {
1173 float l_re = srcl[2 * n], r_re = srcr[2 * n];1185 float l_re = srcl[2 * n], r_re = srcr[2 * n];
1174 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];1186 float l_im = srcl[2 * n + 1], r_im = srcr[2 * n + 1];
1175 float lfe_re = srclfe[2 * n], lfe_im = srclfe[2 * n + 1];1187 float lfe_re = srclfe[2 * n], lfe_im = srclfe[2 * n + 1];
@@ -1206,7 +1218,7 @@ static void filter_5_0_side(AVFilterContext *ctx) · 30 unmodified lines
1206 srcsl = (float *)s->input->extended_data[3];1218 srcsl = (float *)s->input->extended_data[3];
1207 srcsr = (float *)s->input->extended_data[4];1219 srcsr = (float *)s->input->extended_data[4];
1208 1220
1209 for (n = 0; n < s->buf_size; n++) {1221 for (n = 0; n < s->buf_size / 2 + 1; n++) {
1210 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];1222 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
1211 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];1223 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
1212 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];1224 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
@@ -1264,7 +1276,7 @@ static void filter_5_1_side(AVFilterContext *ctx) · 51 unmodified lines
1264 srcsl = (float *)s->input->extended_data[4];1276 srcsl = (float *)s->input->extended_data[4];
1265 srcsr = (float *)s->input->extended_data[5];1277 srcsr = (float *)s->input->extended_data[5];
1266 1278
1267 for (n = 0; n < s->buf_size; n++) {1279 for (n = 0; n < s->buf_size / 2 + 1; n++) {
1268 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];1280 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
1269 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];1281 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
1270 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];1282 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
@@ -1323,7 +1335,7 @@ static void filter_5_1_back(AVFilterContext *ctx) · 52 unmodified lines
1323 srcbl = (float *)s->input->extended_data[4];1335 srcbl = (float *)s->input->extended_data[4];
1324 srcbr = (float *)s->input->extended_data[5];1336 srcbr = (float *)s->input->extended_data[5];
1325 1337
1326 for (n = 0; n < s->buf_size; n++) {1338 for (n = 0; n < s->buf_size / 2 + 1; n++) {
1327 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];1339 float fl_re = srcl[2 * n], fr_re = srcr[2 * n];
1328 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];1340 float fl_im = srcl[2 * n + 1], fr_im = srcr[2 * n + 1];
1329 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];1341 float c_re = srcc[2 * n], c_im = srcc[2 * n + 1];
@@ -1532,14 +1544,12 @@ static int fft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs) · 202 unmodified lines
1532 float *dst;1544 float *dst;
1533 int n;1545 int n;
1534 1546
1535 memset(s->input->extended_data[ch] + s->buf_size * sizeof(float), 0, s->buf_size * sizeof(float));1547 dst = (float *)s->input_in->extended_data[ch];
1536
1537 dst = (float *)s->input->extended_data[ch];
1538 for (n = 0; n < s->buf_size; n++) {1548 for (n = 0; n < s->buf_size; n++) {
1539 dst[n] *= s->window_func_lut[n] * level_in;1549 dst[n] *= s->window_func_lut[n] * level_in;
1540 }1550 }
1541 1551
1542 av_rdft_calc(s->rdft[ch], (float *)s->input->extended_data[ch]);1552 s->tx_fn(s->rdft[ch], (float *)s->input->extended_data[ch], dst, sizeof(float));
1543 1553
1544 return 0;1554 return 0;
1545}1555}
@@ -1552,10 +1562,9 @@ static int ifft_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs) · 6 unmodified lines
1552 float *dst, *ptr;1562 float *dst, *ptr;
1553 int n;1563 int n;
1554 1564
1555 av_rdft_calc(s->irdft[ch], (float *)s->output->extended_data[ch]);1565 dst = (float *)s->output_out->extended_data[ch];
1556
1557 dst = (float *)s->output->extended_data[ch];
1558 ptr = (float *)s->overlap_buffer->extended_data[ch];1566 ptr = (float *)s->overlap_buffer->extended_data[ch];
1567 s->itx_fn(s->irdft[ch], dst, (float *)s->output->extended_data[ch], sizeof(float));
1559 1568
1560 memmove(s->overlap_buffer->extended_data[ch],1569 memmove(s->overlap_buffer->extended_data[ch],
1561 s->overlap_buffer->extended_data[ch] + s->hop_size * sizeof(float),1570 s->overlap_buffer->extended_data[ch] + s->hop_size * sizeof(float),
@@ -1582,7 +1591,7 @@ static int filter_frame(AVFilterLink *inlink) · 20 unmodified lines
1582 AVFrame *out;1591 AVFrame *out;
1583 int ret;1592 int ret;
1584 1593
1585 ret = av_audio_fifo_peek(s->fifo, (void **)s->input->extended_data, s->buf_size);1594 ret = av_audio_fifo_peek(s->fifo, (void **)s->input_in->extended_data, s->buf_size);
1586 if (ret < 0)1595 if (ret < 0)
1587 return ret;1596 return ret;
1588 1597
@@ -1664,18 +1673,17 @@ static int activate(AVFilterContext *ctx) · 75 unmodified lines
1664static av_cold void uninit(AVFilterContext *ctx)1673static av_cold void uninit(AVFilterContext *ctx)
1665{1674{
1666 AudioSurroundContext *s = ctx->priv;1675 AudioSurroundContext *s = ctx->priv;
1667 int ch;
1668 1676
1677 av_frame_free(&s->input_in);
1669 av_frame_free(&s->input);1678 av_frame_free(&s->input);
1670 av_frame_free(&s->output);1679 av_frame_free(&s->output);
1680 av_frame_free(&s->output_out);
1671 av_frame_free(&s->overlap_buffer);1681 av_frame_free(&s->overlap_buffer);
1672 1682
1673 for (ch = 0; ch < s->nb_in_channels; ch++) {1683 for (int ch = 0; ch < s->nb_in_channels; ch++)
1674 av_rdft_end(s->rdft[ch]);1684 av_tx_uninit(&s->rdft[ch]);
1675 }1685 for (int ch = 0; ch < s->nb_out_channels; ch++)
1676 for (ch = 0; ch < s->nb_out_channels; ch++) {1686 av_tx_uninit(&s->irdft[ch]);
1677 av_rdft_end(s->irdft[ch]);
1678 }
1679 av_freep(&s->input_levels);1687 av_freep(&s->input_levels);
1680 av_freep(&s->output_levels);1688 av_freep(&s->output_levels);
1681 av_freep(&s->rdft);1689 av_freep(&s->rdft);

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