The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3178 lines
131KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2022 - Raw Material Software Limited
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 7 End-User License
  8. Agreement and JUCE Privacy Policy.
  9. End User License Agreement: www.juce.com/juce-7-licence
  10. Privacy Policy: www.juce.com/juce-privacy-policy
  11. Or: You may also use this code under the terms of the GPL v3 (see
  12. www.gnu.org/licenses).
  13. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  14. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  15. DISCLAIMED.
  16. ==============================================================================
  17. */
  18. namespace juce
  19. {
  20. /*
  21. IMPORTANT DISCLAIMER: By choosing to enable the JUCE_USE_MP3AUDIOFORMAT flag and
  22. to compile this MP3 code into your software, you do so AT YOUR OWN RISK! By doing so,
  23. you are agreeing that Raw Material Software Limited is in no way responsible for any patent,
  24. copyright, or other legal issues that you may suffer as a result.
  25. The code in juce_MP3AudioFormat.cpp is NOT guaranteed to be free from infringements of 3rd-party
  26. intellectual property. If you wish to use it, please seek your own independent advice about the
  27. legality of doing so. If you are not willing to accept full responsibility for the consequences
  28. of using this code, then do not enable the JUCE_USE_MP3AUDIOFORMAT setting.
  29. */
  30. #if JUCE_USE_MP3AUDIOFORMAT
  31. namespace MP3Decoder
  32. {
  33. struct AllocationTable
  34. {
  35. int16 bits, d;
  36. };
  37. constexpr AllocationTable allocTable0[] =
  38. {
  39. {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767},
  40. {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767},
  41. {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767},
  42. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  43. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  44. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  45. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  46. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  47. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  48. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  49. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  50. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  51. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  52. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  53. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  54. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  55. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  56. {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}
  57. };
  58. constexpr AllocationTable allocTable1[] =
  59. {
  60. {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767},
  61. {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767},
  62. {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767},
  63. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  64. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  65. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  66. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  67. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  68. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  69. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  70. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767},
  71. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  72. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  73. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  74. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  75. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  76. {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767},
  77. {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767},
  78. {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}
  79. };
  80. constexpr AllocationTable allocTable2[] =
  81. {
  82. {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383},
  83. {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383},
  84. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  85. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  86. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}
  87. };
  88. constexpr AllocationTable allocTable3[] =
  89. {
  90. {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383},
  91. {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383},
  92. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  93. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  94. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  95. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  96. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}
  97. };
  98. constexpr AllocationTable allocTable4[] =
  99. {
  100. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191},
  101. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191},
  102. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191},
  103. {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191},
  104. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  105. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  106. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63},
  107. {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9},
  108. {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9},
  109. {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9},
  110. {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9},
  111. {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9},
  112. {2, 0}, {5, 3}, {7, 5}, {10, 9}
  113. };
  114. struct BandInfoStruct
  115. {
  116. int16 longIndex[23];
  117. int16 longDiff[22];
  118. int16 shortIndex[14];
  119. int16 shortDiff[13];
  120. };
  121. constexpr BandInfoStruct bandInfo[9] =
  122. {
  123. { {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576},
  124. {4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158},
  125. {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 40 * 3, 52 * 3, 66 * 3, 84 * 3, 106 * 3, 136 * 3, 192 * 3},
  126. {4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56} },
  127. { {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576},
  128. {4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192},
  129. {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 28 * 3, 38 * 3, 50 * 3, 64 * 3, 80 * 3, 100 * 3, 126 * 3, 192 * 3},
  130. {4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66} },
  131. { {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576},
  132. {4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26},
  133. {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 42 * 3, 58 * 3, 78 * 3, 104 * 3, 138 * 3, 180 * 3, 192 * 3},
  134. {4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12} },
  135. { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
  136. {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 },
  137. {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 24 * 3, 32 * 3, 42 * 3, 56 * 3, 74 * 3, 100 * 3, 132 * 3, 174 * 3, 192 * 3},
  138. {4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18 } },
  139. { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576},
  140. {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 },
  141. {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3, 80 * 3, 104 * 3, 136 * 3, 180 * 3, 192 * 3},
  142. {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12 } },
  143. { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
  144. {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 },
  145. {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3, 80 * 3, 104 * 3, 134 * 3, 174 * 3, 192 * 3},
  146. {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 } },
  147. { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
  148. {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54},
  149. {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576},
  150. {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18} },
  151. { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
  152. {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54},
  153. {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576},
  154. {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18} },
  155. { {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576},
  156. {12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2},
  157. {0, 24, 48, 72, 108, 156, 216, 288, 372, 480, 486, 492, 498, 576},
  158. {8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26} }
  159. };
  160. constexpr double decodeWindow[] =
  161. {
  162. 0.000000000, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000030518,
  163. -0.000030518, -0.000030518, -0.000030518, -0.000045776, -0.000045776, -0.000061035, -0.000061035, -0.000076294,
  164. -0.000076294, -0.000091553, -0.000106812, -0.000106812, -0.000122070, -0.000137329, -0.000152588, -0.000167847,
  165. -0.000198364, -0.000213623, -0.000244141, -0.000259399, -0.000289917, -0.000320435, -0.000366211, -0.000396729,
  166. -0.000442505, -0.000473022, -0.000534058, -0.000579834, -0.000625610, -0.000686646, -0.000747681, -0.000808716,
  167. -0.000885010, -0.000961304, -0.001037598, -0.001113892, -0.001205444, -0.001296997, -0.001388550, -0.001480103,
  168. -0.001586914, -0.001693726, -0.001785278, -0.001907349, -0.002014160, -0.002120972, -0.002243042, -0.002349854,
  169. -0.002456665, -0.002578735, -0.002685547, -0.002792358, -0.002899170, -0.002990723, -0.003082275, -0.003173828,
  170. -0.003250122, -0.003326416, -0.003387451, -0.003433228, -0.003463745, -0.003479004, -0.003479004, -0.003463745,
  171. -0.003417969, -0.003372192, -0.003280640, -0.003173828, -0.003051758, -0.002883911, -0.002700806, -0.002487183,
  172. -0.002227783, -0.001937866, -0.001617432, -0.001266479, -0.000869751, -0.000442505, 0.000030518, 0.000549316,
  173. 0.001098633, 0.001693726, 0.002334595, 0.003005981, 0.003723145, 0.004486084, 0.005294800, 0.006118774,
  174. 0.007003784, 0.007919312, 0.008865356, 0.009841919, 0.010848999, 0.011886597, 0.012939453, 0.014022827,
  175. 0.015121460, 0.016235352, 0.017349243, 0.018463135, 0.019577026, 0.020690918, 0.021789551, 0.022857666,
  176. 0.023910522, 0.024932861, 0.025909424, 0.026840210, 0.027725220, 0.028533936, 0.029281616, 0.029937744,
  177. 0.030532837, 0.031005859, 0.031387329, 0.031661987, 0.031814575, 0.031845093, 0.031738281, 0.031478882,
  178. 0.031082153, 0.030517578, 0.029785156, 0.028884888, 0.027801514, 0.026535034, 0.025085449, 0.023422241,
  179. 0.021575928, 0.019531250, 0.017257690, 0.014801025, 0.012115479, 0.009231567, 0.006134033, 0.002822876,
  180. -0.000686646, -0.004394531, -0.008316040, -0.012420654, -0.016708374, -0.021179199, -0.025817871, -0.030609131,
  181. -0.035552979, -0.040634155, -0.045837402, -0.051132202, -0.056533813, -0.061996460, -0.067520142, -0.073059082,
  182. -0.078628540, -0.084182739, -0.089706421, -0.095169067, -0.100540161, -0.105819702, -0.110946655, -0.115921021,
  183. -0.120697021, -0.125259399, -0.129562378, -0.133590698, -0.137298584, -0.140670776, -0.143676758, -0.146255493,
  184. -0.148422241, -0.150115967, -0.151306152, -0.151962280, -0.152069092, -0.151596069, -0.150497437, -0.148773193,
  185. -0.146362305, -0.143264771, -0.139450073, -0.134887695, -0.129577637, -0.123474121, -0.116577148, -0.108856201,
  186. -0.100311279, -0.090927124, -0.080688477, -0.069595337, -0.057617187, -0.044784546, -0.031082153, -0.016510010,
  187. -0.001068115, 0.015228271, 0.032379150, 0.050354004, 0.069168091, 0.088775635, 0.109161377, 0.130310059,
  188. 0.152206421, 0.174789429, 0.198059082, 0.221984863, 0.246505737, 0.271591187, 0.297210693, 0.323318481,
  189. 0.349868774, 0.376800537, 0.404083252, 0.431655884, 0.459472656, 0.487472534, 0.515609741, 0.543823242,
  190. 0.572036743, 0.600219727, 0.628295898, 0.656219482, 0.683914185, 0.711318970, 0.738372803, 0.765029907,
  191. 0.791213989, 0.816864014, 0.841949463, 0.866363525, 0.890090942, 0.913055420, 0.935195923, 0.956481934,
  192. 0.976852417, 0.996246338, 1.014617920, 1.031936646, 1.048156738, 1.063217163, 1.077117920, 1.089782715,
  193. 1.101211548, 1.111373901, 1.120223999, 1.127746582, 1.133926392, 1.138763428, 1.142211914, 1.144287109,
  194. 1.144989014
  195. };
  196. constexpr int16 huffmanTab0[] = { 0 };
  197. constexpr int16 huffmanTab1[] = { -5,-3,-1,17,1,16,0 };
  198. constexpr int16 huffmanTab2[] = { -15,-11,-9,-5,-3,-1,34,2,18,-1,33,32,17,-1,1,16,0 };
  199. constexpr int16 huffmanTab3[] = { -13,-11,-9,-5,-3,-1,34,2,18,-1,33,32,16,17,-1,1,0 };
  200. constexpr int16 huffmanTab5[] = { -29,-25,-23,-15,-7,-5,-3,-1,51,35,50,49,-3,-1,19,3,-1,48,34,-3,-1,18,33,-1,2,32,17,-1,1,16,0 };
  201. constexpr int16 huffmanTab6[] = { -25,-19,-13,-9,-5,-3,-1,51,3,35,-1,50,48,-1,19,49,-3,-1,34,2,18,-3,-1,33,32,1,-1,17,-1,16,0 };
  202. constexpr int16 huffmanTab7[] =
  203. {
  204. -69,-65,-57,-39,-29,-17,-11,-7,-3,-1,85,69,-1,84,83,-1,53,68,-3,-1,37,82,21,-5,-1,81,-1,5,52,-1,80,-1,67,51,
  205. -5,-3,-1,36,66,20,-1,65,64,-11,-7,-3,-1,4,35,-1,50,3,-1,19,49,-3,-1,48,34,18,-5,-1,33,-1,2,32,17,-1,1,16,0
  206. };
  207. constexpr int16 huffmanTab8[] =
  208. {
  209. -65,-63,-59,-45,-31,-19,-13,-7,-5,-3,-1,85,84,69,83,-3,-1,53,68,37,-3,-1,82,5,21,-5,-1,81,-1,52,67,-3,-1,80,
  210. 51,36,-5,-3,-1,66,20,65,-3,-1,4,64,-1,35,50,-9,-7,-3,-1,19,49,-1,3,48,34,-1,2,32,-1,18,33,17,-3,-1,1,16,0
  211. };
  212. constexpr int16 huffmanTab9[] =
  213. {
  214. -63,-53,-41,-29,-19,-11,-5,-3,-1,85,69,53,-1,83,-1,84,5,-3,-1,68,37,-1,82,21,-3,-1,81,52,-1,67,-1,80,4,-7,-3,
  215. -1,36,66,-1,51,64,-1,20,65,-5,-3,-1,35,50,19,-1,49,-1,3,48,-5,-3,-1,34,2,18,-1,33,32,-3,-1,17,1,-1,16,0
  216. };
  217. constexpr int16 huffmanTab10[] =
  218. {
  219. -125,-121,-111,-83,-55,-35,-21,-13,-7,-3,-1,119,103,-1,118,87,-3,-1,117,102,71,-3,-1,116,86,-1,101,55,-9,-3,
  220. -1,115,70,-3,-1,85,84,99,-1,39,114,-11,-5,-3,-1,100,7,112,-1,98,-1,69,53,-5,-1,6,-1,83,68,23,-17,-5,-1,113,
  221. -1,54,38,-5,-3,-1,37,82,21,-1,81,-1,52,67,-3,-1,22,97,-1,96,-1,5,80,-19,-11,-7,-3,-1,36,66,-1,51,4,-1,20,
  222. 65,-3,-1,64,35,-1,50,3,-3,-1,19,49,-1,48,34,-7,-3,-1,18,33,-1,2,32,17,-1,1,16,0
  223. };
  224. constexpr int16 huffmanTab11[] =
  225. {
  226. -121,-113,-89,-59,-43,-27,-17,-7,-3,-1,119,103,-1,118,117,-3,-1,102,71,-1,116,-1,87,85,-5,-3,-1,86,101,55,
  227. -1,115,70,-9,-7,-3,-1,69,84,-1,53,83,39,-1,114,-1,100,7,-5,-1,113,-1,23,112,-3,-1,54,99,-1,96,-1,68,37,-13,
  228. -7,-5,-3,-1,82,5,21,98,-3,-1,38,6,22,-5,-1,97,-1,81,52,-5,-1,80,-1,67,51,-1,36,66,-15,-11,-7,-3,-1,20,65,
  229. -1,4,64,-1,35,50,-1,19,49,-5,-3,-1,3,48,34,33,-5,-1,18,-1,2,32,17,-3,-1,1,16,0
  230. };
  231. constexpr int16 huffmanTab12[] =
  232. {
  233. -115,-99,-73,-45,-27,-17,-9,-5,-3,-1,119,103,118,-1,87,117,-3,-1,102,71,-1,116,101,-3,-1,86,55,-3,-1,115,
  234. 85,39,-7,-3,-1,114,70,-1,100,23,-5,-1,113,-1,7,112,-1,54,99,-13,-9,-3,-1,69,84,-1,68,-1,6,5,-1,38,98,-5,
  235. -1,97,-1,22,96,-3,-1,53,83,-1,37,82,-17,-7,-3,-1,21,81,-1,52,67,-5,-3,-1,80,4,36,-1,66,20,-3,-1,51,65,-1,
  236. 35,50,-11,-7,-5,-3,-1,64,3,48,19,-1,49,34,-1,18,33,-7,-5,-3,-1,2,32,0,17,-1,1,16
  237. };
  238. constexpr int16 huffmanTab13[] =
  239. {
  240. -509,-503,-475,-405,-333,-265,-205,-153,-115,-83,-53,-35,-21,-13,-9,-7,-5,-3,-1,254,252,253,237,255,-1,239,223,
  241. -3,-1,238,207,-1,222,191,-9,-3,-1,251,206,-1,220,-1,175,233,-1,236,221,-9,-5,-3,-1,250,205,190,-1,235,159,-3,
  242. -1,249,234,-1,189,219,-17,-9,-3,-1,143,248,-1,204,-1,174,158,-5,-1,142,-1,127,126,247,-5,-1,218,-1,173,188,-3,
  243. -1,203,246,111,-15,-7,-3,-1,232,95,-1,157,217,-3,-1,245,231,-1,172,187,-9,-3,-1,79,244,-3,-1,202,230,243,-1,
  244. 63,-1,141,216,-21,-9,-3,-1,47,242,-3,-1,110,156,15,-5,-3,-1,201,94,171,-3,-1,125,215,78,-11,-5,-3,-1,200,214,
  245. 62,-1,185,-1,155,170,-1,31,241,-23,-13,-5,-1,240,-1,186,229,-3,-1,228,140,-1,109,227,-5,-1,226,-1,46,14,-1,30,
  246. 225,-15,-7,-3,-1,224,93,-1,213,124,-3,-1,199,77,-1,139,184,-7,-3,-1,212,154,-1,169,108,-1,198,61,-37,-21,-9,-5,
  247. -3,-1,211,123,45,-1,210,29,-5,-1,183,-1,92,197,-3,-1,153,122,195,-7,-5,-3,-1,167,151,75,209,-3,-1,13,208,-1,
  248. 138,168,-11,-7,-3,-1,76,196,-1,107,182,-1,60,44,-3,-1,194,91,-3,-1,181,137,28,-43,-23,-11,-5,-1,193,-1,152,12,
  249. -1,192,-1,180,106,-5,-3,-1,166,121,59,-1,179,-1,136,90,-11,-5,-1,43,-1,165,105,-1,164,-1,120,135,-5,-1,148,-1,
  250. 119,118,178,-11,-3,-1,27,177,-3,-1,11,176,-1,150,74,-7,-3,-1,58,163,-1,89,149,-1,42,162,-47,-23,-9,-3,-1,26,
  251. 161,-3,-1,10,104,160,-5,-3,-1,134,73,147,-3,-1,57,88,-1,133,103,-9,-3,-1,41,146,-3,-1,87,117,56,-5,-1,131,-1,
  252. 102,71,-3,-1,116,86,-1,101,115,-11,-3,-1,25,145,-3,-1,9,144,-1,72,132,-7,-5,-1,114,-1,70,100,40,-1,130,24,-41,
  253. -27,-11,-5,-3,-1,55,39,23,-1,113,-1,85,7,-7,-3,-1,112,54,-1,99,69,-3,-1,84,38,-1,98,53,-5,-1,129,-1,8,128,-3,
  254. -1,22,97,-1,6,96,-13,-9,-5,-3,-1,83,68,37,-1,82,5,-1,21,81,-7,-3,-1,52,67,-1,80,36,-3,-1,66,51,20,-19,-11,
  255. -5,-1,65,-1,4,64,-3,-1,35,50,19,-3,-1,49,3,-1,48,34,-3,-1,18,33,-1,2,32,-3,-1,17,1,16,0
  256. };
  257. constexpr int16 huffmanTab15[] =
  258. {
  259. -495,-445,-355,-263,-183,-115,-77,-43,-27,-13,-7,-3,-1,255,239,-1,254,223,-1,238,-1,253,207,-7,-3,-1,252,222,-1,
  260. 237,191,-1,251,-1,206,236,-7,-3,-1,221,175,-1,250,190,-3,-1,235,205,-1,220,159,-15,-7,-3,-1,249,234,-1,189,219,
  261. -3,-1,143,248,-1,204,158,-7,-3,-1,233,127,-1,247,173,-3,-1,218,188,-1,111,-1,174,15,-19,-11,-3,-1,203,246,
  262. -3,-1,142,232,-1,95,157,-3,-1,245,126,-1,231,172,-9,-3,-1,202,187,-3,-1,217,141,79,-3,-1,244,63,-1,243,216,
  263. -33,-17,-9,-3,-1,230,47,-1,242,-1,110,240,-3,-1,31,241,-1,156,201,-7,-3,-1,94,171,-1,186,229,-3,-1,125,215,
  264. -1,78,228,-15,-7,-3,-1,140,200,-1,62,109,-3,-1,214,227,-1,155,185,-7,-3,-1,46,170,-1,226,30,-5,-1,225,-1,14,
  265. 224,-1,93,213,-45,-25,-13,-7,-3,-1,124,199,-1,77,139,-1,212,-1,184,154,-7,-3,-1,169,108,-1,198,61,-1,211,210,
  266. -9,-5,-3,-1,45,13,29,-1,123,183,-5,-1,209,-1,92,208,-1,197,138,-17,-7,-3,-1,168,76,-1,196,107,-5,-1,182,-1,
  267. 153,12,-1,60,195,-9,-3,-1,122,167,-1,166,-1,192,11,-1,194,-1,44,91,-55,-29,-15,-7,-3,-1,181,28,-1,137,152,-3,
  268. -1,193,75,-1,180,106,-5,-3,-1,59,121,179,-3,-1,151,136,-1,43,90,-11,-5,-1,178,-1,165,27,-1,177,-1,176,105,-7,
  269. -3,-1,150,74,-1,164,120,-3,-1,135,58,163,-17,-7,-3,-1,89,149,-1,42,162,-3,-1,26,161,-3,-1,10,160,104,-7,-3,
  270. -1,134,73,-1,148,57,-5,-1,147,-1,119,9,-1,88,133,-53,-29,-13,-7,-3,-1,41,103,-1,118,146,-1,145,-1,25,144,-7,
  271. -3,-1,72,132,-1,87,117,-3,-1,56,131,-1,102,71,-7,-3,-1,40,130,-1,24,129,-7,-3,-1,116,8,-1,128,86,-3,-1,101,
  272. 55,-1,115,70,-17,-7,-3,-1,39,114,-1,100,23,-3,-1,85,113,-3,-1,7,112,54,-7,-3,-1,99,69,-1,84,38,-3,-1,98,22,
  273. -3,-1,6,96,53,-33,-19,-9,-5,-1,97,-1,83,68,-1,37,82,-3,-1,21,81,-3,-1,5,80,52,-7,-3,-1,67,36,-1,66,51,-1,
  274. 65,-1,20,4,-9,-3,-1,35,50,-3,-1,64,3,19,-3,-1,49,48,34,-9,-7,-3,-1,18,33,-1,2,32,17,-3,-1,1,16,0
  275. };
  276. constexpr int16 huffmanTab16[] =
  277. {
  278. -509,-503,-461,-323,-103,-37,-27,-15,-7,-3,-1,239,254,-1,223,253,-3,-1,207,252,-1,191,251,-5,-1,175,-1,250,159,
  279. -3,-1,249,248,143,-7,-3,-1,127,247,-1,111,246,255,-9,-5,-3,-1,95,245,79,-1,244,243,-53,-1,240,-1,63,-29,-19,
  280. -13,-7,-5,-1,206,-1,236,221,222,-1,233,-1,234,217,-1,238,-1,237,235,-3,-1,190,205,-3,-1,220,219,174,-11,-5,
  281. -1,204,-1,173,218,-3,-1,126,172,202,-5,-3,-1,201,125,94,189,242,-93,-5,-3,-1,47,15,31,-1,241,-49,-25,-13,
  282. -5,-1,158,-1,188,203,-3,-1,142,232,-1,157,231,-7,-3,-1,187,141,-1,216,110,-1,230,156,-13,-7,-3,-1,171,186,
  283. -1,229,215,-1,78,-1,228,140,-3,-1,200,62,-1,109,-1,214,155,-19,-11,-5,-3,-1,185,170,225,-1,212,-1,184,169,
  284. -5,-1,123,-1,183,208,227,-7,-3,-1,14,224,-1,93,213,-3,-1,124,199,-1,77,139,-75,-45,-27,-13,-7,-3,-1,154,
  285. 108,-1,198,61,-3,-1,92,197,13,-7,-3,-1,138,168,-1,153,76,-3,-1,182,122,60,-11,-5,-3,-1,91,137,28,-1,192,-1,
  286. 152,121,-1,226,-1,46,30,-15,-7,-3,-1,211,45,-1,210,209,-5,-1,59,-1,151,136,29,-7,-3,-1,196,107,-1,195,167,-1,
  287. 44,-1,194,181,-23,-13,-7,-3,-1,193,12,-1,75,180,-3,-1,106,166,179,-5,-3,-1,90,165,43,-1,178,27,-13,-5,-1,177,
  288. -1,11,176,-3,-1,105,150,-1,74,164,-5,-3,-1,120,135,163,-3,-1,58,89,42,-97,-57,-33,-19,-11,-5,-3,-1,149,104,161,
  289. -3,-1,134,119,148,-5,-3,-1,73,87,103,162,-5,-1,26,-1,10,160,-3,-1,57,147,-1,88,133,-9,-3,-1,41,146,-3,-1,118,
  290. 9,25,-5,-1,145,-1,144,72,-3,-1,132,117,-1,56,131,-21,-11,-5,-3,-1,102,40,130,-3,-1,71,116,24,-3,-1,129,128,-3,
  291. -1,8,86,55,-9,-5,-1,115,-1,101,70,-1,39,114,-5,-3,-1,100,85,7,23,-23,-13,-5,-1,113,-1,112,54,-3,-1,99,69,-1,
  292. 84,38,-3,-1,98,22,-1,97,-1,6,96,-9,-5,-1,83,-1,53,68,-1,37,82,-1,81,-1,21,5,-33,-23,-13,-7,-3,-1,52,67,-1,80,
  293. 36,-3,-1,66,51,20,-5,-1,65,-1,4,64,-1,35,50,-3,-1,19,49,-3,-1,3,48,34,-3,-1,18,33,-1,2,32,-3,-1,17,1,16,0
  294. };
  295. constexpr int16 huffmanTab24[] =
  296. {
  297. -451,-117,-43,-25,-15,-7,-3,-1,239,254,-1,223,253,-3,-1,207,252,-1,191,251,-5,-1,250,-1,175,159,-1,249,248,-9,
  298. -5,-3,-1,143,127,247,-1,111,246,-3,-1,95,245,-1,79,244,-71,-7,-3,-1,63,243,-1,47,242,-5,-1,241,-1,31,240,-25,-9,
  299. -1,15,-3,-1,238,222,-1,237,206,-7,-3,-1,236,221,-1,190,235,-3,-1,205,220,-1,174,234,-15,-7,-3,-1,189,219,-1,204,
  300. 158,-3,-1,233,173,-1,218,188,-7,-3,-1,203,142,-1,232,157,-3,-1,217,126,-1,231,172,255,-235,-143,-77,-45,-25,-15,
  301. -7,-3,-1,202,187,-1,141,216,-5,-3,-1,14,224,13,230,-5,-3,-1,110,156,201,-1,94,186,-9,-5,-1,229,-1,171,125,-1,215,
  302. 228,-3,-1,140,200,-3,-1,78,46,62,-15,-7,-3,-1,109,214,-1,227,155,-3,-1,185,170,-1,226,30,-7,-3,-1,225,93,-1,213,124,
  303. -3,-1,199,77,-1,139,184,-31,-15,-7,-3,-1,212,154,-1,169,108,-3,-1,198,61,-1,211,45,-7,-3,-1,210,29,-1,123,183,-3,-1,
  304. 209,92,-1,197,138,-17,-7,-3,-1,168,153,-1,76,196,-3,-1,107,182,-3,-1,208,12,60,-7,-3,-1,195,122,-1,167,44,-3,-1,194,
  305. 91,-1,181,28,-57,-35,-19,-7,-3,-1,137,152,-1,193,75,-5,-3,-1,192,11,59,-3,-1,176,10,26,-5,-1,180,-1,106,166,-3,-1,121,
  306. 151,-3,-1,160,9,144,-9,-3,-1,179,136,-3,-1,43,90,178,-7,-3,-1,165,27,-1,177,105,-1,150,164,-17,-9,-5,-3,-1,74,120,135,
  307. -1,58,163,-3,-1,89,149,-1,42,162,-7,-3,-1,161,104,-1,134,119,-3,-1,73,148,-1,57,147,-63,-31,-15,-7,-3,-1,88,133,-1,41,
  308. 103,-3,-1,118,146,-1,25,145,-7,-3,-1,72,132,-1,87,117,-3,-1,56,131,-1,102,40,-17,-7,-3,-1,130,24,-1,71,116,-5,-1,129,
  309. -1,8,128,-1,86,101,-7,-5,-1,23,-1,7,112,115,-3,-1,55,39,114,-15,-7,-3,-1,70,100,-1,85,113,-3,-1,54,99,-1,69,84,-7,-3,
  310. -1,38,98,-1,22,97,-5,-3,-1,6,96,53,-1,83,68,-51,-37,-23,-15,-9,-3,-1,37,82,-1,21,-1,5,80,-1,81,-1,52,67,-3,-1,36,66,
  311. -1,51,20,-9,-5,-1,65,-1,4,64,-1,35,50,-1,19,49,-7,-5,-3,-1,3,48,34,18,-1,33,-1,2,32,-3,-1,17,1,-1,16,0
  312. };
  313. struct BitsToTableMap
  314. {
  315. uint32 bits;
  316. const int16* table;
  317. };
  318. constexpr BitsToTableMap huffmanTables1[] =
  319. {
  320. { 0, huffmanTab0 }, { 0, huffmanTab1 }, { 0, huffmanTab2 }, { 0, huffmanTab3 },
  321. { 0, huffmanTab0 }, { 0, huffmanTab5 }, { 0, huffmanTab6 }, { 0, huffmanTab7 },
  322. { 0, huffmanTab8 }, { 0, huffmanTab9 }, { 0, huffmanTab10 }, { 0, huffmanTab11 },
  323. { 0, huffmanTab12 }, { 0, huffmanTab13 }, { 0, huffmanTab0 }, { 0, huffmanTab15 },
  324. { 1, huffmanTab16 }, { 2, huffmanTab16 }, { 3, huffmanTab16 }, { 4, huffmanTab16 },
  325. { 6, huffmanTab16 }, { 8, huffmanTab16 }, { 10, huffmanTab16 }, { 13, huffmanTab16 },
  326. { 4, huffmanTab24 }, { 5, huffmanTab24 }, { 6, huffmanTab24 }, { 7, huffmanTab24 },
  327. { 8, huffmanTab24 }, { 9, huffmanTab24 }, { 11, huffmanTab24 }, { 13, huffmanTab24 }
  328. };
  329. constexpr int16 huffmanTabC0[] = { -29,-21,-13,-7,-3,-1,11,15,-1,13,14,-3,-1,7,5,9,-3,-1,6,3,-1,10,12,-3,-1,2,1,-1,4,8,0 };
  330. constexpr int16 huffmanTabC1[] = { -15,-7,-3,-1,15,14,-1,13,12,-3,-1,11,10,-1,9,8,-7,-3,-1,7,6,-1,5,4,-3,-1,3,2,-1,1,0 };
  331. constexpr BitsToTableMap huffmanTables2[] = { { 0, huffmanTabC0 }, { 0, huffmanTabC1 } };
  332. //==============================================================================
  333. struct VBRTagData
  334. {
  335. bool read (const uint8* data) noexcept
  336. {
  337. flags = 0;
  338. const int layer = (data[1] >> 1) & 3;
  339. if (layer != 1)
  340. return false;
  341. const int type = (data[1] >> 3) & 1;
  342. const int sampleRateIndex = (data[2] >> 2) & 3;
  343. const int mode = (data[3] >> 6) & 3;
  344. static constexpr short bitRates[3][16] =
  345. {
  346. { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1 }, // MPEG2
  347. { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1 }, // MPEG1
  348. { 0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1 }, // MPEG 2.5
  349. };
  350. const int bitrate = bitRates[type][((data[2] >> 4) & 15)];
  351. const int sampleRates[3][4] =
  352. {
  353. { 22050, 24000, 16000, -1 }, // MPEG2
  354. { 44100, 48000, 32000, -1 }, // MPEG1
  355. { 11025, 12000, 8000, -1 }, // MPEG2.5
  356. };
  357. if ((data[1] >> 4) == 0xe)
  358. sampleRate = sampleRates[2][sampleRateIndex];
  359. else
  360. sampleRate = sampleRates[type][sampleRateIndex];
  361. data += type != 0 ? (mode != 3 ? (32 + 4) : (17 + 4))
  362. : (mode != 3 ? (17 + 4) : (9 + 4));
  363. if (! isVbrTag (data))
  364. return false;
  365. data += 4;
  366. flags = ByteOrder::bigEndianInt (data);
  367. data += 4;
  368. if (flags & 1)
  369. {
  370. frames = ByteOrder::bigEndianInt (data);
  371. data += 4;
  372. }
  373. if (flags & 2)
  374. {
  375. bytes = ByteOrder::bigEndianInt (data);
  376. data += 4;
  377. }
  378. if (flags & 4)
  379. {
  380. for (int i = 0; i < 100; ++i)
  381. toc[i] = data[i];
  382. data += 100;
  383. }
  384. vbrScale = -1;
  385. if (flags & 8)
  386. vbrScale = (int) ByteOrder::bigEndianInt (data);
  387. headersize = ((type + 1) * 72000 * bitrate) / sampleRate;
  388. return true;
  389. }
  390. uint8 toc[100];
  391. int sampleRate, vbrScale, headersize;
  392. unsigned int flags, frames, bytes;
  393. private:
  394. static bool isVbrTag (const uint8* d) noexcept
  395. {
  396. return (d[0] == 'X' && d[1] == 'i' && d[2] == 'n' && d[3] == 'g')
  397. || (d[0] == 'I' && d[1] == 'n' && d[2] == 'f' && d[3] == 'o');
  398. }
  399. };
  400. //==============================================================================
  401. struct MP3Frame
  402. {
  403. MP3Frame()
  404. {
  405. zeromem (this, sizeof (MP3Frame));
  406. single = -1;
  407. }
  408. void selectLayer2Table()
  409. {
  410. static constexpr int translate[3][2][16] =
  411. {
  412. { { 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, { 0, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } },
  413. { { 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  414. { { 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, { 0, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } }
  415. };
  416. static const AllocationTable* const tables[] = { allocTable0, allocTable1, allocTable2, allocTable3, allocTable4 };
  417. static constexpr int8 limits[] = { 27, 30, 8, 12, 30 };
  418. const int index = lsf ? 4 : translate[sampleRateIndex][2 - numChannels][bitrateIndex];
  419. layer2SubBandLimit = limits[index];
  420. allocationTable = tables[index];
  421. }
  422. int getFrequency() const noexcept
  423. {
  424. const int frequencies[] = { 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000 };
  425. return frequencies[sampleRateIndex];
  426. }
  427. enum class ParseSuccessful { no, yes };
  428. ParseSuccessful decodeHeader (const uint32 header)
  429. {
  430. jassert (((header >> 10) & 3) != 3);
  431. mpeg25 = (header & (1 << 20)) == 0;
  432. lsf = mpeg25 ? 1 : ((header & (1 << 19)) ? 0 : 1);
  433. layer = (int) (4 - ((header >> 17) & 3));
  434. sampleRateIndex = (int) ((header >> 10) & 3) + (mpeg25 ? 6 : (lsf * 3));
  435. crc16FollowsHeader = ((header >> 16) & 1) == 0;
  436. bitrateIndex = (header >> 12) & 15;
  437. padding = (header >> 9) & 1;
  438. mode = (header >> 6) & 3;
  439. modeExt = (header >> 4) & 3;
  440. //extension = (header >> 8) & 1;
  441. //copyright = (header >> 3) & 1;
  442. //original = (header >> 2) & 1;
  443. //emphasis = header & 3;
  444. numChannels = (mode == 3) ? 1 : 2;
  445. static constexpr int frameSizes[2][3][16] =
  446. {
  447. { { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 },
  448. { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 },
  449. { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 } },
  450. { { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256 },
  451. { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 },
  452. { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 } }
  453. };
  454. if (bitrateIndex == 0)
  455. {
  456. jassertfalse; // This means the file is using "free format". Apparently very few decoders
  457. // support this mode, and this one certainly doesn't handle it correctly!
  458. frameSize = 0;
  459. return ParseSuccessful::no;
  460. }
  461. switch (layer)
  462. {
  463. case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break;
  464. case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000) / getFrequency() + (padding - 4); break;
  465. case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break;
  466. default: break;
  467. }
  468. return ParseSuccessful::yes;
  469. }
  470. int layer, frameSize, numChannels, single;
  471. int lsf; // 0 = mpeg-1, 1 = mpeg-2/LSF
  472. bool mpeg25; // true = mpeg-2.5, false = mpeg-1/2
  473. bool crc16FollowsHeader;
  474. int bitrateIndex, sampleRateIndex, padding;
  475. int mode, modeExt, layer2SubBandLimit;
  476. enum { downSampleLimit = 32 };
  477. const AllocationTable* allocationTable;
  478. };
  479. //==============================================================================
  480. struct Constants
  481. {
  482. Constants()
  483. {
  484. cosTables[0] = cos64; cosTables[1] = cos32; cosTables[2] = cos16; cosTables[3] = cos8; cosTables[4] = cos4;
  485. initDecodeTables();
  486. initLayer2Tables();
  487. initLayer3Tables();
  488. }
  489. const uint8* getGroupTable (const int16 d1, const uint32 index) const noexcept
  490. {
  491. switch (d1)
  492. {
  493. case 3: return &group3tab[3 * jmin (index, 3u * 3u * 3u)];
  494. case 5: return &group5tab[3 * jmin (index, 5u * 5u * 5u)];
  495. case 9: return &group9tab[3 * jmin (index, 9u * 9u * 9u)];
  496. default: break;
  497. }
  498. static constexpr uint8 dummy[] = { 0, 0, 0 };
  499. return dummy;
  500. }
  501. float muls[27][64];
  502. float nToThe4Over3[8207];
  503. float antiAliasingCa[8], antiAliasingCs[8];
  504. float win[4][36];
  505. float win1[4][36];
  506. float powToGains[256 + 118 + 4];
  507. int longLimit[9][23];
  508. int shortLimit[9][14];
  509. float tan1_1[16], tan2_1[16], tan1_2[16], tan2_2[16];
  510. float pow1_1[2][16], pow2_1[2][16], pow1_2[2][16], pow2_2[2][16];
  511. int* map[9][3];
  512. int* mapEnd[9][3];
  513. uint32 nLength2[512];
  514. uint32 iLength2[256];
  515. float decodeWin[512 + 32];
  516. float* cosTables[5];
  517. private:
  518. int mapbuf0[9][152];
  519. int mapbuf1[9][156];
  520. int mapbuf2[9][44];
  521. float cos64[16], cos32[8], cos16[4], cos8[2], cos4[1];
  522. uint8 group3tab[32 * 3];
  523. uint8 group5tab[128 * 3];
  524. uint8 group9tab[1024 * 3];
  525. void initDecodeTables()
  526. {
  527. int i, j, scaleval = -1;
  528. float* table = decodeWin;
  529. for (i = 0; i < 5; ++i)
  530. {
  531. int kr = 0x10 >> i;
  532. int divv = 0x40 >> i;
  533. float* costab = cosTables[i];
  534. for (int k = 0; k < kr; ++k)
  535. costab[k] = (float) (1.0 / (2.0 * std::cos (MathConstants<double>::pi * (k * 2 + 1) / divv)));
  536. }
  537. for (i = 0, j = 0; i < 256; ++i, ++j, table += 32)
  538. {
  539. if (table < decodeWin + 512 + 16)
  540. table[16] = table[0] = (float) (decodeWindow[j] * scaleval);
  541. if (i % 32 == 31)
  542. table -= 1023;
  543. if (i % 64 == 63)
  544. scaleval = -scaleval;
  545. }
  546. for (; i < 512; ++i, --j, table += 32)
  547. {
  548. if (table < decodeWin + 512 + 16)
  549. table[16] = table[0] = (float) (decodeWindow[j] * scaleval);
  550. if (i % 32 == 31) table -= 1023;
  551. if (i % 64 == 63) scaleval = -scaleval;
  552. }
  553. }
  554. void initLayer2Tables()
  555. {
  556. static const uint8 base[3][9] =
  557. {
  558. { 1, 0, 2 },
  559. { 17, 18, 0, 19, 20 },
  560. { 21, 1, 22, 23, 0, 24, 25, 2, 26 }
  561. };
  562. static constexpr int tableLengths[] = { 3, 5, 9 };
  563. static uint8* tables[] = { group3tab, group5tab, group9tab };
  564. for (int i = 0; i < 3; ++i)
  565. {
  566. uint8* table = tables[i];
  567. const int len = tableLengths[i];
  568. for (int j = 0; j < len; ++j)
  569. for (int k = 0; k < len; ++k)
  570. for (int l = 0; l < len; ++l)
  571. {
  572. *table++ = base[i][l];
  573. *table++ = base[i][k];
  574. *table++ = base[i][j];
  575. }
  576. }
  577. for (int k = 0; k < 27; ++k)
  578. {
  579. static constexpr double multipliers[] =
  580. {
  581. 0, -2.0 / 3.0, 2.0 / 3.0, 2.0 / 7.0, 2.0 / 15.0, 2.0 / 31.0, 2.0 / 63.0, 2.0 / 127.0, 2.0 / 255.0,
  582. 2.0 / 511.0, 2.0 / 1023.0, 2.0 / 2047.0, 2.0 / 4095.0, 2.0 / 8191.0, 2.0 / 16383.0, 2.0 / 32767.0, 2.0 / 65535.0,
  583. -4.0 / 5.0, -2.0 / 5.0, 2.0 / 5.0, 4.0 / 5.0, -8.0 / 9.0, -4.0 / 9.0, -2.0 / 9.0, 2.0 / 9.0, 4.0 / 9.0, 8.0 / 9.0
  584. };
  585. float* table = muls[k];
  586. for (int j = 3, i = 0; i < 63; ++i, --j)
  587. *table++ = (float) (multipliers[k] * std::pow (2.0, j / 3.0));
  588. *table++ = 0;
  589. }
  590. }
  591. void initLayer3Tables()
  592. {
  593. int i, j;
  594. for (i = -256; i < 118 + 4; ++i)
  595. powToGains[i + 256] = (float) std::pow (2.0, -0.25 * (i + 210));
  596. for (i = 0; i < 8207; ++i)
  597. nToThe4Over3[i] = (float) std::pow ((double) i, 4.0 / 3.0);
  598. for (i = 0; i < 8; ++i)
  599. {
  600. static constexpr double Ci[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 };
  601. const double sq = sqrt (1.0 + Ci[i] * Ci[i]);
  602. antiAliasingCs[i] = (float) (1.0 / sq);
  603. antiAliasingCa[i] = (float) (Ci[i] / sq);
  604. }
  605. for (i = 0; i < 18; ++i)
  606. {
  607. win[0][i] = win[1][i] = (float) (0.5 * std::sin (MathConstants<double>::pi / 72.0 * (2 * i + 1)) / std::cos (MathConstants<double>::pi * (2 * i + 19) / 72.0));
  608. win[0][i + 18] = win[3][i + 18] = (float) (0.5 * std::sin (MathConstants<double>::pi / 72.0 * (2 * (i + 18) + 1)) / std::cos (MathConstants<double>::pi * (2 * (i + 18) + 19) / 72.0));
  609. }
  610. const double piOver72 = MathConstants<double>::pi / 72.0;
  611. for (i = 0; i < 6; ++i)
  612. {
  613. win[1][i + 18] = (float) (0.5 / std::cos (piOver72 * (2 * (i + 18) + 19)));
  614. win[3][i + 12] = (float) (0.5 / std::cos (piOver72 * (2 * (i + 12) + 19)));
  615. win[1][i + 24] = (float) (0.5 * std::sin (MathConstants<double>::pi / 24.0 * (2 * i + 13)) / std::cos (piOver72 * (2 * (i + 24) + 19)));
  616. win[1][i + 30] = win[3][i] = 0;
  617. win[3][i + 6] = (float) (0.5 * std::sin (MathConstants<double>::pi / 24.0 * (2 * i + 1)) / std::cos (piOver72 * (2 * (i + 6) + 19)));
  618. }
  619. for (i = 0; i < 12; ++i)
  620. win[2][i] = (float) (0.5 * std::sin (MathConstants<double>::pi / 24.0 * (2 * i + 1)) / std::cos (MathConstants<double>::pi * (2 * i + 7) / 24.0));
  621. for (j = 0; j < 4; ++j)
  622. {
  623. static constexpr int len[4] = { 36, 36, 12, 36 };
  624. for (i = 0; i < len[j]; i += 2) win1[j][i] = win[j][i];
  625. for (i = 1; i < len[j]; i += 2) win1[j][i] = -win[j][i];
  626. }
  627. const double sqrt2 = 1.41421356237309504880168872420969808;
  628. for (i = 0; i < 16; ++i)
  629. {
  630. const double t = std::tan (i * MathConstants<double>::pi / 12.0);
  631. tan1_1[i] = (float) (t / (1.0 + t));
  632. tan2_1[i] = (float) (1.0 / (1.0 + t));
  633. tan1_2[i] = (float) (sqrt2 * t / (1.0 + t));
  634. tan2_2[i] = (float) (sqrt2 / (1.0 + t));
  635. for (j = 0; j < 2; ++j)
  636. {
  637. double p1 = 1.0, p2 = 1.0;
  638. if (i > 0)
  639. {
  640. const double base = std::pow (2.0, -0.25 * (j + 1));
  641. if (i & 1)
  642. p1 = std::pow (base, (i + 1) * 0.5);
  643. else
  644. p2 = std::pow (base, i * 0.5);
  645. }
  646. pow1_1[j][i] = (float) p1;
  647. pow2_1[j][i] = (float) p2;
  648. pow1_2[j][i] = (float) (sqrt2 * p1);
  649. pow2_2[j][i] = (float) (sqrt2 * p2);
  650. }
  651. }
  652. for (j = 0; j < 9; ++j)
  653. {
  654. const BandInfoStruct& bi = bandInfo[j];
  655. int cb;
  656. int* mp = map[j][0] = mapbuf0[j];
  657. const int16* bdf = bi.longDiff;
  658. for (i = 0, cb = 0; cb < 8; ++cb, i += *bdf++)
  659. {
  660. *mp++ = (*bdf) >> 1;
  661. *mp++ = i;
  662. *mp++ = 3;
  663. *mp++ = cb;
  664. }
  665. bdf = bi.shortDiff + 3;
  666. for (cb = 3; cb < 13; ++cb)
  667. {
  668. const int l = (*bdf++) >> 1;
  669. for (int lwin = 0; lwin < 3; ++lwin)
  670. {
  671. *mp++ = l;
  672. *mp++ = i + lwin;
  673. *mp++ = lwin;
  674. *mp++ = cb;
  675. }
  676. i += 6 * l;
  677. }
  678. mapEnd[j][0] = mp;
  679. mp = map[j][1] = mapbuf1[j];
  680. bdf = bi.shortDiff;
  681. for (i = 0, cb = 0; cb < 13; ++cb)
  682. {
  683. const int l = (*bdf++) >> 1;
  684. for (int lwin = 0; lwin < 3; ++lwin)
  685. {
  686. *mp++ = l;
  687. *mp++ = i + lwin;
  688. *mp++ = lwin;
  689. *mp++ = cb;
  690. }
  691. i += 6 * l;
  692. }
  693. mapEnd[j][1] = mp;
  694. mp = map[j][2] = mapbuf2[j];
  695. bdf = bi.longDiff;
  696. for (cb = 0; cb < 22; ++cb)
  697. {
  698. *mp++ = (*bdf++) >> 1;
  699. *mp++ = cb;
  700. }
  701. mapEnd[j][2] = mp;
  702. }
  703. for (j = 0; j < 9; ++j)
  704. {
  705. for (i = 0; i < 23; ++i) longLimit[j][i] = jmin (32, (bandInfo[j].longIndex[i] - 1 + 8) / 18 + 1);
  706. for (i = 0; i < 14; ++i) shortLimit[j][i] = jmin (32, (bandInfo[j].shortIndex[i] - 1) / 18 + 1);
  707. }
  708. for (i = 0; i < 5; ++i)
  709. for (j = 0; j < 6; ++j)
  710. for (int k = 0; k < 6; ++k)
  711. {
  712. const int n = k + j * 6 + i * 36;
  713. iLength2[n] = (unsigned int) (i | (j << 3) | (k << 6) | (3 << 12));
  714. }
  715. for (i = 0; i < 4; ++i)
  716. for (j = 0; j < 4; ++j)
  717. for (int k = 0; k < 4; ++k)
  718. {
  719. const int n = k + j * 4 + i * 16;
  720. iLength2[n + 180] = (unsigned int) (i | (j << 3) | (k << 6) | (4 << 12));
  721. }
  722. for (i = 0; i < 4; ++i)
  723. for (j = 0; j < 3; ++j)
  724. {
  725. const int n = j + i * 3;
  726. iLength2[n + 244] = (unsigned int) (i | (j << 3) | (5 << 12));
  727. nLength2[n + 500] = (unsigned int) (i | (j << 3) | (2 << 12) | (1 << 15));
  728. }
  729. for (i = 0; i < 5; ++i)
  730. for (j = 0; j < 5; ++j)
  731. for (int k = 0; k < 4; ++k)
  732. for (int l = 0; l < 4; ++l)
  733. {
  734. const int n = l + k * 4 + j * 16 + i * 80;
  735. nLength2[n] = (unsigned int) (i | (j << 3) | (k << 6) | (l << 9) | (0 << 12));
  736. }
  737. for (i = 0; i < 5; ++i)
  738. for (j = 0; j < 5; ++j)
  739. for (int k = 0; k < 4; ++k)
  740. {
  741. const int n = k + j * 4 + i * 20;
  742. nLength2[n + 400] = (unsigned int) (i | (j << 3) | (k << 6) | (1 << 12));
  743. }
  744. }
  745. };
  746. static const Constants constants;
  747. //==============================================================================
  748. struct Layer3SideInfo
  749. {
  750. struct Info
  751. {
  752. void doAntialias (float xr[32][18]) const noexcept
  753. {
  754. float* xr1 = xr[1];
  755. int sb;
  756. if (blockType == 2)
  757. {
  758. if (mixedBlockFlag == 0)
  759. return;
  760. sb = 1;
  761. }
  762. else
  763. sb = (int) maxb - 1;
  764. for (; sb != 0; --sb, xr1 += 10)
  765. {
  766. auto* cs = constants.antiAliasingCs;
  767. auto* ca = constants.antiAliasingCa;
  768. auto* xr2 = xr1;
  769. for (int ss = 7; ss >= 0; --ss)
  770. {
  771. const float bu = *--xr2, bd = *xr1;
  772. *xr2 = (bu * *cs) - (bd * *ca);
  773. *xr1++ = (bd * *cs++) + (bu * *ca++);
  774. }
  775. }
  776. }
  777. void doIStereo (float xrBuffer[2][32][18], const int* scaleFactors,
  778. int sampleRate, bool msStereo, int lsf) const noexcept
  779. {
  780. float (*xr) [32 * 18] = (float (*) [32 * 18]) xrBuffer;
  781. auto& bi = bandInfo[sampleRate];
  782. const float* tabl1, *tabl2;
  783. if (lsf != 0)
  784. {
  785. auto p = scaleFactorCompression & 1;
  786. if (msStereo)
  787. {
  788. tabl1 = constants.pow1_2[p];
  789. tabl2 = constants.pow2_2[p];
  790. }
  791. else
  792. {
  793. tabl1 = constants.pow1_1[p];
  794. tabl2 = constants.pow2_1[p];
  795. }
  796. }
  797. else
  798. {
  799. if (msStereo)
  800. {
  801. tabl1 = constants.tan1_2;
  802. tabl2 = constants.tan2_2;
  803. }
  804. else
  805. {
  806. tabl1 = constants.tan1_1;
  807. tabl2 = constants.tan2_1;
  808. }
  809. }
  810. if (blockType == 2)
  811. {
  812. bool doL = mixedBlockFlag != 0;
  813. for (uint32 lwin = 0; lwin < 3; ++lwin)
  814. {
  815. uint32 sfb = maxBand[lwin];
  816. doL = doL && (sfb <= 3);
  817. for (; sfb < 12; ++sfb)
  818. {
  819. auto p = scaleFactors[sfb * 3 + lwin - mixedBlockFlag];
  820. if (p != 7)
  821. {
  822. auto t1 = tabl1[p];
  823. auto t2 = tabl2[p];
  824. int sb = bi.shortDiff[sfb];
  825. auto index = (uint32) sb + lwin;
  826. for (; sb > 0; --sb, index += 3)
  827. {
  828. float v = xr[0][index];
  829. xr[0][index] = v * t1;
  830. xr[1][index] = v * t2;
  831. }
  832. }
  833. }
  834. auto p = scaleFactors[11 * 3 + lwin - mixedBlockFlag];
  835. if (p != 7)
  836. {
  837. auto t1 = tabl1[p];
  838. auto t2 = tabl2[p];
  839. int sb = bi.shortDiff[12];
  840. auto index = (uint32) sb + lwin;
  841. for (; sb > 0; --sb, index += 3)
  842. {
  843. float v = xr[0][index];
  844. xr[0][index] = v * t1;
  845. xr[1][index] = v * t2;
  846. }
  847. }
  848. }
  849. if (doL)
  850. {
  851. int index = bi.longIndex[maxBandl];
  852. for (uint32 sfb = maxBandl; sfb < 8; ++sfb)
  853. {
  854. int sb = bi.longDiff[sfb];
  855. auto p = scaleFactors[sfb];
  856. if (p != 7)
  857. {
  858. auto t1 = tabl1[p];
  859. auto t2 = tabl2[p];
  860. for (; sb > 0; --sb, ++index)
  861. {
  862. float v = xr[0][index];
  863. xr[0][index] = v * t1;
  864. xr[1][index] = v * t2;
  865. }
  866. }
  867. else
  868. index += sb;
  869. }
  870. }
  871. }
  872. else
  873. {
  874. int index = bi.longIndex[maxBandl];
  875. for (uint32 sfb = maxBandl; sfb < 21; ++sfb)
  876. {
  877. int sb = bi.longDiff[sfb];
  878. auto p = scaleFactors[sfb];
  879. if (p != 7)
  880. {
  881. auto t1 = tabl1[p];
  882. auto t2 = tabl2[p];
  883. for (; sb > 0; --sb, ++index)
  884. {
  885. const float v = xr[0][index];
  886. xr[0][index] = v * t1;
  887. xr[1][index] = v * t2;
  888. }
  889. }
  890. else
  891. index += sb;
  892. }
  893. auto p = scaleFactors[20];
  894. if (p != 7)
  895. {
  896. auto t1 = tabl1[p], t2 = tabl2[p];
  897. for (int sb = bi.longDiff[21]; sb > 0; --sb, ++index)
  898. {
  899. const float v = xr[0][index];
  900. xr[0][index] = v * t1;
  901. xr[1][index] = v * t2;
  902. }
  903. }
  904. }
  905. }
  906. int scfsi;
  907. uint32 part2_3Length, bigValues;
  908. uint32 scaleFactorCompression, blockType, mixedBlockFlag;
  909. uint32 tableSelect[3];
  910. uint32 maxBand[3];
  911. uint32 maxBandl, maxb, region1Start, region2Start;
  912. uint32 preflag, scaleFactorScale, count1TableSelect;
  913. const float* fullGain[3];
  914. const float* pow2gain;
  915. };
  916. struct InfoPair { Info gr[2]; };
  917. InfoPair ch[2];
  918. uint32 mainDataStart, privateBits;
  919. };
  920. //==============================================================================
  921. namespace DCT
  922. {
  923. enum { subBandLimit = 32 };
  924. static constexpr float cos6_1 = 0.866025388f;
  925. static constexpr float cos6_2 = 0.5f;
  926. static constexpr float cos9[] = { 1.0f, 0.98480773f, 0.939692616f, 0.866025388f, 0.766044438f, 0.642787635f, 0.5f, 0.342020154f, 0.173648179f };
  927. static constexpr float cos36[] = { 0.501909912f, 0.517638087f, 0.551688969f, 0.610387266f, 0.707106769f, 0.871723413f, 1.18310082f, 1.93185163f, 5.73685646f };
  928. static constexpr float cos12[] = { 0.517638087f, 0.707106769f, 1.93185163f };
  929. inline void dct36_0 (int v, float* ts, float* out1, float* out2, const float* wintab, float sum0, float sum1) noexcept
  930. {
  931. auto tmp = sum0 + sum1;
  932. out2[9 + v] = tmp * wintab[27 + v];
  933. out2[8 - v] = tmp * wintab[26 - v];
  934. sum0 -= sum1;
  935. ts[subBandLimit * (8 - v)] = out1[8 - v] + sum0 * wintab[8 - v];
  936. ts[subBandLimit * (9 + v)] = out1[9 + v] + sum0 * wintab[9 + v];
  937. }
  938. inline void dct36_12 (int v1, int v2, float* ts, float* out1, float* out2, const float* wintab,
  939. float tmp1a, float tmp1b, float tmp2a, float tmp2b) noexcept
  940. {
  941. dct36_0 (v1, ts, out1, out2, wintab, tmp1a + tmp2a, (tmp1b + tmp2b) * cos36[v1]);
  942. dct36_0 (v2, ts, out1, out2, wintab, tmp2a - tmp1a, (tmp2b - tmp1b) * cos36[v2]);
  943. }
  944. static void dct36 (float* in, float* out1, float* out2, const float* wintab, float* ts) noexcept
  945. {
  946. in[17] += in[16]; in[16] += in[15]; in[15] += in[14]; in[14] += in[13]; in[13] += in[12];
  947. in[12] += in[11]; in[11] += in[10]; in[10] += in[9]; in[9] += in[8]; in[8] += in[7];
  948. in[7] += in[6]; in[6] += in[5]; in[5] += in[4]; in[4] += in[3]; in[3] += in[2];
  949. in[2] += in[1]; in[1] += in[0]; in[17] += in[15]; in[15] += in[13]; in[13] += in[11];
  950. in[11] += in[9]; in[9] += in[7]; in[7] += in[5]; in[5] += in[3]; in[3] += in[1];
  951. auto ta33 = in[6] * cos9[3];
  952. auto ta66 = in[12] * cos9[6];
  953. auto tb33 = in[7] * cos9[3];
  954. auto tb66 = in[13] * cos9[6];
  955. dct36_12 (0, 8, ts, out1, out2, wintab,
  956. in[2] * cos9[1] + ta33 + in[10] * cos9[5] + in[14] * cos9[7],
  957. in[3] * cos9[1] + tb33 + in[11] * cos9[5] + in[15] * cos9[7],
  958. in[0] + in[4] * cos9[2] + in[8] * cos9[4] + ta66 + in[16] * cos9[8],
  959. in[1] + in[5] * cos9[2] + in[9] * cos9[4] + tb66 + in[17] * cos9[8]);
  960. dct36_12 (1, 7, ts, out1, out2, wintab,
  961. (in[2] - in[10] - in[14]) * cos9[3],
  962. (in[3] - in[11] - in[15]) * cos9[3],
  963. (in[4] - in[8] - in[16]) * cos9[6] - in[12] + in[0],
  964. (in[5] - in[9] - in[17]) * cos9[6] - in[13] + in[1]);
  965. dct36_12 (2, 6, ts, out1, out2, wintab,
  966. in[2] * cos9[5] - ta33 - in[10] * cos9[7] + in[14] * cos9[1],
  967. in[3] * cos9[5] - tb33 - in[11] * cos9[7] + in[15] * cos9[1],
  968. in[0] - in[4] * cos9[8] - in[8] * cos9[2] + ta66 + in[16] * cos9[4],
  969. in[1] - in[5] * cos9[8] - in[9] * cos9[2] + tb66 + in[17] * cos9[4]);
  970. dct36_12 (3, 5, ts, out1, out2, wintab,
  971. in[2] * cos9[7] - ta33 + in[10] * cos9[1] - in[14] * cos9[5],
  972. in[3] * cos9[7] - tb33 + in[11] * cos9[1] - in[15] * cos9[5],
  973. in[0] - in[4] * cos9[4] + in[8] * cos9[8] + ta66 - in[16] * cos9[2],
  974. in[1] - in[5] * cos9[4] + in[9] * cos9[8] + tb66 - in[17] * cos9[2]);
  975. dct36_0 (4, ts, out1, out2, wintab,
  976. in[0] - in[4] + in[8] - in[12] + in[16],
  977. (in[1] - in[5] + in[9] - in[13] + in[17]) * cos36[4]);
  978. }
  979. struct DCT12Inputs
  980. {
  981. float in0, in1, in2, in3, in4, in5;
  982. inline DCT12Inputs (const float* in) noexcept
  983. {
  984. in5 = in[5 * 3] + (in4 = in[4 * 3]);
  985. in4 += (in3 = in[3 * 3]);
  986. in3 += (in2 = in[2 * 3]);
  987. in2 += (in1 = in[1 * 3]);
  988. in1 += (in0 = in[0 * 3]);
  989. in5 += in3; in3 += in1;
  990. in2 *= cos6_1;
  991. in3 *= cos6_1;
  992. }
  993. inline void process() noexcept
  994. {
  995. in0 += in4 * cos6_2;
  996. in4 = in0 + in2; in0 -= in2;
  997. in1 += in5 * cos6_2;
  998. in5 = (in1 + in3) * cos12[0];
  999. in1 = (in1 - in3) * cos12[2];
  1000. in3 = in4 + in5; in4 -= in5;
  1001. in2 = in0 + in1; in0 -= in1;
  1002. }
  1003. };
  1004. static void dct12 (const float* in, float* out1, float* out2, const float* wi, float* ts) noexcept
  1005. {
  1006. {
  1007. ts[0] = out1[0];
  1008. ts[subBandLimit * 1] = out1[1];
  1009. ts[subBandLimit * 2] = out1[2];
  1010. ts[subBandLimit * 3] = out1[3];
  1011. ts[subBandLimit * 4] = out1[4];
  1012. ts[subBandLimit * 5] = out1[5];
  1013. DCT12Inputs inputs (in);
  1014. {
  1015. auto tmp1 = (inputs.in0 - inputs.in4);
  1016. auto tmp2 = (inputs.in1 - inputs.in5) * cos12[1];
  1017. auto tmp0 = tmp1 + tmp2;
  1018. tmp1 -= tmp2;
  1019. ts[16 * subBandLimit] = out1[16] + tmp0 * wi[10];
  1020. ts[13 * subBandLimit] = out1[13] + tmp0 * wi[7];
  1021. ts[7 * subBandLimit] = out1[7] + tmp1 * wi[1];
  1022. ts[10 * subBandLimit] = out1[10] + tmp1 * wi[4];
  1023. }
  1024. inputs.process();
  1025. ts[17 * subBandLimit] = out1[17] + inputs.in2 * wi[11];
  1026. ts[12 * subBandLimit] = out1[12] + inputs.in2 * wi[6];
  1027. ts[14 * subBandLimit] = out1[14] + inputs.in3 * wi[8];
  1028. ts[15 * subBandLimit] = out1[15] + inputs.in3 * wi[9];
  1029. ts[6 * subBandLimit] = out1[6] + inputs.in0 * wi[0];
  1030. ts[11 * subBandLimit] = out1[11] + inputs.in0 * wi[5];
  1031. ts[8 * subBandLimit] = out1[8] + inputs.in4 * wi[2];
  1032. ts[9 * subBandLimit] = out1[9] + inputs.in4 * wi[3];
  1033. }
  1034. {
  1035. DCT12Inputs inputs (++in);
  1036. auto tmp1 = (inputs.in0 - inputs.in4);
  1037. auto tmp2 = (inputs.in1 - inputs.in5) * cos12[1];
  1038. auto tmp0 = tmp1 + tmp2;
  1039. tmp1 -= tmp2;
  1040. out2[4] = tmp0 * wi[10];
  1041. out2[1] = tmp0 * wi[7];
  1042. ts[13 * subBandLimit] += tmp1 * wi[1];
  1043. ts[16 * subBandLimit] += tmp1 * wi[4];
  1044. inputs.process();
  1045. out2[5] = inputs.in2 * wi[11];
  1046. out2[0] = inputs.in2 * wi[6];
  1047. out2[2] = inputs.in3 * wi[8];
  1048. out2[3] = inputs.in3 * wi[9];
  1049. ts[12 * subBandLimit] += inputs.in0 * wi[0];
  1050. ts[17 * subBandLimit] += inputs.in0 * wi[5];
  1051. ts[14 * subBandLimit] += inputs.in4 * wi[2];
  1052. ts[15 * subBandLimit] += inputs.in4 * wi[5 - 2];
  1053. }
  1054. {
  1055. DCT12Inputs inputs (++in);
  1056. out2[12] = out2[13] = out2[14] = out2[15] = out2[16] = out2[17] = 0;
  1057. auto tmp1 = (inputs.in0 - inputs.in4);
  1058. auto tmp2 = (inputs.in1 - inputs.in5) * cos12[1];
  1059. auto tmp0 = tmp1 + tmp2;
  1060. tmp1 -= tmp2;
  1061. out2[10] = tmp0 * wi[10];
  1062. out2[7] = tmp0 * wi[7];
  1063. out2[1] += tmp1 * wi[1];
  1064. out2[4] += tmp1 * wi[4];
  1065. inputs.process();
  1066. out2[11] = inputs.in2 * wi[11];
  1067. out2[6] = inputs.in2 * wi[6];
  1068. out2[8] = inputs.in3 * wi[8];
  1069. out2[9] = inputs.in3 * wi[9];
  1070. out2[0] += inputs.in0 * wi[0];
  1071. out2[5] += inputs.in0 * wi[5];
  1072. out2[2] += inputs.in4 * wi[2];
  1073. out2[3] += inputs.in4 * wi[3];
  1074. }
  1075. }
  1076. static void dct64 (float* out0, float* out1, const float* samples) noexcept
  1077. {
  1078. float b1[32], b2[32];
  1079. {
  1080. auto* costab = constants.cosTables[0];
  1081. b1[0x00] = samples[0x00] + samples[0x1F]; b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0];
  1082. b1[0x01] = samples[0x01] + samples[0x1E]; b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1];
  1083. b1[0x02] = samples[0x02] + samples[0x1D]; b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2];
  1084. b1[0x03] = samples[0x03] + samples[0x1C]; b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3];
  1085. b1[0x04] = samples[0x04] + samples[0x1B]; b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4];
  1086. b1[0x05] = samples[0x05] + samples[0x1A]; b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5];
  1087. b1[0x06] = samples[0x06] + samples[0x19]; b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6];
  1088. b1[0x07] = samples[0x07] + samples[0x18]; b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7];
  1089. b1[0x08] = samples[0x08] + samples[0x17]; b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8];
  1090. b1[0x09] = samples[0x09] + samples[0x16]; b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9];
  1091. b1[0x0A] = samples[0x0A] + samples[0x15]; b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA];
  1092. b1[0x0B] = samples[0x0B] + samples[0x14]; b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB];
  1093. b1[0x0C] = samples[0x0C] + samples[0x13]; b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC];
  1094. b1[0x0D] = samples[0x0D] + samples[0x12]; b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD];
  1095. b1[0x0E] = samples[0x0E] + samples[0x11]; b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE];
  1096. b1[0x0F] = samples[0x0F] + samples[0x10]; b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF];
  1097. }
  1098. {
  1099. auto* costab = constants.cosTables[1];
  1100. b2[0x00] = b1[0x00] + b1[0x0F]; b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0];
  1101. b2[0x01] = b1[0x01] + b1[0x0E]; b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1];
  1102. b2[0x02] = b1[0x02] + b1[0x0D]; b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2];
  1103. b2[0x03] = b1[0x03] + b1[0x0C]; b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3];
  1104. b2[0x04] = b1[0x04] + b1[0x0B]; b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4];
  1105. b2[0x05] = b1[0x05] + b1[0x0A]; b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5];
  1106. b2[0x06] = b1[0x06] + b1[0x09]; b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6];
  1107. b2[0x07] = b1[0x07] + b1[0x08]; b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7];
  1108. b2[0x10] = b1[0x10] + b1[0x1F]; b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0];
  1109. b2[0x11] = b1[0x11] + b1[0x1E]; b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1];
  1110. b2[0x12] = b1[0x12] + b1[0x1D]; b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2];
  1111. b2[0x13] = b1[0x13] + b1[0x1C]; b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3];
  1112. b2[0x14] = b1[0x14] + b1[0x1B]; b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4];
  1113. b2[0x15] = b1[0x15] + b1[0x1A]; b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5];
  1114. b2[0x16] = b1[0x16] + b1[0x19]; b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6];
  1115. b2[0x17] = b1[0x17] + b1[0x18]; b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7];
  1116. }
  1117. {
  1118. auto* costab = constants.cosTables[2];
  1119. b1[0x00] = b2[0x00] + b2[0x07]; b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0];
  1120. b1[0x01] = b2[0x01] + b2[0x06]; b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1];
  1121. b1[0x02] = b2[0x02] + b2[0x05]; b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2];
  1122. b1[0x03] = b2[0x03] + b2[0x04]; b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3];
  1123. b1[0x08] = b2[0x08] + b2[0x0F]; b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0];
  1124. b1[0x09] = b2[0x09] + b2[0x0E]; b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1];
  1125. b1[0x0A] = b2[0x0A] + b2[0x0D]; b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2];
  1126. b1[0x0B] = b2[0x0B] + b2[0x0C]; b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3];
  1127. b1[0x10] = b2[0x10] + b2[0x17]; b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0];
  1128. b1[0x11] = b2[0x11] + b2[0x16]; b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1];
  1129. b1[0x12] = b2[0x12] + b2[0x15]; b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2];
  1130. b1[0x13] = b2[0x13] + b2[0x14]; b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3];
  1131. b1[0x18] = b2[0x18] + b2[0x1F]; b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0];
  1132. b1[0x19] = b2[0x19] + b2[0x1E]; b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1];
  1133. b1[0x1A] = b2[0x1A] + b2[0x1D]; b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2];
  1134. b1[0x1B] = b2[0x1B] + b2[0x1C]; b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3];
  1135. }
  1136. {
  1137. auto cos0 = constants.cosTables[3][0];
  1138. auto cos1 = constants.cosTables[3][1];
  1139. b2[0x00] = b1[0x00] + b1[0x03]; b2[0x03] = (b1[0x00] - b1[0x03]) * cos0;
  1140. b2[0x01] = b1[0x01] + b1[0x02]; b2[0x02] = (b1[0x01] - b1[0x02]) * cos1;
  1141. b2[0x04] = b1[0x04] + b1[0x07]; b2[0x07] = (b1[0x07] - b1[0x04]) * cos0;
  1142. b2[0x05] = b1[0x05] + b1[0x06]; b2[0x06] = (b1[0x06] - b1[0x05]) * cos1;
  1143. b2[0x08] = b1[0x08] + b1[0x0B]; b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0;
  1144. b2[0x09] = b1[0x09] + b1[0x0A]; b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1;
  1145. b2[0x0C] = b1[0x0C] + b1[0x0F]; b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0;
  1146. b2[0x0D] = b1[0x0D] + b1[0x0E]; b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1;
  1147. b2[0x10] = b1[0x10] + b1[0x13]; b2[0x13] = (b1[0x10] - b1[0x13]) * cos0;
  1148. b2[0x11] = b1[0x11] + b1[0x12]; b2[0x12] = (b1[0x11] - b1[0x12]) * cos1;
  1149. b2[0x14] = b1[0x14] + b1[0x17]; b2[0x17] = (b1[0x17] - b1[0x14]) * cos0;
  1150. b2[0x15] = b1[0x15] + b1[0x16]; b2[0x16] = (b1[0x16] - b1[0x15]) * cos1;
  1151. b2[0x18] = b1[0x18] + b1[0x1B]; b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0;
  1152. b2[0x19] = b1[0x19] + b1[0x1A]; b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1;
  1153. b2[0x1C] = b1[0x1C] + b1[0x1F]; b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0;
  1154. b2[0x1D] = b1[0x1D] + b1[0x1E]; b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1;
  1155. }
  1156. {
  1157. auto cos0 = constants.cosTables[4][0];
  1158. b1[0x00] = b2[0x00] + b2[0x01]; b1[0x01] = (b2[0x00] - b2[0x01]) * cos0;
  1159. b1[0x02] = b2[0x02] + b2[0x03]; b1[0x03] = (b2[0x03] - b2[0x02]) * cos0; b1[0x02] += b1[0x03];
  1160. b1[0x04] = b2[0x04] + b2[0x05]; b1[0x05] = (b2[0x04] - b2[0x05]) * cos0;
  1161. b1[0x06] = b2[0x06] + b2[0x07]; b1[0x07] = (b2[0x07] - b2[0x06]) * cos0;
  1162. b1[0x06] += b1[0x07]; b1[0x04] += b1[0x06]; b1[0x06] += b1[0x05]; b1[0x05] += b1[0x07];
  1163. b1[0x08] = b2[0x08] + b2[0x09]; b1[0x09] = (b2[0x08] - b2[0x09]) * cos0;
  1164. b1[0x0A] = b2[0x0A] + b2[0x0B]; b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0; b1[0x0A] += b1[0x0B];
  1165. b1[0x0C] = b2[0x0C] + b2[0x0D]; b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0;
  1166. b1[0x0E] = b2[0x0E] + b2[0x0F]; b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0;
  1167. b1[0x0E] += b1[0x0F]; b1[0x0C] += b1[0x0E]; b1[0x0E] += b1[0x0D]; b1[0x0D] += b1[0x0F];
  1168. b1[0x10] = b2[0x10] + b2[0x11]; b1[0x11] = (b2[0x10] - b2[0x11]) * cos0;
  1169. b1[0x12] = b2[0x12] + b2[0x13]; b1[0x13] = (b2[0x13] - b2[0x12]) * cos0; b1[0x12] += b1[0x13];
  1170. b1[0x14] = b2[0x14] + b2[0x15]; b1[0x15] = (b2[0x14] - b2[0x15]) * cos0;
  1171. b1[0x16] = b2[0x16] + b2[0x17]; b1[0x17] = (b2[0x17] - b2[0x16]) * cos0;
  1172. b1[0x16] += b1[0x17]; b1[0x14] += b1[0x16]; b1[0x16] += b1[0x15]; b1[0x15] += b1[0x17];
  1173. b1[0x18] = b2[0x18] + b2[0x19]; b1[0x19] = (b2[0x18] - b2[0x19]) * cos0;
  1174. b1[0x1A] = b2[0x1A] + b2[0x1B]; b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0; b1[0x1A] += b1[0x1B];
  1175. b1[0x1C] = b2[0x1C] + b2[0x1D]; b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0;
  1176. b1[0x1E] = b2[0x1E] + b2[0x1F]; b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0;
  1177. b1[0x1E] += b1[0x1F]; b1[0x1C] += b1[0x1E]; b1[0x1E] += b1[0x1D]; b1[0x1D] += b1[0x1F];
  1178. }
  1179. out0[0x10 * 16] = b1[0x00]; out0[0x10 * 12] = b1[0x04]; out0[0x10 * 8] = b1[0x02]; out0[0x10 * 4] = b1[0x06];
  1180. out0[0] = b1[0x01]; out1[0] = b1[0x01]; out1[0x10 * 4] = b1[0x05]; out1[0x10 * 8] = b1[0x03];
  1181. out1[0x10 * 12] = b1[0x07];
  1182. b1[0x08] += b1[0x0C]; out0[0x10 * 14] = b1[0x08]; b1[0x0C] += b1[0x0a]; out0[0x10 * 10] = b1[0x0C];
  1183. b1[0x0A] += b1[0x0E]; out0[0x10 * 6] = b1[0x0A]; b1[0x0E] += b1[0x09]; out0[0x10 * 2] = b1[0x0E];
  1184. b1[0x09] += b1[0x0D]; out1[0x10 * 2] = b1[0x09]; b1[0x0D] += b1[0x0B]; out1[0x10 * 6] = b1[0x0D];
  1185. b1[0x0B] += b1[0x0F]; out1[0x10 * 10] = b1[0x0B]; out1[0x10 * 14] = b1[0x0F];
  1186. b1[0x18] += b1[0x1C]; out0[0x10 * 15] = b1[0x10] + b1[0x18]; out0[0x10 * 13] = b1[0x18] + b1[0x14];
  1187. b1[0x1C] += b1[0x1a]; out0[0x10 * 11] = b1[0x14] + b1[0x1C]; out0[0x10 * 9] = b1[0x1C] + b1[0x12];
  1188. b1[0x1A] += b1[0x1E]; out0[0x10 * 7] = b1[0x12] + b1[0x1A]; out0[0x10 * 5] = b1[0x1A] + b1[0x16];
  1189. b1[0x1E] += b1[0x19]; out0[0x10 * 3] = b1[0x16] + b1[0x1E]; out0[0x10 * 1] = b1[0x1E] + b1[0x11];
  1190. b1[0x19] += b1[0x1D]; out1[0x10 * 1] = b1[0x11] + b1[0x19]; out1[0x10 * 3] = b1[0x19] + b1[0x15];
  1191. b1[0x1D] += b1[0x1B]; out1[0x10 * 5] = b1[0x15] + b1[0x1D]; out1[0x10 * 7] = b1[0x1D] + b1[0x13];
  1192. b1[0x1B] += b1[0x1F]; out1[0x10 * 9] = b1[0x13] + b1[0x1B]; out1[0x10 * 11] = b1[0x1B] + b1[0x17];
  1193. out1[0x10 * 13] = b1[0x17] + b1[0x1F]; out1[0x10 * 15] = b1[0x1F];
  1194. }
  1195. }
  1196. //==============================================================================
  1197. struct MP3Stream
  1198. {
  1199. MP3Stream (InputStream& source) : stream (source, 8192)
  1200. {
  1201. reset();
  1202. }
  1203. int decodeNextBlock (float* out0, float* out1, int& done)
  1204. {
  1205. if (! headerParsed)
  1206. {
  1207. auto nextFrameOffset = scanForNextFrameHeader (false);
  1208. if (lastFrameSize == -1 || needToSyncBitStream)
  1209. {
  1210. needToSyncBitStream = false;
  1211. readVBRHeader();
  1212. if (vbrHeaderFound)
  1213. return 1;
  1214. }
  1215. if (nextFrameOffset < 0)
  1216. return -1;
  1217. if (nextFrameOffset > 0)
  1218. {
  1219. wasFreeFormat = false;
  1220. needToSyncBitStream = true;
  1221. auto size = (int) (bufferPointer - (bufferSpace[bufferSpaceIndex] + 512));
  1222. if (size > 2880)
  1223. {
  1224. size = 0;
  1225. bufferPointer = bufferSpace[bufferSpaceIndex] + 512;
  1226. }
  1227. auto toSkip = (size + nextFrameOffset) - 2880;
  1228. if (toSkip > 0)
  1229. {
  1230. stream.skipNextBytes (toSkip);
  1231. nextFrameOffset -= toSkip;
  1232. }
  1233. stream.read (bufferPointer, nextFrameOffset);
  1234. lastFrameSize += nextFrameOffset;
  1235. }
  1236. const auto successful = frame.decodeHeader ((uint32) stream.readIntBigEndian());
  1237. if (successful == MP3Frame::ParseSuccessful::no)
  1238. return -1;
  1239. headerParsed = true;
  1240. frameSize = frame.frameSize;
  1241. isFreeFormat = (frameSize == 0);
  1242. sideInfoSize = frame.lsf != 0 ? ((frame.numChannels == 1) ? 9 : 17)
  1243. : ((frame.numChannels == 1) ? 17 : 32);
  1244. if (frame.crc16FollowsHeader)
  1245. sideInfoSize += 2;
  1246. bufferSpaceIndex = 1 - bufferSpaceIndex;
  1247. bufferPointer = bufferSpace[bufferSpaceIndex] + 512;
  1248. bitIndex = 0;
  1249. if (lastFrameSize < 0)
  1250. return 1;
  1251. }
  1252. if (! sideParsed)
  1253. {
  1254. if (frame.layer == 3)
  1255. {
  1256. stream.read (bufferPointer, sideInfoSize);
  1257. if (frame.crc16FollowsHeader)
  1258. getBits (16);
  1259. auto bits = jmax (0, decodeLayer3SideInfo());
  1260. dataSize = (bits + 7) / 8;
  1261. if (! isFreeFormat)
  1262. dataSize = jmin (dataSize, frame.frameSize - sideInfoSize);
  1263. }
  1264. else
  1265. {
  1266. dataSize = frame.frameSize;
  1267. sideInfoSize = 0;
  1268. }
  1269. sideParsed = true;
  1270. }
  1271. int result = 1;
  1272. if (! dataParsed)
  1273. {
  1274. stream.read (bufferPointer, dataSize);
  1275. if (out0 != nullptr)
  1276. {
  1277. if (frame.layer < 3 && frame.crc16FollowsHeader)
  1278. getBits (16);
  1279. switch (frame.layer)
  1280. {
  1281. case 1: decodeLayer1Frame (out0, out1, done); break;
  1282. case 2: decodeLayer2Frame (out0, out1, done); break;
  1283. case 3: decodeLayer3Frame (out0, out1, done); break;
  1284. default: break;
  1285. }
  1286. }
  1287. bufferPointer = bufferSpace[bufferSpaceIndex] + 512 + sideInfoSize + dataSize;
  1288. dataParsed = true;
  1289. result = 0;
  1290. }
  1291. if (isFreeFormat)
  1292. {
  1293. if (wasFreeFormat)
  1294. {
  1295. frameSize = lastFrameSizeNoPadding + frame.padding;
  1296. }
  1297. else
  1298. {
  1299. auto nextFrameOffset = scanForNextFrameHeader (true);
  1300. wasFreeFormat = isFreeFormat;
  1301. if (nextFrameOffset < 0)
  1302. {
  1303. lastFrameSize = frameSize;
  1304. return result;
  1305. }
  1306. frameSize = nextFrameOffset + sideInfoSize + dataSize;
  1307. lastFrameSizeNoPadding = frameSize - frame.padding;
  1308. }
  1309. }
  1310. if (result == 0)
  1311. return result;
  1312. int bytes = frameSize - (sideInfoSize + dataSize);
  1313. if (bytes > 0)
  1314. {
  1315. auto toSkip = bytes - 512;
  1316. if (toSkip > 0)
  1317. {
  1318. stream.skipNextBytes (toSkip);
  1319. bytes -= toSkip;
  1320. frameSize -= toSkip;
  1321. }
  1322. stream.read (bufferPointer, bytes);
  1323. bufferPointer += bytes;
  1324. }
  1325. lastFrameSize = frameSize;
  1326. wasFreeFormat = isFreeFormat;
  1327. frameSize = 0;
  1328. headerParsed = sideParsed = dataParsed = false;
  1329. return result;
  1330. }
  1331. bool seek (int frameIndex)
  1332. {
  1333. frameIndex = jmax (0, frameIndex);
  1334. while (frameIndex >= frameStreamPositions.size() * storedStartPosInterval)
  1335. {
  1336. int dummy = 0;
  1337. auto result = decodeNextBlock (nullptr, nullptr, dummy);
  1338. if (result < 0)
  1339. return false;
  1340. if (result > 0)
  1341. break;
  1342. }
  1343. frameIndex = jmin (frameIndex & ~(storedStartPosInterval - 1),
  1344. (frameStreamPositions.size() - 1) * storedStartPosInterval);
  1345. stream.setPosition (frameStreamPositions.getUnchecked (frameIndex / storedStartPosInterval));
  1346. currentFrameIndex = frameIndex;
  1347. reset();
  1348. return true;
  1349. }
  1350. MP3Frame frame;
  1351. VBRTagData vbrTagData;
  1352. BufferedInputStream stream;
  1353. int numFrames = 0, currentFrameIndex = 0;
  1354. bool vbrHeaderFound = false;
  1355. private:
  1356. bool headerParsed, sideParsed, dataParsed, needToSyncBitStream;
  1357. bool isFreeFormat, wasFreeFormat;
  1358. int sideInfoSize, dataSize;
  1359. int frameSize, lastFrameSize, lastFrameSizeNoPadding;
  1360. int bufferSpaceIndex;
  1361. Layer3SideInfo sideinfo;
  1362. uint8 bufferSpace[2][2880 + 1024];
  1363. uint8* bufferPointer;
  1364. int bitIndex, synthBo;
  1365. float hybridBlock[2][2][32 * 18];
  1366. int hybridBlockIndex[2];
  1367. float synthBuffers[2][2][0x110];
  1368. float hybridIn[2][32][18];
  1369. float hybridOut[2][18][32];
  1370. void reset() noexcept
  1371. {
  1372. headerParsed = sideParsed = dataParsed = isFreeFormat = wasFreeFormat = false;
  1373. lastFrameSize = -1;
  1374. needToSyncBitStream = true;
  1375. frameSize = sideInfoSize = dataSize = bitIndex = 0;
  1376. lastFrameSizeNoPadding = bufferSpaceIndex = 0;
  1377. bufferPointer = bufferSpace[bufferSpaceIndex] + 512;
  1378. synthBo = 1;
  1379. zerostruct (sideinfo);
  1380. zeromem (bufferSpace, sizeof (bufferSpace));
  1381. zeromem (hybridBlock, sizeof (hybridBlock));
  1382. zeromem (hybridBlockIndex, sizeof (hybridBlockIndex));
  1383. zeromem (synthBuffers, sizeof (synthBuffers));
  1384. }
  1385. enum { storedStartPosInterval = 4 };
  1386. Array<int64> frameStreamPositions;
  1387. struct SideInfoLayer1
  1388. {
  1389. uint8 allocation[32][2];
  1390. uint8 scaleFactor[32][2];
  1391. };
  1392. struct SideInfoLayer2
  1393. {
  1394. uint8 allocation[32][2];
  1395. uint8 scaleFactor[32][2][3];
  1396. };
  1397. static bool isValidHeader (uint32 header, int oldLayer) noexcept
  1398. {
  1399. auto newLayer = (int) (4 - ((header >> 17) & 3));
  1400. return (header & 0xffe00000) == 0xffe00000
  1401. && newLayer != 4
  1402. && (oldLayer <= 0 || newLayer == oldLayer)
  1403. && ((header >> 12) & 15) != 15
  1404. && ((header >> 10) & 3) != 3
  1405. && (header & 3) != 2;
  1406. }
  1407. bool rollBackBufferPointer (int backstep) noexcept
  1408. {
  1409. if (lastFrameSize < 0 && backstep > 0)
  1410. return false;
  1411. auto* oldBuffer = bufferSpace[1 - bufferSpaceIndex] + 512;
  1412. bufferPointer -= backstep;
  1413. if (backstep != 0)
  1414. memcpy (bufferPointer, oldBuffer + lastFrameSize - backstep, (size_t) backstep);
  1415. bitIndex = 0;
  1416. return true;
  1417. }
  1418. uint32 getBits (int numBits) noexcept
  1419. {
  1420. if (numBits <= 0 || bufferPointer == nullptr)
  1421. return 0;
  1422. const auto result = (uint32) (((((((bufferPointer[0] << 8) | bufferPointer[1]) << 8)
  1423. | bufferPointer[2]) << bitIndex) & 0xffffff) >> (24 - numBits));
  1424. bitIndex += numBits;
  1425. bufferPointer += (bitIndex >> 3);
  1426. bitIndex &= 7;
  1427. return result;
  1428. }
  1429. uint32 getOneBit() noexcept
  1430. {
  1431. auto result = (uint8) (*bufferPointer << bitIndex);
  1432. ++bitIndex;
  1433. bufferPointer += (bitIndex >> 3);
  1434. bitIndex &= 7;
  1435. return (uint32) (result >> 7);
  1436. }
  1437. uint32 getBitsUnchecked (int numBits) noexcept
  1438. {
  1439. const auto result = (uint32) (((((bufferPointer[0] << 8) | bufferPointer[1]) << bitIndex) & 0xffff) >> (16 - numBits));
  1440. bitIndex += numBits;
  1441. bufferPointer += (bitIndex >> 3);
  1442. bitIndex &= 7;
  1443. return result;
  1444. }
  1445. inline uint8 getBitsUint8 (int numBits) noexcept { return (uint8) getBitsUnchecked (numBits); }
  1446. inline uint16 getBitsUint16 (int numBits) noexcept { return (uint16) getBitsUnchecked (numBits); }
  1447. int scanForNextFrameHeader (bool checkTypeAgainstLastFrame) noexcept
  1448. {
  1449. auto oldPos = stream.getPosition();
  1450. int offset = -3;
  1451. uint32 header = 0;
  1452. for (;;)
  1453. {
  1454. if (stream.isExhausted() || stream.getPosition() > oldPos + 32768)
  1455. {
  1456. offset = -1;
  1457. break;
  1458. }
  1459. header = (header << 8) | (uint8) stream.readByte();
  1460. if (offset >= 0 && isValidHeader (header, frame.layer))
  1461. {
  1462. if (! checkTypeAgainstLastFrame)
  1463. break;
  1464. const bool mpeg25 = (header & (1 << 20)) == 0;
  1465. const uint32 lsf = mpeg25 ? 1 : ((header & (1 << 19)) ? 0 : 1);
  1466. const uint32 sampleRateIndex = mpeg25 ? (6 + ((header >> 10) & 3)) : (((header >> 10) & 3) + (lsf * 3));
  1467. const uint32 mode = (header >> 6) & 3;
  1468. const uint32 numChannels = (mode == 3) ? 1 : 2;
  1469. if (numChannels == (uint32) frame.numChannels && lsf == (uint32) frame.lsf
  1470. && mpeg25 == frame.mpeg25 && sampleRateIndex == (uint32) frame.sampleRateIndex)
  1471. break;
  1472. }
  1473. ++offset;
  1474. }
  1475. if (offset >= 0)
  1476. {
  1477. if ((currentFrameIndex & (storedStartPosInterval - 1)) == 0)
  1478. frameStreamPositions.set (currentFrameIndex / storedStartPosInterval, oldPos + offset);
  1479. ++currentFrameIndex;
  1480. }
  1481. stream.setPosition (oldPos);
  1482. return offset;
  1483. }
  1484. void readVBRHeader()
  1485. {
  1486. auto oldPos = stream.getPosition();
  1487. uint8 xing[194];
  1488. stream.read (xing, sizeof (xing));
  1489. vbrHeaderFound = vbrTagData.read (xing);
  1490. if (vbrHeaderFound)
  1491. {
  1492. numFrames = (int) vbrTagData.frames;
  1493. oldPos += jmax (vbrTagData.headersize, 1);
  1494. }
  1495. stream.setPosition (oldPos);
  1496. }
  1497. void decodeLayer1Frame (float* pcm0, float* pcm1, int& samplesDone) noexcept
  1498. {
  1499. float fraction[2][32];
  1500. SideInfoLayer1 si;
  1501. layer1Step1 (si);
  1502. auto single = (frame.numChannels == 1 || frame.single == 3) ? 0 : frame.single;
  1503. if (single >= 0)
  1504. {
  1505. for (int i = 0; i < 12; ++i)
  1506. {
  1507. layer1Step2 (si, fraction);
  1508. synthesise (fraction[single], 0, pcm0, samplesDone);
  1509. }
  1510. }
  1511. else
  1512. {
  1513. for (int i = 0; i < 12; ++i)
  1514. {
  1515. layer1Step2 (si, fraction);
  1516. synthesiseStereo (fraction[0], fraction[1], pcm0, pcm1, samplesDone);
  1517. }
  1518. }
  1519. }
  1520. void decodeLayer2Frame (float* pcm0, float* pcm1, int& samplesDone)
  1521. {
  1522. float fraction[2][4][32];
  1523. frame.selectLayer2Table();
  1524. SideInfoLayer2 si;
  1525. layer2Step1 (si);
  1526. auto single = (frame.numChannels == 1 || frame.single == 3) ? 0 : frame.single;
  1527. if (single >= 0)
  1528. {
  1529. for (int i = 0; i < 12; ++i)
  1530. {
  1531. layer2Step2 (si, i >> 2, fraction);
  1532. for (int j = 0; j < 3; ++j)
  1533. synthesise (fraction[single][j], 0, pcm0, samplesDone);
  1534. }
  1535. }
  1536. else
  1537. {
  1538. for (int i = 0; i < 12; ++i)
  1539. {
  1540. layer2Step2 (si, i >> 2, fraction);
  1541. for (int j = 0; j < 3; ++j)
  1542. synthesiseStereo (fraction[0][j], fraction[1][j], pcm0, pcm1, samplesDone);
  1543. }
  1544. }
  1545. }
  1546. void decodeLayer3Frame (float* pcm0, float* pcm1, int& samplesDone) noexcept
  1547. {
  1548. if (! rollBackBufferPointer ((int) sideinfo.mainDataStart))
  1549. return;
  1550. const int single = frame.numChannels == 1 ? 0 : frame.single;
  1551. const int numChans = (frame.numChannels == 1 || single >= 0) ? 1 : 2;
  1552. const bool msStereo = (frame.mode == 1) && (frame.modeExt & 2) != 0;
  1553. const bool iStereo = (frame.mode == 1) && (frame.modeExt & 1) != 0;
  1554. const int granules = frame.lsf ? 1 : 2;
  1555. int scaleFactors[2][39];
  1556. for (int gr = 0; gr < granules; ++gr)
  1557. {
  1558. {
  1559. auto& granule = sideinfo.ch[0].gr[gr];
  1560. auto part2bits = frame.lsf ? getLayer3ScaleFactors2 (scaleFactors[0], granule, 0)
  1561. : getLayer3ScaleFactors1 (scaleFactors[0], granule);
  1562. if (layer3DequantizeSample (hybridIn[0], scaleFactors[0], granule, frame.sampleRateIndex, part2bits))
  1563. return;
  1564. }
  1565. if (frame.numChannels == 2)
  1566. {
  1567. auto& granule = sideinfo.ch[1].gr[gr];
  1568. auto part2bits = frame.lsf ? getLayer3ScaleFactors2 (scaleFactors[1], granule, iStereo)
  1569. : getLayer3ScaleFactors1 (scaleFactors[1], granule);
  1570. if (layer3DequantizeSample (hybridIn[1], scaleFactors[1], granule, frame.sampleRateIndex, part2bits))
  1571. return;
  1572. if (msStereo)
  1573. {
  1574. for (int i = 0; i < 32 * 18; ++i)
  1575. {
  1576. auto tmp0 = ((const float*) hybridIn[0])[i];
  1577. auto tmp1 = ((const float*) hybridIn[1])[i];
  1578. ((float*) hybridIn[1])[i] = tmp0 - tmp1;
  1579. ((float*) hybridIn[0])[i] = tmp0 + tmp1;
  1580. }
  1581. }
  1582. if (iStereo)
  1583. granule.doIStereo (hybridIn, scaleFactors[1], frame.sampleRateIndex, msStereo, frame.lsf);
  1584. if (msStereo || iStereo || single == 3)
  1585. {
  1586. if (granule.maxb > sideinfo.ch[0].gr[gr].maxb)
  1587. sideinfo.ch[0].gr[gr].maxb = granule.maxb;
  1588. else
  1589. granule.maxb = sideinfo.ch[0].gr[gr].maxb;
  1590. }
  1591. switch (single)
  1592. {
  1593. case 3:
  1594. {
  1595. auto* in0 = (float*) hybridIn[0];
  1596. auto* in1 = (const float*) hybridIn[1];
  1597. for (int i = 0; i < (int) (18 * granule.maxb); ++i, ++in0)
  1598. *in0 = (*in0 + *in1++);
  1599. }
  1600. break;
  1601. case 1:
  1602. {
  1603. auto* in0 = (float*) hybridIn[0];
  1604. auto* in1 = (const float*) hybridIn[1];
  1605. for (int i = 0; i < (int) (18 * granule.maxb); ++i)
  1606. *in0++ = *in1++;
  1607. }
  1608. break;
  1609. default:
  1610. break;
  1611. }
  1612. }
  1613. for (int ch = 0; ch < numChans; ++ch)
  1614. {
  1615. auto& granule = sideinfo.ch[ch].gr[gr];
  1616. granule.doAntialias (hybridIn[ch]);
  1617. layer3Hybrid (hybridIn[ch], hybridOut[ch], ch, granule);
  1618. }
  1619. for (int ss = 0; ss < 18; ++ss)
  1620. {
  1621. if (single >= 0)
  1622. synthesise (hybridOut[0][ss], 0, pcm0, samplesDone);
  1623. else
  1624. synthesiseStereo (hybridOut[0][ss], hybridOut[1][ss], pcm0, pcm1, samplesDone);
  1625. }
  1626. }
  1627. }
  1628. int decodeLayer3SideInfo() noexcept
  1629. {
  1630. const int numChannels = frame.numChannels;
  1631. const int sampleRate = frame.sampleRateIndex;
  1632. const int single = (numChannels == 1) ? 0 : frame.single;
  1633. const bool msStereo = (frame.mode == 1) && (frame.modeExt & 2) != 0;
  1634. const int granules = frame.lsf ? 1 : 2;
  1635. if (frame.lsf == 0)
  1636. getLayer3SideInfo1 (numChannels, msStereo, sampleRate, single);
  1637. else
  1638. getLayer3SideInfo2 (numChannels, msStereo, sampleRate, single);
  1639. int databits = 0;
  1640. for (int gr = 0; gr < granules; ++gr)
  1641. for (int ch = 0; ch < numChannels; ++ch)
  1642. databits += (int) sideinfo.ch[ch].gr[gr].part2_3Length;
  1643. return databits - 8 * (int) sideinfo.mainDataStart;
  1644. }
  1645. void layer1Step1 (SideInfoLayer1& si) noexcept
  1646. {
  1647. zerostruct (si);
  1648. int i, jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : 32;
  1649. if (frame.numChannels == 2)
  1650. {
  1651. for (i = 0; i < jsbound; ++i)
  1652. {
  1653. si.allocation[i][0] = getBitsUint8 (4);
  1654. si.allocation[i][1] = getBitsUint8 (4);
  1655. }
  1656. for (i = jsbound; i < 32; ++i)
  1657. si.allocation[i][0] = si.allocation[i][1] = getBitsUint8 (4);
  1658. for (i = 0; i < 32; ++i)
  1659. {
  1660. si.scaleFactor[i][0] = si.allocation[i][0] ? getBitsUint8 (6) : 0;
  1661. si.scaleFactor[i][1] = si.allocation[i][1] ? getBitsUint8 (6) : 0;
  1662. }
  1663. }
  1664. else
  1665. {
  1666. for (i = 0; i < 32; ++i)
  1667. si.allocation[i][0] = getBitsUint8 (4);
  1668. for (i = 0; i < 32; ++i)
  1669. si.scaleFactor[i][0] = si.allocation[i][0] ? getBitsUint8 (6) : 0;
  1670. }
  1671. }
  1672. void layer1Step2 (SideInfoLayer1& si, float fraction[2][32]) noexcept
  1673. {
  1674. if (frame.numChannels == 2)
  1675. {
  1676. int i, jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : 32;
  1677. for (i = 0; i < jsbound; ++i)
  1678. {
  1679. const uint8 n0 = si.allocation[i][0];
  1680. const uint8 n1 = si.allocation[i][1];
  1681. fraction[0][i] = n0 > 0 ? ((float) (-(1 << n0) + getBitsUint16 (n0 + 1) + 1) * constants.muls[n0 + 1][si.scaleFactor[i][0]]) : 0.0f;
  1682. fraction[1][i] = n1 > 0 ? ((float) (-(1 << n1) + getBitsUint16 (n1 + 1) + 1) * constants.muls[n1 + 1][si.scaleFactor[i][1]]) : 0.0f;
  1683. }
  1684. for (i = jsbound; i < 32; ++i)
  1685. {
  1686. const uint8 n = si.allocation[i][0];
  1687. if (n > 0)
  1688. {
  1689. const uint32 w = ((uint32) -(1 << n) + getBitsUint16 (n + 1) + 1);
  1690. fraction[0][i] = ((float) w * constants.muls[n + 1][si.scaleFactor[i][0]]);
  1691. fraction[1][i] = ((float) w * constants.muls[n + 1][si.scaleFactor[i][1]]);
  1692. }
  1693. else
  1694. fraction[0][i] = fraction[1][i] = 0;
  1695. }
  1696. }
  1697. else
  1698. {
  1699. for (int i = 0; i < 32; ++i)
  1700. {
  1701. const uint8 n = si.allocation[i][0];
  1702. const uint8 j = si.scaleFactor[i][0];
  1703. if (n > 0)
  1704. fraction[0][i] = ((float) (-(1 << n) + getBitsUint16 (n + 1) + 1) * constants.muls[n + 1][j]);
  1705. else
  1706. fraction[0][i] = 0;
  1707. }
  1708. }
  1709. }
  1710. void layer2Step1 (SideInfoLayer2& si) noexcept
  1711. {
  1712. zerostruct (si);
  1713. const auto sblimit = frame.layer2SubBandLimit;
  1714. const auto jsbound = (frame.mode == 1 ? jmin ((frame.modeExt << 2) + 4, sblimit) : sblimit);
  1715. auto* allocTable = frame.allocationTable;
  1716. uint8 scfsi[32][2];
  1717. if (frame.numChannels == 2)
  1718. {
  1719. for (int i = 0; i < jsbound; ++i)
  1720. {
  1721. auto step = allocTable->bits;
  1722. allocTable += (static_cast<intptr_t> (1) << step);
  1723. si.allocation[i][0] = getBitsUint8 (step);
  1724. si.allocation[i][1] = getBitsUint8 (step);
  1725. }
  1726. for (int i = jsbound; i < sblimit; ++i)
  1727. {
  1728. auto step = allocTable->bits;
  1729. auto b0 = getBitsUint8 (step);
  1730. allocTable += (static_cast<intptr_t> (1) << step);
  1731. si.allocation[i][0] = b0;
  1732. si.allocation[i][1] = b0;
  1733. }
  1734. for (int i = 0; i < sblimit; ++i)
  1735. {
  1736. scfsi[i][0] = si.allocation[i][0] ? getBitsUint8 (2) : 0;
  1737. scfsi[i][1] = si.allocation[i][1] ? getBitsUint8 (2) : 0;
  1738. }
  1739. }
  1740. else
  1741. {
  1742. for (int i = 0; i < sblimit; ++i)
  1743. {
  1744. const int16 step = allocTable->bits;
  1745. allocTable += (static_cast<intptr_t> (1) << step);
  1746. si.allocation[i][0] = getBitsUint8 (step);
  1747. }
  1748. for (int i = 0; i < sblimit; ++i)
  1749. scfsi[i][0] = si.allocation[i][0] ? getBitsUint8 (2) : 0;
  1750. }
  1751. for (int i = 0; i < sblimit; ++i)
  1752. {
  1753. for (int ch = 0; ch < frame.numChannels; ++ch)
  1754. {
  1755. uint8 s0 = 0, s1 = 0, s2 = 0;
  1756. if (si.allocation[i][ch])
  1757. {
  1758. switch (scfsi[i][ch])
  1759. {
  1760. case 0:
  1761. s0 = getBitsUint8 (6);
  1762. s1 = getBitsUint8 (6);
  1763. s2 = getBitsUint8 (6);
  1764. break;
  1765. case 1:
  1766. s1 = s0 = getBitsUint8 (6);
  1767. s2 = getBitsUint8 (6);
  1768. break;
  1769. case 2:
  1770. s2 = s1 = s0 = getBitsUint8 (6);
  1771. break;
  1772. case 3:
  1773. s0 = getBitsUint8 (6);
  1774. s2 = s1 = getBitsUint8 (6);
  1775. break;
  1776. default:
  1777. break;
  1778. }
  1779. }
  1780. si.scaleFactor[i][ch][0] = s0;
  1781. si.scaleFactor[i][ch][1] = s1;
  1782. si.scaleFactor[i][ch][2] = s2;
  1783. }
  1784. }
  1785. }
  1786. void layer2Step2 (SideInfoLayer2& si, const int gr, float fraction[2][4][32]) noexcept
  1787. {
  1788. auto* allocTable = frame.allocationTable;
  1789. auto sblimit = frame.layer2SubBandLimit;
  1790. const auto jsbound = (frame.mode == 1 ? jmin ((frame.modeExt << 2) + 4, sblimit) : sblimit);
  1791. for (int i = 0; i < jsbound; ++i)
  1792. {
  1793. auto step = allocTable->bits;
  1794. for (int ch = 0; ch < frame.numChannels; ++ch)
  1795. {
  1796. if (auto ba = si.allocation[i][ch])
  1797. {
  1798. auto x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]);
  1799. auto* alloc2 = allocTable + ba;
  1800. auto k = jmin ((int16) 16, alloc2->bits);
  1801. auto d1 = alloc2->d;
  1802. if (d1 < 0)
  1803. {
  1804. const double cm = constants.muls[k][x1];
  1805. fraction[ch][0][i] = (float) (((int) getBits (k) + d1) * cm);
  1806. fraction[ch][1][i] = (float) (((int) getBits (k) + d1) * cm);
  1807. fraction[ch][2][i] = (float) (((int) getBits (k) + d1) * cm);
  1808. }
  1809. else
  1810. {
  1811. auto* tab = constants.getGroupTable (d1, getBits (k));
  1812. fraction[ch][0][i] = (float) constants.muls[tab[0]][x1];
  1813. fraction[ch][1][i] = (float) constants.muls[tab[1]][x1];
  1814. fraction[ch][2][i] = (float) constants.muls[tab[2]][x1];
  1815. }
  1816. }
  1817. else
  1818. {
  1819. fraction[ch][0][i] = fraction[ch][1][i] = fraction[ch][2][i] = 0;
  1820. }
  1821. }
  1822. allocTable += (static_cast<intptr_t> (1) << step);
  1823. }
  1824. for (int i = jsbound; i < frame.layer2SubBandLimit; ++i)
  1825. {
  1826. auto step = allocTable->bits;
  1827. auto ba = si.allocation[i][0];
  1828. if (ba != 0)
  1829. {
  1830. auto* alloc2 = allocTable + ba;
  1831. int16 k = alloc2->bits;
  1832. int16 d1 = alloc2->d;
  1833. k = (k <= 16) ? k : 16;
  1834. if (d1 < 0)
  1835. {
  1836. auto v0 = (int) getBits (k);
  1837. auto v1 = (int) getBits (k);
  1838. auto v2 = (int) getBits (k);
  1839. for (int ch = 0; ch < frame.numChannels; ++ch)
  1840. {
  1841. auto x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]);
  1842. const double cm = constants.muls[k][x1];
  1843. fraction[ch][0][i] = (float) ((v0 + d1) * cm);
  1844. fraction[ch][1][i] = (float) ((v1 + d1) * cm);
  1845. fraction[ch][2][i] = (float) ((v2 + d1) * cm);
  1846. }
  1847. }
  1848. else
  1849. {
  1850. auto* tab = constants.getGroupTable (d1, getBits (k));
  1851. auto k0 = tab[0];
  1852. auto k1 = tab[1];
  1853. auto k2 = tab[2];
  1854. for (int ch = 0; ch < frame.numChannels; ++ch)
  1855. {
  1856. auto x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]);
  1857. fraction[ch][0][i] = (float) constants.muls[k0][x1];
  1858. fraction[ch][1][i] = (float) constants.muls[k1][x1];
  1859. fraction[ch][2][i] = (float) constants.muls[k2][x1];
  1860. }
  1861. }
  1862. }
  1863. else
  1864. {
  1865. fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] = 0;
  1866. fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0;
  1867. }
  1868. allocTable += (static_cast<intptr_t> (1) << step);
  1869. }
  1870. for (int ch = 0; ch < frame.numChannels; ++ch)
  1871. for (int i = frame.layer2SubBandLimit; i < 32; ++i)
  1872. fraction[ch][0][i] = fraction[ch][1][i] = fraction[ch][2][i] = 0;
  1873. }
  1874. void getLayer3SideInfo1 (const int stereo, const bool msStereo, const int sampleRate, const int single) noexcept
  1875. {
  1876. const int powdiff = (single == 3) ? 4 : 0;
  1877. sideinfo.mainDataStart = getBits (9);
  1878. sideinfo.privateBits = getBitsUnchecked (stereo == 1 ? 5 : 3);
  1879. for (int ch = 0; ch < stereo; ++ch)
  1880. {
  1881. sideinfo.ch[ch].gr[0].scfsi = -1;
  1882. sideinfo.ch[ch].gr[1].scfsi = (int) getBitsUnchecked (4);
  1883. }
  1884. for (int gr = 0; gr < 2; ++gr)
  1885. {
  1886. for (int ch = 0; ch < stereo; ++ch)
  1887. {
  1888. auto& granule = sideinfo.ch[ch].gr[gr];
  1889. granule.part2_3Length = getBits (12);
  1890. granule.bigValues = jmin (288u, getBitsUnchecked (9));
  1891. const int qss = (int) getBitsUnchecked (8);
  1892. granule.pow2gain = constants.powToGains + 256 - qss + powdiff;
  1893. if (msStereo)
  1894. granule.pow2gain += 2;
  1895. granule.scaleFactorCompression = getBitsUnchecked (4);
  1896. if (getOneBit())
  1897. {
  1898. granule.blockType = getBitsUnchecked (2);
  1899. granule.mixedBlockFlag = getOneBit();
  1900. granule.tableSelect[0] = getBitsUnchecked (5);
  1901. granule.tableSelect[1] = getBitsUnchecked (5);
  1902. granule.tableSelect[2] = 0;
  1903. for (int i = 0; i < 3; ++i)
  1904. {
  1905. const uint32 sbg = (getBitsUnchecked (3) << 3);
  1906. granule.fullGain[i] = granule.pow2gain + sbg;
  1907. }
  1908. granule.region1Start = 36 >> 1;
  1909. granule.region2Start = 576 >> 1;
  1910. }
  1911. else
  1912. {
  1913. for (int i = 0; i < 3; ++i)
  1914. granule.tableSelect[i] = getBitsUnchecked (5);
  1915. const int r0c = (int) getBitsUnchecked (4);
  1916. const int r1c = (int) getBitsUnchecked (3);
  1917. const int region0index = jmin (22, r0c + 1);
  1918. const int region1index = jmin (22, r0c + 1 + r1c + 1);
  1919. granule.region1Start = (uint32) (bandInfo[sampleRate].longIndex[region0index] >> 1);
  1920. granule.region2Start = (uint32) (bandInfo[sampleRate].longIndex[region1index] >> 1);
  1921. granule.blockType = 0;
  1922. granule.mixedBlockFlag = 0;
  1923. }
  1924. granule.preflag = getOneBit();
  1925. granule.scaleFactorScale = getOneBit();
  1926. granule.count1TableSelect = getOneBit();
  1927. }
  1928. }
  1929. }
  1930. void getLayer3SideInfo2 (const int stereo, const bool msStereo, const int sampleRate, const int single) noexcept
  1931. {
  1932. const int powdiff = (single == 3) ? 4 : 0;
  1933. sideinfo.mainDataStart = getBits (8);
  1934. sideinfo.privateBits = stereo == 1 ? getOneBit() : getBitsUnchecked (2);
  1935. for (int ch = 0; ch < stereo; ++ch)
  1936. {
  1937. auto& granule = sideinfo.ch[ch].gr[0];
  1938. granule.part2_3Length = getBits (12);
  1939. granule.bigValues = jmin (288u, getBitsUnchecked (9));
  1940. const uint32 qss = getBitsUnchecked (8);
  1941. granule.pow2gain = constants.powToGains + 256 - qss + powdiff;
  1942. if (msStereo)
  1943. granule.pow2gain += 2;
  1944. granule.scaleFactorCompression = getBits (9);
  1945. if (getOneBit())
  1946. {
  1947. granule.blockType = getBitsUnchecked (2);
  1948. granule.mixedBlockFlag = getOneBit();
  1949. granule.tableSelect[0] = getBitsUnchecked (5);
  1950. granule.tableSelect[1] = getBitsUnchecked (5);
  1951. granule.tableSelect[2] = 0;
  1952. for (int i = 0; i < 3; ++i)
  1953. {
  1954. const uint32 sbg = (getBitsUnchecked (3) << 3);
  1955. granule.fullGain[i] = granule.pow2gain + sbg;
  1956. }
  1957. if (granule.blockType == 0)
  1958. {}
  1959. if (granule.blockType == 2)
  1960. granule.region1Start = sampleRate == 8 ? 36 : (36 >> 1);
  1961. else
  1962. granule.region1Start = sampleRate == 8 ? (108 >> 1) : (54 >> 1);
  1963. granule.region2Start = 576 >> 1;
  1964. }
  1965. else
  1966. {
  1967. for (int i = 0; i < 3; ++i)
  1968. granule.tableSelect[i] = getBitsUnchecked (5);
  1969. const int r0c = (int) getBitsUnchecked (4);
  1970. const int r1c = (int) getBitsUnchecked (3);
  1971. const int region0index = jmin (22, r0c + 1);
  1972. const int region1index = jmin (22, r0c + 1 + r1c + 1);
  1973. granule.region1Start = (uint32) (bandInfo[sampleRate].longIndex[region0index] >> 1);
  1974. granule.region2Start = (uint32) (bandInfo[sampleRate].longIndex[region1index] >> 1);
  1975. granule.blockType = 0;
  1976. granule.mixedBlockFlag = 0;
  1977. }
  1978. granule.scaleFactorScale = getOneBit();
  1979. granule.count1TableSelect = getOneBit();
  1980. }
  1981. }
  1982. int getLayer3ScaleFactors1 (int* scf, const Layer3SideInfo::Info& granule) noexcept
  1983. {
  1984. static const uint8 lengths[2][16] =
  1985. {
  1986. { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 },
  1987. { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 }
  1988. };
  1989. int numBits;
  1990. const int num0 = lengths[0][granule.scaleFactorCompression];
  1991. const int num1 = lengths[1][granule.scaleFactorCompression];
  1992. if (granule.blockType == 2)
  1993. {
  1994. int i = 18;
  1995. numBits = (num0 + num1) * 18;
  1996. if (granule.mixedBlockFlag)
  1997. {
  1998. for (int j = 8; --j >= 0;) *scf++ = (int) getBitsUnchecked (num0);
  1999. numBits -= num0;
  2000. i = 9;
  2001. }
  2002. for (; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0);
  2003. for (i = 18; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1);
  2004. *scf++ = 0;
  2005. *scf++ = 0;
  2006. *scf++ = 0;
  2007. }
  2008. else
  2009. {
  2010. const int scfsi = granule.scfsi;
  2011. if (scfsi < 0)
  2012. {
  2013. for (int i = 11; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0);
  2014. for (int j = 10; --j >= 0;) *scf++ = (int) getBitsUnchecked (num1);
  2015. numBits = (num0 + num1) * 10 + num0;
  2016. }
  2017. else
  2018. {
  2019. numBits = 0;
  2020. if ((scfsi & 8) == 0)
  2021. {
  2022. for (int i = 6; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0);
  2023. numBits += num0 * 6;
  2024. }
  2025. else
  2026. scf += 6;
  2027. if ((scfsi & 4) == 0)
  2028. {
  2029. for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0);
  2030. numBits += num0 * 5;
  2031. }
  2032. else
  2033. scf += 5;
  2034. if ((scfsi & 2) == 0)
  2035. {
  2036. for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1);
  2037. numBits += num1 * 5;
  2038. }
  2039. else
  2040. scf += 5;
  2041. if ((scfsi & 1) == 0)
  2042. {
  2043. for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1);
  2044. numBits += num1 * 5;
  2045. }
  2046. else
  2047. scf += 5;
  2048. }
  2049. *scf = 0;
  2050. }
  2051. return numBits;
  2052. }
  2053. JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6385)
  2054. int getLayer3ScaleFactors2 (int* scf, Layer3SideInfo::Info& granule, const bool iStereo) noexcept
  2055. {
  2056. static const uint8 scaleTable[3][6][4] =
  2057. {
  2058. { { 6, 5, 5, 5 }, { 6, 5, 7, 3 }, { 11, 10, 0, 0 }, { 7, 7, 7, 0 }, { 6, 6, 6, 3 }, { 8, 8, 5, 0 } },
  2059. { { 9, 9, 9, 9 }, { 9, 9, 12, 6 }, { 18, 18, 0, 0 }, { 12, 12, 12, 0 }, { 12, 9, 9, 6 }, { 15, 12, 9, 0 } },
  2060. { { 6, 9, 9, 9 }, { 6, 9, 12, 6 }, { 15, 18, 0, 0 }, { 6, 15, 12, 0 }, { 6, 12, 9, 6 }, { 6, 18, 9, 0 } }
  2061. };
  2062. uint32 len = iStereo ? constants.iLength2[granule.scaleFactorCompression >> 1]
  2063. : constants.nLength2[granule.scaleFactorCompression];
  2064. granule.preflag = (len >> 15) & 1;
  2065. int n = 0;
  2066. if (granule.blockType == 2)
  2067. {
  2068. ++n;
  2069. if (granule.mixedBlockFlag)
  2070. ++n;
  2071. }
  2072. const uint8* const data = scaleTable[n][(len >> 12) & 7];
  2073. int numBits = 0;
  2074. for (int i = 0; i < 4; ++i)
  2075. {
  2076. int num = len & 7;
  2077. len >>= 3;
  2078. if (num)
  2079. {
  2080. for (int j = 0; j < (int) (data[i]); ++j)
  2081. *scf++ = (int) getBitsUnchecked (num);
  2082. numBits += data[i] * num;
  2083. }
  2084. else
  2085. {
  2086. for (int j = 0; j < (int) (data[i]); ++j)
  2087. *scf++ = 0;
  2088. }
  2089. }
  2090. n = (n << 1) + 1;
  2091. for (int i = 0; i < n; ++i)
  2092. *scf++ = 0;
  2093. return numBits;
  2094. }
  2095. JUCE_END_IGNORE_WARNINGS_MSVC
  2096. bool layer3DequantizeSample (float xr[32][18], int* scf, Layer3SideInfo::Info& granule, int sampleRate, int part2bits) noexcept
  2097. {
  2098. const uint32 shift = 1 + granule.scaleFactorScale;
  2099. auto* xrpnt = (float*) xr;
  2100. auto part2remain = (int) granule.part2_3Length - part2bits;
  2101. zeromem (xrpnt, (size_t) (&xr[32][0] - xrpnt) * sizeof (float));
  2102. auto bv = (int) granule.bigValues;
  2103. auto region1 = (int) granule.region1Start;
  2104. auto region2 = (int) granule.region2Start;
  2105. int l3 = ((576 >> 1) - bv) >> 1;
  2106. int l[3];
  2107. if (bv <= region1)
  2108. {
  2109. l[0] = bv;
  2110. l[1] = 0;
  2111. l[2] = 0;
  2112. }
  2113. else
  2114. {
  2115. l[0] = region1;
  2116. if (bv <= region2)
  2117. {
  2118. l[1] = bv - l[0];
  2119. l[2] = 0;
  2120. }
  2121. else
  2122. {
  2123. l[1] = region2 - l[0];
  2124. l[2] = bv - region2;
  2125. }
  2126. }
  2127. for (int i = 0; i < 3; ++i)
  2128. if (l[i] < 0)
  2129. l[i] = 0;
  2130. if (granule.blockType == 2)
  2131. {
  2132. int max[4];
  2133. int step = 0, lwin = 0, cb = 0, mc = 0;
  2134. float v = 0;
  2135. int* map;
  2136. int* mapEnd;
  2137. if (granule.mixedBlockFlag)
  2138. {
  2139. max[3] = -1;
  2140. max[0] = max[1] = max[2] = 2;
  2141. map = constants.map [sampleRate][0];
  2142. mapEnd = constants.mapEnd[sampleRate][0];
  2143. }
  2144. else
  2145. {
  2146. max[0] = max[1] = max[2] = max[3] = -1;
  2147. map = constants.map [sampleRate][1];
  2148. mapEnd = constants.mapEnd[sampleRate][1];
  2149. }
  2150. for (int i = 0; i < 2; ++i)
  2151. {
  2152. auto* h = huffmanTables1 + granule.tableSelect[i];
  2153. for (int lp = l[i]; lp != 0; --lp, --mc)
  2154. {
  2155. int x, y;
  2156. if (mc == 0)
  2157. {
  2158. mc = *map++;
  2159. xrpnt = ((float*) xr) + (*map++);
  2160. lwin = *map++;
  2161. cb = *map++;
  2162. if (lwin == 3)
  2163. {
  2164. v = granule.pow2gain[ (*scf++) << shift];
  2165. step = 1;
  2166. }
  2167. else
  2168. {
  2169. v = granule.fullGain[lwin][ (*scf++) << shift];
  2170. step = 3;
  2171. }
  2172. }
  2173. auto* val = h->table;
  2174. while ((y = *val++) < 0)
  2175. {
  2176. if (getOneBit())
  2177. val -= y;
  2178. --part2remain;
  2179. }
  2180. x = y >> 4;
  2181. y &= 15;
  2182. if (x == 15)
  2183. {
  2184. max[lwin] = cb;
  2185. part2remain -= (int) (h->bits + 1);
  2186. x += (int) getBits ((int) h->bits);
  2187. *xrpnt = constants.nToThe4Over3[x] * (getOneBit() ? -v : v);
  2188. }
  2189. else if (x)
  2190. {
  2191. max[lwin] = cb;
  2192. *xrpnt = constants.nToThe4Over3[x] * (getOneBit() ? -v : v);
  2193. --part2remain;
  2194. }
  2195. else
  2196. *xrpnt = 0;
  2197. xrpnt += step;
  2198. if (y == 15)
  2199. {
  2200. max[lwin] = cb;
  2201. part2remain -= (int) (h->bits + 1);
  2202. y += (int) getBits ((int) h->bits);
  2203. *xrpnt = constants.nToThe4Over3[y] * (getOneBit() ? -v : v);
  2204. }
  2205. else if (y)
  2206. {
  2207. max[lwin] = cb;
  2208. *xrpnt = constants.nToThe4Over3[y] * (getOneBit() ? -v : v);
  2209. --part2remain;
  2210. }
  2211. else
  2212. *xrpnt = 0;
  2213. xrpnt += step;
  2214. }
  2215. }
  2216. for (; l3 && (part2remain > 0); --l3)
  2217. {
  2218. auto* h = huffmanTables2 + granule.count1TableSelect;
  2219. auto* val = h->table;
  2220. int16 a;
  2221. while ((a = *val++) < 0)
  2222. {
  2223. if (part2remain <= 0)
  2224. {
  2225. a = 0;
  2226. break;
  2227. }
  2228. --part2remain;
  2229. if (getOneBit())
  2230. val -= a;
  2231. }
  2232. for (int i = 0; i < 4; ++i)
  2233. {
  2234. if ((i & 1) == 0)
  2235. {
  2236. if (mc == 0)
  2237. {
  2238. mc = *map++;
  2239. xrpnt = ((float*) xr) + (*map++);
  2240. lwin = *map++;
  2241. cb = *map++;
  2242. if (lwin == 3)
  2243. {
  2244. v = granule.pow2gain[ (*scf++) << shift];
  2245. step = 1;
  2246. }
  2247. else
  2248. {
  2249. v = granule.fullGain[lwin][ (*scf++) << shift];
  2250. step = 3;
  2251. }
  2252. }
  2253. --mc;
  2254. }
  2255. if ((a & (8 >> i)))
  2256. {
  2257. max[lwin] = cb;
  2258. if (part2remain == 0)
  2259. break;
  2260. --part2remain;
  2261. *xrpnt = getOneBit() ? -v : v;
  2262. }
  2263. else
  2264. *xrpnt = 0;
  2265. xrpnt += step;
  2266. }
  2267. }
  2268. while (map < mapEnd)
  2269. {
  2270. if (mc == 0)
  2271. {
  2272. mc = *map++;
  2273. xrpnt = ((float*) xr) + *map++;
  2274. step = (*map++ == 3) ? 1 : 3;
  2275. ++map;
  2276. }
  2277. --mc;
  2278. *xrpnt = 0; xrpnt += step;
  2279. *xrpnt = 0; xrpnt += step;
  2280. }
  2281. granule.maxBand[0] = (uint32) (max[0] + 1);
  2282. granule.maxBand[1] = (uint32) (max[1] + 1);
  2283. granule.maxBand[2] = (uint32) (max[2] + 1);
  2284. granule.maxBandl = (uint32) (max[3] + 1);
  2285. const int rmax = jmax (max[0], max[1], max[3]) + 1;
  2286. granule.maxb = rmax ? (uint32) constants.shortLimit[sampleRate][rmax]
  2287. : (uint32) constants.longLimit[sampleRate][max[3] + 1];
  2288. }
  2289. else
  2290. {
  2291. 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 };
  2292. 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 };
  2293. auto* pretab = (const int*) (granule.preflag ? pretab1 : pretab2);
  2294. int max = -1, cb = 0, mc = 0;
  2295. auto* map = constants.map[sampleRate][2];
  2296. float v = 0;
  2297. for (int i = 0; i < 3; ++i)
  2298. {
  2299. auto* h = huffmanTables1 + granule.tableSelect[i];
  2300. for (int lp = l[i]; lp != 0; --lp, --mc)
  2301. {
  2302. if (mc == 0)
  2303. {
  2304. mc = *map++;
  2305. v = granule.pow2gain[((*scf++) + (*pretab++)) << shift];
  2306. cb = *map++;
  2307. }
  2308. auto* val = h->table;
  2309. int y;
  2310. while ((y = *val++) < 0)
  2311. {
  2312. if (getOneBit()) val -= y;
  2313. --part2remain;
  2314. }
  2315. int x = y >> 4;
  2316. y &= 15;
  2317. if (x == 15)
  2318. {
  2319. max = cb;
  2320. part2remain -= (int) (h->bits + 1);
  2321. x += (int) getBits ((int) h->bits);
  2322. *xrpnt++ = constants.nToThe4Over3[x] * (getOneBit() ? -v : v);
  2323. }
  2324. else if (x)
  2325. {
  2326. max = cb;
  2327. *xrpnt++ = constants.nToThe4Over3[x] * (getOneBit() ? -v : v);
  2328. --part2remain;
  2329. }
  2330. else
  2331. *xrpnt++ = 0;
  2332. if (y == 15)
  2333. {
  2334. max = cb;
  2335. part2remain -= (int) (h->bits + 1);
  2336. y += (int) getBits ((int) h->bits);
  2337. *xrpnt++ = constants.nToThe4Over3[y] * (getOneBit() ? -v : v);
  2338. }
  2339. else if (y)
  2340. {
  2341. max = cb;
  2342. *xrpnt++ = constants.nToThe4Over3[y] * (getOneBit() ? -v : v);
  2343. --part2remain;
  2344. }
  2345. else
  2346. *xrpnt++ = 0;
  2347. }
  2348. }
  2349. for (; l3 && part2remain > 0; --l3)
  2350. {
  2351. auto* h = huffmanTables2 + granule.count1TableSelect;
  2352. auto* values = h->table;
  2353. int16 a;
  2354. while ((a = *values++) < 0)
  2355. {
  2356. if (part2remain <= 0)
  2357. {
  2358. a = 0;
  2359. break;
  2360. }
  2361. --part2remain;
  2362. if (getOneBit())
  2363. values -= a;
  2364. }
  2365. for (int i = 0; i < 4; ++i)
  2366. {
  2367. if ((i & 1) == 0)
  2368. {
  2369. if (mc == 0)
  2370. {
  2371. mc = *map++;
  2372. cb = *map++;
  2373. v = granule.pow2gain[((*scf++) + (*pretab++)) << shift];
  2374. }
  2375. --mc;
  2376. }
  2377. if ((a & (0x8 >> i)))
  2378. {
  2379. max = cb;
  2380. if (part2remain <= 0)
  2381. break;
  2382. --part2remain;
  2383. *xrpnt++ = getOneBit() ? -v : v;
  2384. }
  2385. else
  2386. *xrpnt++ = 0;
  2387. }
  2388. }
  2389. zeromem (xrpnt, (size_t) (&xr[32][0] - xrpnt) * sizeof (float));
  2390. granule.maxBandl = (uint32) (max + 1);
  2391. granule.maxb = (uint32) constants.longLimit[sampleRate][granule.maxBandl];
  2392. }
  2393. while (part2remain > 16)
  2394. {
  2395. getBits (16);
  2396. part2remain -= 16;
  2397. }
  2398. if (part2remain > 0)
  2399. getBits (part2remain);
  2400. else if (part2remain < 0)
  2401. return true;
  2402. return false;
  2403. }
  2404. void layer3Hybrid (float fsIn[32][18], float tsOut[18][32], int ch, const Layer3SideInfo::Info& granule) noexcept
  2405. {
  2406. auto* ts = (float*) tsOut;
  2407. float* rawout1, *rawout2;
  2408. int sb = 0;
  2409. {
  2410. int b = hybridBlockIndex[ch];
  2411. rawout1 = hybridBlock[b][ch];
  2412. b = 1 - b;
  2413. rawout2 = hybridBlock[b][ch];
  2414. hybridBlockIndex[ch] = b;
  2415. }
  2416. if (granule.mixedBlockFlag)
  2417. {
  2418. sb = 2;
  2419. DCT::dct36 (fsIn[0], rawout1, rawout2, constants.win[0], ts);
  2420. DCT::dct36 (fsIn[1], rawout1 + 18, rawout2 + 18, constants.win1[0], ts + 1);
  2421. rawout1 += 36;
  2422. rawout2 += 36;
  2423. ts += 2;
  2424. }
  2425. auto bt = granule.blockType;
  2426. if (bt == 2)
  2427. {
  2428. for (; sb < (int) granule.maxb; sb += 2, ts += 2, rawout1 += 36, rawout2 += 36)
  2429. {
  2430. DCT::dct12 (fsIn[sb], rawout1, rawout2, constants.win[2], ts);
  2431. DCT::dct12 (fsIn[sb + 1], rawout1 + 18, rawout2 + 18, constants.win1[2], ts + 1);
  2432. }
  2433. }
  2434. else
  2435. {
  2436. for (; sb < (int) granule.maxb; sb += 2, ts += 2, rawout1 += 36, rawout2 += 36)
  2437. {
  2438. DCT::dct36 (fsIn[sb], rawout1, rawout2, constants.win[bt], ts);
  2439. DCT::dct36 (fsIn[sb + 1], rawout1 + 18, rawout2 + 18, constants.win1[bt], ts + 1);
  2440. }
  2441. }
  2442. for (; sb < 32; ++sb, ++ts)
  2443. {
  2444. for (int i = 0; i < 18; ++i)
  2445. {
  2446. ts[i * 32] = *rawout1++;
  2447. *rawout2++ = 0;
  2448. }
  2449. }
  2450. }
  2451. void synthesiseStereo (const float* bandPtr0, const float* bandPtr1, float* out0, float* out1, int& samplesDone) noexcept
  2452. {
  2453. auto dummy = samplesDone;
  2454. synthesise (bandPtr0, 0, out0, dummy);
  2455. synthesise (bandPtr1, 1, out1, samplesDone);
  2456. }
  2457. void synthesise (const float* bandPtr, int channel, float* out, int& samplesDone)
  2458. {
  2459. out += samplesDone;
  2460. const int bo = channel == 0 ? ((synthBo - 1) & 15) : synthBo;
  2461. float (*buf)[0x110] = synthBuffers[channel];
  2462. float* b0;
  2463. auto bo1 = bo;
  2464. if (bo & 1)
  2465. {
  2466. b0 = buf[0];
  2467. DCT::dct64 (buf[1] + ((bo + 1) & 15), buf[0] + bo, bandPtr);
  2468. }
  2469. else
  2470. {
  2471. ++bo1;
  2472. b0 = buf[1];
  2473. DCT::dct64 (buf[0] + bo, buf[1] + bo1, bandPtr);
  2474. }
  2475. synthBo = bo;
  2476. const float* window = constants.decodeWin + 16 - bo1;
  2477. for (int j = 16; j != 0; --j, b0 += 16, window += 32)
  2478. {
  2479. auto sum = window[0] * b0[0]; sum -= window[1] * b0[1];
  2480. sum += window[2] * b0[2]; sum -= window[3] * b0[3];
  2481. sum += window[4] * b0[4]; sum -= window[5] * b0[5];
  2482. sum += window[6] * b0[6]; sum -= window[7] * b0[7];
  2483. sum += window[8] * b0[8]; sum -= window[9] * b0[9];
  2484. sum += window[10] * b0[10]; sum -= window[11] * b0[11];
  2485. sum += window[12] * b0[12]; sum -= window[13] * b0[13];
  2486. sum += window[14] * b0[14]; sum -= window[15] * b0[15];
  2487. *out++ = sum;
  2488. }
  2489. {
  2490. auto sum = window[0] * b0[0]; sum += window[2] * b0[2];
  2491. sum += window[4] * b0[4]; sum += window[6] * b0[6];
  2492. sum += window[8] * b0[8]; sum += window[10] * b0[10];
  2493. sum += window[12] * b0[12]; sum += window[14] * b0[14];
  2494. *out++ = sum;
  2495. b0 -= 16; window -= 32;
  2496. window += (ptrdiff_t) bo1 << 1;
  2497. }
  2498. for (int j = 15; j != 0; --j, b0 -= 16, window -= 32)
  2499. {
  2500. auto sum = -window[-1] * b0[0]; sum -= window[-2] * b0[1];
  2501. sum -= window[-3] * b0[2]; sum -= window[-4] * b0[3];
  2502. sum -= window[-5] * b0[4]; sum -= window[-6] * b0[5];
  2503. sum -= window[-7] * b0[6]; sum -= window[-8] * b0[7];
  2504. sum -= window[-9] * b0[8]; sum -= window[-10] * b0[9];
  2505. sum -= window[-11] * b0[10]; sum -= window[-12] * b0[11];
  2506. sum -= window[-13] * b0[12]; sum -= window[-14] * b0[13];
  2507. sum -= window[-15] * b0[14]; sum -= window[0] * b0[15];
  2508. *out++ = sum;
  2509. }
  2510. samplesDone += 32;
  2511. }
  2512. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MP3Stream)
  2513. };
  2514. //==============================================================================
  2515. static const char* const mp3FormatName = "MP3 file";
  2516. //==============================================================================
  2517. class MP3Reader final : public AudioFormatReader
  2518. {
  2519. public:
  2520. MP3Reader (InputStream* const in)
  2521. : AudioFormatReader (in, mp3FormatName),
  2522. stream (*in), currentPosition (0),
  2523. decodedStart (0), decodedEnd (0)
  2524. {
  2525. skipID3();
  2526. const int64 streamPos = stream.stream.getPosition();
  2527. if (readNextBlock())
  2528. {
  2529. bitsPerSample = 32;
  2530. usesFloatingPointData = true;
  2531. sampleRate = stream.frame.getFrequency();
  2532. numChannels = (unsigned int) stream.frame.numChannels;
  2533. lengthInSamples = findLength (streamPos);
  2534. }
  2535. }
  2536. bool readSamples (int* const* destSamples, int numDestChannels, int startOffsetInDestBuffer,
  2537. int64 startSampleInFile, int numSamples) override
  2538. {
  2539. if (destSamples == nullptr)
  2540. {
  2541. jassertfalse;
  2542. return false;
  2543. }
  2544. if (currentPosition != startSampleInFile)
  2545. {
  2546. if (! stream.seek ((int) (startSampleInFile / 1152 - 1)))
  2547. {
  2548. currentPosition = -1;
  2549. createEmptyDecodedData();
  2550. }
  2551. else
  2552. {
  2553. decodedStart = decodedEnd = 0;
  2554. const int64 streamPos = stream.currentFrameIndex * 1152;
  2555. int toSkip = (int) (startSampleInFile - streamPos);
  2556. jassert (toSkip >= 0);
  2557. while (toSkip > 0)
  2558. {
  2559. if (! readNextBlock())
  2560. {
  2561. createEmptyDecodedData();
  2562. break;
  2563. }
  2564. const int numReady = decodedEnd - decodedStart;
  2565. if (numReady > toSkip)
  2566. {
  2567. decodedStart += toSkip;
  2568. break;
  2569. }
  2570. toSkip -= numReady;
  2571. }
  2572. currentPosition = startSampleInFile;
  2573. }
  2574. }
  2575. while (numSamples > 0)
  2576. {
  2577. if (decodedEnd <= decodedStart && ! readNextBlock())
  2578. {
  2579. for (int i = numDestChannels; --i >= 0;)
  2580. if (destSamples[i] != nullptr)
  2581. zeromem (destSamples[i] + startOffsetInDestBuffer, (size_t) numSamples * sizeof (float));
  2582. return false;
  2583. }
  2584. const int numToCopy = jmin (decodedEnd - decodedStart, numSamples);
  2585. float* const* const dst = reinterpret_cast<float* const*> (destSamples);
  2586. memcpy (dst[0] + startOffsetInDestBuffer, decoded0 + decodedStart, (size_t) numToCopy * sizeof (float));
  2587. if (numDestChannels > 1 && dst[1] != nullptr)
  2588. memcpy (dst[1] + startOffsetInDestBuffer, (numChannels < 2 ? decoded0 : decoded1) + decodedStart, (size_t) numToCopy * sizeof (float));
  2589. startOffsetInDestBuffer += numToCopy;
  2590. decodedStart += numToCopy;
  2591. currentPosition += numToCopy;
  2592. numSamples -= numToCopy;
  2593. }
  2594. return true;
  2595. }
  2596. private:
  2597. MP3Stream stream;
  2598. int64 currentPosition;
  2599. enum { decodedDataSize = 1152 };
  2600. float decoded0[decodedDataSize], decoded1[decodedDataSize];
  2601. int decodedStart, decodedEnd;
  2602. void createEmptyDecodedData() noexcept
  2603. {
  2604. zeromem (decoded0, sizeof (decoded0));
  2605. zeromem (decoded1, sizeof (decoded1));
  2606. decodedStart = 0;
  2607. decodedEnd = decodedDataSize;
  2608. }
  2609. bool readNextBlock()
  2610. {
  2611. for (int attempts = 10; --attempts >= 0;)
  2612. {
  2613. int samplesDone = 0;
  2614. const int result = stream.decodeNextBlock (decoded0, decoded1, samplesDone);
  2615. if (result > 0 && stream.stream.isExhausted())
  2616. {
  2617. createEmptyDecodedData();
  2618. return true;
  2619. }
  2620. if (result <= 0)
  2621. {
  2622. decodedStart = 0;
  2623. decodedEnd = samplesDone;
  2624. return result == 0;
  2625. }
  2626. }
  2627. return false;
  2628. }
  2629. void skipID3()
  2630. {
  2631. const int64 originalPosition = stream.stream.getPosition();
  2632. const uint32 firstWord = (uint32) stream.stream.readInt();
  2633. if ((firstWord & 0xffffff) == 0x334449)
  2634. {
  2635. uint8 buffer[6];
  2636. if (stream.stream.read (buffer, 6) == 6
  2637. && buffer[0] != 0xff
  2638. && ((buffer[2] | buffer[3] | buffer[4] | buffer[5]) & 0x80) == 0)
  2639. {
  2640. const uint32 length = (((uint32) buffer[2]) << 21)
  2641. | (((uint32) buffer[3]) << 14)
  2642. | (((uint32) buffer[4]) << 7)
  2643. | ((uint32) buffer[5]);
  2644. stream.stream.skipNextBytes (length);
  2645. return;
  2646. }
  2647. }
  2648. stream.stream.setPosition (originalPosition);
  2649. }
  2650. int64 findLength (int64 streamStartPos)
  2651. {
  2652. int64 numFrames = stream.numFrames;
  2653. if (numFrames <= 0)
  2654. {
  2655. const int64 streamSize = stream.stream.getTotalLength();
  2656. if (streamSize > 0)
  2657. {
  2658. const int bytesPerFrame = stream.frame.frameSize + 4;
  2659. if (bytesPerFrame == 417 || bytesPerFrame == 418)
  2660. numFrames = roundToInt ((double) (streamSize - streamStartPos) / 417.95918); // more accurate for 128k
  2661. else
  2662. numFrames = (streamSize - streamStartPos) / bytesPerFrame;
  2663. }
  2664. }
  2665. return numFrames * 1152;
  2666. }
  2667. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MP3Reader)
  2668. };
  2669. }
  2670. //==============================================================================
  2671. MP3AudioFormat::MP3AudioFormat() : AudioFormat (MP3Decoder::mp3FormatName, ".mp3") {}
  2672. MP3AudioFormat::~MP3AudioFormat() {}
  2673. Array<int> MP3AudioFormat::getPossibleSampleRates() { return {}; }
  2674. Array<int> MP3AudioFormat::getPossibleBitDepths() { return {}; }
  2675. bool MP3AudioFormat::canDoStereo() { return true; }
  2676. bool MP3AudioFormat::canDoMono() { return true; }
  2677. bool MP3AudioFormat::isCompressed() { return true; }
  2678. StringArray MP3AudioFormat::getQualityOptions() { return {}; }
  2679. AudioFormatReader* MP3AudioFormat::createReaderFor (InputStream* sourceStream, const bool deleteStreamIfOpeningFails)
  2680. {
  2681. std::unique_ptr<MP3Decoder::MP3Reader> r (new MP3Decoder::MP3Reader (sourceStream));
  2682. if (r->lengthInSamples > 0)
  2683. return r.release();
  2684. if (! deleteStreamIfOpeningFails)
  2685. r->input = nullptr;
  2686. return nullptr;
  2687. }
  2688. AudioFormatWriter* MP3AudioFormat::createWriterFor (OutputStream*, double /*sampleRateToUse*/,
  2689. unsigned int /*numberOfChannels*/, int /*bitsPerSample*/,
  2690. const StringPairArray& /*metadataValues*/, int /*qualityOptionIndex*/)
  2691. {
  2692. jassertfalse; // not yet implemented!
  2693. return nullptr;
  2694. }
  2695. #endif
  2696. } // namespace juce