MP3HuffmanTables.h 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726
  1. /*
  2. * Copyright (c) 2021, the SerenityOS developers.
  3. * Copyright (c) 2021, Arne Elster <arne@elster.li>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Array.h>
  9. #include <AK/BitStream.h>
  10. #include <AK/Span.h>
  11. namespace Audio::MP3::Tables::Huffman {
  12. template<typename Symbol>
  13. struct HuffmanEntry {
  14. using SymbolType = Symbol;
  15. unsigned code;
  16. size_t code_length;
  17. Symbol symbol;
  18. };
  19. template<typename Symbol>
  20. struct HuffmanNode {
  21. int left;
  22. int right;
  23. unsigned code;
  24. size_t code_length;
  25. Symbol symbol;
  26. bool is_leaf() const { return left == -1 && right == -1; }
  27. };
  28. template<typename Symbol, size_t Size>
  29. using HuffmanEntries = Array<Symbol, Size>;
  30. template<typename Symbol, size_t Size>
  31. using HuffmanNodes = Array<HuffmanNode<Symbol>, Size>;
  32. template<typename Symbol, size_t Size>
  33. consteval size_t length_of_longest_huffman_code(HuffmanEntries<Symbol, Size> const& table)
  34. {
  35. size_t max = 0;
  36. for (size_t i = 0; i < table.size(); i++) {
  37. if (table[i].code_length > max)
  38. max = table[i].code_length;
  39. }
  40. return max;
  41. }
  42. template<typename Symbol, typename NodeArrayType>
  43. consteval int make_huffman_tree_internal(auto const& table, NodeArrayType&& nodes)
  44. {
  45. size_t allocation_count = 1;
  46. nodes = {};
  47. nodes[0].left = nodes[0].right = -1;
  48. for (size_t i = 0; i < table.size(); i++) {
  49. HuffmanEntry<Symbol> const& entry = table[i];
  50. int tree_pointer = 0;
  51. for (size_t j = 0; j < entry.code_length; j++) {
  52. bool const bit = (entry.code >> (entry.code_length - j - 1)) & 1;
  53. bool const end_of_code = j == entry.code_length - 1;
  54. int& target_index = bit ? nodes[tree_pointer].left : nodes[tree_pointer].right;
  55. if (target_index != -1) {
  56. if (end_of_code)
  57. return -1;
  58. tree_pointer = target_index;
  59. } else {
  60. tree_pointer = target_index = allocation_count++;
  61. nodes[target_index].left = nodes[target_index].right = -1;
  62. nodes[target_index].code_length = j + 1;
  63. if (end_of_code) {
  64. nodes[target_index].symbol = entry.symbol;
  65. nodes[target_index].code = entry.code;
  66. }
  67. }
  68. }
  69. }
  70. return allocation_count;
  71. }
  72. template<auto table>
  73. consteval auto make_huffman_tree()
  74. {
  75. using Symbol = typename decltype(table)::ValueType::SymbolType;
  76. constexpr size_t size_worst_case = 1 << (length_of_longest_huffman_code(table) + 1);
  77. constexpr int size_fitted = make_huffman_tree_internal<Symbol>(table, HuffmanNodes<Symbol, size_worst_case>());
  78. static_assert(size_fitted >= 0, "Huffman tree is ill-formed");
  79. HuffmanNodes<Symbol, size_fitted> nodes;
  80. make_huffman_tree_internal<Symbol>(table, nodes);
  81. return nodes;
  82. }
  83. template<typename T>
  84. struct HuffmanDecodeResult {
  85. size_t bits_read;
  86. Optional<HuffmanNode<T>> code;
  87. };
  88. template<typename T>
  89. HuffmanDecodeResult<T> huffman_decode(BigEndianInputBitStream& bitstream, ReadonlySpan<HuffmanNode<T>> tree, size_t max_bits_to_read)
  90. {
  91. HuffmanNode<T> const* node = &tree[0];
  92. size_t bits_read = 0;
  93. while (!node->is_leaf() && max_bits_to_read-- > 0) {
  94. auto const maybe_direction = bitstream.read_bit();
  95. if (maybe_direction.is_error())
  96. return { bits_read, {} };
  97. ++bits_read;
  98. if (maybe_direction.value()) {
  99. if (node->left == -1)
  100. return {};
  101. node = &tree[node->left];
  102. } else {
  103. if (node->right == -1)
  104. return {};
  105. node = &tree[node->right];
  106. }
  107. }
  108. if (!node->is_leaf())
  109. return { bits_read, {} };
  110. return { bits_read, *node };
  111. }
  112. struct HuffmanXY {
  113. int x;
  114. int y;
  115. };
  116. struct HuffmanVWXY {
  117. int v;
  118. int w;
  119. int x;
  120. int y;
  121. };
  122. struct HuffmanEntryXY : public HuffmanEntry<HuffmanXY> {
  123. constexpr HuffmanEntryXY(int x, int y, size_t code_length, unsigned code)
  124. {
  125. symbol.x = x;
  126. symbol.y = y;
  127. this->code_length = code_length;
  128. this->code = code;
  129. }
  130. };
  131. struct HuffmanEntryVWXY : public HuffmanEntry<HuffmanVWXY> {
  132. constexpr HuffmanEntryVWXY(int v, int w, int x, int y, size_t code_length, unsigned code)
  133. {
  134. symbol.v = v;
  135. symbol.w = w;
  136. symbol.x = x;
  137. symbol.y = y;
  138. this->code_length = code_length;
  139. this->code = code;
  140. }
  141. };
  142. // All data taken from ISO/IEC 11172-3 (Table B.7)
  143. constexpr HuffmanEntries<HuffmanEntryVWXY, 16> TableA { {
  144. { 0, 0, 0, 0, 1, 0b1 },
  145. { 0, 0, 0, 1, 4, 0b0101 },
  146. { 0, 0, 1, 0, 4, 0b0100 },
  147. { 0, 0, 1, 1, 5, 0b00101 },
  148. { 0, 1, 0, 0, 4, 0b0110 },
  149. { 0, 1, 0, 1, 6, 0b000101 },
  150. { 0, 1, 1, 0, 5, 0b00100 },
  151. { 0, 1, 1, 1, 6, 0b000100 },
  152. { 1, 0, 0, 0, 4, 0b0111 },
  153. { 1, 0, 0, 1, 5, 0b00011 },
  154. { 1, 0, 1, 0, 5, 0b00110 },
  155. { 1, 0, 1, 1, 6, 0b000000 },
  156. { 1, 1, 0, 0, 5, 0b00111 },
  157. { 1, 1, 0, 1, 6, 0b000010 },
  158. { 1, 1, 1, 0, 6, 0b000011 },
  159. { 1, 1, 1, 1, 6, 0b000001 },
  160. } };
  161. constexpr HuffmanEntries<HuffmanEntryVWXY, 16> TableB { {
  162. { 0, 0, 0, 0, 4, 0b1111 },
  163. { 0, 0, 0, 1, 4, 0b1110 },
  164. { 0, 0, 1, 0, 4, 0b1101 },
  165. { 0, 0, 1, 1, 4, 0b1100 },
  166. { 0, 1, 0, 0, 4, 0b1011 },
  167. { 0, 1, 0, 1, 4, 0b1010 },
  168. { 0, 1, 1, 0, 4, 0b1001 },
  169. { 0, 1, 1, 1, 4, 0b1000 },
  170. { 1, 0, 0, 0, 4, 0b0111 },
  171. { 1, 0, 0, 1, 4, 0b0110 },
  172. { 1, 0, 1, 0, 4, 0b0101 },
  173. { 1, 0, 1, 1, 4, 0b0100 },
  174. { 1, 1, 0, 0, 4, 0b0011 },
  175. { 1, 1, 0, 1, 4, 0b0010 },
  176. { 1, 1, 1, 0, 4, 0b0001 },
  177. { 1, 1, 1, 1, 4, 0b0000 },
  178. } };
  179. constexpr HuffmanEntries<HuffmanEntryXY, 1> Table0 { {
  180. { 0, 0, 0, 0b0 },
  181. } };
  182. constexpr HuffmanEntries<HuffmanEntryXY, 4> Table1 { {
  183. { 0, 0, 1, 0b1 },
  184. { 0, 1, 3, 0b001 },
  185. { 1, 0, 2, 0b01 },
  186. { 1, 1, 3, 0b000 },
  187. } };
  188. constexpr HuffmanEntries<HuffmanEntryXY, 9> Table2 { {
  189. { 0, 0, 1, 0b1 },
  190. { 0, 1, 3, 0b010 },
  191. { 0, 2, 6, 0b000001 },
  192. { 1, 0, 3, 0b011 },
  193. { 1, 1, 3, 0b001 },
  194. { 1, 2, 5, 0b00001 },
  195. { 2, 0, 5, 0b00011 },
  196. { 2, 1, 5, 0b00010 },
  197. { 2, 2, 6, 0b000000 },
  198. } };
  199. constexpr HuffmanEntries<HuffmanEntryXY, 9> Table3 { {
  200. { 0, 0, 2, 0b11 },
  201. { 0, 1, 2, 0b10 },
  202. { 0, 2, 6, 0b000001 },
  203. { 1, 0, 3, 0b001 },
  204. { 1, 1, 2, 0b01 },
  205. { 1, 2, 5, 0b00001 },
  206. { 2, 0, 5, 0b00011 },
  207. { 2, 1, 5, 0b00010 },
  208. { 2, 2, 6, 0b000000 },
  209. } };
  210. constexpr HuffmanEntries<HuffmanEntryXY, 16> Table5 { {
  211. { 0, 0, 1, 0b1 },
  212. { 0, 1, 3, 0b010 },
  213. { 0, 2, 6, 0b000110 },
  214. { 0, 3, 7, 0b0000101 },
  215. { 1, 0, 3, 0b011 },
  216. { 1, 1, 3, 0b001 },
  217. { 1, 2, 6, 0b000100 },
  218. { 1, 3, 7, 0b0000100 },
  219. { 2, 0, 6, 0b000111 },
  220. { 2, 1, 6, 0b000101 },
  221. { 2, 2, 7, 0b0000111 },
  222. { 2, 3, 8, 0b00000001 },
  223. { 3, 0, 7, 0b0000110 },
  224. { 3, 1, 6, 0b000001 },
  225. { 3, 2, 7, 0b0000001 },
  226. { 3, 3, 8, 0b00000000 },
  227. } };
  228. constexpr HuffmanEntries<HuffmanEntryXY, 16> Table6 { {
  229. { 0, 0, 3, 0b111 },
  230. { 0, 1, 3, 0b011 },
  231. { 0, 2, 5, 0b00101 },
  232. { 0, 3, 7, 0b0000001 },
  233. { 1, 0, 3, 0b110 },
  234. { 1, 1, 2, 0b10 },
  235. { 1, 2, 4, 0b0011 },
  236. { 1, 3, 5, 0b00010 },
  237. { 2, 0, 4, 0b0101 },
  238. { 2, 1, 4, 0b0100 },
  239. { 2, 2, 5, 0b00100 },
  240. { 2, 3, 6, 0b000001 },
  241. { 3, 0, 6, 0b000011 },
  242. { 3, 1, 5, 0b00011 },
  243. { 3, 2, 6, 0b000010 },
  244. { 3, 3, 7, 0b0000000 },
  245. } };
  246. constexpr HuffmanEntries<HuffmanEntryXY, 36> Table7 { {
  247. { 0, 0, 1, 0b1 },
  248. { 0, 1, 3, 0b010 },
  249. { 0, 2, 6, 0b001010 },
  250. { 0, 3, 8, 0b00010011 },
  251. { 0, 4, 8, 0b00010000 },
  252. { 0, 5, 9, 0b000001010 },
  253. { 1, 0, 3, 0b011 },
  254. { 1, 1, 4, 0b0011 },
  255. { 1, 2, 6, 0b000111 },
  256. { 1, 3, 7, 0b0001010 },
  257. { 1, 4, 7, 0b0000101 },
  258. { 1, 5, 8, 0b00000011 },
  259. { 2, 0, 6, 0b001011 },
  260. { 2, 1, 5, 0b00100 },
  261. { 2, 2, 7, 0b0001101 },
  262. { 2, 3, 8, 0b00010001 },
  263. { 2, 4, 8, 0b00001000 },
  264. { 2, 5, 9, 0b000000100 },
  265. { 3, 0, 7, 0b0001100 },
  266. { 3, 1, 7, 0b0001011 },
  267. { 3, 2, 8, 0b00010010 },
  268. { 3, 3, 9, 0b000001111 },
  269. { 3, 4, 9, 0b000001011 },
  270. { 3, 5, 9, 0b000000010 },
  271. { 4, 0, 7, 0b0000111 },
  272. { 4, 1, 7, 0b0000110 },
  273. { 4, 2, 8, 0b00001001 },
  274. { 4, 3, 9, 0b000001110 },
  275. { 4, 4, 9, 0b000000011 },
  276. { 4, 5, 10, 0b0000000001 },
  277. { 5, 0, 8, 0b00000110 },
  278. { 5, 1, 8, 0b00000100 },
  279. { 5, 2, 9, 0b000000101 },
  280. { 5, 3, 10, 0b0000000011 },
  281. { 5, 4, 10, 0b0000000010 },
  282. { 5, 5, 10, 0b0000000000 },
  283. } };
  284. constexpr HuffmanEntries<HuffmanEntryXY, 36> Table8 { {
  285. { 0, 0, 2, 0b11 },
  286. { 0, 1, 3, 0b100 },
  287. { 0, 2, 6, 0b000110 },
  288. { 0, 3, 8, 0b00010010 },
  289. { 0, 4, 8, 0b00001100 },
  290. { 0, 5, 9, 0b000000101 },
  291. { 1, 0, 3, 0b101 },
  292. { 1, 1, 2, 0b01 },
  293. { 1, 2, 4, 0b0010 },
  294. { 1, 3, 8, 0b00010000 },
  295. { 1, 4, 8, 0b00001001 },
  296. { 1, 5, 8, 0b00000011 },
  297. { 2, 0, 6, 0b000111 },
  298. { 2, 1, 4, 0b0011 },
  299. { 2, 2, 6, 0b000101 },
  300. { 2, 3, 8, 0b00001110 },
  301. { 2, 4, 8, 0b00000111 },
  302. { 2, 5, 9, 0b000000011 },
  303. { 3, 0, 8, 0b00010011 },
  304. { 3, 1, 8, 0b00010001 },
  305. { 3, 2, 8, 0b00001111 },
  306. { 3, 3, 9, 0b000001101 },
  307. { 3, 4, 9, 0b000001010 },
  308. { 3, 5, 10, 0b0000000100 },
  309. { 4, 0, 8, 0b00001101 },
  310. { 4, 1, 7, 0b0000101 },
  311. { 4, 2, 8, 0b00001000 },
  312. { 4, 3, 9, 0b000001011 },
  313. { 4, 4, 10, 0b0000000101 },
  314. { 4, 5, 10, 0b0000000001 },
  315. { 5, 0, 9, 0b000001100 },
  316. { 5, 1, 8, 0b00000100 },
  317. { 5, 2, 9, 0b000000100 },
  318. { 5, 3, 9, 0b000000001 },
  319. { 5, 4, 11, 0b00000000001 },
  320. { 5, 5, 11, 0b00000000000 },
  321. } };
  322. constexpr HuffmanEntries<HuffmanEntryXY, 36> Table9 { {
  323. { 0, 0, 3, 0b111 },
  324. { 0, 1, 3, 0b101 },
  325. { 0, 2, 5, 0b01001 },
  326. { 0, 3, 6, 0b001110 },
  327. { 0, 4, 8, 0b00001111 },
  328. { 0, 5, 9, 0b000000111 },
  329. { 1, 0, 3, 0b110 },
  330. { 1, 1, 3, 0b100 },
  331. { 1, 2, 4, 0b0101 },
  332. { 1, 3, 5, 0b00101 },
  333. { 1, 4, 6, 0b000110 },
  334. { 1, 5, 8, 0b00000111 },
  335. { 2, 0, 4, 0b0111 },
  336. { 2, 1, 4, 0b0110 },
  337. { 2, 2, 5, 0b01000 },
  338. { 2, 3, 6, 0b001000 },
  339. { 2, 4, 7, 0b0001000 },
  340. { 2, 5, 8, 0b00000101 },
  341. { 3, 0, 6, 0b001111 },
  342. { 3, 1, 5, 0b00110 },
  343. { 3, 2, 6, 0b001001 },
  344. { 3, 3, 7, 0b0001010 },
  345. { 3, 4, 7, 0b0000101 },
  346. { 3, 5, 8, 0b00000001 },
  347. { 4, 0, 7, 0b0001011 },
  348. { 4, 1, 6, 0b000111 },
  349. { 4, 2, 7, 0b0001001 },
  350. { 4, 3, 7, 0b0000110 },
  351. { 4, 4, 8, 0b00000100 },
  352. { 4, 5, 9, 0b000000001 },
  353. { 5, 0, 8, 0b00001110 },
  354. { 5, 1, 7, 0b0000100 },
  355. { 5, 2, 8, 0b00000110 },
  356. { 5, 3, 8, 0b00000010 },
  357. { 5, 4, 9, 0b000000110 },
  358. { 5, 5, 9, 0b000000000 },
  359. } };
  360. constexpr HuffmanEntries<HuffmanEntryXY, 64> Table10 { {
  361. { 0, 0, 1, 0b1 },
  362. { 0, 1, 3, 0b010 },
  363. { 0, 2, 6, 0b001010 },
  364. { 0, 3, 8, 0b00010111 },
  365. { 0, 4, 9, 0b000100011 },
  366. { 0, 5, 9, 0b000011110 },
  367. { 0, 6, 9, 0b000001100 },
  368. { 0, 7, 10, 0b0000010001 },
  369. { 1, 0, 3, 0b011 },
  370. { 1, 1, 4, 0b0011 },
  371. { 1, 2, 6, 0b001000 },
  372. { 1, 3, 7, 0b0001100 },
  373. { 1, 4, 8, 0b00010010 },
  374. { 1, 5, 9, 0b000010101 },
  375. { 1, 6, 8, 0b00001100 },
  376. { 1, 7, 8, 0b00000111 },
  377. { 2, 0, 6, 0b001011 },
  378. { 2, 1, 6, 0b001001 },
  379. { 2, 2, 7, 0b0001111 },
  380. { 2, 3, 8, 0b00010101 },
  381. { 2, 4, 9, 0b000100000 },
  382. { 2, 5, 10, 0b0000101000 },
  383. { 2, 6, 9, 0b000010011 },
  384. { 2, 7, 9, 0b000000110 },
  385. { 3, 0, 7, 0b0001110 },
  386. { 3, 1, 7, 0b0001101 },
  387. { 3, 2, 8, 0b00010110 },
  388. { 3, 3, 9, 0b000100010 },
  389. { 3, 4, 10, 0b0000101110 },
  390. { 3, 5, 10, 0b0000010111 },
  391. { 3, 6, 9, 0b000010010 },
  392. { 3, 7, 10, 0b0000000111 },
  393. { 4, 0, 8, 0b00010100 },
  394. { 4, 1, 8, 0b00010011 },
  395. { 4, 2, 9, 0b000100001 },
  396. { 4, 3, 10, 0b0000101111 },
  397. { 4, 4, 10, 0b0000011011 },
  398. { 4, 5, 10, 0b0000010110 },
  399. { 4, 6, 10, 0b0000001001 },
  400. { 4, 7, 10, 0b0000000011 },
  401. { 5, 0, 9, 0b000011111 },
  402. { 5, 1, 9, 0b000010110 },
  403. { 5, 2, 10, 0b0000101001 },
  404. { 5, 3, 10, 0b0000011010 },
  405. { 5, 4, 11, 0b00000010101 },
  406. { 5, 5, 11, 0b00000010100 },
  407. { 5, 6, 10, 0b0000000101 },
  408. { 5, 7, 11, 0b00000000011 },
  409. { 6, 0, 8, 0b00001110 },
  410. { 6, 1, 8, 0b00001101 },
  411. { 6, 2, 9, 0b000001010 },
  412. { 6, 3, 10, 0b0000001011 },
  413. { 6, 4, 10, 0b0000010000 },
  414. { 6, 5, 10, 0b0000000110 },
  415. { 6, 6, 11, 0b00000000101 },
  416. { 6, 7, 11, 0b00000000001 },
  417. { 7, 0, 9, 0b000001001 },
  418. { 7, 1, 8, 0b00001000 },
  419. { 7, 2, 9, 0b000000111 },
  420. { 7, 3, 10, 0b0000001000 },
  421. { 7, 4, 10, 0b0000000100 },
  422. { 7, 5, 11, 0b00000000100 },
  423. { 7, 6, 11, 0b00000000010 },
  424. { 7, 7, 11, 0b00000000000 },
  425. } };
  426. constexpr HuffmanEntries<HuffmanEntryXY, 64> Table11 { {
  427. { 0, 0, 2, 0b11 },
  428. { 0, 1, 3, 0b100 },
  429. { 0, 2, 5, 0b01010 },
  430. { 0, 3, 7, 0b0011000 },
  431. { 0, 4, 8, 0b00100010 },
  432. { 0, 5, 9, 0b000100001 },
  433. { 0, 6, 8, 0b00010101 },
  434. { 0, 7, 9, 0b000001111 },
  435. { 1, 0, 3, 0b101 },
  436. { 1, 1, 3, 0b011 },
  437. { 1, 2, 4, 0b0100 },
  438. { 1, 3, 6, 0b001010 },
  439. { 1, 4, 8, 0b00100000 },
  440. { 1, 5, 8, 0b00010001 },
  441. { 1, 6, 7, 0b0001011 },
  442. { 1, 7, 8, 0b00001010 },
  443. { 2, 0, 5, 0b01011 },
  444. { 2, 1, 5, 0b00111 },
  445. { 2, 2, 6, 0b001101 },
  446. { 2, 3, 7, 0b0010010 },
  447. { 2, 4, 8, 0b00011110 },
  448. { 2, 5, 9, 0b000011111 },
  449. { 2, 6, 8, 0b00010100 },
  450. { 2, 7, 8, 0b00000101 },
  451. { 3, 0, 7, 0b0011001 },
  452. { 3, 1, 6, 0b001011 },
  453. { 3, 2, 7, 0b0010011 },
  454. { 3, 3, 9, 0b000111011 },
  455. { 3, 4, 8, 0b00011011 },
  456. { 3, 5, 10, 0b0000010010 },
  457. { 3, 6, 8, 0b00001100 },
  458. { 3, 7, 9, 0b000000101 },
  459. { 4, 0, 8, 0b00100011 },
  460. { 4, 1, 8, 0b00100001 },
  461. { 4, 2, 8, 0b00011111 },
  462. { 4, 3, 9, 0b000111010 },
  463. { 4, 4, 9, 0b000011110 },
  464. { 4, 5, 10, 0b0000010000 },
  465. { 4, 6, 9, 0b000000111 },
  466. { 4, 7, 10, 0b0000000101 },
  467. { 5, 0, 8, 0b00011100 },
  468. { 5, 1, 8, 0b00011010 },
  469. { 5, 2, 9, 0b000100000 },
  470. { 5, 3, 10, 0b0000010011 },
  471. { 5, 4, 10, 0b0000010001 },
  472. { 5, 5, 11, 0b00000001111 },
  473. { 5, 6, 10, 0b0000001000 },
  474. { 5, 7, 11, 0b00000001110 },
  475. { 6, 0, 8, 0b00001110 },
  476. { 6, 1, 7, 0b0001100 },
  477. { 6, 2, 7, 0b0001001 },
  478. { 6, 3, 8, 0b00001101 },
  479. { 6, 4, 9, 0b000001110 },
  480. { 6, 5, 10, 0b0000001001 },
  481. { 6, 6, 10, 0b0000000100 },
  482. { 6, 7, 10, 0b0000000001 },
  483. { 7, 0, 8, 0b00001011 },
  484. { 7, 1, 7, 0b0000100 },
  485. { 7, 2, 8, 0b00000110 },
  486. { 7, 3, 9, 0b000000110 },
  487. { 7, 4, 10, 0b0000000110 },
  488. { 7, 5, 10, 0b0000000011 },
  489. { 7, 6, 10, 0b0000000010 },
  490. { 7, 7, 10, 0b0000000000 },
  491. } };
  492. constexpr HuffmanEntries<HuffmanEntryXY, 64> Table12 { {
  493. { 0, 0, 4, 0b1001 },
  494. { 0, 1, 3, 0b110 },
  495. { 0, 2, 5, 0b10000 },
  496. { 0, 3, 7, 0b0100001 },
  497. { 0, 4, 8, 0b00101001 },
  498. { 0, 5, 9, 0b000100111 },
  499. { 0, 6, 9, 0b000100110 },
  500. { 0, 7, 9, 0b000011010 },
  501. { 1, 0, 3, 0b111 },
  502. { 1, 1, 3, 0b101 },
  503. { 1, 2, 4, 0b0110 },
  504. { 1, 3, 5, 0b01001 },
  505. { 1, 4, 7, 0b0010111 },
  506. { 1, 5, 7, 0b0010000 },
  507. { 1, 6, 8, 0b00011010 },
  508. { 1, 7, 8, 0b00001011 },
  509. { 2, 0, 5, 0b10001 },
  510. { 2, 1, 4, 0b0111 },
  511. { 2, 2, 5, 0b01011 },
  512. { 2, 3, 6, 0b001110 },
  513. { 2, 4, 7, 0b0010101 },
  514. { 2, 5, 8, 0b00011110 },
  515. { 2, 6, 7, 0b0001010 },
  516. { 2, 7, 8, 0b00000111 },
  517. { 3, 0, 6, 0b010001 },
  518. { 3, 1, 5, 0b01010 },
  519. { 3, 2, 6, 0b001111 },
  520. { 3, 3, 6, 0b001100 },
  521. { 3, 4, 7, 0b0010010 },
  522. { 3, 5, 8, 0b00011100 },
  523. { 3, 6, 8, 0b00001110 },
  524. { 3, 7, 8, 0b00000101 },
  525. { 4, 0, 7, 0b0100000 },
  526. { 4, 1, 6, 0b001101 },
  527. { 4, 2, 7, 0b0010110 },
  528. { 4, 3, 7, 0b0010011 },
  529. { 4, 4, 8, 0b00010010 },
  530. { 4, 5, 8, 0b00010000 },
  531. { 4, 6, 8, 0b00001001 },
  532. { 4, 7, 9, 0b000000101 },
  533. { 5, 0, 8, 0b00101000 },
  534. { 5, 1, 7, 0b0010001 },
  535. { 5, 2, 8, 0b00011111 },
  536. { 5, 3, 8, 0b00011101 },
  537. { 5, 4, 8, 0b00010001 },
  538. { 5, 5, 9, 0b000001101 },
  539. { 5, 6, 8, 0b00000100 },
  540. { 5, 7, 9, 0b000000010 },
  541. { 6, 0, 8, 0b00011011 },
  542. { 6, 1, 7, 0b0001100 },
  543. { 6, 2, 7, 0b0001011 },
  544. { 6, 3, 8, 0b00001111 },
  545. { 6, 4, 8, 0b00001010 },
  546. { 6, 5, 9, 0b000000111 },
  547. { 6, 6, 9, 0b000000100 },
  548. { 6, 7, 10, 0b0000000001 },
  549. { 7, 0, 9, 0b000011011 },
  550. { 7, 1, 8, 0b00001100 },
  551. { 7, 2, 8, 0b00001000 },
  552. { 7, 3, 9, 0b000001100 },
  553. { 7, 4, 9, 0b000000110 },
  554. { 7, 5, 9, 0b000000011 },
  555. { 7, 6, 9, 0b000000001 },
  556. { 7, 7, 10, 0b0000000000 },
  557. } };
  558. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table13 { {
  559. { 0, 0, 1, 0b1 },
  560. { 0, 1, 4, 0b0101 },
  561. { 0, 2, 6, 0b001110 },
  562. { 0, 3, 7, 0b0010101 },
  563. { 0, 4, 8, 0b00100010 },
  564. { 0, 5, 9, 0b000110011 },
  565. { 0, 6, 9, 0b000101110 },
  566. { 0, 7, 10, 0b0001000111 },
  567. { 0, 8, 9, 0b000101010 },
  568. { 0, 9, 10, 0b0000110100 },
  569. { 0, 10, 11, 0b00001000100 },
  570. { 0, 11, 11, 0b00000110100 },
  571. { 0, 12, 12, 0b000001000011 },
  572. { 0, 13, 12, 0b000000101100 },
  573. { 0, 14, 13, 0b0000000101011 },
  574. { 0, 15, 13, 0b0000000010011 },
  575. { 1, 0, 3, 0b011 },
  576. { 1, 1, 4, 0b0100 },
  577. { 1, 2, 6, 0b001100 },
  578. { 1, 3, 7, 0b0010011 },
  579. { 1, 4, 8, 0b00011111 },
  580. { 1, 5, 8, 0b00011010 },
  581. { 1, 6, 9, 0b000101100 },
  582. { 1, 7, 9, 0b000100001 },
  583. { 1, 8, 9, 0b000011111 },
  584. { 1, 9, 9, 0b000011000 },
  585. { 1, 10, 10, 0b0000100000 },
  586. { 1, 11, 10, 0b0000011000 },
  587. { 1, 12, 11, 0b00000011111 },
  588. { 1, 13, 12, 0b000000100011 },
  589. { 1, 14, 12, 0b000000010110 },
  590. { 1, 15, 12, 0b000000001110 },
  591. { 2, 0, 6, 0b001111 },
  592. { 2, 1, 6, 0b001101 },
  593. { 2, 2, 7, 0b0010111 },
  594. { 2, 3, 8, 0b00100100 },
  595. { 2, 4, 9, 0b000111011 },
  596. { 2, 5, 9, 0b000110001 },
  597. { 2, 6, 10, 0b0001001101 },
  598. { 2, 7, 10, 0b0001000001 },
  599. { 2, 8, 9, 0b000011101 },
  600. { 2, 9, 10, 0b0000101000 },
  601. { 2, 10, 10, 0b0000011110 },
  602. { 2, 11, 11, 0b00000101000 },
  603. { 2, 12, 11, 0b00000011011 },
  604. { 2, 13, 12, 0b000000100001 },
  605. { 2, 14, 13, 0b0000000101010 },
  606. { 2, 15, 13, 0b0000000010000 },
  607. { 3, 0, 7, 0b0010110 },
  608. { 3, 1, 7, 0b0010100 },
  609. { 3, 2, 8, 0b00100101 },
  610. { 3, 3, 9, 0b000111101 },
  611. { 3, 4, 9, 0b000111000 },
  612. { 3, 5, 10, 0b0001001111 },
  613. { 3, 6, 10, 0b0001001001 },
  614. { 3, 7, 10, 0b0001000000 },
  615. { 3, 8, 10, 0b0000101011 },
  616. { 3, 9, 11, 0b00001001100 },
  617. { 3, 10, 11, 0b00000111000 },
  618. { 3, 11, 11, 0b00000100101 },
  619. { 3, 12, 11, 0b00000011010 },
  620. { 3, 13, 12, 0b000000011111 },
  621. { 3, 14, 13, 0b0000000011001 },
  622. { 3, 15, 13, 0b0000000001110 },
  623. { 4, 0, 8, 0b00100011 },
  624. { 4, 1, 7, 0b0010000 },
  625. { 4, 2, 9, 0b000111100 },
  626. { 4, 3, 9, 0b000111001 },
  627. { 4, 4, 10, 0b0001100001 },
  628. { 4, 5, 10, 0b0001001011 },
  629. { 4, 6, 11, 0b00001110010 },
  630. { 4, 7, 11, 0b00001011011 },
  631. { 4, 8, 10, 0b0000110110 },
  632. { 4, 9, 11, 0b00001001001 },
  633. { 4, 10, 11, 0b00000110111 },
  634. { 4, 11, 12, 0b000000101001 },
  635. { 4, 12, 12, 0b000000110000 },
  636. { 4, 13, 13, 0b0000000110101 },
  637. { 4, 14, 13, 0b0000000010111 },
  638. { 4, 15, 14, 0b00000000011000 },
  639. { 5, 0, 9, 0b000111010 },
  640. { 5, 1, 8, 0b00011011 },
  641. { 5, 2, 9, 0b000110010 },
  642. { 5, 3, 10, 0b0001100000 },
  643. { 5, 4, 10, 0b0001001100 },
  644. { 5, 5, 10, 0b0001000110 },
  645. { 5, 6, 11, 0b00001011101 },
  646. { 5, 7, 11, 0b00001010100 },
  647. { 5, 8, 11, 0b00001001101 },
  648. { 5, 9, 11, 0b00000111010 },
  649. { 5, 10, 12, 0b000001001111 },
  650. { 5, 11, 11, 0b00000011101 },
  651. { 5, 12, 13, 0b0000001001010 },
  652. { 5, 13, 13, 0b0000000110001 },
  653. { 5, 14, 14, 0b00000000101001 },
  654. { 5, 15, 14, 0b00000000010001 },
  655. { 6, 0, 9, 0b000101111 },
  656. { 6, 1, 9, 0b000101101 },
  657. { 6, 2, 10, 0b0001001110 },
  658. { 6, 3, 10, 0b0001001010 },
  659. { 6, 4, 11, 0b00001110011 },
  660. { 6, 5, 11, 0b00001011110 },
  661. { 6, 6, 11, 0b00001011010 },
  662. { 6, 7, 11, 0b00001001111 },
  663. { 6, 8, 11, 0b00001000101 },
  664. { 6, 9, 12, 0b000001010011 },
  665. { 6, 10, 12, 0b000001000111 },
  666. { 6, 11, 12, 0b000000110010 },
  667. { 6, 12, 13, 0b0000000111011 },
  668. { 6, 13, 13, 0b0000000100110 },
  669. { 6, 14, 14, 0b00000000100100 },
  670. { 6, 15, 14, 0b00000000001111 },
  671. { 7, 0, 10, 0b0001001000 },
  672. { 7, 1, 9, 0b000100010 },
  673. { 7, 2, 10, 0b0000111000 },
  674. { 7, 3, 11, 0b00001011111 },
  675. { 7, 4, 11, 0b00001011100 },
  676. { 7, 5, 11, 0b00001010101 },
  677. { 7, 6, 12, 0b000001011011 },
  678. { 7, 7, 12, 0b000001011010 },
  679. { 7, 8, 12, 0b000001010110 },
  680. { 7, 9, 12, 0b000001001001 },
  681. { 7, 10, 13, 0b0000001001101 },
  682. { 7, 11, 13, 0b0000001000001 },
  683. { 7, 12, 13, 0b0000000110011 },
  684. { 7, 13, 14, 0b00000000101100 },
  685. { 7, 14, 16, 0b0000000000101011 },
  686. { 7, 15, 16, 0b0000000000101010 },
  687. { 8, 0, 9, 0b000101011 },
  688. { 8, 1, 8, 0b00010100 },
  689. { 8, 2, 9, 0b000011110 },
  690. { 8, 3, 10, 0b0000101100 },
  691. { 8, 4, 10, 0b0000110111 },
  692. { 8, 5, 11, 0b00001001110 },
  693. { 8, 6, 11, 0b00001001000 },
  694. { 8, 7, 12, 0b000001010111 },
  695. { 8, 8, 12, 0b000001001110 },
  696. { 8, 9, 12, 0b000000111101 },
  697. { 8, 10, 12, 0b000000101110 },
  698. { 8, 11, 13, 0b0000000110110 },
  699. { 8, 12, 13, 0b0000000100101 },
  700. { 8, 13, 14, 0b00000000011110 },
  701. { 8, 14, 15, 0b000000000010100 },
  702. { 8, 15, 15, 0b000000000010000 },
  703. { 9, 0, 10, 0b0000110101 },
  704. { 9, 1, 9, 0b000011001 },
  705. { 9, 2, 10, 0b0000101001 },
  706. { 9, 3, 10, 0b0000100101 },
  707. { 9, 4, 11, 0b00000101100 },
  708. { 9, 5, 11, 0b00000111011 },
  709. { 9, 6, 11, 0b00000110110 },
  710. { 9, 7, 13, 0b0000001010001 },
  711. { 9, 8, 12, 0b000001000010 },
  712. { 9, 9, 13, 0b0000001001100 },
  713. { 9, 10, 13, 0b0000000111001 },
  714. { 9, 11, 14, 0b00000000110110 },
  715. { 9, 12, 14, 0b00000000100101 },
  716. { 9, 13, 14, 0b00000000010010 },
  717. { 9, 14, 16, 0b0000000000100111 },
  718. { 9, 15, 15, 0b000000000001011 },
  719. { 10, 0, 10, 0b0000100011 },
  720. { 10, 1, 10, 0b0000100001 },
  721. { 10, 2, 10, 0b0000011111 },
  722. { 10, 3, 11, 0b00000111001 },
  723. { 10, 4, 11, 0b00000101010 },
  724. { 10, 5, 12, 0b000001010010 },
  725. { 10, 6, 12, 0b000001001000 },
  726. { 10, 7, 13, 0b0000001010000 },
  727. { 10, 8, 12, 0b000000101111 },
  728. { 10, 9, 13, 0b0000000111010 },
  729. { 10, 10, 14, 0b00000000110111 },
  730. { 10, 11, 13, 0b0000000010101 },
  731. { 10, 12, 14, 0b00000000010110 },
  732. { 10, 13, 15, 0b000000000011010 },
  733. { 10, 14, 16, 0b0000000000100110 },
  734. { 10, 15, 17, 0b00000000000010110 },
  735. { 11, 0, 11, 0b00000110101 },
  736. { 11, 1, 10, 0b0000011001 },
  737. { 11, 2, 10, 0b0000010111 },
  738. { 11, 3, 11, 0b00000100110 },
  739. { 11, 4, 12, 0b000001000110 },
  740. { 11, 5, 12, 0b000000111100 },
  741. { 11, 6, 12, 0b000000110011 },
  742. { 11, 7, 12, 0b000000100100 },
  743. { 11, 8, 13, 0b0000000110111 },
  744. { 11, 9, 13, 0b0000000011010 },
  745. { 11, 10, 13, 0b0000000100010 },
  746. { 11, 11, 14, 0b00000000010111 },
  747. { 11, 12, 15, 0b000000000011011 },
  748. { 11, 13, 15, 0b000000000001110 },
  749. { 11, 14, 15, 0b000000000001001 },
  750. { 11, 15, 16, 0b0000000000000111 },
  751. { 12, 0, 11, 0b00000100010 },
  752. { 12, 1, 11, 0b00000100000 },
  753. { 12, 2, 11, 0b00000011100 },
  754. { 12, 3, 12, 0b000000100111 },
  755. { 12, 4, 12, 0b000000110001 },
  756. { 12, 5, 13, 0b0000001001011 },
  757. { 12, 6, 12, 0b000000011110 },
  758. { 12, 7, 13, 0b0000000110100 },
  759. { 12, 8, 14, 0b00000000110000 },
  760. { 12, 9, 14, 0b00000000101000 },
  761. { 12, 10, 15, 0b000000000110100 },
  762. { 12, 11, 15, 0b000000000011100 },
  763. { 12, 12, 15, 0b000000000010010 },
  764. { 12, 13, 16, 0b0000000000010001 },
  765. { 12, 14, 16, 0b0000000000001001 },
  766. { 12, 15, 16, 0b0000000000000101 },
  767. { 13, 0, 12, 0b000000101101 },
  768. { 13, 1, 11, 0b00000010101 },
  769. { 13, 2, 12, 0b000000100010 },
  770. { 13, 3, 13, 0b0000001000000 },
  771. { 13, 4, 13, 0b0000000111000 },
  772. { 13, 5, 13, 0b0000000110010 },
  773. { 13, 6, 14, 0b00000000110001 },
  774. { 13, 7, 14, 0b00000000101101 },
  775. { 13, 8, 14, 0b00000000011111 },
  776. { 13, 9, 14, 0b00000000010011 },
  777. { 13, 10, 14, 0b00000000001100 },
  778. { 13, 11, 15, 0b000000000001111 },
  779. { 13, 12, 16, 0b0000000000001010 },
  780. { 13, 13, 15, 0b000000000000111 },
  781. { 13, 14, 16, 0b0000000000000110 },
  782. { 13, 15, 16, 0b0000000000000011 },
  783. { 14, 0, 13, 0b0000000110000 },
  784. { 14, 1, 12, 0b000000010111 },
  785. { 14, 2, 12, 0b000000010100 },
  786. { 14, 3, 13, 0b0000000100111 },
  787. { 14, 4, 13, 0b0000000100100 },
  788. { 14, 5, 13, 0b0000000100011 },
  789. { 14, 6, 15, 0b000000000110101 },
  790. { 14, 7, 14, 0b00000000010101 },
  791. { 14, 8, 14, 0b00000000010000 },
  792. { 14, 9, 17, 0b00000000000010111 },
  793. { 14, 10, 15, 0b000000000001101 },
  794. { 14, 11, 15, 0b000000000001010 },
  795. { 14, 12, 15, 0b000000000000110 },
  796. { 14, 13, 17, 0b00000000000000001 },
  797. { 14, 14, 16, 0b0000000000000100 },
  798. { 14, 15, 16, 0b0000000000000010 },
  799. { 15, 0, 12, 0b000000010000 },
  800. { 15, 1, 12, 0b000000001111 },
  801. { 15, 2, 13, 0b0000000010001 },
  802. { 15, 3, 14, 0b00000000011011 },
  803. { 15, 4, 14, 0b00000000011001 },
  804. { 15, 5, 14, 0b00000000010100 },
  805. { 15, 6, 15, 0b000000000011101 },
  806. { 15, 7, 14, 0b00000000001011 },
  807. { 15, 8, 15, 0b000000000010001 },
  808. { 15, 9, 15, 0b000000000001100 },
  809. { 15, 10, 16, 0b0000000000010000 },
  810. { 15, 11, 16, 0b0000000000001000 },
  811. { 15, 12, 19, 0b0000000000000000001 },
  812. { 15, 13, 18, 0b000000000000000001 },
  813. { 15, 14, 19, 0b0000000000000000000 },
  814. { 15, 15, 16, 0b0000000000000001 },
  815. } };
  816. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table15 { {
  817. { 0, 0, 3, 0b111 },
  818. { 0, 1, 4, 0b1100 },
  819. { 0, 2, 5, 0b10010 },
  820. { 0, 3, 7, 0b0110101 },
  821. { 0, 4, 7, 0b0101111 },
  822. { 0, 5, 8, 0b01001100 },
  823. { 0, 6, 9, 0b001111100 },
  824. { 0, 7, 9, 0b001101100 },
  825. { 0, 8, 9, 0b001011001 },
  826. { 0, 9, 10, 0b0001111011 },
  827. { 0, 10, 10, 0b0001101100 },
  828. { 0, 11, 11, 0b00001110111 },
  829. { 0, 12, 11, 0b00001101011 },
  830. { 0, 13, 11, 0b00001010001 },
  831. { 0, 14, 12, 0b000001111010 },
  832. { 0, 15, 13, 0b0000000111111 },
  833. { 1, 0, 4, 0b1101 },
  834. { 1, 1, 3, 0b101 },
  835. { 1, 2, 5, 0b10000 },
  836. { 1, 3, 6, 0b011011 },
  837. { 1, 4, 7, 0b0101110 },
  838. { 1, 5, 7, 0b0100100 },
  839. { 1, 6, 8, 0b00111101 },
  840. { 1, 7, 8, 0b00110011 },
  841. { 1, 8, 8, 0b00101010 },
  842. { 1, 9, 9, 0b001000110 },
  843. { 1, 10, 9, 0b000110100 },
  844. { 1, 11, 10, 0b0001010011 },
  845. { 1, 12, 10, 0b0001000001 },
  846. { 1, 13, 10, 0b0000101001 },
  847. { 1, 14, 11, 0b00000111011 },
  848. { 1, 15, 11, 0b00000100100 },
  849. { 2, 0, 5, 0b10011 },
  850. { 2, 1, 5, 0b10001 },
  851. { 2, 2, 5, 0b01111 },
  852. { 2, 3, 6, 0b011000 },
  853. { 2, 4, 7, 0b0101001 },
  854. { 2, 5, 7, 0b0100010 },
  855. { 2, 6, 8, 0b00111011 },
  856. { 2, 7, 8, 0b00110000 },
  857. { 2, 8, 8, 0b00101000 },
  858. { 2, 9, 9, 0b001000000 },
  859. { 2, 10, 9, 0b000110010 },
  860. { 2, 11, 10, 0b0001001110 },
  861. { 2, 12, 10, 0b0000111110 },
  862. { 2, 13, 11, 0b00001010000 },
  863. { 2, 14, 11, 0b00000111000 },
  864. { 2, 15, 11, 0b00000100001 },
  865. { 3, 0, 6, 0b011101 },
  866. { 3, 1, 6, 0b011100 },
  867. { 3, 2, 6, 0b011001 },
  868. { 3, 3, 7, 0b0101011 },
  869. { 3, 4, 7, 0b0100111 },
  870. { 3, 5, 8, 0b00111111 },
  871. { 3, 6, 8, 0b00110111 },
  872. { 3, 7, 9, 0b001011101 },
  873. { 3, 8, 9, 0b001001100 },
  874. { 3, 9, 9, 0b000111011 },
  875. { 3, 10, 10, 0b0001011101 },
  876. { 3, 11, 10, 0b0001001000 },
  877. { 3, 12, 10, 0b0000110110 },
  878. { 3, 13, 11, 0b00001001011 },
  879. { 3, 14, 11, 0b00000110010 },
  880. { 3, 15, 11, 0b00000011101 },
  881. { 4, 0, 7, 0b0110100 },
  882. { 4, 1, 6, 0b010110 },
  883. { 4, 2, 7, 0b0101010 },
  884. { 4, 3, 7, 0b0101000 },
  885. { 4, 4, 8, 0b01000011 },
  886. { 4, 5, 8, 0b00111001 },
  887. { 4, 6, 9, 0b001011111 },
  888. { 4, 7, 9, 0b001001111 },
  889. { 4, 8, 9, 0b001001000 },
  890. { 4, 9, 9, 0b000111001 },
  891. { 4, 10, 10, 0b0001011001 },
  892. { 4, 11, 10, 0b0001000101 },
  893. { 4, 12, 10, 0b0000110001 },
  894. { 4, 13, 11, 0b00001000010 },
  895. { 4, 14, 11, 0b00000101110 },
  896. { 4, 15, 11, 0b00000011011 },
  897. { 5, 0, 8, 0b01001101 },
  898. { 5, 1, 7, 0b0100101 },
  899. { 5, 2, 7, 0b0100011 },
  900. { 5, 3, 8, 0b01000010 },
  901. { 5, 4, 8, 0b00111010 },
  902. { 5, 5, 8, 0b00110100 },
  903. { 5, 6, 9, 0b001011011 },
  904. { 5, 7, 9, 0b001001010 },
  905. { 5, 8, 9, 0b000111110 },
  906. { 5, 9, 9, 0b000110000 },
  907. { 5, 10, 10, 0b0001001111 },
  908. { 5, 11, 10, 0b0000111111 },
  909. { 5, 12, 11, 0b00001011010 },
  910. { 5, 13, 11, 0b00000111110 },
  911. { 5, 14, 11, 0b00000101000 },
  912. { 5, 15, 12, 0b000000100110 },
  913. { 6, 0, 9, 0b001111101 },
  914. { 6, 1, 7, 0b0100000 },
  915. { 6, 2, 8, 0b00111100 },
  916. { 6, 3, 8, 0b00111000 },
  917. { 6, 4, 8, 0b00110010 },
  918. { 6, 5, 9, 0b001011100 },
  919. { 6, 6, 9, 0b001001110 },
  920. { 6, 7, 9, 0b001000001 },
  921. { 6, 8, 9, 0b000110111 },
  922. { 6, 9, 10, 0b0001010111 },
  923. { 6, 10, 10, 0b0001000111 },
  924. { 6, 11, 10, 0b0000110011 },
  925. { 6, 12, 11, 0b00001001001 },
  926. { 6, 13, 11, 0b00000110011 },
  927. { 6, 14, 12, 0b000001000110 },
  928. { 6, 15, 12, 0b000000011110 },
  929. { 7, 0, 9, 0b001101101 },
  930. { 7, 1, 8, 0b00110101 },
  931. { 7, 2, 8, 0b00110001 },
  932. { 7, 3, 9, 0b001011110 },
  933. { 7, 4, 9, 0b001011000 },
  934. { 7, 5, 9, 0b001001011 },
  935. { 7, 6, 9, 0b001000010 },
  936. { 7, 7, 10, 0b0001111010 },
  937. { 7, 8, 10, 0b0001011011 },
  938. { 7, 9, 10, 0b0001001001 },
  939. { 7, 10, 10, 0b0000111000 },
  940. { 7, 11, 10, 0b0000101010 },
  941. { 7, 12, 11, 0b00001000000 },
  942. { 7, 13, 11, 0b00000101100 },
  943. { 7, 14, 11, 0b00000010101 },
  944. { 7, 15, 12, 0b000000011001 },
  945. { 8, 0, 9, 0b001011010 },
  946. { 8, 1, 8, 0b00101011 },
  947. { 8, 2, 8, 0b00101001 },
  948. { 8, 3, 9, 0b001001101 },
  949. { 8, 4, 9, 0b001001001 },
  950. { 8, 5, 9, 0b000111111 },
  951. { 8, 6, 9, 0b000111000 },
  952. { 8, 7, 10, 0b0001011100 },
  953. { 8, 8, 10, 0b0001001101 },
  954. { 8, 9, 10, 0b0001000010 },
  955. { 8, 10, 10, 0b0000101111 },
  956. { 8, 11, 11, 0b00001000011 },
  957. { 8, 12, 11, 0b00000110000 },
  958. { 8, 13, 12, 0b000000110101 },
  959. { 8, 14, 12, 0b000000100100 },
  960. { 8, 15, 12, 0b000000010100 },
  961. { 9, 0, 9, 0b001000111 },
  962. { 9, 1, 8, 0b00100010 },
  963. { 9, 2, 9, 0b001000011 },
  964. { 9, 3, 9, 0b000111100 },
  965. { 9, 4, 9, 0b000111010 },
  966. { 9, 5, 9, 0b000110001 },
  967. { 9, 6, 10, 0b0001011000 },
  968. { 9, 7, 10, 0b0001001100 },
  969. { 9, 8, 10, 0b0001000011 },
  970. { 9, 9, 11, 0b00001101010 },
  971. { 9, 10, 11, 0b00001000111 },
  972. { 9, 11, 11, 0b00000110110 },
  973. { 9, 12, 11, 0b00000100110 },
  974. { 9, 13, 12, 0b000000100111 },
  975. { 9, 14, 12, 0b000000010111 },
  976. { 9, 15, 12, 0b000000001111 },
  977. { 10, 0, 10, 0b0001101101 },
  978. { 10, 1, 9, 0b000110101 },
  979. { 10, 2, 9, 0b000110011 },
  980. { 10, 3, 9, 0b000101111 },
  981. { 10, 4, 10, 0b0001011010 },
  982. { 10, 5, 10, 0b0001010010 },
  983. { 10, 6, 10, 0b0000111010 },
  984. { 10, 7, 10, 0b0000111001 },
  985. { 10, 8, 10, 0b0000110000 },
  986. { 10, 9, 11, 0b00001001000 },
  987. { 10, 10, 11, 0b00000111001 },
  988. { 10, 11, 11, 0b00000101001 },
  989. { 10, 12, 11, 0b00000010111 },
  990. { 10, 13, 12, 0b000000011011 },
  991. { 10, 14, 13, 0b0000000111110 },
  992. { 10, 15, 12, 0b000000001001 },
  993. { 11, 0, 10, 0b0001010110 },
  994. { 11, 1, 9, 0b000101010 },
  995. { 11, 2, 9, 0b000101000 },
  996. { 11, 3, 9, 0b000100101 },
  997. { 11, 4, 10, 0b0001000110 },
  998. { 11, 5, 10, 0b0001000000 },
  999. { 11, 6, 10, 0b0000110100 },
  1000. { 11, 7, 10, 0b0000101011 },
  1001. { 11, 8, 11, 0b00001000110 },
  1002. { 11, 9, 11, 0b00000110111 },
  1003. { 11, 10, 11, 0b00000101010 },
  1004. { 11, 11, 11, 0b00000011001 },
  1005. { 11, 12, 12, 0b000000011101 },
  1006. { 11, 13, 12, 0b000000010010 },
  1007. { 11, 14, 12, 0b000000001011 },
  1008. { 11, 15, 13, 0b0000000001011 },
  1009. { 12, 0, 11, 0b00001110110 },
  1010. { 12, 1, 10, 0b0001000100 },
  1011. { 12, 2, 9, 0b000011110 },
  1012. { 12, 3, 10, 0b0000110111 },
  1013. { 12, 4, 10, 0b0000110010 },
  1014. { 12, 5, 10, 0b0000101110 },
  1015. { 12, 6, 11, 0b00001001010 },
  1016. { 12, 7, 11, 0b00001000001 },
  1017. { 12, 8, 11, 0b00000110001 },
  1018. { 12, 9, 11, 0b00000100111 },
  1019. { 12, 10, 11, 0b00000011000 },
  1020. { 12, 11, 11, 0b00000010000 },
  1021. { 12, 12, 12, 0b000000010110 },
  1022. { 12, 13, 12, 0b000000001101 },
  1023. { 12, 14, 13, 0b0000000001110 },
  1024. { 12, 15, 13, 0b0000000000111 },
  1025. { 13, 0, 11, 0b00001011011 },
  1026. { 13, 1, 10, 0b0000101100 },
  1027. { 13, 2, 10, 0b0000100111 },
  1028. { 13, 3, 10, 0b0000100110 },
  1029. { 13, 4, 10, 0b0000100010 },
  1030. { 13, 5, 11, 0b00000111111 },
  1031. { 13, 6, 11, 0b00000110100 },
  1032. { 13, 7, 11, 0b00000101101 },
  1033. { 13, 8, 11, 0b00000011111 },
  1034. { 13, 9, 12, 0b000000110100 },
  1035. { 13, 10, 12, 0b000000011100 },
  1036. { 13, 11, 12, 0b000000010011 },
  1037. { 13, 12, 12, 0b000000001110 },
  1038. { 13, 13, 12, 0b000000001000 },
  1039. { 13, 14, 13, 0b0000000001001 },
  1040. { 13, 15, 13, 0b0000000000011 },
  1041. { 14, 0, 12, 0b000001111011 },
  1042. { 14, 1, 11, 0b00000111100 },
  1043. { 14, 2, 11, 0b00000111010 },
  1044. { 14, 3, 11, 0b00000110101 },
  1045. { 14, 4, 11, 0b00000101111 },
  1046. { 14, 5, 11, 0b00000101011 },
  1047. { 14, 6, 11, 0b00000100000 },
  1048. { 14, 7, 11, 0b00000010110 },
  1049. { 14, 8, 12, 0b000000100101 },
  1050. { 14, 9, 12, 0b000000011000 },
  1051. { 14, 10, 12, 0b000000010001 },
  1052. { 14, 11, 12, 0b000000001100 },
  1053. { 14, 12, 13, 0b0000000001111 },
  1054. { 14, 13, 13, 0b0000000001010 },
  1055. { 14, 14, 12, 0b000000000010 },
  1056. { 14, 15, 13, 0b0000000000001 },
  1057. { 15, 0, 12, 0b000001000111 },
  1058. { 15, 1, 11, 0b00000100101 },
  1059. { 15, 2, 11, 0b00000100010 },
  1060. { 15, 3, 11, 0b00000011110 },
  1061. { 15, 4, 11, 0b00000011100 },
  1062. { 15, 5, 11, 0b00000010100 },
  1063. { 15, 6, 11, 0b00000010001 },
  1064. { 15, 7, 12, 0b000000011010 },
  1065. { 15, 8, 12, 0b000000010101 },
  1066. { 15, 9, 12, 0b000000010000 },
  1067. { 15, 10, 12, 0b000000001010 },
  1068. { 15, 11, 12, 0b000000000110 },
  1069. { 15, 12, 13, 0b0000000001000 },
  1070. { 15, 13, 13, 0b0000000000110 },
  1071. { 15, 14, 13, 0b0000000000010 },
  1072. { 15, 15, 13, 0b0000000000000 },
  1073. } };
  1074. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table16 { {
  1075. { 0, 0, 1, 0b1 },
  1076. { 0, 1, 4, 0b0101 },
  1077. { 0, 2, 6, 0b001110 },
  1078. { 0, 3, 8, 0b00101100 },
  1079. { 0, 4, 9, 0b001001010 },
  1080. { 0, 5, 9, 0b000111111 },
  1081. { 0, 6, 10, 0b0001101110 },
  1082. { 0, 7, 10, 0b0001011101 },
  1083. { 0, 8, 11, 0b00010101100 },
  1084. { 0, 9, 11, 0b00010010101 },
  1085. { 0, 10, 11, 0b00010001010 },
  1086. { 0, 11, 12, 0b000011110010 },
  1087. { 0, 12, 12, 0b000011100001 },
  1088. { 0, 13, 12, 0b000011000011 },
  1089. { 0, 14, 13, 0b0000101111000 },
  1090. { 0, 15, 9, 0b000010001 },
  1091. { 1, 0, 3, 0b011 },
  1092. { 1, 1, 4, 0b0100 },
  1093. { 1, 2, 6, 0b001100 },
  1094. { 1, 3, 7, 0b0010100 },
  1095. { 1, 4, 8, 0b00100011 },
  1096. { 1, 5, 9, 0b000111110 },
  1097. { 1, 6, 9, 0b000110101 },
  1098. { 1, 7, 9, 0b000101111 },
  1099. { 1, 8, 10, 0b0001010011 },
  1100. { 1, 9, 10, 0b0001001011 },
  1101. { 1, 10, 10, 0b0001000100 },
  1102. { 1, 11, 11, 0b00001110111 },
  1103. { 1, 12, 12, 0b000011001001 },
  1104. { 1, 13, 11, 0b00001101011 },
  1105. { 1, 14, 12, 0b000011001111 },
  1106. { 1, 15, 8, 0b00001001 },
  1107. { 2, 0, 6, 0b001111 },
  1108. { 2, 1, 6, 0b001101 },
  1109. { 2, 2, 7, 0b0010111 },
  1110. { 2, 3, 8, 0b00100110 },
  1111. { 2, 4, 9, 0b001000011 },
  1112. { 2, 5, 9, 0b000111010 },
  1113. { 2, 6, 10, 0b0001100111 },
  1114. { 2, 7, 10, 0b0001011010 },
  1115. { 2, 8, 11, 0b00010100001 },
  1116. { 2, 9, 10, 0b0001001000 },
  1117. { 2, 10, 11, 0b00001111111 },
  1118. { 2, 11, 11, 0b00001110101 },
  1119. { 2, 12, 11, 0b00001101110 },
  1120. { 2, 13, 12, 0b000011010001 },
  1121. { 2, 14, 12, 0b000011001110 },
  1122. { 2, 15, 9, 0b000010000 },
  1123. { 3, 0, 8, 0b00101101 },
  1124. { 3, 1, 7, 0b0010101 },
  1125. { 3, 2, 8, 0b00100111 },
  1126. { 3, 3, 9, 0b001000101 },
  1127. { 3, 4, 9, 0b001000000 },
  1128. { 3, 5, 10, 0b0001110010 },
  1129. { 3, 6, 10, 0b0001100011 },
  1130. { 3, 7, 10, 0b0001010111 },
  1131. { 3, 8, 11, 0b00010011110 },
  1132. { 3, 9, 11, 0b00010001100 },
  1133. { 3, 10, 12, 0b000011111100 },
  1134. { 3, 11, 12, 0b000011010100 },
  1135. { 3, 12, 12, 0b000011000111 },
  1136. { 3, 13, 13, 0b0000110000011 },
  1137. { 3, 14, 13, 0b0000101101101 },
  1138. { 3, 15, 10, 0b0000011010 },
  1139. { 4, 0, 9, 0b001001011 },
  1140. { 4, 1, 8, 0b00100100 },
  1141. { 4, 2, 9, 0b001000100 },
  1142. { 4, 3, 9, 0b001000001 },
  1143. { 4, 4, 10, 0b0001110011 },
  1144. { 4, 5, 10, 0b0001100101 },
  1145. { 4, 6, 11, 0b00010110011 },
  1146. { 4, 7, 11, 0b00010100100 },
  1147. { 4, 8, 11, 0b00010011011 },
  1148. { 4, 9, 12, 0b000100001000 },
  1149. { 4, 10, 12, 0b000011110110 },
  1150. { 4, 11, 12, 0b000011100010 },
  1151. { 4, 12, 13, 0b0000110001011 },
  1152. { 4, 13, 13, 0b0000101111110 },
  1153. { 4, 14, 13, 0b0000101101010 },
  1154. { 4, 15, 9, 0b000001001 },
  1155. { 5, 0, 9, 0b001000010 },
  1156. { 5, 1, 8, 0b00011110 },
  1157. { 5, 2, 9, 0b000111011 },
  1158. { 5, 3, 9, 0b000111000 },
  1159. { 5, 4, 10, 0b0001100110 },
  1160. { 5, 5, 11, 0b00010111001 },
  1161. { 5, 6, 11, 0b00010101101 },
  1162. { 5, 7, 12, 0b000100001001 },
  1163. { 5, 8, 11, 0b00010001110 },
  1164. { 5, 9, 12, 0b000011111101 },
  1165. { 5, 10, 12, 0b000011101000 },
  1166. { 5, 11, 13, 0b0000110010000 },
  1167. { 5, 12, 13, 0b0000110000100 },
  1168. { 5, 13, 13, 0b0000101111010 },
  1169. { 5, 14, 14, 0b00000110111101 },
  1170. { 5, 15, 10, 0b0000010000 },
  1171. { 6, 0, 10, 0b0001101111 },
  1172. { 6, 1, 9, 0b000110110 },
  1173. { 6, 2, 9, 0b000110100 },
  1174. { 6, 3, 10, 0b0001100100 },
  1175. { 6, 4, 11, 0b00010111000 },
  1176. { 6, 5, 11, 0b00010110010 },
  1177. { 6, 6, 11, 0b00010100000 },
  1178. { 6, 7, 11, 0b00010000101 },
  1179. { 6, 8, 12, 0b000100000001 },
  1180. { 6, 9, 12, 0b000011110100 },
  1181. { 6, 10, 12, 0b000011100100 },
  1182. { 6, 11, 12, 0b000011011001 },
  1183. { 6, 12, 13, 0b0000110000001 },
  1184. { 6, 13, 13, 0b0000101101110 },
  1185. { 6, 14, 14, 0b00001011001011 },
  1186. { 6, 15, 10, 0b0000001010 },
  1187. { 7, 0, 10, 0b0001100010 },
  1188. { 7, 1, 9, 0b000110000 },
  1189. { 7, 2, 10, 0b0001011011 },
  1190. { 7, 3, 10, 0b0001011000 },
  1191. { 7, 4, 11, 0b00010100101 },
  1192. { 7, 5, 11, 0b00010011101 },
  1193. { 7, 6, 11, 0b00010010100 },
  1194. { 7, 7, 12, 0b000100000101 },
  1195. { 7, 8, 12, 0b000011111000 },
  1196. { 7, 9, 13, 0b0000110010111 },
  1197. { 7, 10, 13, 0b0000110001101 },
  1198. { 7, 11, 13, 0b0000101110100 },
  1199. { 7, 12, 13, 0b0000101111100 },
  1200. { 7, 13, 15, 0b000001101111001 },
  1201. { 7, 14, 15, 0b000001101110100 },
  1202. { 7, 15, 10, 0b0000001000 },
  1203. { 8, 0, 10, 0b0001010101 },
  1204. { 8, 1, 10, 0b0001010100 },
  1205. { 8, 2, 10, 0b0001010001 },
  1206. { 8, 3, 11, 0b00010011111 },
  1207. { 8, 4, 11, 0b00010011100 },
  1208. { 8, 5, 11, 0b00010001111 },
  1209. { 8, 6, 12, 0b000100000100 },
  1210. { 8, 7, 12, 0b000011111001 },
  1211. { 8, 8, 13, 0b0000110101011 },
  1212. { 8, 9, 13, 0b0000110010001 },
  1213. { 8, 10, 13, 0b0000110001000 },
  1214. { 8, 11, 13, 0b0000101111111 },
  1215. { 8, 12, 14, 0b00001011010111 },
  1216. { 8, 13, 14, 0b00001011001001 },
  1217. { 8, 14, 14, 0b00001011000100 },
  1218. { 8, 15, 10, 0b0000000111 },
  1219. { 9, 0, 11, 0b00010011010 },
  1220. { 9, 1, 10, 0b0001001100 },
  1221. { 9, 2, 10, 0b0001001001 },
  1222. { 9, 3, 11, 0b00010001101 },
  1223. { 9, 4, 11, 0b00010000011 },
  1224. { 9, 5, 12, 0b000100000000 },
  1225. { 9, 6, 12, 0b000011110101 },
  1226. { 9, 7, 13, 0b0000110101010 },
  1227. { 9, 8, 13, 0b0000110010110 },
  1228. { 9, 9, 13, 0b0000110001010 },
  1229. { 9, 10, 13, 0b0000110000000 },
  1230. { 9, 11, 14, 0b00001011011111 },
  1231. { 9, 12, 13, 0b0000101100111 },
  1232. { 9, 13, 14, 0b00001011000110 },
  1233. { 9, 14, 13, 0b0000101100000 },
  1234. { 9, 15, 11, 0b00000001011 },
  1235. { 10, 0, 11, 0b00010001011 },
  1236. { 10, 1, 11, 0b00010000001 },
  1237. { 10, 2, 10, 0b0001000011 },
  1238. { 10, 3, 11, 0b00001111101 },
  1239. { 10, 4, 12, 0b000011110111 },
  1240. { 10, 5, 12, 0b000011101001 },
  1241. { 10, 6, 12, 0b000011100101 },
  1242. { 10, 7, 12, 0b000011011011 },
  1243. { 10, 8, 13, 0b0000110001001 },
  1244. { 10, 9, 14, 0b00001011100111 },
  1245. { 10, 10, 14, 0b00001011100001 },
  1246. { 10, 11, 14, 0b00001011010000 },
  1247. { 10, 12, 15, 0b000001101110101 },
  1248. { 10, 13, 15, 0b000001101110010 },
  1249. { 10, 14, 14, 0b00000110110111 },
  1250. { 10, 15, 10, 0b0000000100 },
  1251. { 11, 0, 12, 0b000011110011 },
  1252. { 11, 1, 11, 0b00001111000 },
  1253. { 11, 2, 11, 0b00001110110 },
  1254. { 11, 3, 11, 0b00001110011 },
  1255. { 11, 4, 12, 0b000011100011 },
  1256. { 11, 5, 12, 0b000011011111 },
  1257. { 11, 6, 13, 0b0000110001100 },
  1258. { 11, 7, 14, 0b00001011101010 },
  1259. { 11, 8, 14, 0b00001011100110 },
  1260. { 11, 9, 14, 0b00001011100000 },
  1261. { 11, 10, 14, 0b00001011010001 },
  1262. { 11, 11, 14, 0b00001011001000 },
  1263. { 11, 12, 14, 0b00001011000010 },
  1264. { 11, 13, 13, 0b0000011011111 },
  1265. { 11, 14, 14, 0b00000110110100 },
  1266. { 11, 15, 11, 0b00000000110 },
  1267. { 12, 0, 12, 0b000011001010 },
  1268. { 12, 1, 12, 0b000011100000 },
  1269. { 12, 2, 12, 0b000011011110 },
  1270. { 12, 3, 12, 0b000011011010 },
  1271. { 12, 4, 12, 0b000011011000 },
  1272. { 12, 5, 13, 0b0000110000101 },
  1273. { 12, 6, 13, 0b0000110000010 },
  1274. { 12, 7, 13, 0b0000101111101 },
  1275. { 12, 8, 13, 0b0000101101100 },
  1276. { 12, 9, 15, 0b000001101111000 },
  1277. { 12, 10, 14, 0b00000110111011 },
  1278. { 12, 11, 14, 0b00001011000011 },
  1279. { 12, 12, 14, 0b00000110111000 },
  1280. { 12, 13, 14, 0b00000110110101 },
  1281. { 12, 14, 16, 0b0000011011000000 },
  1282. { 12, 15, 11, 0b00000000100 },
  1283. { 13, 0, 14, 0b00001011101011 },
  1284. { 13, 1, 12, 0b000011010011 },
  1285. { 13, 2, 12, 0b000011010010 },
  1286. { 13, 3, 12, 0b000011010000 },
  1287. { 13, 4, 13, 0b0000101110010 },
  1288. { 13, 5, 13, 0b0000101111011 },
  1289. { 13, 6, 14, 0b00001011011110 },
  1290. { 13, 7, 14, 0b00001011010011 },
  1291. { 13, 8, 14, 0b00001011001010 },
  1292. { 13, 9, 16, 0b0000011011000111 },
  1293. { 13, 10, 15, 0b000001101110011 },
  1294. { 13, 11, 15, 0b000001101101101 },
  1295. { 13, 12, 15, 0b000001101101100 },
  1296. { 13, 13, 17, 0b00000110110000011 },
  1297. { 13, 14, 15, 0b000001101100001 },
  1298. { 13, 15, 11, 0b00000000010 },
  1299. { 14, 0, 13, 0b0000101111001 },
  1300. { 14, 1, 13, 0b0000101110001 },
  1301. { 14, 2, 11, 0b00001100110 },
  1302. { 14, 3, 12, 0b000010111011 },
  1303. { 14, 4, 14, 0b00001011010110 },
  1304. { 14, 5, 14, 0b00001011010010 },
  1305. { 14, 6, 13, 0b0000101100110 },
  1306. { 14, 7, 14, 0b00001011000111 },
  1307. { 14, 8, 14, 0b00001011000101 },
  1308. { 14, 9, 15, 0b000001101100010 },
  1309. { 14, 10, 16, 0b0000011011000110 },
  1310. { 14, 11, 15, 0b000001101100111 },
  1311. { 14, 12, 17, 0b00000110110000010 },
  1312. { 14, 13, 15, 0b000001101100110 },
  1313. { 14, 14, 14, 0b00000110110010 },
  1314. { 14, 15, 11, 0b00000000000 },
  1315. { 15, 0, 9, 0b000001100 },
  1316. { 15, 1, 8, 0b00001010 },
  1317. { 15, 2, 8, 0b00000111 },
  1318. { 15, 3, 9, 0b000001011 },
  1319. { 15, 4, 9, 0b000001010 },
  1320. { 15, 5, 10, 0b0000010001 },
  1321. { 15, 6, 10, 0b0000001011 },
  1322. { 15, 7, 10, 0b0000001001 },
  1323. { 15, 8, 11, 0b00000001101 },
  1324. { 15, 9, 11, 0b00000001100 },
  1325. { 15, 10, 11, 0b00000001010 },
  1326. { 15, 11, 11, 0b00000000111 },
  1327. { 15, 12, 11, 0b00000000101 },
  1328. { 15, 13, 11, 0b00000000011 },
  1329. { 15, 14, 11, 0b00000000001 },
  1330. { 15, 15, 8, 0b00000011 },
  1331. } };
  1332. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table17 { Table16 };
  1333. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table18 { Table16 };
  1334. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table19 { Table16 };
  1335. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table20 { Table16 };
  1336. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table21 { Table16 };
  1337. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table22 { Table16 };
  1338. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table23 { Table16 };
  1339. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table24 { {
  1340. { 0, 0, 4, 0b1111 },
  1341. { 0, 1, 4, 0b1101 },
  1342. { 0, 2, 6, 0b101110 },
  1343. { 0, 3, 7, 0b1010000 },
  1344. { 0, 4, 8, 0b10010010 },
  1345. { 0, 5, 9, 0b100000110 },
  1346. { 0, 6, 9, 0b011111000 },
  1347. { 0, 7, 10, 0b0110110010 },
  1348. { 0, 8, 10, 0b0110101010 },
  1349. { 0, 9, 11, 0b01010011101 },
  1350. { 0, 10, 11, 0b01010001101 },
  1351. { 0, 11, 11, 0b01010001001 },
  1352. { 0, 12, 11, 0b01001101101 },
  1353. { 0, 13, 11, 0b01000000101 },
  1354. { 0, 14, 12, 0b010000001000 },
  1355. { 0, 15, 9, 0b001011000 },
  1356. { 1, 0, 4, 0b1110 },
  1357. { 1, 1, 4, 0b1100 },
  1358. { 1, 2, 5, 0b10101 },
  1359. { 1, 3, 6, 0b100110 },
  1360. { 1, 4, 7, 0b1000111 },
  1361. { 1, 5, 8, 0b10000010 },
  1362. { 1, 6, 8, 0b01111010 },
  1363. { 1, 7, 9, 0b011011000 },
  1364. { 1, 8, 9, 0b011010001 },
  1365. { 1, 9, 9, 0b011000110 },
  1366. { 1, 10, 10, 0b0101000111 },
  1367. { 1, 11, 10, 0b0101011001 },
  1368. { 1, 12, 10, 0b0100111111 },
  1369. { 1, 13, 10, 0b0100101001 },
  1370. { 1, 14, 10, 0b0100010111 },
  1371. { 1, 15, 8, 0b00101010 },
  1372. { 2, 0, 6, 0b101111 },
  1373. { 2, 1, 5, 0b10110 },
  1374. { 2, 2, 6, 0b101001 },
  1375. { 2, 3, 7, 0b1001010 },
  1376. { 2, 4, 7, 0b1000100 },
  1377. { 2, 5, 8, 0b10000000 },
  1378. { 2, 6, 8, 0b01111000 },
  1379. { 2, 7, 9, 0b011011101 },
  1380. { 2, 8, 9, 0b011001111 },
  1381. { 2, 9, 9, 0b011000010 },
  1382. { 2, 10, 9, 0b010110110 },
  1383. { 2, 11, 10, 0b0101010100 },
  1384. { 2, 12, 10, 0b0100111011 },
  1385. { 2, 13, 10, 0b0100100111 },
  1386. { 2, 14, 11, 0b01000011101 },
  1387. { 2, 15, 7, 0b0010010 },
  1388. { 3, 0, 7, 0b1010001 },
  1389. { 3, 1, 6, 0b100111 },
  1390. { 3, 2, 7, 0b1001011 },
  1391. { 3, 3, 7, 0b1000110 },
  1392. { 3, 4, 8, 0b10000110 },
  1393. { 3, 5, 8, 0b01111101 },
  1394. { 3, 6, 8, 0b01110100 },
  1395. { 3, 7, 9, 0b011011100 },
  1396. { 3, 8, 9, 0b011001100 },
  1397. { 3, 9, 9, 0b010111110 },
  1398. { 3, 10, 9, 0b010110010 },
  1399. { 3, 11, 10, 0b0101000101 },
  1400. { 3, 12, 10, 0b0100110111 },
  1401. { 3, 13, 10, 0b0100100101 },
  1402. { 3, 14, 10, 0b0100001111 },
  1403. { 3, 15, 7, 0b0010000 },
  1404. { 4, 0, 8, 0b10010011 },
  1405. { 4, 1, 7, 0b1001000 },
  1406. { 4, 2, 7, 0b1000101 },
  1407. { 4, 3, 8, 0b10000111 },
  1408. { 4, 4, 8, 0b01111111 },
  1409. { 4, 5, 8, 0b01110110 },
  1410. { 4, 6, 8, 0b01110000 },
  1411. { 4, 7, 9, 0b011010010 },
  1412. { 4, 8, 9, 0b011001000 },
  1413. { 4, 9, 9, 0b010111100 },
  1414. { 4, 10, 10, 0b0101100000 },
  1415. { 4, 11, 10, 0b0101000011 },
  1416. { 4, 12, 10, 0b0100110010 },
  1417. { 4, 13, 10, 0b0100011101 },
  1418. { 4, 14, 11, 0b01000011100 },
  1419. { 4, 15, 7, 0b0001110 },
  1420. { 5, 0, 9, 0b100000111 },
  1421. { 5, 1, 7, 0b1000010 },
  1422. { 5, 2, 8, 0b10000001 },
  1423. { 5, 3, 8, 0b01111110 },
  1424. { 5, 4, 8, 0b01110111 },
  1425. { 5, 5, 8, 0b01110010 },
  1426. { 5, 6, 9, 0b011010110 },
  1427. { 5, 7, 9, 0b011001010 },
  1428. { 5, 8, 9, 0b011000000 },
  1429. { 5, 9, 9, 0b010110100 },
  1430. { 5, 10, 10, 0b0101010101 },
  1431. { 5, 11, 10, 0b0100111101 },
  1432. { 5, 12, 10, 0b0100101101 },
  1433. { 5, 13, 10, 0b0100011001 },
  1434. { 5, 14, 10, 0b0100000110 },
  1435. { 5, 15, 7, 0b0001100 },
  1436. { 6, 0, 9, 0b011111001 },
  1437. { 6, 1, 8, 0b01111011 },
  1438. { 6, 2, 8, 0b01111001 },
  1439. { 6, 3, 8, 0b01110101 },
  1440. { 6, 4, 8, 0b01110001 },
  1441. { 6, 5, 9, 0b011010111 },
  1442. { 6, 6, 9, 0b011001110 },
  1443. { 6, 7, 9, 0b011000011 },
  1444. { 6, 8, 9, 0b010111001 },
  1445. { 6, 9, 10, 0b0101011011 },
  1446. { 6, 10, 10, 0b0101001010 },
  1447. { 6, 11, 10, 0b0100110100 },
  1448. { 6, 12, 10, 0b0100100011 },
  1449. { 6, 13, 10, 0b0100010000 },
  1450. { 6, 14, 11, 0b01000001000 },
  1451. { 6, 15, 7, 0b0001010 },
  1452. { 7, 0, 10, 0b0110110011 },
  1453. { 7, 1, 8, 0b01110011 },
  1454. { 7, 2, 8, 0b01101111 },
  1455. { 7, 3, 8, 0b01101101 },
  1456. { 7, 4, 9, 0b011010011 },
  1457. { 7, 5, 9, 0b011001011 },
  1458. { 7, 6, 9, 0b011000100 },
  1459. { 7, 7, 9, 0b010111011 },
  1460. { 7, 8, 10, 0b0101100001 },
  1461. { 7, 9, 10, 0b0101001100 },
  1462. { 7, 10, 10, 0b0100111001 },
  1463. { 7, 11, 10, 0b0100101010 },
  1464. { 7, 12, 10, 0b0100011011 },
  1465. { 7, 13, 11, 0b01000010011 },
  1466. { 7, 14, 11, 0b00101111101 },
  1467. { 7, 15, 8, 0b00010001 },
  1468. { 8, 0, 10, 0b0110101011 },
  1469. { 8, 1, 9, 0b011010100 },
  1470. { 8, 2, 9, 0b011010000 },
  1471. { 8, 3, 9, 0b011001101 },
  1472. { 8, 4, 9, 0b011001001 },
  1473. { 8, 5, 9, 0b011000001 },
  1474. { 8, 6, 9, 0b010111010 },
  1475. { 8, 7, 9, 0b010110001 },
  1476. { 8, 8, 9, 0b010101001 },
  1477. { 8, 9, 10, 0b0101000000 },
  1478. { 8, 10, 10, 0b0100101111 },
  1479. { 8, 11, 10, 0b0100011110 },
  1480. { 8, 12, 10, 0b0100001100 },
  1481. { 8, 13, 11, 0b01000000010 },
  1482. { 8, 14, 11, 0b00101111001 },
  1483. { 8, 15, 8, 0b00010000 },
  1484. { 9, 0, 10, 0b0101001111 },
  1485. { 9, 1, 9, 0b011000111 },
  1486. { 9, 2, 9, 0b011000101 },
  1487. { 9, 3, 9, 0b010111111 },
  1488. { 9, 4, 9, 0b010111101 },
  1489. { 9, 5, 9, 0b010110101 },
  1490. { 9, 6, 9, 0b010101110 },
  1491. { 9, 7, 10, 0b0101001101 },
  1492. { 9, 8, 10, 0b0101000001 },
  1493. { 9, 9, 10, 0b0100110001 },
  1494. { 9, 10, 10, 0b0100100001 },
  1495. { 9, 11, 10, 0b0100010011 },
  1496. { 9, 12, 11, 0b01000001001 },
  1497. { 9, 13, 11, 0b00101111011 },
  1498. { 9, 14, 11, 0b00101110011 },
  1499. { 9, 15, 8, 0b00001011 },
  1500. { 10, 0, 11, 0b01010011100 },
  1501. { 10, 1, 9, 0b010111000 },
  1502. { 10, 2, 9, 0b010110111 },
  1503. { 10, 3, 9, 0b010110011 },
  1504. { 10, 4, 9, 0b010101111 },
  1505. { 10, 5, 10, 0b0101011000 },
  1506. { 10, 6, 10, 0b0101001011 },
  1507. { 10, 7, 10, 0b0100111010 },
  1508. { 10, 8, 10, 0b0100110000 },
  1509. { 10, 9, 10, 0b0100100010 },
  1510. { 10, 10, 10, 0b0100010101 },
  1511. { 10, 11, 11, 0b01000010010 },
  1512. { 10, 12, 11, 0b00101111111 },
  1513. { 10, 13, 11, 0b00101110101 },
  1514. { 10, 14, 11, 0b00101101110 },
  1515. { 10, 15, 8, 0b00001010 },
  1516. { 11, 0, 11, 0b01010001100 },
  1517. { 11, 1, 10, 0b0101011010 },
  1518. { 11, 2, 9, 0b010101011 },
  1519. { 11, 3, 9, 0b010101000 },
  1520. { 11, 4, 9, 0b010100100 },
  1521. { 11, 5, 10, 0b0100111110 },
  1522. { 11, 6, 10, 0b0100110101 },
  1523. { 11, 7, 10, 0b0100101011 },
  1524. { 11, 8, 10, 0b0100011111 },
  1525. { 11, 9, 10, 0b0100010100 },
  1526. { 11, 10, 10, 0b0100000111 },
  1527. { 11, 11, 11, 0b01000000001 },
  1528. { 11, 12, 11, 0b00101110111 },
  1529. { 11, 13, 11, 0b00101110000 },
  1530. { 11, 14, 11, 0b00101101010 },
  1531. { 11, 15, 8, 0b00000110 },
  1532. { 12, 0, 11, 0b01010001000 },
  1533. { 12, 1, 10, 0b0101000010 },
  1534. { 12, 2, 10, 0b0100111100 },
  1535. { 12, 3, 10, 0b0100111000 },
  1536. { 12, 4, 10, 0b0100110011 },
  1537. { 12, 5, 10, 0b0100101110 },
  1538. { 12, 6, 10, 0b0100100100 },
  1539. { 12, 7, 10, 0b0100011100 },
  1540. { 12, 8, 10, 0b0100001101 },
  1541. { 12, 9, 10, 0b0100000101 },
  1542. { 12, 10, 11, 0b01000000000 },
  1543. { 12, 11, 11, 0b00101111000 },
  1544. { 12, 12, 11, 0b00101110010 },
  1545. { 12, 13, 11, 0b00101101100 },
  1546. { 12, 14, 11, 0b00101100111 },
  1547. { 12, 15, 8, 0b00000100 },
  1548. { 13, 0, 11, 0b01001101100 },
  1549. { 13, 1, 10, 0b0100101100 },
  1550. { 13, 2, 10, 0b0100101000 },
  1551. { 13, 3, 10, 0b0100100110 },
  1552. { 13, 4, 10, 0b0100100000 },
  1553. { 13, 5, 10, 0b0100011010 },
  1554. { 13, 6, 10, 0b0100010001 },
  1555. { 13, 7, 10, 0b0100001010 },
  1556. { 13, 8, 11, 0b01000000011 },
  1557. { 13, 9, 11, 0b00101111100 },
  1558. { 13, 10, 11, 0b00101110110 },
  1559. { 13, 11, 11, 0b00101110001 },
  1560. { 13, 12, 11, 0b00101101101 },
  1561. { 13, 13, 11, 0b00101101001 },
  1562. { 13, 14, 11, 0b00101100101 },
  1563. { 13, 15, 8, 0b00000010 },
  1564. { 14, 0, 12, 0b010000001001 },
  1565. { 14, 1, 10, 0b0100011000 },
  1566. { 14, 2, 10, 0b0100010110 },
  1567. { 14, 3, 10, 0b0100010010 },
  1568. { 14, 4, 10, 0b0100001011 },
  1569. { 14, 5, 10, 0b0100001000 },
  1570. { 14, 6, 10, 0b0100000011 },
  1571. { 14, 7, 11, 0b00101111110 },
  1572. { 14, 8, 11, 0b00101111010 },
  1573. { 14, 9, 11, 0b00101110100 },
  1574. { 14, 10, 11, 0b00101101111 },
  1575. { 14, 11, 11, 0b00101101011 },
  1576. { 14, 12, 11, 0b00101101000 },
  1577. { 14, 13, 11, 0b00101100110 },
  1578. { 14, 14, 11, 0b00101100100 },
  1579. { 14, 15, 8, 0b00000000 },
  1580. { 15, 0, 8, 0b00101011 },
  1581. { 15, 1, 7, 0b0010100 },
  1582. { 15, 2, 7, 0b0010011 },
  1583. { 15, 3, 7, 0b0010001 },
  1584. { 15, 4, 7, 0b0001111 },
  1585. { 15, 5, 7, 0b0001101 },
  1586. { 15, 6, 7, 0b0001011 },
  1587. { 15, 7, 7, 0b0001001 },
  1588. { 15, 8, 7, 0b0000111 },
  1589. { 15, 9, 7, 0b0000110 },
  1590. { 15, 10, 7, 0b0000100 },
  1591. { 15, 11, 8, 0b00000111 },
  1592. { 15, 12, 8, 0b00000101 },
  1593. { 15, 13, 8, 0b00000011 },
  1594. { 15, 14, 8, 0b00000001 },
  1595. { 15, 15, 4, 0b0011 },
  1596. } };
  1597. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table25 { Table24 };
  1598. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table26 { Table24 };
  1599. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table27 { Table24 };
  1600. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table28 { Table24 };
  1601. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table29 { Table24 };
  1602. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table30 { Table24 };
  1603. constexpr HuffmanEntries<HuffmanEntryXY, 256> Table31 { Table24 };
  1604. constexpr auto TreeA = make_huffman_tree<TableA>();
  1605. constexpr auto TreeB = make_huffman_tree<TableB>();
  1606. constexpr auto Tree0 = make_huffman_tree<Table0>();
  1607. constexpr auto Tree1 = make_huffman_tree<Table1>();
  1608. constexpr auto Tree2 = make_huffman_tree<Table2>();
  1609. constexpr auto Tree3 = make_huffman_tree<Table3>();
  1610. constexpr auto Tree5 = make_huffman_tree<Table5>();
  1611. constexpr auto Tree6 = make_huffman_tree<Table6>();
  1612. constexpr auto Tree7 = make_huffman_tree<Table7>();
  1613. constexpr auto Tree8 = make_huffman_tree<Table8>();
  1614. constexpr auto Tree9 = make_huffman_tree<Table9>();
  1615. constexpr auto Tree10 = make_huffman_tree<Table10>();
  1616. constexpr auto Tree11 = make_huffman_tree<Table11>();
  1617. constexpr auto Tree12 = make_huffman_tree<Table12>();
  1618. constexpr auto Tree13 = make_huffman_tree<Table13>();
  1619. constexpr auto Tree15 = make_huffman_tree<Table15>();
  1620. constexpr auto Tree16 = make_huffman_tree<Table16>();
  1621. constexpr auto Tree17 = make_huffman_tree<Table17>();
  1622. constexpr auto Tree18 = make_huffman_tree<Table18>();
  1623. constexpr auto Tree19 = make_huffman_tree<Table19>();
  1624. constexpr auto Tree20 = make_huffman_tree<Table20>();
  1625. constexpr auto Tree21 = make_huffman_tree<Table21>();
  1626. constexpr auto Tree22 = make_huffman_tree<Table22>();
  1627. constexpr auto Tree23 = make_huffman_tree<Table23>();
  1628. constexpr auto Tree24 = make_huffman_tree<Table24>();
  1629. constexpr auto Tree25 = make_huffman_tree<Table25>();
  1630. constexpr auto Tree26 = make_huffman_tree<Table26>();
  1631. constexpr auto Tree27 = make_huffman_tree<Table27>();
  1632. constexpr auto Tree28 = make_huffman_tree<Table28>();
  1633. constexpr auto Tree29 = make_huffman_tree<Table29>();
  1634. constexpr auto Tree30 = make_huffman_tree<Table30>();
  1635. constexpr auto Tree31 = make_huffman_tree<Table31>();
  1636. struct HuffmanTreeXY {
  1637. ReadonlySpan<HuffmanNode<HuffmanXY>> nodes;
  1638. int linbits;
  1639. };
  1640. Array<HuffmanTreeXY const, 32> HuffmanTreesXY { {
  1641. { Tree0, 0 },
  1642. { Tree1, 0 },
  1643. { Tree2, 0 },
  1644. { Tree3, 0 },
  1645. { {}, 0 },
  1646. { Tree5, 0 },
  1647. { Tree6, 0 },
  1648. { Tree7, 0 },
  1649. { Tree8, 0 },
  1650. { Tree9, 0 },
  1651. { Tree10, 0 },
  1652. { Tree11, 0 },
  1653. { Tree12, 0 },
  1654. { Tree13, 0 },
  1655. { {}, 0 },
  1656. { Tree15, 0 },
  1657. { Tree16, 1 },
  1658. { Tree17, 2 },
  1659. { Tree18, 3 },
  1660. { Tree19, 4 },
  1661. { Tree20, 6 },
  1662. { Tree21, 8 },
  1663. { Tree22, 10 },
  1664. { Tree23, 13 },
  1665. { Tree24, 4 },
  1666. { Tree25, 5 },
  1667. { Tree26, 6 },
  1668. { Tree27, 7 },
  1669. { Tree28, 8 },
  1670. { Tree29, 9 },
  1671. { Tree30, 11 },
  1672. { Tree31, 13 },
  1673. } };
  1674. }