History

avfilter/af_biquads: add tdi transform type

Paul B Mahol committed 4 years ago

Commit d1663171 parent 6c1b6852 files · +92 −0Browse files

Unified · Split

2 files
  1. doc/filters.texi +9 −0
  2. libavfilter/af_biquads.c +83 −0
doc/filters.texi+9−0
@@ -2050,6 +2050,7 @@ Set transform type of IIR filter. · 2049 unmodified lines
20502050 @table @option
20512051 @item di
20522052 @item dii
2053+@item tdi
20532054 @item tdii
20542055 @item latt
20552056 @item svf
@@ -3479,6 +3480,7 @@ Set transform type of IIR filter. · 1423 unmodified lines
34793480 @table @option
34803481 @item di
34813482 @item dii
3483+@item tdi
34823484 @item tdii
34833485 @item latt
34843486 @item svf
@@ -3567,6 +3569,7 @@ Set transform type of IIR filter. · 82 unmodified lines
35673569 @table @option
35683570 @item di
35693571 @item dii
3572+@item tdi
35703573 @item tdii
35713574 @item latt
35723575 @item svf
@@ -3665,6 +3668,7 @@ Set transform type of IIR filter. · 92 unmodified lines
36653668 @table @option
36663669 @item di
36673670 @item dii
3671+@item tdi
36683672 @item tdii
36693673 @item latt
36703674 @item svf
@@ -3748,6 +3752,7 @@ Set transform type of IIR filter. · 77 unmodified lines
37483752 @table @option
37493753 @item di
37503754 @item dii
3755+@item tdi
37513756 @item tdii
37523757 @item latt
37533758 @item svf
@@ -4541,6 +4546,7 @@ Set transform type of IIR filter. · 787 unmodified lines
45414546 @table @option
45424547 @item di
45434548 @item dii
4549+@item tdi
45444550 @item tdii
45454551 @item latt
45464552 @item svf
@@ -5043,6 +5049,7 @@ Set transform type of IIR filter. · 496 unmodified lines
50435049 @table @option
50445050 @item di
50455051 @item dii
5052+@item tdi
50465053 @item tdii
50475054 @item latt
50485055 @item svf
@@ -5394,6 +5401,7 @@ Set transform type of IIR filter. · 345 unmodified lines
53945401 @table @option
53955402 @item di
53965403 @item dii
5404+@item tdi
53975405 @item tdii
53985406 @item latt
53995407 @item svf
@@ -6631,6 +6639,7 @@ Set transform type of IIR filter. · 1231 unmodified lines
66316639 @table @option
66326640 @item di
66336641 @item dii
6642+@item tdi
66346643 @item tdii
66356644 @item latt
66366645 @item svf
libavfilter/af_biquads.c+83−0
@@ -99,6 +99,7 @@ enum WidthType { · 98 unmodified lines
9999 enum TransformType {
100100 DI,
101101 DII,
102+ TDI,
102103 TDII,
103104 LATT,
104105 SVF,
@@ -321,6 +322,62 @@ BIQUAD_DII_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1) · 216 unmodified lines
321322 BIQUAD_DII_FILTER(flt, float, -1., 1., 0)
322323 BIQUAD_DII_FILTER(dbl, double, -1., 1., 0)
323324
325+#define BIQUAD_TDI_FILTER(name, type, min, max, need_clipping) \
326+static void biquad_tdi_## name (BiquadsContext *s, \
327+ const void *input, void *output, int len, \
328+ double *z1, double *z2, \
329+ double *z3, double *z4, \
330+ double b0, double b1, double b2, \
331+ double a1, double a2, int *clippings, \
332+ int disabled) \
333+{ \
334+ const type *ibuf = input; \
335+ type *obuf = output; \
336+ double s1 = *z1; \
337+ double s2 = *z2; \
338+ double s3 = *z3; \
339+ double s4 = *z4; \
340+ double wet = s->mix; \
341+ double dry = 1. - wet; \
342+ double in, out; \
343+ \
344+ a1 = -a1; \
345+ a2 = -a2; \
346+ \
347+ for (int i = 0; i < len; i++) { \
348+ double t1, t2, t3, t4; \
349+ in = ibuf[i] + s1; \
350+ t1 = in * a1 + s2; \
351+ t2 = in * a2; \
352+ t3 = in * b1 + s4; \
353+ t4 = in * b2; \
354+ out = b0 * in + s3; \
355+ out = out * wet + in * dry; \
356+ s1 = t1; s2 = t2; s3 = t3; s4 = t4; \
357+ if (disabled) { \
358+ obuf[i] = in; \
359+ } else if (need_clipping && out < min) { \
360+ (*clippings)++; \
361+ obuf[i] = min; \
362+ } else if (need_clipping && out > max) { \
363+ (*clippings)++; \
364+ obuf[i] = max; \
365+ } else { \
366+ obuf[i] = out; \
367+ } \
368+ } \
369+ \
370+ *z1 = s1; \
371+ *z2 = s2; \
372+ *z3 = s3; \
373+ *z4 = s4; \
374+}
375+
376+BIQUAD_TDI_FILTER(s16, int16_t, INT16_MIN, INT16_MAX, 1)
377+BIQUAD_TDI_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1)
378+BIQUAD_TDI_FILTER(flt, float, -1., 1., 0)
379+BIQUAD_TDI_FILTER(dbl, double, -1., 1., 0)
380+
324381 #define BIQUAD_TDII_FILTER(name, type, min, max, need_clipping) \
325382 static void biquad_tdii_## name (BiquadsContext *s, \
326383 const void *input, void *output, int len, \
@@ -760,6 +817,23 @@ static int config_filter(AVFilterLink *outlink, int reset) · 433 unmodified lines
760817 default: av_assert0(0);
761818 }
762819 break;
820+ case TDI:
821+ switch (inlink->format) {
822+ case AV_SAMPLE_FMT_S16P:
823+ s->filter = biquad_tdi_s16;
824+ break;
825+ case AV_SAMPLE_FMT_S32P:
826+ s->filter = biquad_tdi_s32;
827+ break;
828+ case AV_SAMPLE_FMT_FLTP:
829+ s->filter = biquad_tdi_flt;
830+ break;
831+ case AV_SAMPLE_FMT_DBLP:
832+ s->filter = biquad_tdi_dbl;
833+ break;
834+ default: av_assert0(0);
835+ }
836+ break;
763837 case TDII:
764838 switch (inlink->format) {
765839 case AV_SAMPLE_FMT_S16P:
@@ -1006,6 +1080,7 @@ static const AVOption equalizer_options[] = { · 240 unmodified lines
10061080 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
10071081 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
10081082 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1083+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
10091084 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
10101085 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
10111086 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},
@@ -1048,6 +1123,7 @@ static const AVOption bass_lowshelf_options[] = { · 36 unmodified lines
10481123 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
10491124 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
10501125 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1126+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
10511127 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
10521128 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
10531129 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},
@@ -1097,6 +1173,7 @@ static const AVOption treble_highshelf_options[] = { · 43 unmodified lines
10971173 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
10981174 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
10991175 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1176+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
11001177 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
11011178 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
11021179 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},
@@ -1145,6 +1222,7 @@ static const AVOption bandpass_options[] = { · 42 unmodified lines
11451222 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
11461223 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
11471224 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1225+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
11481226 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
11491227 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
11501228 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},
@@ -1183,6 +1261,7 @@ static const AVOption bandreject_options[] = { · 32 unmodified lines
11831261 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
11841262 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
11851263 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1264+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
11861265 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
11871266 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
11881267 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},
@@ -1223,6 +1302,7 @@ static const AVOption lowpass_options[] = { · 34 unmodified lines
12231302 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
12241303 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
12251304 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1305+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
12261306 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
12271307 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
12281308 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},
@@ -1263,6 +1343,7 @@ static const AVOption highpass_options[] = { · 34 unmodified lines
12631343 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
12641344 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
12651345 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1346+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
12661347 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
12671348 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
12681349 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},
@@ -1303,6 +1384,7 @@ static const AVOption allpass_options[] = { · 34 unmodified lines
13031384 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
13041385 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
13051386 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1387+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
13061388 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
13071389 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
13081390 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},
@@ -1336,6 +1418,7 @@ static const AVOption biquad_options[] = { · 27 unmodified lines
13361418 {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"},
13371419 {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"},
13381420 {"dii", "direct form II", 0, AV_OPT_TYPE_CONST, {.i64=DII}, 0, 0, AF, "transform_type"},
1421+ {"tdi", "transposed direct form I", 0, AV_OPT_TYPE_CONST, {.i64=TDI}, 0, 0, AF, "transform_type"},
13391422 {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"},
13401423 {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"},
13411424 {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"},

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