92#ifndef FL_STB_VORBIS_HEADER_ONLY
132#ifndef FL_STB_VORBIS_MAX_CHANNELS
134#define FL_STB_VORBIS_MAX_CHANNELS 2
150#ifndef FL_STB_VORBIS_PUSHDATA_CRC_COUNT
151#define FL_STB_VORBIS_PUSHDATA_CRC_COUNT 4
159#ifndef FL_STB_VORBIS_FAST_HUFFMAN_LENGTH
160#define FL_STB_VORBIS_FAST_HUFFMAN_LENGTH 10
173#ifndef FL_STB_VORBIS_FAST_HUFFMAN_INT
174#define FL_STB_VORBIS_FAST_HUFFMAN_SHORT
201#ifdef FL_STB_VORBIS_CODEBOOK_SHORTS
202#error "FL_STB_VORBIS_CODEBOOK_SHORTS is no longer supported as it produced incorrect results for some input formats"
208#define FL_STB_VORBIS_DIVIDE_TABLE
227#ifdef FL_STB_VORBIS_NO_PULLDATA_API
228 #define FL_STB_VORBIS_NO_INTEGER_CONVERSION
229 #define FL_STB_VORBIS_NO_STDIO
232#if defined(FL_STB_VORBIS_NO_CRT) && !defined(FL_STB_VORBIS_NO_STDIO)
233 #define FL_STB_VORBIS_NO_STDIO 1
236#ifndef FL_STB_VORBIS_NO_INTEGER_CONVERSION
237#ifndef FL_STB_VORBIS_NO_FAST_SCALED_FLOAT
242 #ifndef FL_STB_VORBIS_BIG_ENDIAN
243 #define FL_STB_VORBIS_ENDIAN 0
245 #define FL_STB_VORBIS_ENDIAN 1
252#ifndef FL_STB_VORBIS_NO_STDIO
257#ifndef FL_STB_VORBIS_NO_CRT
276#ifndef FL_STB_VORBIS_NO_STDIO
283#if FL_STB_VORBIS_MAX_CHANNELS > 256
284#error "Value of FL_STB_VORBIS_MAX_CHANNELS outside of allowed range"
287#if FL_STB_VORBIS_FAST_HUFFMAN_LENGTH > 24
288#error "Value of FL_STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range"
296namespace third_party {
316#define FL_STBV_CHECK(f) _CrtIsValidHeapPointer(f->channel_buffers[1])
318#define FL_STBV_CHECK(f) ((void) 0)
350#define FL_STBV_FAST_HUFFMAN_TABLE_SIZE (1 << FL_STB_VORBIS_FAST_HUFFMAN_LENGTH)
351#define FL_STBV_FAST_HUFFMAN_TABLE_MASK (FL_STBV_FAST_HUFFMAN_TABLE_SIZE - 1)
366 #ifdef FL_STB_VORBIS_FAST_HUFFMAN_SHORT
473#ifndef FL_STB_VORBIS_NO_STDIO
530 #ifndef FL_STB_VORBIS_NO_DEFER_FLOOR
567#ifndef FL_STB_VORBIS_NO_PUSHDATA_API
576#if defined(FL_STB_VORBIS_NO_PUSHDATA_API)
577 #define FL_STBV_IS_PUSH_MODE(f) false
578#elif defined(FL_STB_VORBIS_NO_PULLDATA_API)
579 #define FL_STBV_IS_PUSH_MODE(f) true
581 #define FL_STBV_IS_PUSH_MODE(f) ((f)->push_mode)
612 size = (size + 7) & ~7;
620 int32_t new_capacity = new_offset * 2;
621 if (new_capacity < 65536) new_capacity = 65536;
622 buffer.reserve(new_capacity);
623 buffer.resize(new_offset);
641 if (f->alloc.alloc_buffer) {
648 if (f->alloc.alloc_buffer) {
649 return f->temp_offset;
655 if (f->alloc.alloc_buffer) {
656 f->temp_offset = saved;
662#define fl_stbv_array_size_required(count,size) (count*(sizeof(void *)+(size)))
664#define fl_stbv_temp_alloc(f,size) fl_stbv_temp_alloc_impl(f,size)
665#define fl_stbv_temp_free(f,p) (void)0
666#define fl_stbv_temp_alloc_save(f) fl_stbv_temp_alloc_save_impl(f)
667#define fl_stbv_temp_alloc_restore(f,p) fl_stbv_temp_alloc_restore_impl(f,p)
669#define fl_stbv_temp_block_array(f,count,size) make_block_array(fl_stbv_temp_alloc(f,fl_stbv_array_size_required(count,size)), count, size)
675 void ** p = (
void **) mem;
676 char *q = (
char *) (p + count);
677 for (i=0; i < count; ++i) {
687 f->setup_memory_required += sz;
688 if (f->alloc.alloc_buffer) {
689 void *p = (
char *) f->alloc.alloc_buffer + f->setup_offset;
690 if (f->setup_offset + sz > f->temp_offset)
return nullptr;
691 f->setup_offset += sz;
699 if (f->alloc.alloc_buffer)
return;
706 if (f->alloc.alloc_buffer) {
707 if (f->temp_offset - sz < f->setup_offset)
return nullptr;
708 f->temp_offset -= sz;
709 return (
char *) f->alloc.alloc_buffer + f->temp_offset;
716 if (f->alloc.alloc_buffer) {
717 f->temp_offset += (sz+7)&~7;
730 for(i=0; i < 256; i++) {
731 for (s=(
uint32) i << 24, j=0; j < 8; ++j)
732 s = (s << 1) ^ (s >= (1UL<<31) ?
CRC32_POLY : 0);
739 return (crc << 8) ^
crc_table[
byte ^ (crc >> 24)];
746 n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1);
747 n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2);
748 n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4);
749 n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8);
750 return (n >> 16) | (n << 16);
763 static signed char log2_4[16] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 };
769 if (n < (1 << 4))
return 0 + log2_4[n ];
770 else if (n < (1 << 9))
return 5 + log2_4[n >> 5];
771 else return 10 + log2_4[n >> 10];
772 else if (n < (1L << 24))
773 if (n < (1L << 19))
return 15 + log2_4[n >> 15];
774 else return 20 + log2_4[n >> 20];
775 else if (n < (1L << 29))
return 25 + log2_4[n >> 25];
776 else return 30 + log2_4[n >> 30];
790 uint32 mantissa =
x & 0x1fffff;
793 double res =
sign ? -(double)mantissa : (double)mantissa;
808 c->codewords [symbol] = huff_code;
810 c->codewords [count] = huff_code;
811 c->codeword_lengths[count] = len;
812 values [count] = symbol;
823 for (k=0; k < n; ++k)
if (len[k] <
NO_CODE)
break;
824 if (k == n) {
FL_ASSERT(c->sorted_entries == 0,
"sorted_entries must be 0");
return true; }
825 FL_ASSERT(len[k] < 32,
"len must be < 32");
829 for (i=1; i <= len[k]; ++i)
835 for (i=k+1; i < n; ++i) {
847 if (
z == 0) {
return false; }
853 for (
y=len[i];
y >
z; --
y) {
868 c->fast_huffman[i] = -1;
870 len = c->sparse ? c->sorted_entries : c->entries;
871 #ifdef FL_STB_VORBIS_FAST_HUFFMAN_SHORT
872 if (len > 32767) len = 32767;
874 for (i=0; i < len; ++i) {
879 c->fast_huffman[
z] = i;
880 z += 1 << c->codeword_lengths[i];
890 return x <
y ? -1 :
x >
y;
895 if (c->sparse) {
FL_ASSERT(len !=
NO_CODE,
"len must not be NO_CODE");
return true; }
896 if (len ==
NO_CODE)
return false;
912 for (i=0; i < c->entries; ++i)
914 c->sorted_codewords[k++] =
bit_reverse(c->codewords[i]);
915 FL_ASSERT(k == c->sorted_entries,
"k must equal sorted_entries");
917 for (i=0; i < c->sorted_entries; ++i)
918 c->sorted_codewords[i] =
bit_reverse(c->codewords[i]);
922 c->sorted_codewords[c->sorted_entries] = 0xffffffff;
924 len = c->sparse ? c->sorted_entries : c->entries;
930 for (i=0; i < len; ++i) {
938 if (c->sorted_codewords[m] <= code) {
945 FL_ASSERT(c->sorted_codewords[
x] == code,
"sorted_codewords must match code");
947 c->sorted_values[
x] = values[i];
948 c->codeword_lengths[
x] = huff_len;
950 c->sorted_values[
x] = i;
959 static uint8 vorbis[6] = {
'v',
'o',
'r',
'b',
'i',
's' };
970 if (
pow((
float) r+1, dim) <= entries)
980 int32_t n4 = n >> 2, n8 = n >> 3;
983 for (k=k2=0; k < n4; ++k,k2+=2) {
985 A[k2+1] = (float) -
sin(4*k*
FL_PI/n);
986 B[k2 ] = (float)
cos((k2+1)*
FL_PI/n/2) * 0.5f;
987 B[k2+1] = (float)
sin((k2+1)*
FL_PI/n/2) * 0.5f;
989 for (k=k2=0; k < n8; ++k,k2+=2) {
991 C[k2+1] = (float) -
sin(2*(k2+1)*
FL_PI/n);
998 for (i=0; i < n2; ++i)
1006 for (i=0; i < n8; ++i)
1012 int32_t n2 = n >> 1, n4 = n >> 2, n8 = n >> 3;
1013 f->A[b] = (
float *)
setup_malloc(f,
sizeof(
float) * n2);
1014 f->B[b] = (
float *)
setup_malloc(f,
sizeof(
float) * n2);
1015 f->C[b] = (
float *)
setup_malloc(f,
sizeof(
float) * n4);
1018 f->window[b] = (
float *)
setup_malloc(f,
sizeof(
float) * n2);
1032 for (i=0; i < n; ++i) {
1033 if (
x[i] > low &&
x[i] <
x[n]) { *plow = i; low =
x[i]; }
1034 if (
x[i] < high &&
x[i] >
x[n]) { *phigh = i; high =
x[i]; }
1048 return a->
x < b->
x ? -1 : a->
x > b->
x;
1055#if defined(FL_STB_VORBIS_NO_STDIO)
1056 #define FL_STBV_USE_MEMORY(z) true
1058 #define FL_STBV_USE_MEMORY(z) ((z)->stream)
1064 if (
z->stream >=
z->stream_end) {
z->eof =
true;
return 0; }
1065 return *
z->stream++;
1068 #ifndef FL_STB_VORBIS_NO_STDIO
1071 if (c == EOF) {
z->eof =
true;
return 0; }
1090 if (
z->stream+n >
z->stream_end) {
z->eof = 1;
return 0; }
1096 #ifndef FL_STB_VORBIS_NO_STDIO
1110 if (
z->stream >=
z->stream_end)
z->eof = 1;
1113 #ifndef FL_STB_VORBIS_NO_STDIO
1123 #ifndef FL_STB_VORBIS_NO_PUSHDATA_API
1124 if (f->push_mode)
return 0;
1132 if (loc >= (
size_t)(f->stream_end - f->stream_start)) {
1133 f->stream = f->stream_end;
1137 f->stream = f->stream_start + loc;
1141 #ifndef FL_STB_VORBIS_NO_STDIO
1142 if (loc + f->f_start < loc || loc >= 0x80000000) {
1161 if (0x4f !=
get8(f))
return false;
1162 if (0x67 !=
get8(f))
return false;
1163 if (0x67 !=
get8(f))
return false;
1164 if (0x53 !=
get8(f))
return false;
1181 f->page_flag =
get8(f);
1195 f->segment_count =
get8(f);
1196 if (!
getn(f, f->segments, f->segment_count))
1199 f->end_seg_with_known_loc = -2;
1200 if (loc0 != ~0U || loc1 != ~0U) {
1203 for (i=f->segment_count-1; i >= 0; --i)
1204 if (f->segments[i] < 255)
1208 f->end_seg_with_known_loc = i;
1209 f->known_loc_for_packet = loc0;
1212 if (f->first_decode) {
1215 for (i=0; i < f->segment_count; ++i)
1216 len += f->segments[i];
1217 len += 27 + f->segment_count;
1218 f->p_first.page_end = f->p_first.page_start + len;
1219 f->p_first.last_decoded_sample = loc0;
1233 while (f->next_seg == -1) {
1238 f->last_seg =
false;
1240 f->packet_bytes = 0;
1241 f->bytes_in_seg = 0;
1248 if (f->next_seg == -1) {
1250 if (f->eof)
return false;
1259 f->last_seg =
false;
1260 f->bytes_in_seg = 0;
1270 if (f->last_seg)
return 0;
1271 if (f->next_seg == -1) {
1272 f->last_seg_which = f->segment_count-1;
1273 if (!
start_page(f)) { f->last_seg = 1;
return 0; }
1276 len = f->segments[f->next_seg++];
1279 f->last_seg_which = f->next_seg-1;
1281 if (f->next_seg >= f->segment_count)
1283 FL_ASSERT(f->bytes_in_seg == 0,
"bytes_in_seg must be 0");
1284 f->bytes_in_seg = len;
1293 if (!f->bytes_in_seg) {
1294 if (f->last_seg)
return EOP;
1297 FL_ASSERT(f->bytes_in_seg > 0,
"bytes_in_seg must be > 0");
1331 if (f->valid_bits < 0)
return 0;
1332 if (f->valid_bits < n) {
1339 if (f->valid_bits == 0) f->acc = 0;
1340 while (f->valid_bits < n) {
1346 f->acc +=
z << f->valid_bits;
1351 FL_ASSERT(f->valid_bits >= n,
"valid_bits must be >= n");
1352 z = f->acc & ((1 << n)-1);
1364 if (f->valid_bits <= 24) {
1365 if (f->valid_bits == 0) f->acc = 0;
1368 if (f->last_seg && !f->bytes_in_seg)
return;
1370 if (
z ==
EOP)
return;
1371 f->acc += (unsigned)
z << f->valid_bits;
1373 }
while (f->valid_bits <= 24);
1389 if (c->codewords ==
nullptr && c->sorted_codewords ==
nullptr)
1394 if (c->entries > 8 ? c->sorted_codewords!=
nullptr : !c->codewords) {
1397 int32_t x=0, n=c->sorted_entries, len;
1402 if (c->sorted_codewords[m] <= code) {
1410 if (!c->sparse)
x = c->sorted_values[
x];
1412 len = c->codeword_lengths[
x];
1413 if (f->valid_bits >= len) {
1415 f->valid_bits -= len;
1424 FL_ASSERT(!c->sparse,
"codebook must not be sparse");
1425 for (i=0; i < c->entries; ++i) {
1426 if (c->codeword_lengths[i] ==
NO_CODE)
continue;
1427 if (c->codewords[i] == (f->acc & ((1 << c->codeword_lengths[i])-1))) {
1428 if (f->valid_bits >= c->codeword_lengths[i]) {
1429 f->acc >>= c->codeword_lengths[i];
1430 f->valid_bits -= c->codeword_lengths[i];
1443#ifndef FL_STB_VORBIS_NO_INLINE_DECODE
1445#define FL_STBV_DECODE_RAW(var, f,c) \
1446 if (f->valid_bits < FL_STB_VORBIS_FAST_HUFFMAN_LENGTH) \
1448 var = f->acc & FL_STBV_FAST_HUFFMAN_TABLE_MASK; \
1449 var = c->fast_huffman[var]; \
1451 int32_t n = c->codeword_lengths[var]; \
1453 f->valid_bits -= n; \
1454 if (f->valid_bits < 0) { f->valid_bits = 0; var = -1; } \
1456 var = codebook_decode_scalar_raw(f,c); \
1461static int32_t codebook_decode_scalar(
vorb *f, Codebook *c)
1468 i = c->fast_huffman[i];
1470 f->acc >>= c->codeword_lengths[i];
1471 f->valid_bits -= c->codeword_lengths[i];
1472 if (f->valid_bits < 0) { f->valid_bits = 0;
return -1; }
1478#define FL_STBV_DECODE_RAW(var,f,c) var = codebook_decode_scalar(f,c);
1482#define FL_STBV_DECODE(var,f,c) \
1483 FL_STBV_DECODE_RAW(var,f,c) \
1484 if (c->sparse) var = c->sorted_values[var];
1486#ifndef FL_STB_VORBIS_DIVIDES_IN_CODEBOOK
1487 #define FL_STBV_DECODE_VQ(var,f,c) FL_STBV_DECODE_RAW(var,f,c)
1489 #define FL_STBV_DECODE_VQ(var,f,c) FL_STBV_DECODE(var,f,c)
1499#define FL_STBV_CODEBOOK_ELEMENT(c,off) (c->multiplicands[off])
1500#define FL_STBV_CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off])
1501#define FL_STBV_CODEBOOK_ELEMENT_BASE(c) (0)
1508 if (c->lookup_type == 0)
1512 if (c->sparse)
FL_ASSERT(
z < c->sorted_entries,
"z must be < sorted_entries");
1514 if (!f->bytes_in_seg)
1526 if (
z < 0)
return false;
1527 if (len > c->dimensions) len = c->dimensions;
1529#ifdef FL_STB_VORBIS_DIVIDES_IN_CODEBOOK
1530 if (c->lookup_type == 1) {
1533 for (i=0; i < len; ++i) {
1534 int32_t off = (
z / div) % c->lookup_values;
1537 if (c->sequence_p) last = val + c->minimum_value;
1538 div *= c->lookup_values;
1545 if (c->sequence_p) {
1547 for (i=0; i < len; ++i) {
1550 last = val + c->minimum_value;
1554 for (i=0; i < len; ++i) {
1566 if (
z < 0)
return false;
1567 if (len > c->dimensions) len = c->dimensions;
1569#ifdef FL_STB_VORBIS_DIVIDES_IN_CODEBOOK
1570 if (c->lookup_type == 1) {
1572 for (i=0; i < len; ++i) {
1573 int32_t off = (
z / div) % c->lookup_values;
1575 output[i*
step] += val;
1576 if (c->sequence_p) last = val;
1577 div *= c->lookup_values;
1584 for (i=0; i < len; ++i) {
1586 output[i*
step] += val;
1587 if (c->sequence_p) last = val;
1597 int32_t i,
z, effective = c->dimensions;
1602 while (total_decode > 0) {
1605 #ifndef FL_STB_VORBIS_DIVIDES_IN_CODEBOOK
1606 FL_ASSERT(!c->sparse ||
z < c->sorted_entries,
"sparse codebook z must be < sorted_entries");
1609 if (!f->bytes_in_seg)
1610 if (f->last_seg)
return false;
1618 if (c_inter + p_inter*ch + effective > len * ch) {
1619 effective = len*ch - (p_inter*ch - c_inter);
1622 #ifdef FL_STB_VORBIS_DIVIDES_IN_CODEBOOK
1623 if (c->lookup_type == 1) {
1625 for (i=0; i < effective; ++i) {
1626 int32_t off = (
z / div) % c->lookup_values;
1628 if (outputs[c_inter])
1629 outputs[c_inter][p_inter] += val;
1630 if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1631 if (c->sequence_p) last = val;
1632 div *= c->lookup_values;
1638 if (c->sequence_p) {
1639 for (i=0; i < effective; ++i) {
1641 if (outputs[c_inter])
1642 outputs[c_inter][p_inter] += val;
1643 if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1647 for (i=0; i < effective; ++i) {
1649 if (outputs[c_inter])
1650 outputs[c_inter][p_inter] += val;
1651 if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1656 total_decode -= effective;
1658 *c_inter_p = c_inter;
1659 *p_inter_p = p_inter;
1670 return dy < 0 ? y0 - off : y0 + off;
1676 1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f,
1677 1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f,
1678 1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f,
1679 2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f,
1680 2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f,
1681 3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f,
1682 4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f,
1683 6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f,
1684 7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f,
1685 1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f,
1686 1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f,
1687 1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f,
1688 2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f,
1689 2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f,
1690 3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f,
1691 4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f,
1692 5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f,
1693 7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f,
1694 9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f,
1695 1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f,
1696 1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f,
1697 2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f,
1698 2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f,
1699 3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f,
1700 4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f,
1701 5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f,
1702 7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f,
1703 9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f,
1704 0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f,
1705 0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f,
1706 0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f,
1707 0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f,
1708 0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f,
1709 0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f,
1710 0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f,
1711 0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f,
1712 0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f,
1713 0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f,
1714 0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f,
1715 0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f,
1716 0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f,
1717 0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f,
1718 0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f,
1719 0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f,
1720 0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f,
1721 0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f,
1722 0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f,
1723 0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f,
1724 0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f,
1725 0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f,
1726 0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f,
1727 0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f,
1728 0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f,
1729 0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f,
1730 0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f,
1731 0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f,
1732 0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f,
1733 0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f,
1734 0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f,
1735 0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f,
1736 0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f,
1737 0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f,
1738 0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f,
1739 0.82788260f, 0.88168307f, 0.9389798f, 1.0f
1750#ifndef FL_STB_VORBIS_NO_DEFER_FLOOR
1751#define FL_STBV_LINE_OP(a,b) a *= b
1753#define FL_STBV_LINE_OP(a,b) a = b
1756#ifdef FL_STB_VORBIS_DIVIDE_TABLE
1772#ifdef FL_STB_VORBIS_DIVIDE_TABLE
1795 ady -=
abs(base) * adx;
1799 for (++
x;
x < x1; ++
x) {
1816 for (k=0; k <
step; ++k)
1820 for (k=0; k < n; ) {
1823 k += book->dimensions;
1824 offset += book->dimensions;
1835 Residue *r = f->residue_config + rn;
1836 int32_t rtype = f->residue_types[rn];
1838 int32_t classwords = f->codebooks[c].dimensions;
1839 uint32_t actual_size = rtype == 2 ? n*2 : n;
1841 uint32_t limit_r_end = (r->
end < actual_size ? r->
end : actual_size);
1842 int32_t n_read = limit_r_end - limit_r_begin;
1845 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1853 for (i=0; i < ch; ++i)
1854 if (!do_not_decode[i])
1855 memset(residue_buffers[i], 0,
sizeof(
float) * n);
1857 if (rtype == 2 && ch != 1) {
1858 for (j=0; j < ch; ++j)
1859 if (!do_not_decode[j])
1864 for (pass=0; pass < 8; ++pass) {
1867 while (
pcount < part_read) {
1869 int32_t c_inter = (
z & 1), p_inter =
z>>1;
1875 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1876 part_classdata[0][class_set] = r->
classdata[q];
1878 for (i=classwords-1; i >= 0; --i) {
1884 for (i=0; i < classwords &&
pcount < part_read; ++i, ++
pcount) {
1886 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1887 int32_t c = part_classdata[0][class_set][i];
1894 #ifdef FL_STB_VORBIS_DIVIDES_IN_CODEBOOK
1908 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1912 }
else if (ch > 2) {
1913 while (
pcount < part_read) {
1915 int32_t c_inter =
z % ch, p_inter =
z/ch;
1921 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1922 part_classdata[0][class_set] = r->
classdata[q];
1924 for (i=classwords-1; i >= 0; --i) {
1930 for (i=0; i < classwords &&
pcount < part_read; ++i, ++
pcount) {
1932 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1933 int32_t c = part_classdata[0][class_set][i];
1948 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1958 for (pass=0; pass < 8; ++pass) {
1960 while (
pcount < part_read) {
1962 for (j=0; j < ch; ++j) {
1963 if (!do_not_decode[j]) {
1968 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1969 part_classdata[j][class_set] = r->
classdata[temp];
1971 for (i=classwords-1; i >= 0; --i) {
1979 for (i=0; i < classwords &&
pcount < part_read; ++i, ++
pcount) {
1980 for (j=0; j < ch; ++j) {
1981 if (!do_not_decode[j]) {
1982 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
1983 int32_t c = part_classdata[j][class_set][i];
1989 float *target = residue_buffers[j];
1999 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
2006 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
2017void inverse_mdct_slow(
float *buffer,
int32_t n)
2022 memcpy(
x, buffer,
sizeof(*
x) * n2);
2023 for (i=0; i < n; ++i) {
2025 for (j=0; j < n2; ++j)
2033 acc +=
x[j] * (
float)
cos(
FL_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1));
2044 int32_t n2 = n >> 1, nmask = (n << 2) -1;
2046 memcpy(
x, buffer,
sizeof(*
x) * n2);
2047 for (i=0; i < 4*n; ++i)
2048 mcos[i] = (
float)
cos(
FL_PI / 2 * i / n);
2050 for (i=0; i < n; ++i) {
2052 for (j=0; j < n2; ++j)
2053 acc +=
x[j] * mcos[(2 * i + 1 + n2)*(2*j+1) & nmask];
2061void dct_iv_slow(
float *buffer,
int32_t n)
2066 int32_t n2 = n >> 1, nmask = (n << 3) - 1;
2068 for (i=0; i < 8*n; ++i)
2069 mcos[i] = (
float)
cos(
FL_PI / 4 * i / n);
2070 for (i=0; i < n; ++i) {
2072 for (j=0; j < n; ++j)
2073 acc +=
x[j] * mcos[((2 * i + 1)*(2*j+1)) & nmask];
2080 int32_t i, n4 = n >> 2, n2 = n >> 1, n3_4 = n - n4;
2083 memcpy(temp, buffer, n2 *
sizeof(
float));
2084 dct_iv_slow(temp, n2);
2086 for (i=0; i < n4 ; ++i) buffer[i] = temp[i+n4];
2087 for ( ; i < n3_4; ++i) buffer[i] = -temp[n3_4 - i - 1];
2088 for ( ; i < n ; ++i) buffer[i] = -temp[i - n3_4];
2092#ifndef FL_STBV_LIBVORBIS_MDCT
2093#define FL_STBV_LIBVORBIS_MDCT 0
2096#if FL_STBV_LIBVORBIS_MDCT
2110extern void mdct_init(mdct_lookup *lookup,
int32_t n);
2111extern void mdct_clear(mdct_lookup *l);
2112extern void mdct_backward(mdct_lookup *
init,
float *in,
float *out);
2119 if (M1.n == n) M = &M1;
2120 else if (M2.n == n) M = &M2;
2121 else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; }
2123 if (M2.n) __asm
int 3;
2128 mdct_backward(M, buffer, buffer);
2138 float *ee0 = e + i_off;
2139 float *ee2 = ee0 + k_off;
2142 FL_ASSERT((n & 3) == 0,
"n must be multiple of 4");
2143 for (i=(n>>2); i > 0; --i) {
2144 float k00_20, k01_21;
2145 k00_20 = ee0[ 0] - ee2[ 0];
2146 k01_21 = ee0[-1] - ee2[-1];
2149 ee2[ 0] = k00_20 * A[0] - k01_21 * A[1];
2150 ee2[-1] = k01_21 * A[0] + k00_20 * A[1];
2153 k00_20 = ee0[-2] - ee2[-2];
2154 k01_21 = ee0[-3] - ee2[-3];
2157 ee2[-2] = k00_20 * A[0] - k01_21 * A[1];
2158 ee2[-3] = k01_21 * A[0] + k00_20 * A[1];
2161 k00_20 = ee0[-4] - ee2[-4];
2162 k01_21 = ee0[-5] - ee2[-5];
2165 ee2[-4] = k00_20 * A[0] - k01_21 * A[1];
2166 ee2[-5] = k01_21 * A[0] + k00_20 * A[1];
2169 k00_20 = ee0[-6] - ee2[-6];
2170 k01_21 = ee0[-7] - ee2[-7];
2173 ee2[-6] = k00_20 * A[0] - k01_21 * A[1];
2174 ee2[-7] = k01_21 * A[0] + k00_20 * A[1];
2184 float k00_20, k01_21;
2187 float *e2 = e0 + k_off;
2189 for (i=lim >> 2; i > 0; --i) {
2190 k00_20 = e0[-0] - e2[-0];
2191 k01_21 = e0[-1] - e2[-1];
2194 e2[-0] = (k00_20)*A[0] - (k01_21) * A[1];
2195 e2[-1] = (k01_21)*A[0] + (k00_20) * A[1];
2199 k00_20 = e0[-2] - e2[-2];
2200 k01_21 = e0[-3] - e2[-3];
2203 e2[-2] = (k00_20)*A[0] - (k01_21) * A[1];
2204 e2[-3] = (k01_21)*A[0] + (k00_20) * A[1];
2208 k00_20 = e0[-4] - e2[-4];
2209 k01_21 = e0[-5] - e2[-5];
2212 e2[-4] = (k00_20)*A[0] - (k01_21) * A[1];
2213 e2[-5] = (k01_21)*A[0] + (k00_20) * A[1];
2217 k00_20 = e0[-6] - e2[-6];
2218 k01_21 = e0[-7] - e2[-7];
2221 e2[-6] = (k00_20)*A[0] - (k01_21) * A[1];
2222 e2[-7] = (k01_21)*A[0] + (k00_20) * A[1];
2237 float aa2 = A[0+a_off];
2238 float aa3 = A[0+a_off+1];
2239 float aa4 = A[0+a_off*2+0];
2240 float aa5 = A[0+a_off*2+1];
2241 float aa6 = A[0+a_off*3+0];
2242 float aa7 = A[0+a_off*3+1];
2246 float *ee0 = e +i_off;
2247 float *ee2 = ee0+k_off;
2249 for (i=n; i > 0; --i) {
2250 k00 = ee0[ 0] - ee2[ 0];
2251 k11 = ee0[-1] - ee2[-1];
2252 ee0[ 0] = ee0[ 0] + ee2[ 0];
2253 ee0[-1] = ee0[-1] + ee2[-1];
2254 ee2[ 0] = (k00) * aa0 - (k11) * aa1;
2255 ee2[-1] = (k11) * aa0 + (k00) * aa1;
2257 k00 = ee0[-2] - ee2[-2];
2258 k11 = ee0[-3] - ee2[-3];
2259 ee0[-2] = ee0[-2] + ee2[-2];
2260 ee0[-3] = ee0[-3] + ee2[-3];
2261 ee2[-2] = (k00) * aa2 - (k11) * aa3;
2262 ee2[-3] = (k11) * aa2 + (k00) * aa3;
2264 k00 = ee0[-4] - ee2[-4];
2265 k11 = ee0[-5] - ee2[-5];
2266 ee0[-4] = ee0[-4] + ee2[-4];
2267 ee0[-5] = ee0[-5] + ee2[-5];
2268 ee2[-4] = (k00) * aa4 - (k11) * aa5;
2269 ee2[-5] = (k11) * aa4 + (k00) * aa5;
2271 k00 = ee0[-6] - ee2[-6];
2272 k11 = ee0[-7] - ee2[-7];
2273 ee0[-6] = ee0[-6] + ee2[-6];
2274 ee0[-7] = ee0[-7] + ee2[-7];
2275 ee2[-6] = (k00) * aa6 - (k11) * aa7;
2276 ee2[-7] = (k11) * aa6 + (k00) * aa7;
2285 float k00,k11,k22,k33;
2288 k00 =
z[ 0] -
z[-4];
2291 k22 =
z[-2] -
z[-6];
2298 k33 =
z[-3] -
z[-7];
2305 k11 =
z[-1] -
z[-5];
2319 float aa2 = A[0+a_off];
2320 float *
z = e + i_off;
2321 float *base =
z - 16 * n;
2327 k00 =
z[-0] -
z[ -8];
2328 k11 =
z[-1] -
z[ -9];
2329 l00 =
z[-2] -
z[-10];
2330 l11 =
z[-3] -
z[-11];
2331 z[ -0] =
z[-0] +
z[ -8];
2332 z[ -1] =
z[-1] +
z[ -9];
2333 z[ -2] =
z[-2] +
z[-10];
2334 z[ -3] =
z[-3] +
z[-11];
2337 z[-10] = (l00+l11) * aa2;
2338 z[-11] = (l11-l00) * aa2;
2340 k00 =
z[ -4] -
z[-12];
2341 k11 =
z[ -5] -
z[-13];
2342 l00 =
z[ -6] -
z[-14];
2343 l11 =
z[ -7] -
z[-15];
2344 z[ -4] =
z[ -4] +
z[-12];
2345 z[ -5] =
z[ -5] +
z[-13];
2346 z[ -6] =
z[ -6] +
z[-14];
2347 z[ -7] =
z[ -7] +
z[-15];
2350 z[-14] = (l11-l00) * aa2;
2351 z[-15] = (l00+l11) * -aa2;
2361 int32_t n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l;
2366 float *u=
nullptr,*v=
nullptr;
2368 float *A = f->A[blocktype];
2390 float *d,*e, *AA, *e_stop;
2394 e_stop = &buffer[n2];
2395 while (e != e_stop) {
2396 d[1] = (e[0] * AA[0] - e[2]*AA[1]);
2397 d[0] = (e[0] * AA[1] + e[2]*AA[0]);
2405 d[1] = (-e[2] * AA[0] - -e[0]*AA[1]);
2406 d[0] = (-e[2] * AA[1] + -e[0]*AA[0]);
2424 float *AA = &A[n2-8];
2425 float *d0,*d1, *e0, *e1;
2434 float v40_20, v41_21;
2436 v41_21 = e0[1] - e1[1];
2437 v40_20 = e0[0] - e1[0];
2438 d0[1] = e0[1] + e1[1];
2439 d0[0] = e0[0] + e1[0];
2440 d1[1] = v41_21*AA[4] - v40_20*AA[5];
2441 d1[0] = v40_20*AA[4] + v41_21*AA[5];
2443 v41_21 = e0[3] - e1[3];
2444 v40_20 = e0[2] - e1[2];
2445 d0[3] = e0[3] + e1[3];
2446 d0[2] = e0[2] + e1[2];
2447 d1[3] = v41_21*AA[0] - v40_20*AA[1];
2448 d1[2] = v40_20*AA[0] + v41_21*AA[1];
2480 for (; l < (ld-3)>>1; ++l) {
2481 int32_t k0 = n >> (l+2), k0_2 = k0>>1;
2484 for (i=0; i < lim; ++i)
2488 for (; l < ld-6; ++l) {
2489 int32_t k0 = n >> (l+2), k1 = 1 << (l+3), k0_2 = k0>>1;
2495 for (r=rlim; r > 0; --r) {
2514 uint16 *bitrev = f->bit_reverse[blocktype];
2520 float *d0 = &v[n4-4];
2521 float *d1 = &v[n2-4];
2546 FL_ASSERT(v == buf2,
"v must equal buf2");
2551 float *
C = f->C[blocktype];
2558 float a02,a11,b0,b1,b2,b3;
2563 b0 =
C[1]*a02 +
C[0]*a11;
2564 b1 =
C[1]*a11 -
C[0]*a02;
2577 b0 =
C[3]*a02 +
C[2]*a11;
2578 b1 =
C[3]*a11 -
C[2]*a02;
2605 float *d0,*d1,*d2,*d3;
2607 float *
B = f->B[blocktype] + n2 - 8;
2608 float *e = buf2 + n2 - 8;
2616 p3 = e[6]*
B[7] - e[7]*
B[6];
2617 p2 = -e[6]*
B[6] - e[7]*
B[7];
2624 p1 = e[4]*
B[5] - e[5]*
B[4];
2625 p0 = -e[4]*
B[4] - e[5]*
B[5];
2632 p3 = e[2]*
B[3] - e[3]*
B[2];
2633 p2 = -e[2]*
B[2] - e[3]*
B[3];
2640 p1 = e[0]*
B[1] - e[1]*
B[0];
2641 p0 = -e[0]*
B[0] - e[1]*
B[1];
2663void inverse_mdct_naive(
float *buffer,
int32_t n)
2666 float A[1 << 12],
B[1 << 12],
C[1 << 11];
2667 int32_t i,k,k2,k4, n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l;
2671 float u[1 << 13], X[1 << 13], v[1 << 13], w[1 << 13];
2674 for (k=k2=0; k < n4; ++k,k2+=2) {
2676 A[k2+1] = (float) -
sin(4*k*
FL_PI/n);
2678 B[k2+1] = (float)
sin((k2+1)*
FL_PI/n/2);
2680 for (k=k2=0; k < n8; ++k,k2+=2) {
2682 C[k2+1] = (float) -
sin(2*(k2+1)*
FL_PI/n);
2693 for (k=0; k < n2; ++k) u[k] = buffer[k];
2694 for ( ; k < n ; ++k) u[k] = -buffer[n - k - 1];
2697 for (k=k2=k4=0; k < n4; k+=1, k2+=2, k4+=4) {
2698 v[n-k4-1] = (u[k4] - u[n-k4-1]) * A[k2] - (u[k4+2] - u[n-k4-3])*A[k2+1];
2699 v[n-k4-3] = (u[k4] - u[n-k4-1]) * A[k2+1] + (u[k4+2] - u[n-k4-3])*A[k2];
2702 for (k=k4=0; k < n8; k+=1, k4+=4) {
2703 w[n2+3+k4] = v[n2+3+k4] + v[k4+3];
2704 w[n2+1+k4] = v[n2+1+k4] + v[k4+1];
2705 w[k4+3] = (v[n2+3+k4] - v[k4+3])*A[n2-4-k4] - (v[n2+1+k4]-v[k4+1])*A[n2-3-k4];
2706 w[k4+1] = (v[n2+1+k4] - v[k4+1])*A[n2-4-k4] + (v[n2+3+k4]-v[k4+3])*A[n2-3-k4];
2710 for (l=0; l < ld-3; ++l) {
2711 int32_t k0 = n >> (l+2), k1 = 1 << (l+3);
2712 int32_t rlim = n >> (l+4), r4, r;
2713 int32_t s2lim = 1 << (l+2), s2;
2714 for (r=r4=0; r < rlim; r4+=4,++r) {
2715 for (s2=0; s2 < s2lim; s2+=2) {
2716 u[n-1-k0*s2-r4] = w[n-1-k0*s2-r4] + w[n-1-k0*(s2+1)-r4];
2717 u[n-3-k0*s2-r4] = w[n-3-k0*s2-r4] + w[n-3-k0*(s2+1)-r4];
2718 u[n-1-k0*(s2+1)-r4] = (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1]
2719 - (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1+1];
2720 u[n-3-k0*(s2+1)-r4] = (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1]
2721 + (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1+1];
2731 for (i=0; i < n8; ++i) {
2744 v[j8+1] = u[
i8+1], v[
i8+1] = u[j8 + 1];
2745 v[j8+3] = u[
i8+3], v[
i8+3] = u[j8 + 3];
2746 v[j8+5] = u[
i8+5], v[
i8+5] = u[j8 + 5];
2747 v[j8+7] = u[
i8+7], v[
i8+7] = u[j8 + 7];
2751 for (k=0; k < n2; ++k) {
2755 for (k=k2=k4=0; k < n8; ++k, k2 += 2, k4 += 4) {
2757 u[n-2-k2] = w[k4+1];
2758 u[n3_4 - 1 - k2] = w[k4+2];
2759 u[n3_4 - 2 - k2] = w[k4+3];
2762 for (k=k2=0; k < n8; ++k, k2 += 2) {
2763 v[n2 + k2 ] = ( u[n2 + k2] + u[n-2-k2] +
C[k2+1]*(u[n2+k2]-u[n-2-k2]) +
C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2;
2764 v[n-2 - k2] = ( u[n2 + k2] + u[n-2-k2] -
C[k2+1]*(u[n2+k2]-u[n-2-k2]) -
C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2;
2765 v[n2+1+ k2] = ( u[n2+1+k2] - u[n-1-k2] +
C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) -
C[k2]*(u[n2+k2]-u[n-2-k2]))/2;
2766 v[n-1 - k2] = (-u[n2+1+k2] + u[n-1-k2] +
C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) -
C[k2]*(u[n2+k2]-u[n-2-k2]))/2;
2769 for (k=k2=0; k < n4; ++k,k2 += 2) {
2770 X[k] = v[k2+n2]*
B[k2 ] + v[k2+1+n2]*
B[k2+1];
2771 X[n2-1-k] = v[k2+n2]*
B[k2+1] - v[k2+1+n2]*
B[k2 ];
2783 for (i=0; i < n4 ; ++i) buffer[i] = s * X[i+n4];
2784 for ( ; i < n3_4; ++i) buffer[i] = -s * X[n3_4 - i - 1];
2785 for ( ; i < n ; ++i) buffer[i] = -s * X[i - n3_4];
2792 if (len == f->blocksize_0)
return f->window[0];
2793 if (len == f->blocksize_1)
return f->window[1];
2797#ifndef FL_STB_VORBIS_NO_DEFER_FLOOR
2807 if (f->floor_types[
floor] == 0) {
2813 for (q=1; q < g->
values; ++q) {
2815 #ifndef FL_STB_VORBIS_NO_DEFER_FLOOR
2832 for (j=lx; j < n2; ++j)
2857 int32_t i, n, prev, next, window_center;
2858 f->channel_buffer_start = f->channel_buffer_end = 0;
2861 if (f->eof)
return false;
2872 if (f->alloc.alloc_buffer)
2873 FL_ASSERT(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset,
"alloc_buffer_length must equal temp_offset");
2876 if (i ==
EOP)
return false;
2877 if (i >= f->mode_count)
return false;
2879 m = f->mode_config + i;
2891 window_center = n >> 1;
2893 *p_left_start = (n - f->blocksize_0) >> 2;
2894 *p_left_end = (n + f->blocksize_0) >> 2;
2897 *p_left_end = window_center;
2900 *p_right_start = (n*3 - f->blocksize_0) >> 2;
2901 *p_right_end = (n*3 + f->blocksize_0) >> 2;
2903 *p_right_start = window_center;
2915 int32_t really_zero_channel[256];
2920 n = f->blocksize[m->blockflag];
2921 map = &f->mapping[m->mapping];
2928 for (i=0; i < f->channels; ++i) {
2930 zero_channel[i] =
false;
2932 if (f->floor_types[
floor] == 0) {
2938 uint8 step2_flag[256];
2939 static int32_t range_list[4] = { 256, 128, 86, 64 };
2942 finalY = f->finalY[i];
2949 int32_t csub = (1 << cbits)-1;
2955 for (k=0; k < cdim; ++k) {
2957 cval = cval >> cbits;
2968 step2_flag[0] = step2_flag[1] = 1;
2969 for (j=2; j < g->
values; ++j) {
2970 int32_t low, high, pred, highroom, lowroom, room, val;
2976 highroom = range - pred;
2978 if (highroom < lowroom)
2979 room = highroom * 2;
2983 step2_flag[low] = step2_flag[high] = 1;
2986 if (highroom > lowroom)
2987 finalY[j] = val - lowroom + pred;
2989 finalY[j] = pred - val + highroom - 1;
2992 finalY[j] = pred - ((val+1)>>1);
2994 finalY[j] = pred + (val>>1);
3001#ifdef FL_STB_VORBIS_NO_DEFER_FLOOR
3002 do_floor(f,
map, i, n, f->floor_buffers[i], finalY, step2_flag);
3005 for (j=0; j < g->
values; ++j) {
3012 zero_channel[i] =
true;
3022 if (f->alloc.alloc_buffer)
3023 FL_ASSERT(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset,
"alloc_buffer_length must equal temp_offset");
3026 memcpy(really_zero_channel, zero_channel,
sizeof(really_zero_channel[0]) * f->channels);
3027 for (i=0; i <
map->coupling_steps; ++i)
3028 if (!zero_channel[
map->chan[i].magnitude] || !zero_channel[
map->chan[i].angle]) {
3029 zero_channel[
map->chan[i].magnitude] = zero_channel[
map->chan[i].angle] =
false;
3034 for (i=0; i <
map->submaps; ++i) {
3037 uint8 do_not_decode[256];
3039 for (j=0; j < f->channels; ++j) {
3040 if (
map->chan[j].mux == i) {
3041 if (zero_channel[j]) {
3042 do_not_decode[ch] =
true;
3043 residue_buffers[ch] =
nullptr;
3045 do_not_decode[ch] =
false;
3046 residue_buffers[ch] = f->channel_buffers[j];
3051 r =
map->submap_residue[i];
3055 if (f->alloc.alloc_buffer)
3056 FL_ASSERT(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset,
"alloc_buffer_length must equal temp_offset");
3060 for (i =
map->coupling_steps-1; i >= 0; --i) {
3062 float *m = f->channel_buffers[
map->chan[i].magnitude];
3063 float *a = f->channel_buffers[
map->chan[i].angle ];
3064 for (j=0; j < n2; ++j) {
3068 m2 = m[j], a2 = m[j] - a[j];
3070 a2 = m[j], m2 = m[j] + a[j];
3073 m2 = m[j], a2 = m[j] + a[j];
3075 a2 = m[j], m2 = m[j] - a[j];
3083#ifndef FL_STB_VORBIS_NO_DEFER_FLOOR
3084 for (i=0; i < f->channels; ++i) {
3085 if (really_zero_channel[i]) {
3086 memset(f->channel_buffers[i], 0,
sizeof(*f->channel_buffers[i]) * n2);
3088 do_floor(f,
map, i, n, f->channel_buffers[i], f->finalY[i],
nullptr);
3092 for (i=0; i < f->channels; ++i) {
3093 if (really_zero_channel[i]) {
3094 memset(f->channel_buffers[i], 0,
sizeof(*f->channel_buffers[i]) * n2);
3096 for (j=0; j < n2; ++j)
3097 f->channel_buffers[i][j] *= f->floor_buffers[i][j];
3104 for (i=0; i < f->channels; ++i)
3105 inverse_mdct(f->channel_buffers[i], n, f, m->blockflag);
3112 if (f->first_decode) {
3117 f->current_loc = 0u - n2;
3120 f->discard_samples_deferred = n - right_end;
3121 f->current_loc_valid =
true;
3122 f->first_decode =
false;
3123 }
else if (f->discard_samples_deferred) {
3124 if (f->discard_samples_deferred >= right_start - left_start) {
3125 f->discard_samples_deferred -= (right_start - left_start);
3126 left_start = right_start;
3127 *p_left = left_start;
3129 left_start += f->discard_samples_deferred;
3130 *p_left = left_start;
3131 f->discard_samples_deferred = 0;
3133 }
else if (f->previous_length == 0 && f->current_loc_valid) {
3143 if (f->last_seg_which == f->end_seg_with_known_loc) {
3146 uint32 current_end = f->known_loc_for_packet;
3148 if (current_end < f->current_loc + (right_end-left_start)) {
3149 if (current_end < f->current_loc) {
3153 *len = current_end - f->current_loc;
3156 if (*len > right_end) *len = right_end;
3157 f->current_loc += *len;
3165 f->current_loc = f->known_loc_for_packet - (n2-left_start);
3166 f->current_loc_valid =
true;
3168 if (f->current_loc_valid)
3169 f->current_loc += (right_start - left_start);
3171 if (f->alloc.alloc_buffer)
3172 FL_ASSERT(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset,
"alloc_buffer_length must equal temp_offset");
3181 int32_t mode, left_end, right_end;
3198 if (f->previous_length) {
3199 int32_t i,j, n = f->previous_length;
3201 if (w ==
nullptr)
return 0;
3202 for (i=0; i < f->channels; ++i) {
3203 for (j=0; j < n; ++j)
3204 f->channel_buffers[i][left+j] =
3205 f->channel_buffers[i][left+j]*w[ j] +
3206 f->previous_window[i][ j]*w[n-1-j];
3210 prev = f->previous_length;
3213 f->previous_length = len - right;
3221 for (i=0; i < f->channels; ++i)
3222 for (j=0; right+j < len; ++j)
3223 f->previous_window[i][j] = f->channel_buffers[i][right+j];
3232 if (len < right) right = len;
3234 f->samples_output += right-left;
3236 return right - left;
3241 int32_t len, right, left, res;
3248#ifndef FL_STB_VORBIS_NO_PUSHDATA_API
3259 int32_t s = f->next_seg, first =
true;
3260 uint8 *p = f->stream;
3263 for (; s < f->segment_count; ++s) {
3264 p += f->segments[s];
3265 if (f->segments[s] < 255)
3269 if (s == f->segment_count)
3284 if (f->previous_length)
3296 for (s=0; s < n; ++s) {
3314 int32_t len,i,j,k, max_submaps = 0;
3318 f->first_decode =
true;
3328 if (f->segments[0] != 30) {
3330 if (f->segments[0] == 64 &&
3331 getn(f, header, 6) &&
3362 f->blocksize_0 = 1 << log0;
3363 f->blocksize_1 = 1 << log1;
3388 f->vendor = (
char*)
setup_malloc(f,
sizeof(
char) * (len+1));
3390 for(i=0; i < len; ++i) {
3393 f->vendor[len] = (char)
'\0';
3396 f->comment_list =
nullptr;
3397 if (f->comment_list_length > 0)
3399 f->comment_list = (
char**)
setup_malloc(f,
sizeof(
char*) * (f->comment_list_length));
3403 for(i=0; i < f->comment_list_length; ++i) {
3405 f->comment_list[i] = (
char*)
setup_malloc(f,
sizeof(
char) * (len+1));
3408 for(j=0; j < len; ++j) {
3411 f->comment_list[i][len] = (char)
'\0';
3418 skip(f, f->bytes_in_seg);
3419 f->bytes_in_seg = 0;
3424 f->bytes_in_seg = 0;
3431 #ifndef FL_STB_VORBIS_NO_PUSHDATA_API
3451 f->codebook_count =
get_bits(f,8) + 1;
3455 memset(f->codebooks, 0,
sizeof(*f->codebooks) * f->codebook_count);
3456 for (i=0; i < f->codebook_count; ++i) {
3459 int32_t ordered, sorted_count;
3492 while (current_entry < c->entries) {
3493 if (++loop_counter > 100000) {
3508 for (j=0; j < c->
entries; ++j) {
3525 f->setup_temp_memory_required = c->
entries;
3537 sorted_count = total;
3540 #ifndef FL_STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH
3541 for (j=0; j < c->
entries; ++j)
3565 if (size > f->setup_temp_memory_required)
3566 f->setup_temp_memory_required = size;
3628#ifndef FL_STB_VORBIS_DIVIDES_IN_CODEBOOK
3640 for (j=0; j < len; ++j) {
3674#ifndef FL_STB_VORBIS_DIVIDES_IN_CODEBOOK
3687 for (i=0; i <
x; ++i) {
3694 f->floor_config = (
Floor *)
setup_malloc(f, f->floor_count *
sizeof(*f->floor_config));
3696 for (i=0; i < f->floor_count; ++i) {
3697 f->floor_types[i] =
get_bits(f, 16);
3699 if (f->floor_types[i] == 0) {
3700 Floor0 *g = &f->floor_config[i].floor0;
3712 Floor1 *g = &f->floor_config[i].floor1;
3720 for (j=0; j <= max_class; ++j) {
3745 for (j=0; j < g->
values; ++j) {
3750 for (j=0; j < g->
values-1; ++j)
3751 if (p[j].
x == p[j+1].
x)
3753 for (j=0; j < g->
values; ++j)
3756 for (j=2; j < g->
values; ++j) {
3763 if (g->
values > longest_floorlist)
3764 longest_floorlist = g->
values;
3769 f->residue_count =
get_bits(f, 6)+1;
3770 f->residue_config = (
Residue *)
setup_malloc(f, f->residue_count *
sizeof(f->residue_config[0]));
3772 memset(f->residue_config, 0, f->residue_count *
sizeof(f->residue_config[0]));
3773 for (i=0; i < f->residue_count; ++i) {
3774 uint8 residue_cascade[64];
3775 Residue *r = f->residue_config+i;
3776 f->residue_types[i] =
get_bits(f, 16);
3790 residue_cascade[j] = high_bits*8 + low_bits;
3795 for (k=0; k < 8; ++k) {
3796 if (residue_cascade[j] & (1 << k)) {
3809 for (j=0; j < f->codebooks[r->
classbook].entries; ++j) {
3814 for (k=classwords-1; k >= 0; --k) {
3821 f->mapping_count =
get_bits(f,6)+1;
3824 memset(f->mapping, 0, f->mapping_count *
sizeof(*f->mapping));
3825 for (i=0; i < f->mapping_count; ++i) {
3853 for (j=0; j < f->channels; ++j) {
3859 for (j=0; j < f->channels; ++j)
3862 for (j=0; j < m->
submaps; ++j) {
3873 for (i=0; i < f->mode_count; ++i) {
3874 Mode *m = f->mode_config+i;
3886 f->previous_length = 0;
3888 for (i=0; i < f->channels; ++i) {
3889 f->channel_buffers[i] = (
float *)
setup_malloc(f,
sizeof(
float) * f->blocksize_1);
3890 f->previous_window[i] = (
float *)
setup_malloc(f,
sizeof(
float) * f->blocksize_1/2);
3892 if (f->channel_buffers[i] ==
nullptr || f->previous_window[i] ==
nullptr || f->finalY[i] ==
nullptr)
return error(f,
VORBIS_outofmem);
3893 memset(f->channel_buffers[i], 0,
sizeof(
float) * f->blocksize_1);
3894 #ifdef FL_STB_VORBIS_NO_DEFER_FLOOR
3895 f->floor_buffers[i] = (
float *)
setup_malloc(f,
sizeof(
float) * f->blocksize_1/2);
3902 f->blocksize[0] = f->blocksize_0;
3903 f->blocksize[1] = f->blocksize_1;
3905#ifdef FL_STB_VORBIS_DIVIDE_TABLE
3916 uint32 imdct_mem = (f->blocksize_1 *
sizeof(float) >> 1);
3919 for (i=0; i < f->residue_count; ++i) {
3920 Residue *r = f->residue_config + i;
3921 uint32_t actual_size = f->blocksize_1 / 2;
3923 uint32_t limit_r_end = r->
end < actual_size ? r->
end : actual_size;
3924 int32_t n_read = limit_r_end - limit_r_begin;
3926 if (part_read > max_part_read)
3927 max_part_read = part_read;
3929 #ifndef FL_STB_VORBIS_DIVIDES_IN_RESIDUE
3930 classify_mem = f->channels * (
sizeof(
void*) + max_part_read *
sizeof(
uint8 *));
3932 classify_mem = f->channels * (
sizeof(
void*) + max_part_read *
sizeof(
int32_t*));
3937 f->temp_memory_required = classify_mem;
3938 if (imdct_mem > f->temp_memory_required)
3939 f->temp_memory_required = imdct_mem;
3943 if (f->alloc.alloc_buffer) {
3944 FL_ASSERT(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes,
"temp_offset must equal alloc_buffer_length");
3946 if (f->setup_offset +
sizeof(*f) + f->temp_memory_required > (
unsigned) f->temp_offset)
3956 if (f->next_seg == -1) {
3959 f->first_audio_page_offset = 0;
3971 for (i=0; i < p->comment_list_length; ++i) {
3976 if (p->residue_config) {
3977 for (i=0; i < p->residue_count; ++i) {
3978 Residue *r = p->residue_config+i;
3980 for (j=0; j < p->codebooks[r->
classbook].entries; ++j)
3990 for (i=0; i < p->codebook_count; ++i) {
4004 for (i=0; i < p->mapping_count; ++i)
4012 #ifdef FL_STB_VORBIS_NO_DEFER_FLOOR
4017 for (i=0; i < 2; ++i) {
4024 #ifndef FL_STB_VORBIS_NO_STDIO
4031 if (p ==
nullptr)
return;
4038 memset(p, 0,
sizeof(*p));
4041 p->alloc.alloc_buffer_length_in_bytes &= ~7;
4042 p->temp_offset = p->alloc.alloc_buffer_length_in_bytes;
4046 p->stream =
nullptr;
4047 p->codebooks =
nullptr;
4048 p->page_crc_tests = -1;
4049 #ifndef FL_STB_VORBIS_NO_STDIO
4050 p->close_on_free =
false;
4057 if (f->current_loc_valid)
4058 return f->current_loc;
4097#ifndef FL_STB_VORBIS_NO_PUSHDATA_API
4101 f->previous_length = 0;
4102 f->page_crc_tests = 0;
4103 f->discard_samples_deferred = 0;
4104 f->current_loc_valid =
false;
4105 f->first_decode =
false;
4106 f->samples_output = 0;
4107 f->channel_buffer_start = 0;
4108 f->channel_buffer_end = 0;
4114 for (i=0; i < f->page_crc_tests; ++i)
4115 f->scan[i].bytes_done = 0;
4120 if (data_len < 4)
return 0;
4123 for (i=0; i < data_len; ++i) {
4124 if (data[i] == 0x4f) {
4129 if (i+26 >= data_len || i+27+data[i+26] >= data_len) {
4136 len = 27 + data[i+26];
4137 for (j=0; j < data[i+26]; ++j)
4138 len += data[i+27+j];
4141 for (j=0; j < 22; ++j)
4144 for ( ; j < 26; ++j)
4147 n = f->page_crc_tests++;
4148 f->scan[n].bytes_left = len-j;
4149 f->scan[n].crc_so_far = crc;
4150 f->scan[n].goal_crc = data[i+22] + (data[i+23] << 8) + ((
uint32)data[i+24]<<16) + ((
uint32)data[i+25]<<24);
4153 if (data[i+27+data[i+26]-1] == 255)
4154 f->scan[n].sample_loc = ~0;
4156 f->scan[n].sample_loc = data[i+6] + (data[i+7] << 8) + ((
uint32)data[i+ 8]<<16) + ((
uint32)data[i+ 9]<<24);
4157 f->scan[n].bytes_done = i+j;
4166 for (i=0; i < f->page_crc_tests;) {
4169 int32_t n = f->scan[i].bytes_done;
4170 int32_t m = f->scan[i].bytes_left;
4171 if (m > data_len - n) m = data_len - n;
4173 crc = f->scan[i].crc_so_far;
4174 for (j=0; j < m; ++j)
4176 f->scan[i].bytes_left -= m;
4177 f->scan[i].crc_so_far = crc;
4178 if (f->scan[i].bytes_left == 0) {
4180 if (f->scan[i].crc_so_far == f->scan[i].goal_crc) {
4183 f->page_crc_tests = -1;
4184 f->previous_length = 0;
4186 f->current_loc = f->scan[i].sample_loc;
4188 f->current_loc_valid = f->current_loc != ~0U;
4192 f->scan[i] = f->scan[--f->page_crc_tests];
4215 if (f->page_crc_tests >= 0) {
4220 f->stream = (
uint8 *) data;
4221 f->stream_end = (
uint8 *) data + data_len;
4239 return (
int32_t) (f->stream - data);
4242 if (f->previous_length == 0) {
4249 return (
int32_t) (f->stream - data);
4263 for (i=0; i < f->channels; ++i)
4264 f->outputs[i] = f->channel_buffers[i] + left;
4268 *output = f->outputs;
4269 return (
int32_t) (f->stream - data);
4273 const unsigned char *data,
int32_t data_len,
4305 #ifndef FL_STB_VORBIS_NO_PUSHDATA_API
4306 if (f->push_mode)
return 0;
4309 #ifndef FL_STB_VORBIS_NO_STDIO
4314#ifndef FL_STB_VORBIS_NO_PULLDATA_API
4323 if (f->eof)
return 0;
4329 if (retry_loc - 25 > f->stream_len)
4332 for (i=1; i < 4; ++i)
4335 if (f->eof)
return 0;
4338 uint32 i, crc, goal, len;
4339 for (i=0; i < 4; ++i)
4342 header[i] =
get8(f);
4343 if (f->eof)
return 0;
4344 if (header[4] != 0)
goto invalid;
4345 goal = header[22] + (header[23] << 8) + ((
uint32)header[24]<<16) + ((
uint32)header[25]<<24);
4346 for (i=22; i < 26; ++i)
4349 for (i=0; i < 27; ++i)
4352 for (i=0; i < header[26]; ++i) {
4357 if (len && f->eof)
return 0;
4358 for (i=0; i < len; ++i)
4373 if (header[5] & 0x04)
4403 uint8 header[27], lacing[255];
4410 getn(f, header, 27);
4411 if (header[0] !=
'O' || header[1] !=
'g' || header[2] !=
'g' || header[3] !=
'S')
4413 getn(f, lacing, header[26]);
4417 for (i=0; i < header[26]; ++i)
4421 z->page_end =
z->page_start + 27 + header[26] + len;
4424 z->last_decoded_sample = header[6] + (header[7] << 8) + ((
uint32)header[8] << 16) + ((
uint32)header[9] << 24);
4438 if (limit_offset >= 65536 && limit_offset-65536 >= f->first_audio_page_offset)
4439 previous_safe = limit_offset - 65536;
4441 previous_safe = f->first_audio_page_offset;
4461 int32_t i, start_seg_with_known_loc, end_pos, page_start;
4462 uint32 delta, stream_length, padding, last_sample_limit;
4463 double offset = 0.0, bytes_per_sample = 0.0;
4474 padding = ((f->blocksize_1 - f->blocksize_0) >> 2);
4475 if (sample_number < padding)
4476 last_sample_limit = 0;
4478 last_sample_limit = sample_number - padding;
4493 if (f->current_loc > sample_number)
4504 if (delta <= 65536) {
4549 if (probe >= 2 || delta <= 65536)
4565 end_pos = f->end_seg_with_known_loc;
4566 FL_ASSERT(end_pos >= 0,
"end_pos must be >= 0");
4569 for (i = end_pos; i > 0; --i)
4570 if (f->segments[i-1] != 255)
4573 start_seg_with_known_loc = i;
4584 end_pos = f->segment_count - 1;
4588 f->current_loc_valid =
false;
4589 f->last_seg =
false;
4591 f->packet_bytes = 0;
4592 f->bytes_in_seg = 0;
4593 f->previous_length = 0;
4594 f->next_seg = start_seg_with_known_loc;
4596 for (i = 0; i < start_seg_with_known_loc; i++)
4597 skip(f, f->segments[i]);
4602 if (f->current_loc > sample_number)
4615 int32_t bits_read, bytes_read;
4621 bits_read = 1 +
ilog(f->mode_count-1);
4622 if (f->mode_config[*mode].blockflag)
4624 bytes_read = (bits_read + 7) / 8;
4626 f->bytes_in_seg += bytes_read;
4627 f->packet_bytes -= bytes_read;
4628 skip(f, -bytes_read);
4629 if (f->next_seg == -1)
4630 f->next_seg = f->segment_count - 1;
4640 uint32 max_frame_samples;
4648 FL_ASSERT(f->current_loc_valid,
"current_loc must be valid");
4649 FL_ASSERT(f->current_loc <= sample_number,
"current_loc must be <= sample_number");
4652 max_frame_samples = (f->blocksize_1*3 - f->blocksize_0) >> 2;
4653 while (f->current_loc < sample_number) {
4654 int32_t left_start, left_end, right_start, right_end, mode, frame_samples;
4658 frame_samples = right_start - left_start;
4659 if (f->current_loc + frame_samples > sample_number) {
4661 }
else if (f->current_loc + frame_samples + max_frame_samples > sample_number) {
4666 f->current_loc += frame_samples;
4667 f->previous_length = 0;
4682 if (sample_number != f->current_loc) {
4684 uint32 frame_start = f->current_loc;
4686 FL_ASSERT(sample_number > frame_start,
"sample_number must be > frame_start");
4687 FL_ASSERT(f->channel_buffer_start + (
int32_t) (sample_number-frame_start) <= f->channel_buffer_end,
"buffer bounds check");
4688 f->channel_buffer_start += (sample_number - frame_start);
4698 f->previous_length = 0;
4699 f->first_decode =
true;
4706 uint32_t restore_offset, previous_safe;
4710 if (!f->total_samples) {
4720 if (f->stream_len >= 65536 && f->stream_len-65536 >= f->first_audio_page_offset)
4721 previous_safe = f->stream_len - 65536;
4723 previous_safe = f->first_audio_page_offset;
4732 f->total_samples = 0xffffffff;
4756 getn(f, (
unsigned char *)header, 6);
4760 if (lo == 0xffffffff && hi == 0xffffffff) {
4767 f->total_samples = lo;
4769 f->p_last.page_start = last_page_loc;
4770 f->p_last.page_end =
end;
4771 f->p_last.last_decoded_sample = lo;
4776 return f->total_samples ==
SAMPLE_unknown ? 0 : f->total_samples;
4792 f->channel_buffer_start = f->channel_buffer_end = 0;
4797 for (i=0; i < f->channels; ++i)
4798 f->outputs[i] = f->channel_buffers[i] + left;
4800 f->channel_buffer_start = left;
4801 f->channel_buffer_end = left+len;
4804 if (output) *output = f->outputs;
4808#ifndef FL_STB_VORBIS_NO_STDIO
4844#if defined(_WIN32) && defined(__STDC_WANT_SECURE_LIB__)
4845 if (0 != fopen_s(&f, filename,
"rb"))
4893#ifndef FL_STB_VORBIS_NO_INTEGER_CONVERSION
4914#ifndef FL_STB_VORBIS_NO_FAST_SCALED_FLOAT
4920 #define FL_STBV_FASTDEF(x) float_conv x
4922 #define FL_STBV_MAGIC(SHIFT) (1.5f * (1L << (23-SHIFT)) + 0.5f/(1L << SHIFT))
4923 #define FL_STBV_ADDEND(SHIFT) (((int32_t)(150-SHIFT) << 23) + (1L << 22))
4924 #define FL_STBV_FAST_SCALED_FLOAT_TO_INT(temp,x,s) (temp.f = (x) + FL_STBV_MAGIC(s), temp.i - FL_STBV_ADDEND(s))
4925 #define fl_stbv_check_endianness()
4927 #define FL_STBV_FAST_SCALED_FLOAT_TO_INT(temp,x,s) ((int32_t) ((x) * (1L << (s))))
4928 #define fl_stbv_check_endianness()
4929 #define FL_STBV_FASTDEF(x)
4936 for (i=0; i < len; ++i) {
4939 if ((
uint32_t) (v + 32768) > 65535)
4940 v = v < 0 ? -32768 : 32767;
4947 constexpr int32_t STB_BUFFER_SIZE = 32;
4948 float buffer[STB_BUFFER_SIZE];
4949 int32_t i,j,o,n = STB_BUFFER_SIZE;
4951 for (o = 0; o < len; o += STB_BUFFER_SIZE) {
4952 memset(buffer, 0,
sizeof(buffer));
4953 if (o + n > len) n = len - o;
4954 for (j=0; j < num_c; ++j) {
4956 for (i=0; i < n; ++i)
4957 buffer[i] += data[j][d_offset+o+i];
4960 for (i=0; i < n; ++i) {
4963 if ((
uint32_t) (v + 32768) > 65535)
4964 v = v < 0 ? -32768 : 32767;
4972 constexpr int32_t STB_BUFFER_SIZE = 32;
4973 float buffer[STB_BUFFER_SIZE];
4974 int32_t i,j,o,n = STB_BUFFER_SIZE >> 1;
4977 for (o = 0; o < len; o += STB_BUFFER_SIZE >> 1) {
4980 memset(buffer, 0,
sizeof(buffer));
4981 if (o + n > len) n = len - o;
4982 for (j=0; j < num_c; ++j) {
4985 for (i=0; i < n; ++i) {
4986 buffer[i*2+0] += data[j][d_offset+o+i];
4987 buffer[i*2+1] += data[j][d_offset+o+i];
4990 for (i=0; i < n; ++i) {
4991 buffer[i*2+0] += data[j][d_offset+o+i];
4994 for (i=0; i < n; ++i) {
4995 buffer[i*2+1] += data[j][d_offset+o+i];
4999 for (i=0; i < (n<<1); ++i) {
5002 if ((
uint32_t) (v + 32768) > 65535)
5003 v = v < 0 ? -32768 : 32767;
5012 if (buf_c != data_c && buf_c <= 2 && data_c <= 6) {
5014 for (i=0; i < buf_c; ++i)
5015 compute_samples(channel_selector[buf_c][i], buffer[i]+b_offset, data_c, data, d_offset, samples);
5017 int32_t limit = buf_c < data_c ? buf_c : data_c;
5018 for (i=0; i < limit; ++i)
5019 copy_samples(buffer[i]+b_offset, data[i]+d_offset, samples);
5020 for ( ; i < buf_c; ++i)
5021 memset(buffer[i]+b_offset, 0,
sizeof(
short) * samples);
5027 float **output =
nullptr;
5029 if (len > num_samples) len = num_samples;
5039 if (buf_c != data_c && buf_c <= 2 && data_c <= 6) {
5040 FL_ASSERT(buf_c == 2,
"buf_c must be 2");
5041 for (i=0; i < buf_c; ++i)
5044 int32_t limit = buf_c < data_c ? buf_c : data_c;
5046 for (j=0; j < len; ++j) {
5047 for (i=0; i < limit; ++i) {
5049 float f = data[i][d_offset+j];
5051 if ((
uint32_t) (v + 32768) > 65535)
5052 v = v < 0 ? -32768 : 32767;
5055 for ( ; i < buf_c; ++i)
5068 if (len*num_c > num_shorts) len = num_shorts / num_c;
5080 int32_t k = f->channel_buffer_end - f->channel_buffer_start;
5081 if (n+k >= len) k = len - n;
5086 f->channel_buffer_start += k;
5087 if (n == len)
break;
5098 int32_t k = f->channel_buffer_end - f->channel_buffer_start;
5099 if (n+k >= len) k = len - n;
5103 f->channel_buffer_start += k;
5104 if (n == len)
break;
5110#ifndef FL_STB_VORBIS_NO_STDIO
5116 if (v ==
nullptr)
return -1;
5123 data = (
short *)
fl::malloc(total *
sizeof(*data));
5124 if (data ==
nullptr) {
5133 if (
offset + limit > total) {
5136 data2 = (
short *)
fl::realloc(data, total *
sizeof(*data));
5137 if (data2 ==
nullptr) {
5156 if (v ==
nullptr)
return -1;
5163 data = (
short *)
fl::malloc(total *
sizeof(*data));
5164 if (data ==
nullptr) {
5173 if (
offset + limit > total) {
5176 data2 = (
short *)
fl::realloc(data, total *
sizeof(*data));
5177 if (data2 ==
nullptr) {
5200 int32_t k = f->channel_buffer_end - f->channel_buffer_start;
5201 if (n+k >= len) k = len - n;
5202 for (j=0; j < k; ++j) {
5203 for (i=0; i <
z; ++i)
5204 *buffer++ = f->channel_buffers[i][f->channel_buffer_start+j];
5209 f->channel_buffer_start += k;
5224 while (n < num_samples) {
5226 int32_t k = f->channel_buffer_end - f->channel_buffer_start;
5227 if (n+k >= num_samples) k = num_samples - n;
5229 for (i=0; i <
z; ++i)
5230 memcpy(buffer[i]+n, f->channel_buffers[i]+f->channel_buffer_start,
sizeof(
float)*k);
5232 memset(buffer[i]+n, 0,
sizeof(
float) * k);
5235 f->channel_buffer_start += k;
5236 if (n == num_samples)
fl::UISlider scale("Scale", 4,.1, 4,.1)
#define FL_ASSERT(x, MSG)
static T & instance() FL_NOEXCEPT
fl::UISlider length("Length", 1.0f, 0.0f, 1.0f, 0.01f)
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
void * memcpy(void *dest, const void *src, size_t n) FL_NOEXCEPT
static void imdct_step3_inner_s_loop(int32_t n, float *e, int32_t i_off, int32_t k_off, float *A, int32_t a_off, int32_t k0) FL_NOEXCEPT
static void flush_packet(vorb *f) FL_NOEXCEPT
static void inverse_mdct(float *buffer, int32_t n, vorb *f, int32_t blocktype) FL_NOEXCEPT
static int32_t start_page(vorb *f) FL_NOEXCEPT
float stb_vorbis_stream_length_in_seconds(stb_vorbis *f) FL_NOEXCEPT
static int32_t ilog(int32 n) FL_NOEXCEPT
static void imdct_step3_iter0_loop(int32_t n, float *e, int32_t i_off, int32_t k_off, float *A) FL_NOEXCEPT
static constexpr int32_t INVALID_BITS
static int32_t predict_point(int32_t x, int32_t x0, int32_t x1, int32_t y0, int32_t y1) FL_NOEXCEPT
static constexpr int8_t PLAYBACK_LEFT
static int uint32_compare(const void *p, const void *q) FL_NOEXCEPT
static int8 channel_position[7][6]
static int32_t do_floor(vorb *f, Mapping *map, int32_t i, int32_t n, float *target, YTYPE *finalY, uint8 *step2_flag) FL_NOEXCEPT
static int32_t vorbis_decode_packet_rest(vorb *f, int32_t *len, Mode *m, int32_t left_start, int32_t left_end, int32_t right_start, int32_t right_end, int32_t *p_left) FL_NOEXCEPT
static int32_t error(vorb *f, enum STBVorbisError e) FL_NOEXCEPT
int8 integer_divide_table[DIVTAB_NUMER][DIVTAB_DENOM]
double ldexp(double value, int exp) FL_NOEXCEPT
static int32_t codebook_decode(vorb *f, Codebook *c, float *output, int32_t len) FL_NOEXCEPT
int32_t stb_vorbis_get_frame_short(stb_vorbis *f, int32_t num_c, short **buffer, int32_t num_samples) FL_NOEXCEPT
static constexpr int8_t PLAYBACK_RIGHT
static constexpr int8_t L
static constexpr uint8_t NO_CODE
static int32_t get_seek_page_info(stb_vorbis *f, ProbedPage *z) FL_NOEXCEPT
static void add_entry(Codebook *c, uint32 huff_code, int32_t symbol, int32_t count, int32_t len, uint32 *values) FL_NOEXCEPT
static constexpr int8_t PLAYBACK_MONO
static constexpr int8_t C
static void compute_twiddle_factors(int32_t n, float *A, float *B, float *C) FL_NOEXCEPT
static int32_t vorbis_search_for_page_pushdata(vorb *f, uint8 *data, int32_t data_len) FL_NOEXCEPT
static constexpr int32_t MAX_BLOCKSIZE
static int32_t residue_decode(vorb *f, Codebook *book, float *target, int32_t offset, int32_t n, int32_t rtype) FL_NOEXCEPT
static int32_t vorbis_pump_first_frame(stb_vorbis *f) FL_NOEXCEPT
static int32_t init_blocksize(vorb *f, int32_t b, int32_t n) FL_NOEXCEPT
static int32_t fl_stbv_temp_alloc_save_impl(vorb *f) FL_NOEXCEPT
stb_vorbis * stb_vorbis_open_filename(const char *filename, int32_t *error, const stb_vorbis_alloc *alloc)
static void * make_block_array(void *mem, int32_t count, int32_t size) FL_NOEXCEPT
static void setup_temp_free(vorb *f, void *p, int32_t sz) FL_NOEXCEPT
static void convert_channels_short_interleaved(int32_t buf_c, short *buffer, int32_t data_c, float **data, int32_t d_offset, int32_t len) FL_NOEXCEPT
static uint32 vorbis_find_page(stb_vorbis *f, uint32 *end, uint32 *last) FL_NOEXCEPT
static int32_t is_whole_packet_present(stb_vorbis *f) FL_NOEXCEPT
static uint8 ogg_page_header[4]
static constexpr uint8_t PAGEFLAG_last_page
static int32_t start_page_no_capturepattern(vorb *f) FL_NOEXCEPT
void * memset(void *s, int c, size_t n) FL_NOEXCEPT
int32_t stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int32_t channels, short *buffer, int32_t num_shorts) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type floor(T x) FL_NOEXCEPT
static void skip(vorb *z, int32_t n) FL_NOEXCEPT
FL_ALWAYS_INLINE void draw_line(float *output, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t n) FL_NOEXCEPT
int32_t stb_vorbis_seek_start(stb_vorbis *f) FL_NOEXCEPT
static int32_t vorbis_finish_frame(stb_vorbis *f, int32_t len, int32_t left, int32_t right) FL_NOEXCEPT
int32_t stb_vorbis_seek(stb_vorbis *f, uint32_t sample_number) FL_NOEXCEPT
int32_t stb_vorbis_get_frame_float(stb_vorbis *f, int32_t *channels, float ***output) FL_NOEXCEPT
static int32_t vorbis_decode_initial(vorb *f, int32_t *p_left_start, int32_t *p_left_end, int32_t *p_right_start, int32_t *p_right_end, int32_t *mode) FL_NOEXCEPT
stb_vorbis * stb_vorbis_open_pushdata(const unsigned char *data, int32_t data_len, int32_t *data_used, int32_t *error, const stb_vorbis_alloc *alloc) FL_NOEXCEPT
int memcmp(const void *s1, const void *s2, size_t n) FL_NOEXCEPT
stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f) FL_NOEXCEPT
static constexpr uint32_t SAMPLE_unknown
double log(double value) FL_NOEXCEPT
static constexpr int32_t EOP
uint32_t stb_vorbis_stream_length_in_samples(stb_vorbis *f) FL_NOEXCEPT
static float float32_unpack(uint32 x) FL_NOEXCEPT
static constexpr uint8_t PAGEFLAG_continued_packet
static int32_t vorbis_validate(uint8 *data) FL_NOEXCEPT
static constexpr int32_t DIVTAB_DENOM
static void * fl_stbv_temp_alloc_impl(vorb *f, int32_t size) FL_NOEXCEPT
static void crc32_init(void) FL_NOEXCEPT
static int32_t codebook_decode_deinterleave_repeat(vorb *f, Codebook *c, float **outputs, int32_t ch, int32_t *c_inter_p, int32_t *p_inter_p, int32_t len, int32_t total_decode) FL_NOEXCEPT
int32_t stb_vorbis_get_error(stb_vorbis *f) FL_NOEXCEPT
@ VORBIS_seek_without_length
@ VORBIS_invalid_api_mixing
@ VORBIS_file_open_failure
@ VORBIS_too_many_channels
@ VORBIS_continued_packet_flag_invalid
@ VORBIS_invalid_stream_structure_version
@ VORBIS_ogg_skeleton_not_supported
@ VORBIS_feature_not_supported
@ VORBIS_invalid_first_page
@ VORBIS_missing_capture_pattern
@ VORBIS_cant_find_last_page
static float inverse_db_table[256]
FL_ALWAYS_INLINE uint32 crc32_update(uint32 crc, uint8 byte) FL_NOEXCEPT
static constexpr int32_t DIVTAB_NUMER
static int32_t vorbis_decode_packet(vorb *f, int32_t *len, int32_t *p_left, int32_t *p_right) FL_NOEXCEPT
stb_vorbis * stb_vorbis_open_file_section(fl::FILE *file, int32_t close_on_free, int32_t *error, const stb_vorbis_alloc *alloc, uint32_t length)
stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int32_t len, int32_t *error, const stb_vorbis_alloc *alloc) FL_NOEXCEPT
static constexpr int8_t R
static int32_t getn(vorb *z, uint8 *data, int32_t n) FL_NOEXCEPT
static uint8 get8(vorb *z) FL_NOEXCEPT
int32_t stb_vorbis_get_samples_float(stb_vorbis *f, int32_t channels, float **buffer, int32_t num_samples) FL_NOEXCEPT
enable_if< is_fixed_point< T >::value, T >::type pow(T base, T exp) FL_NOEXCEPT
static void * setup_malloc(vorb *f, int32_t sz) FL_NOEXCEPT
uint32_t stb_vorbis_get_file_offset(stb_vorbis *f) FL_NOEXCEPT
int32_t stb_vorbis_decode_filename(const char *filename, int32_t *channels, int32_t *sample_rate, short **output)
void stb_vorbis_close(stb_vorbis *p) FL_NOEXCEPT
static void compute_sorted_huffman(Codebook *c, uint8 *lengths, uint32 *values) FL_NOEXCEPT
void stb_vorbis_flush_pushdata(stb_vorbis *f) FL_NOEXCEPT
static int32_t lookup1_values(int32_t entries, int32_t dim) FL_NOEXCEPT
static void compute_window(int32_t n, float *window) FL_NOEXCEPT
int32_t stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int32_t channels, float *buffer, int32_t num_floats) FL_NOEXCEPT
int32_t stb_vorbis_decode_frame_pushdata(stb_vorbis *f, const uint8 *data, int32_t data_len, int32_t *channels, float ***output, int32_t *samples) FL_NOEXCEPT
static void vorbis_deinit(stb_vorbis *p) FL_NOEXCEPT
static int32_t set_file_offset(stb_vorbis *f, uint32_t loc) FL_NOEXCEPT
static int32_t codebook_decode_scalar_raw(vorb *f, Codebook *c) FL_NOEXCEPT
static int32_t get8_packet_raw(vorb *f) FL_NOEXCEPT
FL_ALWAYS_INLINE void iter_54(float *z) FL_NOEXCEPT
enable_if< is_fixed_point< T >::value, T >::type cos(T angle) FL_NOEXCEPT
static uint32_t bit_reverse(uint32_t n) FL_NOEXCEPT
static void compute_stereo_samples(short *output, int32_t num_c, float **data, int32_t d_offset, int32_t len) FL_NOEXCEPT
FL_ALWAYS_INLINE void prep_huffman(vorb *f) FL_NOEXCEPT
static void imdct_step3_inner_s_loop_ld654(int32_t n, float *e, int32_t i_off, float *A, int32_t base_n) FL_NOEXCEPT
static int32_t compute_codewords(Codebook *c, uint8 *len, int32_t n, uint32 *values) FL_NOEXCEPT
static void fl_stbv_temp_alloc_restore_impl(vorb *f, int32_t saved) FL_NOEXCEPT
static int32_t start_packet(vorb *f) FL_NOEXCEPT
static int32_t seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) FL_NOEXCEPT
static int32_t start_decoder(vorb *f) FL_NOEXCEPT
static void imdct_step3_inner_r_loop(int32_t lim, float *e, int32_t d0, int32_t k_off, float *A, int32_t k1) FL_NOEXCEPT
static void convert_samples_short(int32_t buf_c, short **buffer, int32_t b_offset, int32_t data_c, float **data, int32_t d_offset, int32_t samples) FL_NOEXCEPT
enable_if< is_fixed_point< T >::value, T >::type sin(T angle) FL_NOEXCEPT
static void compute_bitreverse(int32_t n, uint16 *rev) FL_NOEXCEPT
stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f) FL_NOEXCEPT
char stb_vorbis_float_size_test[sizeof(float)==4 &&sizeof(int32_t)==4]
static constexpr int32_t MAX_BLOCKSIZE_LOG
static int32_t maybe_start_packet(vorb *f) FL_NOEXCEPT
static int32_t codebook_decode_step(vorb *f, Codebook *c, float *output, int32_t len, int32_t step) FL_NOEXCEPT
static void neighbors(uint16 *x, int32_t n, int32_t *plow, int32_t *phigh) FL_NOEXCEPT
static void vorbis_init(stb_vorbis *p, const stb_vorbis_alloc *z) FL_NOEXCEPT
static float * get_window(vorb *f, int32_t len) FL_NOEXCEPT
static void decode_residue(vorb *f, float *residue_buffers[], int32_t ch, int32_t n, int32_t rn, uint8 *do_not_decode) FL_NOEXCEPT
int32_t stb_vorbis_seek_frame(stb_vorbis *f, uint32_t sample_number) FL_NOEXCEPT
static void * setup_temp_malloc(vorb *f, int32_t sz) FL_NOEXCEPT
static int32_t get32_packet(vorb *f) FL_NOEXCEPT
static int32_t include_in_sort(Codebook *c, uint8 len) FL_NOEXCEPT
static constexpr uint32_t CRC32_POLY
static StbvTempBuffer & get_stbv_temp_buffer() FL_NOEXCEPT
static int point_compare(const void *p, const void *q) FL_NOEXCEPT
static constexpr uint8_t PAGEFLAG_first_page
static uint32 get32(vorb *f) FL_NOEXCEPT
static uint32 get_bits(vorb *f, int32_t n) FL_NOEXCEPT
int32_t stb_vorbis_get_samples_short(stb_vorbis *f, int32_t channels, short **buffer, int32_t len) FL_NOEXCEPT
int32_t stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int32_t num_c, short *buffer, int32_t num_shorts) FL_NOEXCEPT
static stb_vorbis * vorbis_alloc(stb_vorbis *f) FL_NOEXCEPT
static uint32 crc_table[256]
static int32_t codebook_decode_start(vorb *f, Codebook *c) FL_NOEXCEPT
int32_t stb_vorbis_get_sample_offset(stb_vorbis *f) FL_NOEXCEPT
static void compute_accelerated_huffman(Codebook *c) FL_NOEXCEPT
stb_vorbis * stb_vorbis_open_file(fl::FILE *file, int32_t close_on_free, int32_t *error, const stb_vorbis_alloc *alloc)
enable_if< is_fixed_point< T >::value, T >::type exp(T x) FL_NOEXCEPT
static int32_t peek_decode_initial(vorb *f, int32_t *p_left_start, int32_t *p_left_end, int32_t *p_right_start, int32_t *p_right_end, int32_t *mode) FL_NOEXCEPT
static int32_t get8_packet(vorb *f) FL_NOEXCEPT
static void copy_samples(short *dest, float *src, int32_t len) FL_NOEXCEPT
static float square(float x) FL_NOEXCEPT
static void setup_free(vorb *f, void *p) FL_NOEXCEPT
static void compute_samples(int32_t mask, short *output, int32_t num_c, float **data, int32_t d_offset, int32_t len) FL_NOEXCEPT
int32_t stb_vorbis_decode_memory(const uint8 *mem, int32_t len, int32_t *channels, int32_t *sample_rate, short **output) FL_NOEXCEPT
static int32_t capture_pattern(vorb *f) FL_NOEXCEPT
static int32_t next_segment(vorb *f) FL_NOEXCEPT
static int32_t go_to_page_before(stb_vorbis *f, uint32_t limit_offset) FL_NOEXCEPT
uint32_t temp_memory_required
uint8 class_masterbooks[16]
int32_t comment_list_length
uint8 class_subclasses[16]
int32_t discard_samples_deferred
uint32 first_audio_page_offset
uint32 * sorted_codewords
int32_t current_loc_valid
enum STBVorbisError error
uint8 partition_class_list[32]
uint32_t setup_memory_required
uint32_t setup_temp_memory_required
uint8 neighbors[31 *8+2][2]
float * previous_window[FL_STB_VORBIS_MAX_CHANNELS]
int16(* residue_books)[8]
uint32 known_loc_for_packet
int32_t comment_list_length
uint32_t setup_memory_required
uint32_t temp_memory_required
int16 * finalY[FL_STB_VORBIS_MAX_CHANNELS]
int32_t channel_buffer_end
float * channel_buffers[FL_STB_VORBIS_MAX_CHANNELS]
uint8 sorted_order[31 *8+2]
CRCscan scan[FL_STB_VORBIS_PUSHDATA_CRC_COUNT]
uint32 last_decoded_sample
uint32_t setup_temp_memory_required
int32_t channel_buffer_start
float * outputs[FL_STB_VORBIS_MAX_CHANNELS]
int32_t end_seg_with_known_loc
int16 subclass_books[16][8]
uint8 class_dimensions[16]
int16 fast_huffman[FL_STBV_FAST_HUFFMAN_TABLE_SIZE]
void * memcpy(void *dest, const void *src, size_t n) FL_NOEXCEPT
int fseek(FILE *file, long offset, int origin)
Set file position.
double ldexp(double value, int exp) FL_NOEXCEPT
void init(Context &ctx, int w, int h)
MapRedBlackTree< Key, T, Compare, fl::allocator_slab< char > > map
FL_DISABLE_WARNING_PUSH unsigned char * B
constexpr T * end(T(&array)[N]) FL_NOEXCEPT
void * memset(void *s, int c, size_t n) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type floor(T x) FL_NOEXCEPT
int memcmp(const void *s1, const void *s2, size_t n) FL_NOEXCEPT
void qsort(void *base, size_t nmemb, size_t size, qsort_compare_fn compar)
constexpr enable_if< is_fixed_point< T >::value, int >::type sign(T x) FL_NOEXCEPT
double log(double value) FL_NOEXCEPT
void * malloc(size_t size)
FILE * fopen(const char *path, const char *mode)
Open a file.
enable_if< is_fixed_point< T >::value, T >::type pow(T base, T exp) FL_NOEXCEPT
fl::size_t fread(void *buffer, fl::size_t size, fl::size_t count, FILE *file)
Read from file.
enable_if< is_fixed_point< T >::value, T >::type cos(T angle) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type step(T edge, T x) FL_NOEXCEPT
int fclose(FILE *file)
Close a file.
void * realloc(void *ptr, size_t new_size)
enable_if< is_fixed_point< T >::value, T >::type sin(T angle) FL_NOEXCEPT
long ftell(FILE *file)
Get current file position.
enable_if< is_fixed_point< T >::value, T >::type exp(T x) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type abs(T x) FL_NOEXCEPT
Base definition for an LED controller.
#define fl_stbv_temp_free(f, p)
#define FL_STBV_DECODE(var, f, c)
#define fl_stbv_temp_alloc_save(f)
#define FL_STB_VORBIS_MAX_CHANNELS
#define FL_STBV_DECODE_VQ(var, f, c)
#define FL_STB_VORBIS_FAST_HUFFMAN_LENGTH
#define FL_STBV_LINE_OP(a, b)
#define FL_STBV_FAST_SCALED_FLOAT_TO_INT(temp, x, s)
#define FL_STBV_CODEBOOK_ELEMENT_BASE(c)
#define FL_STBV_FASTDEF(x)
#define fl_stbv_temp_alloc(f, size)
#define fl_stbv_temp_block_array(f, count, size)
#define FL_STBV_CODEBOOK_ELEMENT_FAST(c, off)
#define fl_stbv_check_endianness()
#define fl_stbv_temp_alloc_restore(f, p)
#define FL_STBV_USE_MEMORY(z)
#define FL_STBV_FAST_HUFFMAN_TABLE_SIZE
#define FL_STBV_IS_PUSH_MODE(f)
#define FL_STBV_FAST_HUFFMAN_TABLE_MASK
#define FL_STB_VORBIS_PUSHDATA_CRC_COUNT
static constexpr T max() FL_NOEXCEPT
void restore(int32_t saved_offset) FL_NOEXCEPT
int32_t save() const FL_NOEXCEPT
void * alloc(int32_t size) FL_NOEXCEPT
fl::vector< uint8_t > buffer