Showing the changes to libavfilter/af_biquads.c (1 of 2 files). Show all
Unified · Split
| @@ -99,6 +99,7 @@ enum WidthType { · 98 unmodified lines | ||
| 99 | 99 | enum TransformType { |
| 100 | 100 | DI, |
| 101 | 101 | DII, |
| 102 | + TDI, | |
| 102 | 103 | TDII, |
| 103 | 104 | LATT, |
| 104 | 105 | SVF, |
| @@ -321,6 +322,62 @@ BIQUAD_DII_FILTER(s32, int32_t, INT32_MIN, INT32_MAX, 1) · 216 unmodified lines | ||
| 321 | 322 | BIQUAD_DII_FILTER(flt, float, -1., 1., 0) |
| 322 | 323 | BIQUAD_DII_FILTER(dbl, double, -1., 1., 0) |
| 323 | 324 | |
| 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 | + | |
| 324 | 381 | #define BIQUAD_TDII_FILTER(name, type, min, max, need_clipping) \ |
| 325 | 382 | static void biquad_tdii_## name (BiquadsContext *s, \ |
| 326 | 383 | const void *input, void *output, int len, \ |
| @@ -760,6 +817,23 @@ static int config_filter(AVFilterLink *outlink, int reset) · 433 unmodified lines | ||
| 760 | 817 | default: av_assert0(0); |
| 761 | 818 | } |
| 762 | 819 | 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; | |
| 763 | 837 | case TDII: |
| 764 | 838 | switch (inlink->format) { |
| 765 | 839 | case AV_SAMPLE_FMT_S16P: |
| @@ -1006,6 +1080,7 @@ static const AVOption equalizer_options[] = { · 240 unmodified lines | ||
| 1006 | 1080 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1007 | 1081 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1008 | 1082 | {"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"}, | |
| 1009 | 1084 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1010 | 1085 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1011 | 1086 | {"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 | ||
| 1048 | 1123 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1049 | 1124 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1050 | 1125 | {"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"}, | |
| 1051 | 1127 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1052 | 1128 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1053 | 1129 | {"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 | ||
| 1097 | 1173 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1098 | 1174 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1099 | 1175 | {"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"}, | |
| 1100 | 1177 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1101 | 1178 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1102 | 1179 | {"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 | ||
| 1145 | 1222 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1146 | 1223 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1147 | 1224 | {"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"}, | |
| 1148 | 1226 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1149 | 1227 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1150 | 1228 | {"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 | ||
| 1183 | 1261 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1184 | 1262 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1185 | 1263 | {"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"}, | |
| 1186 | 1265 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1187 | 1266 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1188 | 1267 | {"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 | ||
| 1223 | 1302 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1224 | 1303 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1225 | 1304 | {"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"}, | |
| 1226 | 1306 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1227 | 1307 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1228 | 1308 | {"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 | ||
| 1263 | 1343 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1264 | 1344 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1265 | 1345 | {"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"}, | |
| 1266 | 1347 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1267 | 1348 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1268 | 1349 | {"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 | ||
| 1303 | 1384 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1304 | 1385 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1305 | 1386 | {"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"}, | |
| 1306 | 1388 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1307 | 1389 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1308 | 1390 | {"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 | ||
| 1336 | 1418 | {"a", "set transform type", OFFSET(transform_type), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_TTYPE-1, AF, "transform_type"}, |
| 1337 | 1419 | {"di", "direct form I", 0, AV_OPT_TYPE_CONST, {.i64=DI}, 0, 0, AF, "transform_type"}, |
| 1338 | 1420 | {"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"}, | |
| 1339 | 1422 | {"tdii", "transposed direct form II", 0, AV_OPT_TYPE_CONST, {.i64=TDII}, 0, 0, AF, "transform_type"}, |
| 1340 | 1423 | {"latt", "lattice-ladder form", 0, AV_OPT_TYPE_CONST, {.i64=LATT}, 0, 0, AF, "transform_type"}, |
| 1341 | 1424 | {"svf", "state variable filter form", 0, AV_OPT_TYPE_CONST, {.i64=SVF}, 0, 0, AF, "transform_type"}, |