46#define FRAME_SIZE_SHIFT 2
47#define FRAME_SIZE (120<<FRAME_SIZE_SHIFT)
48#define WINDOW_SIZE (2*FRAME_SIZE)
49#define FREQ_SIZE (FRAME_SIZE + 1)
51#define PITCH_MIN_PERIOD 60
52#define PITCH_MAX_PERIOD 768
53#define PITCH_FRAME_SIZE 960
54#define PITCH_BUF_SIZE (PITCH_MAX_PERIOD+PITCH_FRAME_SIZE)
56#define SQUARE(x) ((x)*(x))
61#define NB_DELTA_CEPS 6
63#define NB_FEATURES (NB_BANDS+3*NB_DELTA_CEPS+2)
65#define WEIGHTS_SCALE (1.f/256)
67#define MAX_NEURONS 128
69#define ACTIVATION_TANH 0
70#define ACTIVATION_SIGMOID 1
71#define ACTIVATION_RELU 2
153#define F_ACTIVATION_TANH 0
154#define F_ACTIVATION_SIGMOID 1
155#define F_ACTIVATION_RELU 2
159#define FREE_MAYBE(ptr) do { if (ptr) free(ptr); } while (0)
160#define FREE_DENSE(name) do { \
162 av_free((void *) model->name->input_weights); \
163 av_free((void *) model->name->bias); \
164 av_free((void *) model->name); \
167#define FREE_GRU(name) do { \
169 av_free((void *) model->name->input_weights); \
170 av_free((void *) model->name->recurrent_weights); \
171 av_free((void *) model->name->bias); \
172 av_free((void *) model->name); \
198 if (fscanf(
f,
"rnnoise-nu model file version %d\n", &in) != 1 || in != 1)
205#define ALLOC_LAYER(type, name) \
206 name = av_calloc(1, sizeof(type)); \
208 rnnoise_model_free(ret); \
209 return AVERROR(ENOMEM); \
220#define INPUT_VAL(name) do { \
221 if (fscanf(f, "%d", &in) != 1 || in < 0 || in > 128) { \
222 rnnoise_model_free(ret); \
223 return AVERROR(EINVAL); \
228#define INPUT_ACTIVATION(name) do { \
230 INPUT_VAL(activation); \
231 switch (activation) { \
232 case F_ACTIVATION_SIGMOID: \
233 name = ACTIVATION_SIGMOID; \
235 case F_ACTIVATION_RELU: \
236 name = ACTIVATION_RELU; \
239 name = ACTIVATION_TANH; \
243#define INPUT_ARRAY(name, len) do { \
244 float *values = av_calloc((len), sizeof(float)); \
246 rnnoise_model_free(ret); \
247 return AVERROR(ENOMEM); \
250 for (int i = 0; i < (len); i++) { \
251 if (fscanf(f, "%d", &in) != 1) { \
252 rnnoise_model_free(ret); \
253 return AVERROR(EINVAL); \
259#define INPUT_ARRAY3(name, len0, len1, len2) do { \
260 float *values = av_calloc(FFALIGN((len0), 4) * FFALIGN((len1), 4) * (len2), sizeof(float)); \
262 rnnoise_model_free(ret); \
263 return AVERROR(ENOMEM); \
266 for (int k = 0; k < (len0); k++) { \
267 for (int i = 0; i < (len2); i++) { \
268 for (int j = 0; j < (len1); j++) { \
269 if (fscanf(f, "%d", &in) != 1) { \
270 rnnoise_model_free(ret); \
271 return AVERROR(EINVAL); \
273 values[j * (len2) * FFALIGN((len0), 4) + i * FFALIGN((len0), 4) + k] = in; \
279#define NEW_LINE() do { \
281 while ((c = fgetc(f)) != EOF) { \
287#define INPUT_DENSE(name) do { \
288 INPUT_VAL(name->nb_inputs); \
289 INPUT_VAL(name->nb_neurons); \
290 ret->name ## _size = name->nb_neurons; \
291 INPUT_ACTIVATION(name->activation); \
293 INPUT_ARRAY(name->input_weights, name->nb_inputs * name->nb_neurons); \
295 INPUT_ARRAY(name->bias, name->nb_neurons); \
299#define INPUT_GRU(name) do { \
300 INPUT_VAL(name->nb_inputs); \
301 INPUT_VAL(name->nb_neurons); \
302 ret->name ## _size = name->nb_neurons; \
303 INPUT_ACTIVATION(name->activation); \
305 INPUT_ARRAY3(name->input_weights, name->nb_inputs, name->nb_neurons, 3); \
307 INPUT_ARRAY3(name->recurrent_weights, name->nb_neurons, name->nb_neurons, 3); \
309 INPUT_ARRAY(name->bias, name->nb_neurons * 3); \
360 for (
int i = 0;
i <
s->channels;
i++) {
373 for (
int i = 0;
i <
s->channels;
i++) {
391static void biquad(
float *y,
float mem[2],
const float *x,
392 const float *
b,
const float *
a,
int N)
394 for (
int i = 0;
i <
N;
i++) {
399 mem[0] = mem[1] + (
b[0]*
xi -
a[0]*yi);
400 mem[1] = (
b[1]*
xi -
a[1]*yi);
405#define RNN_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
406#define RNN_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst))))
407#define RNN_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
444 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100
455 for (
int j = 0; j < band_size; j++) {
456 float tmp, frac = (
float)j / band_size;
460 sum[
i] += (1.f - frac) *
tmp;
461 sum[
i + 1] += frac *
tmp;
480 for (
int j = 0; j < band_size; j++) {
481 float tmp, frac = (
float)j / band_size;
485 sum[
i] += (1 - frac) *
tmp;
486 sum[
i + 1] += frac *
tmp;
513 const float mix =
s->mix;
514 const float imix = 1.f -
FFMAX(
mix, 0.f);
528 float y_0, y_1, y_2, y_3 = 0;
535 for (j = 0; j <
len - 3; j += 4) {
596 const float *y,
int N)
600 for (
int i = 0;
i <
N;
i++)
607 float *xcorr,
int len,
int max_pitch)
611 for (
i = 0;
i < max_pitch - 3;
i += 4) {
612 float sum[4] = { 0, 0, 0, 0};
617 xcorr[
i + 1] = sum[1];
618 xcorr[
i + 2] = sum[2];
619 xcorr[
i + 3] = sum[3];
622 for (;
i < max_pitch;
i++) {
642 for (
int i = 0;
i < n;
i++)
644 for (
int i = 0;
i < overlap;
i++) {
654 for (
int k = 0; k <= lag; k++) {
657 for (
int i = k + fastN;
i < n;
i++)
658 d += xptr[
i] * xptr[
i-k];
673 for (
int i = 0;
i < p;
i++) {
676 for (
int j = 0; j <
i; j++)
677 rr += (lpc[j] * ac[
i - j]);
682 for (
int j = 0; j < (
i + 1) >> 1; j++) {
686 lpc[j] = tmp1 + (
r*tmp2);
687 lpc[
i-1-j] = tmp2 + (
r*tmp1);
692 if (
error < .001f * ac[0])
704 float num0, num1, num2, num3, num4;
705 float mem0, mem1, mem2, mem3, mem4;
718 for (
int i = 0;
i <
N;
i++) {
746 float lpc[4], mem[5]={0,0,0,0,0};
751 x_lp[
i] = .5f * (.5f * (x[0][(2*
i-1)]+x[0][(2*
i+1)])+x[0][2*
i]);
752 x_lp[0] = .5f * (.5f * (x[0][1])+x[0][0]);
755 x_lp[
i] += (.5f * (.5f * (x[1][(2*
i-1)]+x[1][(2*
i+1)])+x[1][2*
i]));
756 x_lp[0] += .5f * (.5f * (x[1][1])+x[1][0]);
764 for (
int i = 1;
i <= 4;
i++) {
766 ac[
i] -= ac[
i]*(.008f*
i)*(.008f*
i);
770 for (
int i = 0;
i < 4;
i++) {
772 lpc[
i] = (lpc[
i] *
tmp);
775 lpc2[0] = lpc[0] + .8f;
776 lpc2[1] = lpc[1] + (
c1 * lpc[0]);
777 lpc2[2] = lpc[2] + (
c1 * lpc[1]);
778 lpc2[3] = lpc[3] + (
c1 * lpc[2]);
779 lpc2[4] = (
c1 * lpc[3]);
784 int N,
float *xy1,
float *xy2)
786 float xy01 = 0, xy02 = 0;
788 for (
int i = 0;
i <
N;
i++) {
789 xy01 += (x[
i] * y01[
i]);
790 xy02 += (x[
i] * y02[
i]);
799 return xy /
sqrtf(1.f + xx * yy);
802static const uint8_t
second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2};
804 int *T0_,
int prev_period,
float prev_gain)
811 float best_xy, best_yy;
816 minperiod0 = minperiod;
830 for (
i = 1;
i <= maxperiod;
i++) {
831 yy = yy+(x[-
i] * x[-
i])-(x[
N-
i] * x[
N-
i]);
832 yy_lookup[
i] =
FFMAX(0, yy);
839 for (k = 2; k <= 15; k++) {
859 xy = .5f * (xy + xy2);
860 yy = .5f * (yy_lookup[T1] + yy_lookup[T1b]);
862 if (
FFABS(T1-prev_period)<=1)
864 else if (
FFABS(T1-prev_period)<=2 && 5 * k * k < T0)
865 cont = prev_gain * .5f;
868 thresh =
FFMAX(.3f, (.7f * g0) - cont);
872 thresh =
FFMAX(.4f, (.85f * g0) - cont);
873 else if (T1<2*minperiod)
874 thresh =
FFMAX(.5f, (.9f * g0) - cont);
883 best_xy =
FFMAX(0, best_xy);
884 if (best_yy <= best_xy)
887 pg = best_xy/(best_yy + 1);
889 for (k = 0; k < 3; k++)
891 if ((xcorr[2]-xcorr[0]) > .7f * (xcorr[1]-xcorr[0]))
893 else if ((xcorr[0]-xcorr[2]) > (.7f * (xcorr[1] - xcorr[2])))
907 int max_pitch,
int *best_pitch)
920 for (
int j = 0; j <
len; j++)
923 for (
int i = 0;
i < max_pitch;
i++) {
932 num = xcorr16 * xcorr16;
933 if ((num * best_den[1]) > (best_num[1] * Syy)) {
934 if ((num * best_den[0]) > (best_num[0] * Syy)) {
935 best_num[1] = best_num[0];
936 best_den[1] = best_den[0];
937 best_pitch[1] = best_pitch[0];
954 int len,
int max_pitch,
int *pitch)
957 int best_pitch[2]={0,0};
967 for (
int j = 0; j < len >> 2; j++)
968 x_lp4[j] = x_lp[2*j];
969 for (
int j = 0; j < lag >> 2; j++)
982 if (
FFABS(
i-2*best_pitch[0])>2 &&
FFABS(
i-2*best_pitch[1])>2)
985 xcorr[
i] =
FFMAX(-1, sum);
991 if (best_pitch[0] > 0 && best_pitch[0] < (max_pitch >> 1) - 1) {
994 a = xcorr[best_pitch[0] - 1];
995 b = xcorr[best_pitch[0]];
996 c = xcorr[best_pitch[0] + 1];
997 if (
c -
a > .7f * (
b -
a))
999 else if (
a -
c > .7f * (
b-
c))
1007 *pitch = 2 * best_pitch[0] -
offset;
1021 float *Ex,
float *Ep,
float *Exp,
float *features,
const float *in)
1024 float *ceps_0, *ceps_1, *ceps_2;
1025 float spec_variability = 0;
1033 float follow, logMax;
1058 Exp[
i] = Exp[
i] /
sqrtf(.001f+Ex[
i]*Ep[
i]);
1075 logMax =
FFMAX(logMax, Ly[
i]);
1076 follow =
FFMAX(follow-1.5, Ly[
i]);
1087 dct(
s, features, Ly);
1095 ceps_0[
i] = features[
i];
1099 features[
i] = ceps_0[
i] + ceps_1[
i] + ceps_2[
i];
1108 float mindist = 1e15f;
1109 for (
int j = 0; j <
CEPS_MEM; j++) {
1111 for (
int k = 0; k <
NB_BANDS; k++) {
1119 mindist =
FFMIN(mindist, dist);
1122 spec_variability += mindist;
1137 for (
int j = 0; j < band_size; j++) {
1138 float frac = (
float)j / band_size;
1146 const float *Exp,
const float *
g)
1155 if (Exp[
i]>
g[
i])
r[
i] = 1;
1162 X[
i].re += rf[
i]*
P[
i].re;
1163 X[
i].im += rf[
i]*
P[
i].im;
1167 norm[
i] =
sqrtf(Ex[
i] / (1e-8+newE[
i]));
1171 X[
i].re *= normf[
i];
1172 X[
i].im *= normf[
i];
1177 0.000000f, 0.039979f, 0.079830f, 0.119427f, 0.158649f,
1178 0.197375f, 0.235496f, 0.272905f, 0.309507f, 0.345214f,
1179 0.379949f, 0.413644f, 0.446244f, 0.477700f, 0.507977f,
1180 0.537050f, 0.564900f, 0.591519f, 0.616909f, 0.641077f,
1181 0.664037f, 0.685809f, 0.706419f, 0.725897f, 0.744277f,
1182 0.761594f, 0.777888f, 0.793199f, 0.807569f, 0.821040f,
1183 0.833655f, 0.845456f, 0.856485f, 0.866784f, 0.876393f,
1184 0.885352f, 0.893698f, 0.901468f, 0.908698f, 0.915420f,
1185 0.921669f, 0.927473f, 0.932862f, 0.937863f, 0.942503f,
1186 0.946806f, 0.950795f, 0.954492f, 0.957917f, 0.961090f,
1187 0.964028f, 0.966747f, 0.969265f, 0.971594f, 0.973749f,
1188 0.975743f, 0.977587f, 0.979293f, 0.980869f, 0.982327f,
1189 0.983675f, 0.984921f, 0.986072f, 0.987136f, 0.988119f,
1190 0.989027f, 0.989867f, 0.990642f, 0.991359f, 0.992020f,
1191 0.992631f, 0.993196f, 0.993718f, 0.994199f, 0.994644f,
1192 0.995055f, 0.995434f, 0.995784f, 0.996108f, 0.996407f,
1193 0.996682f, 0.996937f, 0.997172f, 0.997389f, 0.997590f,
1194 0.997775f, 0.997946f, 0.998104f, 0.998249f, 0.998384f,
1195 0.998508f, 0.998623f, 0.998728f, 0.998826f, 0.998916f,
1196 0.999000f, 0.999076f, 0.999147f, 0.999213f, 0.999273f,
1197 0.999329f, 0.999381f, 0.999428f, 0.999472f, 0.999513f,
1198 0.999550f, 0.999585f, 0.999617f, 0.999646f, 0.999673f,
1199 0.999699f, 0.999722f, 0.999743f, 0.999763f, 0.999781f,
1200 0.999798f, 0.999813f, 0.999828f, 0.999841f, 0.999853f,
1201 0.999865f, 0.999875f, 0.999885f, 0.999893f, 0.999902f,
1202 0.999909f, 0.999916f, 0.999923f, 0.999929f, 0.999934f,
1203 0.999939f, 0.999944f, 0.999948f, 0.999952f, 0.999956f,
1204 0.999959f, 0.999962f, 0.999965f, 0.999968f, 0.999970f,
1205 0.999973f, 0.999975f, 0.999977f, 0.999978f, 0.999980f,
1206 0.999982f, 0.999983f, 0.999984f, 0.999986f, 0.999987f,
1207 0.999988f, 0.999989f, 0.999990f, 0.999990f, 0.999991f,
1208 0.999992f, 0.999992f, 0.999993f, 0.999994f, 0.999994f,
1209 0.999994f, 0.999995f, 0.999995f, 0.999996f, 0.999996f,
1210 0.999996f, 0.999997f, 0.999997f, 0.999997f, 0.999997f,
1211 0.999997f, 0.999998f, 0.999998f, 0.999998f, 0.999998f,
1212 0.999998f, 0.999998f, 0.999999f, 0.999999f, 0.999999f,
1213 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f,
1214 0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f,
1215 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
1216 1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
1240 i = (int)
floor(.5f+25*x);
1244 y = y + x*dy*(1 - y*x);
1257 for (
int i = 0;
i <
N;
i++) {
1259 float sum = layer->
bias[
i];
1261 for (
int j = 0; j <
M; j++)
1268 for (
int i = 0;
i <
N;
i++)
1271 for (
int i = 0;
i <
N;
i++)
1274 for (
int i = 0;
i <
N;
i++)
1275 output[
i] =
FFMAX(0, output[
i]);
1290 const int stride = 3 * AN, istride = 3 * AM;
1292 for (
int i = 0;
i <
N;
i++) {
1294 float sum = gru->
bias[
i];
1296 sum +=
s->fdsp->scalarproduct_float(gru->
input_weights +
i * istride, input, AM);
1301 for (
int i = 0;
i <
N;
i++) {
1303 float sum = gru->
bias[
N +
i];
1305 sum +=
s->fdsp->scalarproduct_float(gru->
input_weights + AM +
i * istride, input, AM);
1310 for (
int i = 0;
i <
N;
i++) {
1312 float sum = gru->
bias[2 *
N +
i];
1314 sum +=
s->fdsp->scalarproduct_float(gru->
input_weights + 2 * AM +
i * istride, input, AM);
1315 for (
int j = 0; j <
N; j++)
1332#define INPUT_SIZE 42
1375 static const float a_hp[2] = {-1.99599, 0.99600};
1376 static const float b_hp[2] = {-2, 1};
1382 if (!silence && !disabled) {
1401 memcpy(history, in,
FRAME_SIZE *
sizeof(*history));
1416 const int start =
ff_slice_pos(
out->ch_layout.nb_channels, jobnr, nb_jobs);
1417 const int end =
ff_slice_pos(
out->ch_layout.nb_channels, jobnr + 1, nb_jobs);
1419 for (
int ch = start; ch < end; ch++) {
1421 (
float *)
out->extended_data[ch],
1489 if (!*model || ret < 0)
1514 for (
int j = 0; j <
NB_BANDS; j++) {
1517 s->dct_table[j][
i] *=
sqrtf(.5);
1531 for (
int ch = 0; ch <
s->channels &&
s->st; ch++) {
1532 av_freep(&
s->st[ch].rnn[n].vad_gru_state);
1533 av_freep(&
s->st[ch].rnn[n].noise_gru_state);
1534 av_freep(&
s->st[ch].rnn[n].denoise_gru_state);
1539 char *res,
int res_len,
int flags)
1553 for (
int ch = 0; ch <
s->channels; ch++)
1558 for (
int ch = 0; ch <
s->channels; ch++)
1574 for (
int ch = 0; ch <
s->channels &&
s->st; ch++) {
1589#define OFFSET(x) offsetof(AudioRNNContext, x)
1590#define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
1603 .p.description =
NULL_IF_CONFIG_SMALL(
"Reduce noise from speech using Recurrent Neural Networks."),
1604 .p.priv_class = &arnndn_class,
static enum AVSampleFormat sample_fmts[]
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
static const AVFilterPad inputs[]
static int config_input(AVFilterLink *inlink)
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
static float compute_pitch_gain(float xy, float xx, float yy)
static int compute_frame_features(AudioRNNContext *s, DenoiseState *st, AVComplexFloat *X, AVComplexFloat *P, float *Ex, float *Ep, float *Exp, float *features, const float *in)
static const uint8_t second_check[16]
static void dual_inner_prod(const float *x, const float *y01, const float *y02, int N, float *xy1, float *xy2)
static float remove_doubling(float *x, int maxperiod, int minperiod, int N, int *T0_, int prev_period, float prev_gain)
static void inverse_transform(DenoiseState *st, float *out, const AVComplexFloat *in)
static int celt_autocorr(const float *x, float *ac, const float *window, int overlap, int lag, int n)
static void forward_transform(DenoiseState *st, AVComplexFloat *out, const float *in)
static void pitch_downsample(float *x[], float *x_lp, int len, int C)
static int rnnoise_model_from_file(FILE *f, RNNModel **rnn)
#define ACTIVATION_SIGMOID
static int open_model(AVFilterContext *ctx, RNNModel **model)
#define ALLOC_LAYER(type, name)
static float celt_inner_prod(const float *x, const float *y, int N)
static void free_model(AVFilterContext *ctx, int n)
static void pitch_filter(AVComplexFloat *X, const AVComplexFloat *P, const float *Ex, const float *Ep, const float *Exp, const float *g)
static int config_input(AVFilterLink *inlink)
#define RNN_CLEAR(dst, n)
static void frame_synthesis(AudioRNNContext *s, DenoiseState *st, float *out, const AVComplexFloat *y)
static float sigmoid_approx(float x)
static void compute_gru(AudioRNNContext *s, const GRULayer *gru, float *state, const float *input)
#define INPUT_DENSE(name)
static void interp_band_gain(float *g, const float *bandE)
#define RNN_COPY(dst, src, n)
static void compute_band_corr(float *bandE, const AVComplexFloat *X, const AVComplexFloat *P)
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static void celt_lpc(float *lpc, const float *ac, int p)
static void dct(AudioRNNContext *s, float *out, const float *in)
static const AVOption arnndn_options[]
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
static int rnnoise_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
static int activate(AVFilterContext *ctx)
static void compute_band_energy(float *bandE, const AVComplexFloat *X)
static void frame_analysis(AudioRNNContext *s, DenoiseState *st, AVComplexFloat *X, float *Ex, const float *in)
#define RNN_MOVE(dst, src, n)
static av_cold void uninit(AVFilterContext *ctx)
static float rnnoise_channel(AudioRNNContext *s, DenoiseState *st, float *out, const float *in, int disabled)
const FFFilter ff_af_arnndn
static void rnnoise_model_free(RNNModel *model)
static void celt_fir5(const float *x, const float *num, float *y, int N, float *mem)
static void compute_dense(const DenseLayer *layer, float *output, const float *input)
static void compute_rnn(AudioRNNContext *s, RNNState *rnn, float *gains, float *vad, const float *input)
static void celt_pitch_xcorr(const float *x, const float *y, float *xcorr, int len, int max_pitch)
static float tansig_approx(float x)
static void xcorr_kernel(const float *x, const float *y, float sum[4], int len)
static void find_best_pitch(float *xcorr, float *y, int len, int max_pitch, int *best_pitch)
static void pitch_search(const float *x_lp, float *y, int len, int max_pitch, int *pitch)
static const uint8_t eband5ms[]
static const float tansig_table[201]
const AVFilterPad ff_audio_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_AUDIO.
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Generic processing of user supplied commands that are set in the same way as the filter options.
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, AVFrame **rframe)
Take samples from the link's FIFO and update the link's stats.
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
#define xi(width, name, var, range_min, range_max, subs,...)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static __device__ float sqrtf(float a)
static __device__ float floor(float a)
static const int sample_rates[]
int(* init)(AVBSFContext *ctx)
static struct @346255127015250356166251341105367306144006377143 state
static SDL_Window * window
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will have its filter_frame() c...
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVSampleFormat
Audio sample formats.
@ AV_SAMPLE_FMT_FLTP
float, planar
static const int16_t alpha[]
static void scale(int *out, const int *in, const int w, const int h, const int shift)
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
static int mix(int c0, int c1)
static int shift(int a, int b)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
#define FF_FILTER_FORWARD_WANTED(outlink, inlink)
Forward the frame_wanted_out flag from an output link to an input link.
#define FF_FILTER_FORWARD_STATUS(inlink, outlink)
Acknowledge the status on an input link and forward it to an output link.
#define FFERROR_NOT_READY
Filters implementation helper functions and internal structures.
#define FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink)
Forward the status on an output link to an input link.
#define AVFILTER_DEFINE_CLASS(fname)
#define FILTER_QUERY_FUNC2(func)
FILE * avpriv_fopen_utf8(const char *path, const char *mode)
Open a file using a UTF-8 filename.
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define FFSWAP(type, a, b)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
#define LOCAL_ALIGNED_32(t, v,...)
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
A link between two filters.
AVChannelLayout ch_layout
channel layout of current buffer (see libavutil/channel_layout.h)
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
uint8_t ** extended_data
pointers to the data planes/channels.
float window[WINDOW_SIZE]
float dct_table[FFALIGN(NB_BANDS, 4)][FFALIGN(NB_BANDS, 4)]
float pitch_enh_buf[PITCH_BUF_SIZE]
float analysis_mem[FRAME_SIZE]
float cepstral_mem[CEPS_MEM][NB_BANDS]
float synthesis_mem[FRAME_SIZE]
float pitch_buf[PITCH_BUF_SIZE]
float history[FRAME_SIZE]
const float * input_weights
const float * recurrent_weights
const float * input_weights
const DenseLayer * denoise_output
const DenseLayer * input_dense
const DenseLayer * vad_output
const GRULayer * noise_gru
const GRULayer * denoise_gru
float * denoise_gru_state
Used for passing data between threads.
static void error(const char *err)
static AVFormatContext * ctx
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
@ AV_TX_FLOAT_FFT
Standard complex to complex FFT with sample data type of AVComplexFloat, AVComplexDouble or AVComplex...
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.