History

avfilter/af_afftdn: stop using fifo and rewritting pts

Paul B Mahol committed 4 years ago

Commit 644b6ed1 parent c1735bb1 file · +29 −49Browse files

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

Unified · Split

libavfilter/af_afftdn.c+29−49
@@ -20,7 +20,6 @@ · 19 unmodified lines
20 20
21#include <float.h>21#include <float.h>
22 22
23#include "libavutil/audio_fifo.h"
24#include "libavutil/avstring.h"23#include "libavutil/avstring.h"
25#include "libavutil/channel_layout.h"24#include "libavutil/channel_layout.h"
26#include "libavutil/opt.h"25#include "libavutil/opt.h"
@@ -101,7 +100,6 @@ typedef struct AudioFFTDeNoiseContext { · 74 unmodified lines
101 float last_noise_balance;100 float last_noise_balance;
102 int64_t block_count;101 int64_t block_count;
103 102
104 int64_t pts;
105 int channels;103 int channels;
106 int sample_noise;104 int sample_noise;
107 int sample_noise_start;105 int sample_noise_start;
@@ -124,6 +122,8 @@ typedef struct AudioFFTDeNoiseContext { · 16 unmodified lines
124 122
125 DeNoiseChannel *dnch;123 DeNoiseChannel *dnch;
126 124
125 AVFrame *winframe;
126
127 double max_gain;127 double max_gain;
128 double max_var;128 double max_var;
129 double gain_scale;129 double gain_scale;
@@ -138,8 +138,6 @@ typedef struct AudioFFTDeNoiseContext { · 8 unmodified lines
138 double vector_b[5];138 double vector_b[5];
139 double matrix_b[75];139 double matrix_b[75];
140 double matrix_c[75];140 double matrix_c[75];
141
142 AVAudioFifo *fifo;
143} AudioFFTDeNoiseContext;141} AudioFFTDeNoiseContext;
144 142
145#define OFFSET(x) offsetof(AudioFFTDeNoiseContext, x)143#define OFFSET(x) offsetof(AudioFFTDeNoiseContext, x)
@@ -620,7 +618,6 @@ static int config_input(AVFilterLink *inlink) · 474 unmodified lines
620 if (!s->dnch)618 if (!s->dnch)
621 return AVERROR(ENOMEM);619 return AVERROR(ENOMEM);
622 620
623 s->pts = AV_NOPTS_VALUE;
624 s->channels = inlink->channels;621 s->channels = inlink->channels;
625 s->sample_rate = inlink->sample_rate;622 s->sample_rate = inlink->sample_rate;
626 s->sample_advance = s->sample_rate / 80;623 s->sample_advance = s->sample_rate / 80;
@@ -831,6 +828,10 @@ static int config_input(AVFilterLink *inlink) · 204 unmodified lines
831 }828 }
832 }829 }
833 830
831 s->winframe = ff_get_audio_buffer(inlink, s->window_length);
832 if (!s->winframe)
833 return AVERROR(ENOMEM);
834
834 wscale = sqrt(16.0 / (9.0 * s->fft_length));835 wscale = sqrt(16.0 / (9.0 * s->fft_length));
835 sum = 0.0;836 sum = 0.0;
836 for (int i = 0; i < s->window_length; i++) {837 for (int i = 0; i < s->window_length; i++) {
@@ -857,10 +858,6 @@ static int config_input(AVFilterLink *inlink) · 20 unmodified lines
857 }858 }
858 s->noise_band_count = s->noise_band_edge[16];859 s->noise_band_count = s->noise_band_edge[16];
859 860
860 s->fifo = av_audio_fifo_alloc(inlink->format, inlink->channels, s->fft_length);
861 if (!s->fifo)
862 return AVERROR(ENOMEM);
863
864 return 0;861 return 0;
865}862}
866 863
@@ -1160,23 +1157,24 @@ static void get_auto_noise_levels(AudioFFTDeNoiseContext *s, · 293 unmodified lines
1160 }1157 }
1161}1158}
1162 1159
1163static int output_frame(AVFilterLink *inlink)1160static int output_frame(AVFilterLink *inlink, AVFrame *in)
1164{1161{
1165 AVFilterContext *ctx = inlink->dst;1162 AVFilterContext *ctx = inlink->dst;
1166 AVFilterLink *outlink = ctx->outputs[0];1163 AVFilterLink *outlink = ctx->outputs[0];
1167 AudioFFTDeNoiseContext *s = ctx->priv;1164 AudioFFTDeNoiseContext *s = ctx->priv;
1168 const int output_mode = ctx->is_disabled ? IN_MODE : s->output_mode;1165 const int output_mode = ctx->is_disabled ? IN_MODE : s->output_mode;
1169 AVFrame *out = NULL, *in = NULL;1166 const int offset = s->window_length - s->sample_advance;
1167 AVFrame *out = NULL;
1170 ThreadData td;1168 ThreadData td;
1171 int ret = 0;1169 int ret = 0;
1172 1170
1173 in = ff_get_audio_buffer(outlink, s->window_length);1171 for (int ch = 0; ch < s->channels; ch++) {
1174 if (!in)1172 float *src = (float *)s->winframe->extended_data[ch];
1175 return AVERROR(ENOMEM);
1176 1173
1177 ret = av_audio_fifo_peek(s->fifo, (void **)in->extended_data, s->window_length);1174 memmove(src, &src[s->sample_advance], offset * sizeof(float));
1178 if (ret < 0)1175 memcpy(&src[offset], in->extended_data[ch], in->nb_samples * sizeof(float));
1179 goto end;1176 memset(&src[offset + in->nb_samples], 0, (s->sample_advance - in->nb_samples) * sizeof(float));
1177 }
1180 1178
1181 if (s->track_noise) {1179 if (s->track_noise) {
1182 for (int ch = 0; ch < inlink->channels; ch++) {1180 for (int ch = 0; ch < inlink->channels; ch++) {
@@ -1205,7 +1203,7 @@ static int output_frame(AVFilterLink *inlink) · 22 unmodified lines
1205 for (int ch = 0; ch < inlink->channels; ch++) {1203 for (int ch = 0; ch < inlink->channels; ch++) {
1206 DeNoiseChannel *dnch = &s->dnch[ch];1204 DeNoiseChannel *dnch = &s->dnch[ch];
1207 1205
1208 sample_noise_block(s, dnch, in, ch);1206 sample_noise_block(s, dnch, s->winframe, ch);
1209 }1207 }
1210 }1208 }
1211 1209
@@ -1223,11 +1221,11 @@ static int output_frame(AVFilterLink *inlink) · 11 unmodified lines
1223 }1221 }
1224 1222
1225 s->block_count++;1223 s->block_count++;
1226 td.in = in;1224 td.in = s->winframe;
1227 ff_filter_execute(ctx, filter_channel, &td, NULL,1225 ff_filter_execute(ctx, filter_channel, &td, NULL,
1228 FFMIN(outlink->channels, ff_filter_get_nb_threads(ctx)));1226 FFMIN(outlink->channels, ff_filter_get_nb_threads(ctx)));
1229 1227
1230 out = ff_get_audio_buffer(outlink, s->sample_advance);1228 out = ff_get_audio_buffer(outlink, in->nb_samples);
1231 if (!out) {1229 if (!out) {
1232 ret = AVERROR(ENOMEM);1230 ret = AVERROR(ENOMEM);
1233 goto end;1231 goto end;
@@ -1236,20 +1234,20 @@ static int output_frame(AVFilterLink *inlink) · 2 unmodified lines
1236 for (int ch = 0; ch < inlink->channels; ch++) {1234 for (int ch = 0; ch < inlink->channels; ch++) {
1237 DeNoiseChannel *dnch = &s->dnch[ch];1235 DeNoiseChannel *dnch = &s->dnch[ch];
1238 double *src = dnch->out_samples;1236 double *src = dnch->out_samples;
1239 float *orig = (float *)in->extended_data[ch];1237 const float *orig = (const float *)s->winframe->extended_data[ch];
1240 float *dst = (float *)out->extended_data[ch];1238 float *dst = (float *)out->extended_data[ch];
1241 1239
1242 switch (output_mode) {1240 switch (output_mode) {
1243 case IN_MODE:1241 case IN_MODE:
1244 for (int m = 0; m < s->sample_advance; m++)1242 for (int m = 0; m < out->nb_samples; m++)
1245 dst[m] = orig[m];1243 dst[m] = orig[m];
1246 break;1244 break;
1247 case OUT_MODE:1245 case OUT_MODE:
1248 for (int m = 0; m < s->sample_advance; m++)1246 for (int m = 0; m < out->nb_samples; m++)
1249 dst[m] = src[m];1247 dst[m] = src[m];
1250 break;1248 break;
1251 case NOISE_MODE:1249 case NOISE_MODE:
1252 for (int m = 0; m < s->sample_advance; m++)1250 for (int m = 0; m < out->nb_samples; m++)
1253 dst[m] = orig[m] - src[m];1251 dst[m] = orig[m] - src[m];
1254 break;1252 break;
1255 default:1253 default:
@@ -1261,13 +1259,11 @@ static int output_frame(AVFilterLink *inlink) · 5 unmodified lines
1261 memset(src + (s->window_length - s->sample_advance), 0, s->sample_advance * sizeof(*src));1259 memset(src + (s->window_length - s->sample_advance), 0, s->sample_advance * sizeof(*src));
1262 }1260 }
1263 1261
1264 av_audio_fifo_drain(s->fifo, s->sample_advance);1262 out->pts = in->pts;
1265 1263
1266 out->pts = s->pts;
1267 ret = ff_filter_frame(outlink, out);1264 ret = ff_filter_frame(outlink, out);
1268 if (ret < 0)1265 if (ret < 0)
1269 goto end;1266 goto end;
1270 s->pts += av_rescale_q(s->sample_advance, (AVRational){1, outlink->sample_rate}, outlink->time_base);
1271end:1267end:
1272 av_frame_free(&in);1268 av_frame_free(&in);
1273 1269
@@ -1279,34 +1275,19 @@ static int activate(AVFilterContext *ctx) · 5 unmodified lines
1279 AVFilterLink *inlink = ctx->inputs[0];1275 AVFilterLink *inlink = ctx->inputs[0];
1280 AVFilterLink *outlink = ctx->outputs[0];1276 AVFilterLink *outlink = ctx->outputs[0];
1281 AudioFFTDeNoiseContext *s = ctx->priv;1277 AudioFFTDeNoiseContext *s = ctx->priv;
1282 AVFrame *frame = NULL;1278 AVFrame *in = NULL;
1283 int ret;1279 int ret;
1284 1280
1285 FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);1281 FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
1286 1282
1287 ret = ff_inlink_consume_frame(inlink, &frame);1283 ret = ff_inlink_consume_samples(inlink, s->sample_advance, s->sample_advance, &in);
1288 if (ret < 0)1284 if (ret < 0)
1289 return ret;1285 return ret;
1290 1286 if (ret > 0)
1291 if (ret > 0) {1287 return output_frame(inlink, in);
1292 if (s->pts == AV_NOPTS_VALUE)
1293 s->pts = frame->pts;
1294
1295 ret = av_audio_fifo_write(s->fifo, (void **)frame->extended_data, frame->nb_samples);
1296 av_frame_free(&frame);
1297 if (ret < 0)
1298 return ret;
1299 }
1300
1301 if (av_audio_fifo_size(s->fifo) >= s->window_length)
1302 return output_frame(inlink);
1303 1288
1304 FF_FILTER_FORWARD_STATUS(inlink, outlink);1289 FF_FILTER_FORWARD_STATUS(inlink, outlink);
1305 if (ff_outlink_frame_wanted(outlink) &&1290 FF_FILTER_FORWARD_WANTED(outlink, inlink);
1306 av_audio_fifo_size(s->fifo) < s->window_length) {
1307 ff_inlink_request_frame(inlink);
1308 return 0;
1309 }
1310 1291
1311 return FFERROR_NOT_READY;1292 return FFERROR_NOT_READY;
1312}1293}
@@ -1319,6 +1300,7 @@ static av_cold void uninit(AVFilterContext *ctx) · 6 unmodified lines
1319 av_freep(&s->bin2band);1300 av_freep(&s->bin2band);
1320 av_freep(&s->band_alpha);1301 av_freep(&s->band_alpha);
1321 av_freep(&s->band_beta);1302 av_freep(&s->band_beta);
1303 av_frame_free(&s->winframe);
1322 1304
1323 if (s->dnch) {1305 if (s->dnch) {
1324 for (int ch = 0; ch < s->channels; ch++) {1306 for (int ch = 0; ch < s->channels; ch++) {
@@ -1343,8 +1325,6 @@ static av_cold void uninit(AVFilterContext *ctx) · 18 unmodified lines
1343 }1325 }
1344 av_freep(&s->dnch);1326 av_freep(&s->dnch);
1345 }1327 }
1346
1347 av_audio_fifo_free(s->fifo);
1348}1328}
1349 1329
1350static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,1330static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,

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