22#define BITSTREAM_WRITER_LE
36#define UPDATE_WEIGHT(weight, delta, source, result) \
37 if ((source) && (result)) { \
38 int32_t s = (int32_t) ((source) ^ (result)) >> 31; \
39 weight = ((delta) ^ s) + ((weight) - s); \
42#define APPLY_WEIGHT_F(weight, sample) ((((((sample) & 0xffff) * (weight)) >> 9) + \
43 ((((sample) & ~0xffff) >> 9) * (weight)) + 1) >> 1)
45#define APPLY_WEIGHT_I(weight, sample) (((weight) * (sample) + 512) >> 10)
47#define APPLY_WEIGHT(weight, sample) ((sample) != (short) (sample) ? \
48 APPLY_WEIGHT_F(weight, sample) : APPLY_WEIGHT_I (weight, sample))
50#define CLEAR(destin) memset(&destin, 0, sizeof(destin));
53#define SHIFT_MASK (0x1FU << SHIFT_LSB)
56#define MAG_MASK (0x1FU << MAG_LSB)
59#define SRATE_MASK (0xFU << SRATE_LSB)
61#define EXTRA_TRY_DELTAS 1
62#define EXTRA_ADJUST_DELTAS 2
63#define EXTRA_SORT_FIRST 4
64#define EXTRA_BRANCHES 8
65#define EXTRA_SORT_LAST 16
161 s->decorr_filter = 3;
180 s->decorr_filter = 2;
183 s->decorr_filter = 1;
186 s->decorr_filter = 0;
194 s->delta_decay = 2.0;
202 for (
i = 0;
i < nb_samples;
i++)
207 int nb_samples,
int shift)
210 for (
i = 0;
i < nb_samples;
i++) {
216#define FLOAT_SHIFT_ONES 1
217#define FLOAT_SHIFT_SAME 2
218#define FLOAT_SHIFT_SENT 4
219#define FLOAT_ZEROS_SENT 8
220#define FLOAT_NEG_ZEROS 0x10
221#define FLOAT_EXCEPTIONS 0x20
223#define get_mantissa(f) ((f) & 0x7fffff)
224#define get_exponent(f) (((f) >> 23) & 0xff)
225#define get_sign(f) (((f) >> 31) & 0x1)
239 shift_count =
s->max_exp ?
s->max_exp - 1 : 0;
243 if (shift_count < 25)
244 value >>= shift_count;
253 }
else if (shift_count) {
272 uint32_t crc = 0xffffffffu;
275 s->shifted_ones =
s->shifted_zeros =
s->shifted_both =
s->ordata = 0;
276 s->float_shift =
s->float_flags = 0;
277 s->false_zeros =
s->neg_zeros = 0;
281 for (
i = 0;
i < nb_samples;
i++) {
289 for (
i = 0;
i < nb_samples;
i++) {
308 for (
i = 0;
i < nb_samples;
i++)
311 for (
i = 0;
i < nb_samples;
i++) {
317 s->float_max_exp =
s->max_exp;
321 else if (
s->shifted_ones && !
s->shifted_zeros)
323 else if (
s->shifted_ones &&
s->shifted_zeros)
325 else if (
s->ordata && !(
s->ordata & 1)) {
329 }
while (!(
s->ordata & 1));
334 shift_stereo(samples_l, samples_r, nb_samples,
s->float_shift);
344 if (
s->false_zeros ||
s->neg_zeros)
358 uint32_t magdata = 0, ordata = 0, xordata = 0, anddata = ~0;
359 int i, total_shift = 0;
361 s->int32_sent_bits =
s->int32_zeros =
s->int32_ones =
s->int32_dups = 0;
364 for (
i = 0;
i < nb_samples;
i++) {
367 magdata |= (
M < 0) ? ~
M :
M;
368 xordata |=
M ^ -(
M & 1);
372 if ((ordata & 1) && !(anddata & 1) && (xordata & 2))
376 for (
i = 0;
i < nb_samples;
i++) {
380 magdata |= (
L < 0) ? ~
L :
L;
381 magdata |= (
R < 0) ? ~
R :
R;
382 xordata |=
L ^ -(
L & 1);
383 xordata |=
R ^ -(
R & 1);
387 if ((ordata & 1) && !(anddata & 1) && (xordata & 2))
408 }
while (!(ordata & 1));
409 }
else if (anddata & 1) {
415 }
while (anddata & 1);
416 }
else if (!(xordata & 2)) {
422 }
while (!(xordata & 2));
429 shift_mono(samples_l, nb_samples, total_shift);
431 shift_stereo(samples_l, samples_r, nb_samples, total_shift);
439 uint32_t magdata = 0, ordata = 0, xordata = 0, anddata = ~0;
440 uint32_t crc = 0xffffffffu;
441 int i, total_shift = 0;
443 s->int32_sent_bits =
s->int32_zeros =
s->int32_ones =
s->int32_dups = 0;
446 for (
i = 0;
i < nb_samples;
i++) {
449 crc = crc * 9 + (
M & 0xffff) * 3 + ((
M >> 16) & 0xffff);
450 magdata |= (
M < 0) ? ~
M :
M;
451 xordata |=
M ^ -(
M & 1);
456 for (
i = 0;
i < nb_samples;
i++) {
460 crc = crc * 9 + (
L & 0xffff) * 3 + ((
L >> 16) & 0xffff);
461 crc = crc * 9 + (
R & 0xffff) * 3 + ((
R >> 16) & 0xffff);
462 magdata |= (
L < 0) ? ~
L :
L;
463 magdata |= (
R < 0) ? ~
R :
R;
464 xordata |=
L ^ -(
L & 1);
465 xordata |=
R ^ -(
R & 1);
490 }
while (!(ordata & 1));
491 else if (anddata & 1)
497 }
while (anddata & 1);
498 else if (!(xordata & 2))
504 }
while (!(xordata & 2));
508 total_shift +=
s->int32_sent_bits;
517 shift_mono(samples_l, nb_samples, total_shift);
519 shift_stereo(samples_l, samples_r, nb_samples, total_shift);
522 return s->int32_sent_bits;
539 result += (result + 64) >> 7;
550 int nb_samples,
struct Decorr *dpp,
int dir)
557 out_samples += (nb_samples - 1);
558 in_samples += (nb_samples - 1);
567 while (nb_samples--) {
578 out_samples[0] =
left;
582 }
else if (dpp->
value > 0) {
583 while (nb_samples--) {
594 out_samples[0] =
left;
631 }
else if (dpp->
value > 1) {
634 for (
i = 0, j = dpp->
value - 1, k = 0; k < dpp->
value / 2;
i++, j--, k++) {
644#define count_bits(av) ((av) ? 32 - ff_clz(av) : 0)
650 if ((v += v >> 9) < (1 << 8)) {
653 *result += dbits = (dbits << 8) +
ff_wp_log2_table[(v >> (dbits - 9)) & 0xff];
665 while (nb_samples--) {
674 int nb_samples,
int limit)
677 while (nb_samples--) {
688 int nb_samples,
struct Decorr *dpp,
691 struct Decorr dp, *dppi = dpp + tindex;
699 pre_delta =
delta + 1;
703 dp.
delta = pre_delta;
717 decorr_mono(samples, outsamples, nb_samples, &dp, 1);
723 decorr_mono(samples, outsamples, nb_samples, &dp, 1);
727 int depth,
int delta, uint32_t input_bits)
729 int term, branches =
s->num_branches - depth;
731 uint32_t term_bits[22],
bits;
733 if (branches < 1 || depth + 1 == info->nterms)
737 samples =
s->sampleptrs[depth][0];
738 outsamples =
s->sampleptrs[depth + 1][0];
740 for (term = 1; term <= 18; term++) {
741 if (term == 17 && branches == 1 && depth + 1 < info->
nterms)
744 if (term > 8 && term < 17)
747 if (!
s->extra_flags && (term > 4 && term < 17))
758 memcpy(
s->decorr_passes, info->
dps,
sizeof(info->
dps[0]) * (depth + 1));
759 memcpy(
s->sampleptrs[info->
nterms + 1][0],
760 s->sampleptrs[depth + 1][0],
s->block_samples * 4);
763 term_bits[term + 3] =
bits;
766 while (depth + 1 < info->
nterms && branches--) {
767 uint32_t local_best_bits = input_bits;
768 int best_term = 0,
i;
770 for (
i = 0;
i < 22;
i++)
771 if (term_bits[
i] && term_bits[
i] < local_best_bits) {
772 local_best_bits = term_bits[
i];
779 term_bits[best_term + 3] = 0;
797 memcpy(info->
dps,
s->decorr_passes,
sizeof(
s->decorr_passes));
800 for (ri = 0; ri < info->
nterms &&
s->decorr_passes[ri].value; ri++) {
802 if (ri + 1 >= info->
nterms || !
s->decorr_passes[ri+1].value)
805 if (
s->decorr_passes[ri].value ==
s->decorr_passes[ri+1].value) {
807 s->block_samples, info->
dps, ri);
811 info->
dps[ri ] =
s->decorr_passes[ri+1];
812 info->
dps[ri+1] =
s->decorr_passes[ri ];
814 for (
i = ri;
i < info->
nterms &&
s->decorr_passes[
i].value;
i++)
816 s->block_samples, info->
dps,
i);
823 memcpy(
s->decorr_passes, info->
dps,
sizeof(info->
dps[0]) *
i);
824 memcpy(
s->sampleptrs[info->
nterms + 1][0],
s->sampleptrs[
i][0],
825 s->block_samples * 4);
827 info->
dps[ri ] =
s->decorr_passes[ri];
828 info->
dps[ri+1] =
s->decorr_passes[ri+1];
830 s->block_samples, info->
dps, ri);
838 int lower = 0,
delta, d;
841 if (!
s->decorr_passes[0].value)
843 delta =
s->decorr_passes[0].delta;
845 for (d =
delta - 1; d >= 0; d--) {
848 for (
i = 0;
i < info->
nterms &&
s->decorr_passes[
i].value;
i++) {
852 s->block_samples, info->
dps,
i);
862 memcpy(
s->decorr_passes, info->
dps,
sizeof(info->
dps[0]) *
i);
863 memcpy(
s->sampleptrs[info->
nterms + 1][0],
s->sampleptrs[
i][0],
864 s->block_samples * 4);
867 for (d =
delta + 1; !lower && d <= 7; d++) {
870 for (
i = 0;
i < info->
nterms &&
s->decorr_passes[
i].value;
i++) {
874 s->block_samples, info->
dps,
i);
883 memcpy(
s->decorr_passes, info->
dps,
sizeof(info->
dps[0]) *
i);
884 memcpy(
s->sampleptrs[info->
nterms + 1][0],
s->sampleptrs[
i][0],
885 s->block_samples * 4);
893 for (
i = 0;
i < nterms + 2;
i++) {
895 s->block_samples * 4);
896 if (!
s->sampleptrs[
i][0])
900 s->block_samples * 4);
901 if (!
s->sampleptrs[
i][1])
913 for (
i = 0;
i < 2;
i++) {
915 s->block_samples * 4);
916 if (!
s->best_buffer[0])
920 s->block_samples * 4);
921 if (!
s->temp_buffer[
i][0])
925 s->block_samples * 4);
926 if (!
s->best_buffer[1])
930 s->block_samples * 4);
931 if (!
s->temp_buffer[
i][1])
952 memcpy(info.
dps,
s->decorr_passes,
sizeof(info.
dps));
953 memcpy(
s->sampleptrs[0][0], samples,
s->block_samples * 4);
957 s->block_samples, info.
dps +
i, 1);
960 memcpy(
s->sampleptrs[info.
nterms + 1][0],
s->sampleptrs[
i][0],
s->block_samples * 4);
964 log2mono(
s->sampleptrs[0][0],
s->block_samples, 0));
973 s->delta_decay = (
float)((
s->delta_decay * 2.0 +
s->decorr_passes[0].delta) / 3.0);
975 s->delta_decay = 2.0;
982 memcpy(samples,
s->sampleptrs[info.
nterms + 1][0],
s->block_samples * 4);
985 if (!
s->decorr_passes[
i].value)
992 int32_t *samples,
int nb_samples,
int dir)
995 samples += nb_samples - 1;
997 while (nb_samples--) {
1024 int no_history,
int do_samples)
1026 struct Decorr temp_decorr_pass, save_decorr_passes[
MAX_TERMS] = {{0}};
1027 int nb_samples =
s->block_samples;
1028 int buf_size =
sizeof(
int32_t) * nb_samples;
1029 uint32_t best_size = UINT32_MAX,
size;
1030 int log_limit, pi,
i, ret;
1032 for (
i = 0;
i < nb_samples;
i++)
1036 if (
i == nb_samples) {
1044 log_limit =
FFMIN(6912, log_limit);
1049 if (no_history ||
s->num_passes >= 7)
1050 s->best_decorr =
s->mask_decorr = 0;
1052 for (pi = 0; pi <
s->num_passes;) {
1059 if (
s->mask_decorr == 0)
1062 c = (
s->best_decorr & (
s->mask_decorr - 1)) |
s->mask_decorr;
1064 if (
c ==
s->best_decorr) {
1065 s->mask_decorr =
s->mask_decorr ? ((
s->mask_decorr << 1) & (
s->num_decorrs - 1)) : 1;
1070 wpds = &
s->decorr_specs[
c];
1074 memcpy(
s->temp_buffer[0][0], samples, buf_size);
1075 CLEAR(save_decorr_passes);
1077 for (j = 0; j < nterms; j++) {
1078 CLEAR(temp_decorr_pass);
1082 if (temp_decorr_pass.
value < 0)
1083 temp_decorr_pass.
value = 1;
1085 decorr_mono(
s->temp_buffer[j&1][0],
s->temp_buffer[~j&1][0],
1086 FFMIN(nb_samples, 2048), &temp_decorr_pass, -1);
1094 memcpy(save_decorr_passes + j, &temp_decorr_pass,
sizeof(
struct Decorr));
1095 decorr_mono(
s->temp_buffer[j&1][0],
s->temp_buffer[~j&1][0],
1096 nb_samples, &temp_decorr_pass, 1);
1099 size =
log2mono(
s->temp_buffer[j&1][0], nb_samples, log_limit);
1100 if (
size != UINT32_MAX || !nterms)
1105 if (
size < best_size) {
1106 memcpy(
s->best_buffer[0],
s->temp_buffer[j&1][0], buf_size);
1107 memcpy(
s->decorr_passes, save_decorr_passes,
sizeof(
struct Decorr) *
MAX_TERMS);
1108 s->num_terms = nterms;
1114 s->mask_decorr =
s->mask_decorr ? ((
s->mask_decorr << 1) & (
s->num_decorrs - 1)) : 1;
1119 else if (do_samples)
1120 memcpy(samples,
s->best_buffer[0], buf_size);
1122 if (no_history ||
s->extra_flags) {
1124 scan_word(
s, &
s->w.c[0],
s->best_buffer[0], nb_samples, -1);
1131 int nb_samples,
struct Decorr *dpp,
int dir)
1138 out_left += nb_samples - 1;
1139 out_right += nb_samples - 1;
1140 in_left += nb_samples - 1;
1141 in_right += nb_samples - 1;
1152 switch (dpp->
value) {
1154 while (nb_samples--) {
1176 while (nb_samples--) {
1198 while (nb_samples--) {
1222 while (nb_samples--) {
1259 while (nb_samples--) {
1278 while (nb_samples--) {
1297 while (nb_samples--) {
1327 if (dpp->
value & 1) {
1340 if (dpp->
value & 1) {
1350 }
else if (dpp->
value > 1) {
1353 for (
i = 0, j = dpp->
value - 1, k = 0; k < dpp->
value / 2;
i++, j--, k++) {
1368 int nb_samples,
struct Decorr *dpp)
1380 switch (dpp->
value) {
1382 for (
i = 0;
i < nb_samples;
i++) {
1397 for (
i = 0;
i < nb_samples;
i++) {
1412 for (
i = 0;
i < nb_samples;
i++) {
1429 for (
i = 0;
i < nb_samples;
i++) {
1460 for (
i = 0;
i < nb_samples;
i++) {
1472 for (
i = 0;
i < nb_samples;
i++) {
1484 for (
i = 0;
i < nb_samples;
i++) {
1505 int nb_samples,
int tindex)
1507 struct Decorr dp = {0}, *dppi = info->
dps + tindex;
1508 int delta = dppi->delta, pre_delta;
1509 int term = dppi->value;
1516 pre_delta =
delta + 1;
1519 dp.
delta = pre_delta;
1521 FFMIN(2048, nb_samples), &dp, -1);
1538 decorr_stereo(in_left, in_right, out_left, out_right, nb_samples, &dp, 1);
1542 dppi->weightA = dp.
weightA = dp.
sumA / nb_samples;
1543 dppi->weightB = dp.
weightB = dp.
sumB / nb_samples;
1548 nb_samples, &dp, 1);
1562 memcpy(info->
dps,
s->decorr_passes,
sizeof(
s->decorr_passes));
1565 for (ri = 0; ri < info->
nterms &&
s->decorr_passes[ri].value; ri++) {
1567 if (ri + 1 >= info->
nterms || !
s->decorr_passes[ri+1].value)
1570 if (
s->decorr_passes[ri].value ==
s->decorr_passes[ri+1].value) {
1572 s->sampleptrs[ri ][0],
s->sampleptrs[ri ][1],
1573 s->sampleptrs[ri+1][0],
s->sampleptrs[ri+1][1],
1574 s->block_samples, ri);
1578 info->
dps[ri ] =
s->decorr_passes[ri+1];
1579 info->
dps[ri+1] =
s->decorr_passes[ri ];
1581 for (
i = ri;
i < info->
nterms &&
s->decorr_passes[
i].value;
i++)
1583 s->sampleptrs[
i ][0],
s->sampleptrs[
i ][1],
1584 s->sampleptrs[
i+1][0],
s->sampleptrs[
i+1][1],
1585 s->block_samples,
i);
1594 memcpy(
s->decorr_passes, info->
dps,
sizeof(info->
dps[0]) *
i);
1595 memcpy(
s->sampleptrs[info->
nterms + 1][0],
1596 s->sampleptrs[
i][0],
s->block_samples * 4);
1597 memcpy(
s->sampleptrs[info->
nterms + 1][1],
1598 s->sampleptrs[
i][1],
s->block_samples * 4);
1600 info->
dps[ri ] =
s->decorr_passes[ri ];
1601 info->
dps[ri+1] =
s->decorr_passes[ri+1];
1603 s->sampleptrs[ri ][0],
s->sampleptrs[ri ][1],
1604 s->sampleptrs[ri+1][0],
s->sampleptrs[ri+1][1],
1605 s->block_samples, ri);
1613 int lower = 0,
delta, d,
i;
1616 if (!
s->decorr_passes[0].value)
1618 delta =
s->decorr_passes[0].delta;
1620 for (d =
delta - 1; d >= 0; d--) {
1621 for (
i = 0;
i < info->
nterms &&
s->decorr_passes[
i].value;
i++) {
1625 s->sampleptrs[
i ][0],
s->sampleptrs[
i ][1],
1626 s->sampleptrs[
i+1][0],
s->sampleptrs[
i+1][1],
1627 s->block_samples,
i);
1637 memcpy(
s->decorr_passes, info->
dps,
sizeof(info->
dps[0]) *
i);
1638 memcpy(
s->sampleptrs[info->
nterms + 1][0],
s->sampleptrs[
i][0],
1639 s->block_samples * 4);
1640 memcpy(
s->sampleptrs[info->
nterms + 1][1],
s->sampleptrs[
i][1],
1641 s->block_samples * 4);
1644 for (d =
delta + 1; !lower && d <= 7; d++) {
1645 for (
i = 0;
i < info->
nterms &&
s->decorr_passes[
i].value;
i++) {
1649 s->sampleptrs[
i ][0],
s->sampleptrs[
i ][1],
1650 s->sampleptrs[
i+1][0],
s->sampleptrs[
i+1][1],
1651 s->block_samples,
i);
1660 memcpy(
s->decorr_passes, info->
dps,
sizeof(info->
dps[0]) *
i);
1661 memcpy(
s->sampleptrs[info->
nterms + 1][0],
1662 s->sampleptrs[
i][0],
s->block_samples * 4);
1663 memcpy(
s->sampleptrs[info->
nterms + 1][1],
1664 s->sampleptrs[
i][1],
s->block_samples * 4);
1672 int depth,
int delta, uint32_t input_bits)
1674 int term, branches =
s->num_branches - depth;
1675 int32_t *in_left, *in_right, *out_left, *out_right;
1676 uint32_t term_bits[22],
bits;
1678 if (branches < 1 || depth + 1 == info->nterms)
1682 in_left =
s->sampleptrs[depth ][0];
1683 in_right =
s->sampleptrs[depth ][1];
1684 out_left =
s->sampleptrs[depth + 1][0];
1685 out_right =
s->sampleptrs[depth + 1][1];
1687 for (term = -3; term <= 18; term++) {
1688 if (!term || (term > 8 && term < 17))
1691 if (term == 17 && branches == 1 && depth + 1 < info->
nterms)
1694 if (term == -1 || term == -2)
1698 if (!
s->extra_flags && (term > 4 && term < 17))
1704 s->block_samples, depth);
1710 memcpy(
s->decorr_passes, info->
dps,
sizeof(info->
dps[0]) * (depth + 1));
1711 memcpy(
s->sampleptrs[info->
nterms + 1][0],
s->sampleptrs[depth + 1][0],
1712 s->block_samples * 4);
1713 memcpy(
s->sampleptrs[info->
nterms + 1][1],
s->sampleptrs[depth + 1][1],
1714 s->block_samples * 4);
1717 term_bits[term + 3] =
bits;
1720 while (depth + 1 < info->
nterms && branches--) {
1721 uint32_t local_best_bits = input_bits;
1722 int best_term = 0,
i;
1724 for (
i = 0;
i < 22;
i++)
1725 if (term_bits[
i] && term_bits[
i] < local_best_bits) {
1726 local_best_bits = term_bits[
i];
1733 term_bits[best_term + 3] = 0;
1735 info->
dps[depth].
value = best_term;
1738 s->block_samples, depth);
1761 memcpy(info.
dps,
s->decorr_passes,
sizeof(info.
dps));
1762 memcpy(
s->sampleptrs[0][0], in_left,
s->block_samples * 4);
1763 memcpy(
s->sampleptrs[0][1], in_right,
s->block_samples * 4);
1768 s->sampleptrs[
i + 1][0],
s->sampleptrs[
i + 1][1],
1769 s->block_samples, info.
dps +
i, 1);
1772 s->sampleptrs[
i + 1][0],
s->sampleptrs[
i + 1][1],
1773 s->block_samples, info.
dps +
i);
1776 s->block_samples, 0);
1778 memcpy(
s->sampleptrs[info.
nterms + 1][0],
s->sampleptrs[
i][0],
s->block_samples * 4);
1779 memcpy(
s->sampleptrs[info.
nterms + 1][1],
s->sampleptrs[
i][1],
s->block_samples * 4);
1784 s->block_samples, 0));
1793 s->delta_decay = (
float)((
s->delta_decay * 2.0 +
s->decorr_passes[0].delta) / 3.0);
1795 s->delta_decay = 2.0;
1802 memcpy(in_left,
s->sampleptrs[info.
nterms + 1][0],
s->block_samples * 4);
1803 memcpy(in_right,
s->sampleptrs[info.
nterms + 1][1],
s->block_samples * 4);
1807 if (!
s->decorr_passes[
i].value)
1815 int no_history,
int do_samples)
1817 struct Decorr temp_decorr_pass, save_decorr_passes[
MAX_TERMS] = {{0}};
1818 int nb_samples =
s->block_samples, ret;
1819 int buf_size =
sizeof(
int32_t) * nb_samples;
1820 int log_limit, force_js = 0, force_ts = 0, got_js = 0, pi,
i;
1821 uint32_t best_size = UINT32_MAX,
size;
1823 for (
i = 0;
i < nb_samples;
i++)
1824 if (samples_l[
i] || samples_r[
i])
1827 if (
i == nb_samples) {
1836 log_limit =
FFMIN(6912, log_limit);
1838 if (
s->joint != -1) {
1839 force_js =
s->joint;
1840 force_ts = !
s->joint;
1846 if (no_history ||
s->num_passes >= 7)
1847 s->best_decorr =
s->mask_decorr = 0;
1849 for (pi = 0; pi <
s->num_passes;) {
1856 if (
s->mask_decorr == 0)
1859 c = (
s->best_decorr & (
s->mask_decorr - 1)) |
s->mask_decorr;
1861 if (
c ==
s->best_decorr) {
1862 s->mask_decorr =
s->mask_decorr ? ((
s->mask_decorr << 1) & (
s->num_decorrs - 1)) : 1;
1867 wpds = &
s->decorr_specs[
c];
1875 memcpy(
s->js_left, samples_l, buf_size);
1876 memcpy(
s->js_right, samples_r, buf_size);
1878 for (
i = 0;
i < nb_samples;
i++)
1879 s->js_right[
i] += ((
s->js_left[
i] -=
s->js_right[
i]) >> 1);
1883 memcpy(
s->temp_buffer[0][0],
s->js_left, buf_size);
1884 memcpy(
s->temp_buffer[0][1],
s->js_right, buf_size);
1886 memcpy(
s->temp_buffer[0][0], samples_l, buf_size);
1887 memcpy(
s->temp_buffer[0][1], samples_r, buf_size);
1890 CLEAR(save_decorr_passes);
1892 for (j = 0; j < nterms; j++) {
1893 CLEAR(temp_decorr_pass);
1898 temp_decorr_pass.
value = -3;
1901 s->temp_buffer[~j&1][0],
s->temp_buffer[~j&1][1],
1902 FFMIN(2048, nb_samples), &temp_decorr_pass, -1);
1911 memcpy(save_decorr_passes + j, &temp_decorr_pass,
sizeof(
struct Decorr));
1915 s->temp_buffer[~j&1][0],
s->temp_buffer[~j&1][1],
1916 nb_samples, &temp_decorr_pass, 1);
1919 s->temp_buffer[~j&1][0],
s->temp_buffer[~j&1][1],
1920 nb_samples, &temp_decorr_pass);
1924 nb_samples, log_limit);
1925 if (
size != UINT32_MAX || !nterms)
1930 if (
size < best_size) {
1931 memcpy(
s->best_buffer[0],
s->temp_buffer[j&1][0], buf_size);
1932 memcpy(
s->best_buffer[1],
s->temp_buffer[j&1][1], buf_size);
1933 memcpy(
s->decorr_passes, save_decorr_passes,
sizeof(
struct Decorr) *
MAX_TERMS);
1934 s->num_terms = nterms;
1940 s->mask_decorr =
s->mask_decorr ? ((
s->mask_decorr << 1) & (
s->num_decorrs - 1)) : 1;
1943 if (force_js || (
s->decorr_specs[
s->best_decorr].joint_stereo && !force_ts))
1948 if (
s->extra_flags) {
1953 memcpy(samples_l,
s->js_left, buf_size);
1954 memcpy(samples_r,
s->js_right, buf_size);
1958 }
else if (do_samples) {
1959 memcpy(samples_l,
s->best_buffer[0], buf_size);
1960 memcpy(samples_r,
s->best_buffer[1], buf_size);
1963 if (
s->extra_flags || no_history ||
1964 s->joint_stereo !=
s->decorr_specs[
s->best_decorr].joint_stereo) {
1965 s->joint_stereo =
s->decorr_specs[
s->best_decorr].joint_stereo;
1967 scan_word(
s, &
s->w.c[0],
s->best_buffer[0], nb_samples, -1);
1968 scan_word(
s, &
s->w.c[1],
s->best_buffer[1], nb_samples, -1);
1986 put_bits(pb, cbits, (1U << cbits) - 1);
1993 while (
w->zeros_acc > 1) {
2001 if (
w->holding_one) {
2002 if (
w->holding_one >= 16) {
2007 w->holding_one -= 16;
2015 put_bits(pb, cbits, (1U << cbits) - 1);
2022 while (
w->holding_one > 1) {
2024 w->holding_one >>= 1;
2027 w->holding_zero = 0;
2029 put_bits(pb,
w->holding_one, (1 <<
w->holding_one) - 1);
2035 if (
w->holding_zero) {
2037 w->holding_zero = 0;
2040 if (
w->pend_count) {
2042 w->pend_data =
w->pend_count = 0;
2049 uint32_t ones_count, low,
high;
2052 if (
s->w.c[0].median[0] < 2 && !
s->w.holding_zero &&
s->w.c[1].median[0] < 2) {
2074 ones_count = low = 0;
2095 low += (ones_count - 2) *
GET_MED(2);
2102 if (
w->holding_zero) {
2109 w->holding_zero = 1;
2112 w->holding_zero = 0;
2114 w->holding_zero = 1;
2116 w->holding_one = ones_count * 2;
2121 uint32_t extras = (1 << bitcount) - maxcode - 1;
2123 if (
code < extras) {
2124 w->pend_data |=
code <<
w->pend_count;
2125 w->pend_count += bitcount - 1;
2127 w->pend_data |= ((
code + extras) >> 1) <<
w->pend_count;
2128 w->pend_count += bitcount - 1;
2129 w->pend_data |= ((
code + extras) & 1) <<
w->pend_count++;
2133 w->pend_data |= ((
int32_t) sign <<
w->pend_count++);
2135 if (!
w->holding_zero)
2143 const int sent_bits =
s->int32_sent_bits;
2147 pre_shift =
s->int32_zeros +
s->int32_ones +
s->int32_dups;
2153 for (
i = 0;
i < nb_samples;
i++) {
2154 put_sbits(pb, sent_bits, samples_l[
i] >> pre_shift);
2157 for (
i = 0;
i < nb_samples;
i++) {
2158 put_sbits(pb, sent_bits, samples_l[
i] >> pre_shift);
2159 put_sbits(pb, sent_bits, samples_r[
i] >> pre_shift);
2166 const int max_exp =
s->float_max_exp;
2184 shift_count = max_exp ? max_exp - 1 : 0;
2188 if (shift_count < 25)
2189 value >>= shift_count;
2210 }
else if (shift_count) {
2226 for (
i = 0;
i < nb_samples;
i++)
2229 for (
i = 0;
i < nb_samples;
i++) {
2242 switch (dpp->
value) {
2244 for (
i = 0;
i < nb_samples;
i++) {
2259 for (
i = 0;
i < nb_samples;
i++) {
2302 for (
i = 0;
i < nb_samples;
i++) {
2314 for (
i = 0;
i < nb_samples;
i++) {
2326 for (
i = 0;
i < nb_samples;
i++) {
2344#define update_weight_d2(weight, delta, source, result) \
2345 if (source && result) \
2346 weight -= (((source ^ result) >> 29) & 4) - 2;
2348#define update_weight_clip_d2(weight, delta, source, result) \
2349 if (source && result) { \
2350 const int32_t s = (source ^ result) >> 31; \
2351 if ((weight = (weight ^ s) + (2 - s)) > 1024) weight = 1024; \
2352 weight = (weight ^ s) - s; \
2361 switch (dpp->
value) {
2363 for (
i = 0;
i < nb_samples;
i++) {
2378 for (
i = 0;
i < nb_samples;
i++) {
2422 for (
i = 0;
i < nb_samples;
i++) {
2434 for (
i = 0;
i < nb_samples;
i++) {
2446 for (
i = 0;
i < nb_samples;
i++) {
2469 bytestream2_put_byte(pb,
flags);
2470 bytestream2_put_byte(pb, (
size + 1) >> 1);
2477 int block_size, start, end, data_size, tcount,
temp, m = 0;
2478 int i, j, ret = 0, got_extra = 0, nb_samples =
s->block_samples;
2479 uint32_t crc = 0xffffffffu;
2486 if (!(
s->flags &
WV_MONO) &&
s->optimize_mono) {
2489 for (
i = 0;
i < nb_samples;
i++) {
2490 lor |= samples_l[
i] | samples_r[
i];
2491 diff |= samples_l[
i] - samples_r[
i];
2497 if (
i == nb_samples && lor && !
diff) {
2501 if (!
s->false_stereo) {
2502 s->false_stereo = 1;
2506 }
else if (
s->false_stereo) {
2507 s->false_stereo = 0;
2522 if ((mag -=
shift) < 0)
2530 memcpy(
s->orig_l, samples_l,
sizeof(
int32_t) * nb_samples);
2533 memcpy(
s->orig_r, samples_r,
sizeof(
int32_t) * nb_samples);
2537 got_extra =
scan_float(
s, samples_l, samples_r, nb_samples);
2539 got_extra =
scan_int32(
s, samples_l, samples_r, nb_samples);
2543 if (
s->shift !=
s->int32_zeros +
s->int32_ones +
s->int32_dups) {
2544 s->shift =
s->int32_zeros +
s->int32_ones +
s->int32_dups;
2549 if (!
s->num_passes && !
s->num_terms) {
2555 ret =
wv_stereo(
s, samples_l, samples_r, 1, 0);
2560 for (
i = 0;
i < nb_samples;
i++)
2561 crc += (crc << 1) + samples_l[
i];
2564 ret =
wv_mono(
s, samples_l, !
s->num_terms, 1);
2566 for (
i = 0;
i < nb_samples;
i++)
2567 crc += (crc << 3) + ((uint32_t)samples_l[
i] << 1) + samples_l[
i] + samples_r[
i];
2570 ret =
wv_stereo(
s, samples_l, samples_r, !
s->num_terms, 1);
2578 s->ch_offset += 1 + !(
s->flags &
WV_MONO);
2580 if (
s->ch_offset ==
s->avctx->ch_layout.nb_channels)
2584 bytestream2_put_le32(&pb,
MKTAG(
'w',
'v',
'p',
'k'));
2585 bytestream2_put_le32(&pb, 0);
2586 bytestream2_put_le16(&pb, 0x410);
2587 bytestream2_put_le16(&pb, 0);
2588 bytestream2_put_le32(&pb, 0);
2589 bytestream2_put_le32(&pb,
s->sample_index);
2590 bytestream2_put_le32(&pb, nb_samples);
2591 bytestream2_put_le32(&pb,
s->flags);
2592 bytestream2_put_le32(&pb, crc);
2599 bytestream2_put_byte(&pb,
s->avctx->ch_layout.nb_channels);
2600 if (
s->avctx->ch_layout.u.mask >> 32)
2601 bytestream2_put_le32(&pb, 0);
2603 bytestream2_put_le32(&pb,
s->avctx->ch_layout.u.mask);
2604 bytestream2_put_byte(&pb, 0);
2608 bytestream2_put_byte(&pb,
s->avctx->ch_layout.nb_channels);
2609 bytestream2_put_le32(&pb, 0);
2610 bytestream2_put_byte(&pb, 0);
2615 bytestream2_put_le24(&pb,
s->avctx->sample_rate);
2616 bytestream2_put_byte(&pb, 0);
2620 for (
i = 0;
i <
s->num_terms;
i++) {
2621 struct Decorr *dpp = &
s->decorr_passes[
i];
2622 bytestream2_put_byte(&pb, ((dpp->
value + 5) & 0x1f) | ((dpp->
delta << 5) & 0xe0));
2624 if (
s->num_terms & 1)
2625 bytestream2_put_byte(&pb, 0);
2627#define WRITE_DECWEIGHT(type) do { \
2628 temp = store_weight(type); \
2629 bytestream2_put_byte(&pb, temp); \
2630 type = restore_weight(temp); \
2634 bytestream2_put_byte(&pb, 0);
2636 for (
i =
s->num_terms - 1;
i >= 0; --
i) {
2637 struct Decorr *dpp = &
s->decorr_passes[
i];
2644 for (
i = 0;
i <
s->num_terms;
i++) {
2645 struct Decorr *dpp = &
s->decorr_passes[
i];
2656 out[start - 1] = (end - start + 1) >> 1;
2657 if ((end - start) & 1)
2658 bytestream2_put_byte(&pb, 0);
2660#define WRITE_DECSAMPLE(type) do { \
2661 temp = log2s(type); \
2662 type = wp_exp2(temp); \
2663 bytestream2_put_le16(&pb, temp); \
2667 bytestream2_put_byte(&pb, 0);
2669 for (
i = 0;
i <
s->num_terms;
i++) {
2670 struct Decorr *dpp = &
s->decorr_passes[
i];
2679 }
else if (dpp->
value < 0) {
2683 for (j = 0; j < dpp->
value; j++) {
2695 out[start - 1] = (end - start) >> 1;
2697#define WRITE_CHAN_ENTROPY(chan) do { \
2698 for (i = 0; i < 3; i++) { \
2699 temp = wp_log2(s->w.c[chan].median[i]); \
2700 bytestream2_put_le16(&pb, temp); \
2701 s->w.c[chan].median[i] = wp_exp2(temp); \
2712 bytestream2_put_byte(&pb,
s->float_flags);
2713 bytestream2_put_byte(&pb,
s->float_shift);
2714 bytestream2_put_byte(&pb,
s->float_max_exp);
2715 bytestream2_put_byte(&pb, 127);
2720 bytestream2_put_byte(&pb,
s->int32_sent_bits);
2721 bytestream2_put_byte(&pb,
s->int32_zeros);
2722 bytestream2_put_byte(&pb,
s->int32_ones);
2723 bytestream2_put_byte(&pb,
s->int32_dups);
2727 for (
i = 0;
i < nb_samples;
i++) {
2730 for (tcount =
s->num_terms, dpp =
s->decorr_passes; tcount--; dpp++) {
2751 samples_l[
i] =
code;
2754 for (tcount =
s->num_terms, dpp =
s->decorr_passes; tcount--; dpp++)
2769 }
else if (!
s->num_passes) {
2771 for (
i = 0;
i < nb_samples;
i++)
2772 samples_r[
i] += ((samples_l[
i] -= samples_r[
i]) >> 1);
2775 for (
i = 0;
i <
s->num_terms;
i++) {
2776 struct Decorr *dpp = &
s->decorr_passes[
i];
2787 for (
i = 0;
i < nb_samples;
i++)
2790 for (
i = 0;
i < nb_samples;
i++) {
2798 bytestream2_put_le24(&pb, (data_size + 1) >> 1);
2801 bytestream2_put_byte(&pb, 0);
2812 bytestream2_put_le24(&pb, (data_size + 5) >> 1);
2813 bytestream2_put_le32(&pb,
s->crc_x);
2816 bytestream2_put_byte(&pb, 0);
2833#define COPY_SAMPLES(type, offset, shift) do { \
2834 const type *sptr = (const type *)src; \
2835 for (i = 0; i < nb_samples; i++) \
2836 dst[i] = (sptr[i] - offset) >> shift; \
2839 switch (
s->avctx->sample_fmt) {
2847 if (
s->avctx->bits_per_raw_sample <= 24) {
2853 memcpy(
dst,
src, nb_samples * 4);
2861 for (
i = 0;
i < 15;
i++) {
2876 s->block_samples =
frame->nb_samples;
2878 sizeof(
int32_t) *
s->block_samples);
2883 sizeof(
int32_t) *
s->block_samples);
2897 switch (
s->avctx->sample_fmt) {
2911 s->flags += (1 <<
MAG_LSB) * ((
s->flags & 3) * 8 + 7);
2914 buf, buf_size)) < 0)
2920 s->sample_index +=
frame->nb_samples;
2923 *got_packet_ptr = 1;
2935 s->sampleptrs_size[
i][0] =
s->sampleptrs_size[
i][1] = 0;
2938 for (
i = 0;
i < 2;
i++) {
2940 s->samples_size[
i] = 0;
2943 s->best_buffer_size[
i] = 0;
2947 s->temp_buffer_size[
i][0] =
s->temp_buffer_size[
i][1] = 0;
2952 s->js_left_size =
s->js_right_size = 0;
2956 s->orig_l_size =
s->orig_r_size = 0;
2961#define OFFSET(x) offsetof(WavPackEncodeContext, x)
2962#define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
2970 .class_name =
"WavPack encoder",
2977 .p.name =
"wavpack",
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_wavpack_encoder
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
#define FF_COMPRESSION_DEFAULT
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static av_always_inline int bytestream2_tell_p(const PutByteContext *p)
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
static av_always_inline void bytestream2_skip_p(PutByteContext *p, unsigned int size)
static av_always_inline int bytestream2_get_bytes_left_p(const PutByteContext *p)
static av_always_inline unsigned int bytestream2_get_eof(PutByteContext *p)
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
Public libavutil channel layout APIs header.
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define CODEC_SAMPLEFMTS(...)
#define FFABSU(a)
Unsigned Absolute value.
static __device__ float floor(float a)
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
static const uint8_t bits[8]
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
#define AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_STEREO
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
@ AV_CHANNEL_ORDER_NATIVE
The native channel order, i.e.
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_SAMPLE_FMT_FLTP
float, planar
@ AV_SAMPLE_FMT_S16P
signed 16 bits, planar
@ AV_SAMPLE_FMT_U8P
unsigned 8 bits, planar
@ AV_SAMPLE_FMT_S32P
signed 32 bits, planar
#define LIBAVUTIL_VERSION_INT
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
static int shift(int a, int b)
Macro definitions for various function/variable attributes.
static const uint16_t mask[17]
#define MKTAG(a, b, c, d)
Memory handling functions.
static void put_sbits(PutBitContext *pb, int n, int32_t value)
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
static int put_bytes_output(const PutBitContext *s)
const h264_weight_func weight
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
main external API structure.
AVChannelLayout ch_layout
Audio channel layout.
int sample_rate
samples per second
int frame_size
Number of samples per channel in an audio frame.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
int8_t terms[MAX_TERMS+1]
int32_t * sampleptrs[MAX_TERMS+2][2]
int temp_buffer_size[2][2]
int32_t * temp_buffer[2][2]
struct Decorr decorr_passes[MAX_TERMS]
int sampleptrs_size[MAX_TERMS+2][2]
const WavPackDecorrSpec * decorr_specs
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static double limit(double x)
static av_always_inline int wp_exp2(int16_t val)
const uint8_t ff_wp_log2_table[256]
static const int wv_rates[16]
static av_always_inline int wp_log2(uint32_t val)
#define UPDATE_WEIGHT_CLIP(weight, delta, samples, in)
static void decorr_stereo(int32_t *in_left, int32_t *in_right, int32_t *out_left, int32_t *out_right, int nb_samples, struct Decorr *dpp, int dir)
static void recurse_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info, int depth, int delta, uint32_t input_bits)
static void process_float(WavPackEncodeContext *s, int32_t *sample)
static av_cold int wavpack_encode_close(AVCodecContext *avctx)
static void analyze_mono(WavPackEncodeContext *s, int32_t *samples, int do_samples)
static void encode_flush(WavPackEncodeContext *s)
#define update_weight_clip_d2(weight, delta, source, result)
static int scan_int32(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
static const AVClass wavpack_encoder_class
#define EXTRA_ADJUST_DELTAS
static void decorr_stereo_pass2(struct Decorr *dpp, int32_t *samples_l, int32_t *samples_r, int nb_samples)
static uint32_t log2sample(uint32_t v, int limit, uint32_t *result)
static void reverse_decorr(struct Decorr *dpp)
static void pack_int32(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
static void wavpack_encode_sample(WavPackEncodeContext *s, WvChannel *c, int32_t sample)
static uint32_t log2stereo(int32_t *samples_l, int32_t *samples_r, int nb_samples, int limit)
static void sort_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info)
static void sort_mono(WavPackEncodeContext *s, WavPackExtraInfo *info)
static void scan_word(WavPackEncodeContext *s, WvChannel *c, int32_t *samples, int nb_samples, int dir)
#define COPY_SAMPLES(type, offset, shift)
static int wv_mono(WavPackEncodeContext *s, int32_t *samples, int no_history, int do_samples)
#define UPDATE_WEIGHT(weight, delta, source, result)
static void put_metadata_block(PutByteContext *pb, int flags, int size)
static void decorr_stereo_buffer(WavPackExtraInfo *info, int32_t *in_left, int32_t *in_right, int32_t *out_left, int32_t *out_right, int nb_samples, int tindex)
static int8_t store_weight(int weight)
static void fill_buffer(WavPackEncodeContext *s, const int8_t *src, int32_t *dst, int nb_samples)
static void pack_float(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
#define update_weight_d2(weight, delta, source, result)
static uint32_t log2mono(int32_t *samples, int nb_samples, int limit)
static void recurse_mono(WavPackEncodeContext *s, WavPackExtraInfo *info, int depth, int delta, uint32_t input_bits)
static void scan_int23(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
static int allocate_buffers2(WavPackEncodeContext *s, int nterms)
static void shift_stereo(int32_t *left, int32_t *right, int nb_samples, int shift)
static int restore_weight(int8_t weight)
static void set_samplerate(WavPackEncodeContext *s)
static int allocate_buffers(WavPackEncodeContext *s)
static av_cold int wavpack_encode_init(AVCodecContext *avctx)
static int wavpack_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
#define WRITE_CHAN_ENTROPY(chan)
static void decorr_stereo_quick(int32_t *in_left, int32_t *in_right, int32_t *out_left, int32_t *out_right, int nb_samples, struct Decorr *dpp)
static void delta_mono(WavPackEncodeContext *s, WavPackExtraInfo *info)
static void reverse_mono_decorr(struct Decorr *dpp)
#define WRITE_DECSAMPLE(type)
#define APPLY_WEIGHT_I(weight, sample)
static int scan_float(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int nb_samples)
static int log2s(int32_t value)
static void shift_mono(int32_t *samples, int nb_samples, int shift)
static void delta_stereo(WavPackEncodeContext *s, WavPackExtraInfo *info)
static void decorr_mono_buffer(int32_t *samples, int32_t *outsamples, int nb_samples, struct Decorr *dpp, int tindex)
static int wavpack_encode_block(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, uint8_t *out, int out_size)
static void decorr_mono(int32_t *in_samples, int32_t *out_samples, int nb_samples, struct Decorr *dpp, int dir)
#define WRITE_DECWEIGHT(type)
static void pack_float_sample(WavPackEncodeContext *s, int32_t *sample)
#define APPLY_WEIGHT(weight, sample)
static void analyze_stereo(WavPackEncodeContext *s, int32_t *in_left, int32_t *in_right, int do_samples)
static int wv_stereo(WavPackEncodeContext *s, int32_t *samples_l, int32_t *samples_r, int no_history, int do_samples)
static void decorr_stereo_pass_id2(struct Decorr *dpp, int32_t *samples_l, int32_t *samples_r, int nb_samples)
static const uint8_t decorr_filter_nterms[]
static const WavPackDecorrSpec *const decorr_filters[]
static const uint16_t decorr_filter_sizes[]