bool layer3DequantizeSample()

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;
  }