in pedalboard/juce_overrides/juce_PatchedMP3AudioFormat.cpp [2851:3156]
bool layer3DequantizeSample(float xr[32][18], int *scf,
Layer3SideInfo::Info &granule, int sampleRate,
int part2bits) noexcept {
const uint32 shift = 1 + granule.scaleFactorScale;
auto *xrpnt = (float *)xr;
auto part2remain = (int)granule.part2_3Length - part2bits;
zeromem(xrpnt, (size_t)(&xr[32][0] - xrpnt) * sizeof(float));
auto bv = (int)granule.bigValues;
auto region1 = (int)granule.region1Start;
auto region2 = (int)granule.region2Start;
int l3 = ((576 >> 1) - bv) >> 1;
int l[3];
if (bv <= region1) {
l[0] = bv;
l[1] = 0;
l[2] = 0;
} else {
l[0] = region1;
if (bv <= region2) {
l[1] = bv - l[0];
l[2] = 0;
} else {
l[1] = region2 - l[0];
l[2] = bv - region2;
}
}
for (int i = 0; i < 3; ++i)
if (l[i] < 0)
l[i] = 0;
if (granule.blockType == 2) {
int max[4];
int step = 0, lwin = 0, cb = 0, mc = 0;
float v = 0;
int *map;
int *mapEnd;
if (granule.mixedBlockFlag) {
max[3] = -1;
max[0] = max[1] = max[2] = 2;
map = constants.map[sampleRate][0];
mapEnd = constants.mapEnd[sampleRate][0];
} else {
max[0] = max[1] = max[2] = max[3] = -1;
map = constants.map[sampleRate][1];
mapEnd = constants.mapEnd[sampleRate][1];
}
for (int i = 0; i < 2; ++i) {
auto *h = huffmanTables1 + granule.tableSelect[i];
for (int lp = l[i]; lp != 0; --lp, --mc) {
int x, y;
if (mc == 0) {
mc = *map++;
xrpnt = ((float *)xr) + (*map++);
lwin = *map++;
cb = *map++;
if (lwin == 3) {
v = granule.pow2gain[(*scf++) << shift];
step = 1;
} else {
v = granule.fullGain[lwin][(*scf++) << shift];
step = 3;
}
}
auto *val = h->table;
while ((y = *val++) < 0) {
if (getOneBit())
val -= y;
--part2remain;
}
x = y >> 4;
y &= 15;
if (x == 15) {
max[lwin] = cb;
part2remain -= (int)(h->bits + 1);
x += (int)getBits((int)h->bits);
*xrpnt = constants.nToThe4Over3[x] * (getOneBit() ? -v : v);
} else if (x) {
max[lwin] = cb;
*xrpnt = constants.nToThe4Over3[x] * (getOneBit() ? -v : v);
--part2remain;
} else
*xrpnt = 0;
xrpnt += step;
if (y == 15) {
max[lwin] = cb;
part2remain -= (int)(h->bits + 1);
y += (int)getBits((int)h->bits);
*xrpnt = constants.nToThe4Over3[y] * (getOneBit() ? -v : v);
} else if (y) {
max[lwin] = cb;
*xrpnt = constants.nToThe4Over3[y] * (getOneBit() ? -v : v);
--part2remain;
} else
*xrpnt = 0;
xrpnt += step;
}
}
for (; l3 && (part2remain > 0); --l3) {
auto *h = huffmanTables2 + granule.count1TableSelect;
auto *val = h->table;
int16 a;
while ((a = *val++) < 0) {
if (part2remain <= 0) {
a = 0;
break;
}
--part2remain;
if (getOneBit())
val -= a;
}
for (int i = 0; i < 4; ++i) {
if ((i & 1) == 0) {
if (mc == 0) {
mc = *map++;
xrpnt = ((float *)xr) + (*map++);
lwin = *map++;
cb = *map++;
if (lwin == 3) {
v = granule.pow2gain[(*scf++) << shift];
step = 1;
} else {
v = granule.fullGain[lwin][(*scf++) << shift];
step = 3;
}
}
--mc;
}
if ((a & (8 >> i))) {
max[lwin] = cb;
if (part2remain == 0)
break;
--part2remain;
*xrpnt = getOneBit() ? -v : v;
} else
*xrpnt = 0;
xrpnt += step;
}
}
while (map < mapEnd) {
if (mc == 0) {
mc = *map++;
xrpnt = ((float *)xr) + *map++;
step = (*map++ == 3) ? 1 : 3;
++map;
}
--mc;
*xrpnt = 0;
xrpnt += step;
*xrpnt = 0;
xrpnt += step;
}
granule.maxBand[0] = (uint32)(max[0] + 1);
granule.maxBand[1] = (uint32)(max[1] + 1);
granule.maxBand[2] = (uint32)(max[2] + 1);
granule.maxBandl = (uint32)(max[3] + 1);
const int rmax = jmax(max[0], max[1], max[3]) + 1;
granule.maxb = rmax ? (uint32)constants.shortLimit[sampleRate][rmax]
: (uint32)constants.longLimit[sampleRate][max[3] + 1];
} else {
static const int pretab1[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0};
static const int pretab2[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
auto *pretab = (const int *)(granule.preflag ? pretab1 : pretab2);
int max = -1, cb = 0, mc = 0;
auto *map = constants.map[sampleRate][2];
float v = 0;
for (int i = 0; i < 3; ++i) {
auto *h = huffmanTables1 + granule.tableSelect[i];
for (int lp = l[i]; lp != 0; --lp, --mc) {
if (mc == 0) {
mc = *map++;
v = granule.pow2gain[((*scf++) + (*pretab++)) << shift];
cb = *map++;
}
auto *val = h->table;
int y;
while ((y = *val++) < 0) {
if (getOneBit())
val -= y;
--part2remain;
}
int x = y >> 4;
y &= 15;
if (x == 15) {
max = cb;
part2remain -= (int)(h->bits + 1);
x += (int)getBits((int)h->bits);
*xrpnt++ = constants.nToThe4Over3[x] * (getOneBit() ? -v : v);
} else if (x) {
max = cb;
*xrpnt++ = constants.nToThe4Over3[x] * (getOneBit() ? -v : v);
--part2remain;
} else
*xrpnt++ = 0;
if (y == 15) {
max = cb;
part2remain -= (int)(h->bits + 1);
y += (int)getBits((int)h->bits);
*xrpnt++ = constants.nToThe4Over3[y] * (getOneBit() ? -v : v);
} else if (y) {
max = cb;
*xrpnt++ = constants.nToThe4Over3[y] * (getOneBit() ? -v : v);
--part2remain;
} else
*xrpnt++ = 0;
}
}
for (; l3 && part2remain > 0; --l3) {
auto *h = huffmanTables2 + granule.count1TableSelect;
auto *values = h->table;
int16 a;
while ((a = *values++) < 0) {
if (part2remain <= 0) {
a = 0;
break;
}
--part2remain;
if (getOneBit())
values -= a;
}
for (int i = 0; i < 4; ++i) {
if ((i & 1) == 0) {
if (mc == 0) {
mc = *map++;
cb = *map++;
v = granule.pow2gain[((*scf++) + (*pretab++)) << shift];
}
--mc;
}
if ((a & (0x8 >> i))) {
max = cb;
if (part2remain <= 0)
break;
--part2remain;
*xrpnt++ = getOneBit() ? -v : v;
} else
*xrpnt++ = 0;
}
}
zeromem(xrpnt, (size_t)(&xr[32][0] - xrpnt) * sizeof(float));
granule.maxBandl = (uint32)(max + 1);
granule.maxb = (uint32)constants.longLimit[sampleRate][granule.maxBandl];
}
while (part2remain > 16) {
getBits(16);
part2remain -= 16;
}
if (part2remain > 0)
getBits(part2remain);
else if (part2remain < 0)
return true;
return false;
}