brotli_bit_stream.go 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435
  1. package brotli
  2. import (
  3. "slices"
  4. "sync"
  5. )
  6. const maxHuffmanTreeSize = (2*numCommandSymbols + 1)
  7. /*
  8. The maximum size of Huffman dictionary for distances assuming that
  9. NPOSTFIX = 0 and NDIRECT = 0.
  10. */
  11. const maxSimpleDistanceAlphabetSize = 140
  12. /*
  13. Represents the range of values belonging to a prefix code:
  14. [offset, offset + 2^nbits)
  15. */
  16. type prefixCodeRange struct {
  17. offset uint32
  18. nbits uint32
  19. }
  20. var kBlockLengthPrefixCode = [numBlockLenSymbols]prefixCodeRange{
  21. prefixCodeRange{1, 2},
  22. prefixCodeRange{5, 2},
  23. prefixCodeRange{9, 2},
  24. prefixCodeRange{13, 2},
  25. prefixCodeRange{17, 3},
  26. prefixCodeRange{25, 3},
  27. prefixCodeRange{33, 3},
  28. prefixCodeRange{41, 3},
  29. prefixCodeRange{49, 4},
  30. prefixCodeRange{65, 4},
  31. prefixCodeRange{81, 4},
  32. prefixCodeRange{97, 4},
  33. prefixCodeRange{113, 5},
  34. prefixCodeRange{145, 5},
  35. prefixCodeRange{177, 5},
  36. prefixCodeRange{209, 5},
  37. prefixCodeRange{241, 6},
  38. prefixCodeRange{305, 6},
  39. prefixCodeRange{369, 7},
  40. prefixCodeRange{497, 8},
  41. prefixCodeRange{753, 9},
  42. prefixCodeRange{1265, 10},
  43. prefixCodeRange{2289, 11},
  44. prefixCodeRange{4337, 12},
  45. prefixCodeRange{8433, 13},
  46. prefixCodeRange{16625, 24},
  47. }
  48. func blockLengthPrefixCode(len uint32) uint32 {
  49. var code uint32
  50. if len >= 177 {
  51. if len >= 753 {
  52. code = 20
  53. } else {
  54. code = 14
  55. }
  56. } else if len >= 41 {
  57. code = 7
  58. } else {
  59. code = 0
  60. }
  61. for code < (numBlockLenSymbols-1) && len >= kBlockLengthPrefixCode[code+1].offset {
  62. code++
  63. }
  64. return code
  65. }
  66. func getBlockLengthPrefixCode(len uint32, code *uint, n_extra *uint32, extra *uint32) {
  67. *code = uint(blockLengthPrefixCode(uint32(len)))
  68. *n_extra = kBlockLengthPrefixCode[*code].nbits
  69. *extra = len - kBlockLengthPrefixCode[*code].offset
  70. }
  71. type blockTypeCodeCalculator struct {
  72. last_type uint
  73. second_last_type uint
  74. }
  75. func initBlockTypeCodeCalculator(self *blockTypeCodeCalculator) {
  76. self.last_type = 1
  77. self.second_last_type = 0
  78. }
  79. func nextBlockTypeCode(calculator *blockTypeCodeCalculator, type_ byte) uint {
  80. var type_code uint
  81. if uint(type_) == calculator.last_type+1 {
  82. type_code = 1
  83. } else if uint(type_) == calculator.second_last_type {
  84. type_code = 0
  85. } else {
  86. type_code = uint(type_) + 2
  87. }
  88. calculator.second_last_type = calculator.last_type
  89. calculator.last_type = uint(type_)
  90. return type_code
  91. }
  92. /*
  93. |nibblesbits| represents the 2 bits to encode MNIBBLES (0-3)
  94. REQUIRES: length > 0
  95. REQUIRES: length <= (1 << 24)
  96. */
  97. func encodeMlen(length uint, bits *uint64, numbits *uint, nibblesbits *uint64) {
  98. var lg uint
  99. if length == 1 {
  100. lg = 1
  101. } else {
  102. lg = uint(log2FloorNonZero(uint(uint32(length-1)))) + 1
  103. }
  104. var tmp uint
  105. if lg < 16 {
  106. tmp = 16
  107. } else {
  108. tmp = (lg + 3)
  109. }
  110. var mnibbles uint = tmp / 4
  111. assert(length > 0)
  112. assert(length <= 1<<24)
  113. assert(lg <= 24)
  114. *nibblesbits = uint64(mnibbles) - 4
  115. *numbits = mnibbles * 4
  116. *bits = uint64(length) - 1
  117. }
  118. func storeCommandExtra(cmd *command, storage_ix *uint, storage []byte) {
  119. var copylen_code uint32 = commandCopyLenCode(cmd)
  120. var inscode uint16 = getInsertLengthCode(uint(cmd.insert_len_))
  121. var copycode uint16 = getCopyLengthCode(uint(copylen_code))
  122. var insnumextra uint32 = getInsertExtra(inscode)
  123. var insextraval uint64 = uint64(cmd.insert_len_) - uint64(getInsertBase(inscode))
  124. var copyextraval uint64 = uint64(copylen_code) - uint64(getCopyBase(copycode))
  125. var bits uint64 = copyextraval<<insnumextra | insextraval
  126. writeBits(uint(insnumextra+getCopyExtra(copycode)), bits, storage_ix, storage)
  127. }
  128. /*
  129. Data structure that stores almost everything that is needed to encode each
  130. block switch command.
  131. */
  132. type blockSplitCode struct {
  133. type_code_calculator blockTypeCodeCalculator
  134. type_depths [maxBlockTypeSymbols]byte
  135. type_bits [maxBlockTypeSymbols]uint16
  136. length_depths [numBlockLenSymbols]byte
  137. length_bits [numBlockLenSymbols]uint16
  138. }
  139. /* Stores a number between 0 and 255. */
  140. func storeVarLenUint8(n uint, storage_ix *uint, storage []byte) {
  141. if n == 0 {
  142. writeBits(1, 0, storage_ix, storage)
  143. } else {
  144. var nbits uint = uint(log2FloorNonZero(n))
  145. writeBits(1, 1, storage_ix, storage)
  146. writeBits(3, uint64(nbits), storage_ix, storage)
  147. writeBits(nbits, uint64(n)-(uint64(uint(1))<<nbits), storage_ix, storage)
  148. }
  149. }
  150. /*
  151. Stores the compressed meta-block header.
  152. REQUIRES: length > 0
  153. REQUIRES: length <= (1 << 24)
  154. */
  155. func storeCompressedMetaBlockHeader(is_final_block bool, length uint, storage_ix *uint, storage []byte) {
  156. var lenbits uint64
  157. var nlenbits uint
  158. var nibblesbits uint64
  159. var is_final uint64
  160. if is_final_block {
  161. is_final = 1
  162. } else {
  163. is_final = 0
  164. }
  165. /* Write ISLAST bit. */
  166. writeBits(1, is_final, storage_ix, storage)
  167. /* Write ISEMPTY bit. */
  168. if is_final_block {
  169. writeBits(1, 0, storage_ix, storage)
  170. }
  171. encodeMlen(length, &lenbits, &nlenbits, &nibblesbits)
  172. writeBits(2, nibblesbits, storage_ix, storage)
  173. writeBits(nlenbits, lenbits, storage_ix, storage)
  174. if !is_final_block {
  175. /* Write ISUNCOMPRESSED bit. */
  176. writeBits(1, 0, storage_ix, storage)
  177. }
  178. }
  179. /*
  180. Stores the uncompressed meta-block header.
  181. REQUIRES: length > 0
  182. REQUIRES: length <= (1 << 24)
  183. */
  184. func storeUncompressedMetaBlockHeader(length uint, storage_ix *uint, storage []byte) {
  185. var lenbits uint64
  186. var nlenbits uint
  187. var nibblesbits uint64
  188. /* Write ISLAST bit.
  189. Uncompressed block cannot be the last one, so set to 0. */
  190. writeBits(1, 0, storage_ix, storage)
  191. encodeMlen(length, &lenbits, &nlenbits, &nibblesbits)
  192. writeBits(2, nibblesbits, storage_ix, storage)
  193. writeBits(nlenbits, lenbits, storage_ix, storage)
  194. /* Write ISUNCOMPRESSED bit. */
  195. writeBits(1, 1, storage_ix, storage)
  196. }
  197. var storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder = [codeLengthCodes]byte{1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15}
  198. var storeHuffmanTreeOfHuffmanTreeToBitMask_kHuffmanBitLengthHuffmanCodeSymbols = [6]byte{0, 7, 3, 2, 1, 15}
  199. var storeHuffmanTreeOfHuffmanTreeToBitMask_kHuffmanBitLengthHuffmanCodeBitLengths = [6]byte{2, 4, 3, 2, 2, 4}
  200. func storeHuffmanTreeOfHuffmanTreeToBitMask(num_codes int, code_length_bitdepth []byte, storage_ix *uint, storage []byte) {
  201. var skip_some uint = 0
  202. var codes_to_store uint = codeLengthCodes
  203. /* The bit lengths of the Huffman code over the code length alphabet
  204. are compressed with the following static Huffman code:
  205. Symbol Code
  206. ------ ----
  207. 0 00
  208. 1 1110
  209. 2 110
  210. 3 01
  211. 4 10
  212. 5 1111 */
  213. /* Throw away trailing zeros: */
  214. if num_codes > 1 {
  215. for ; codes_to_store > 0; codes_to_store-- {
  216. if code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[codes_to_store-1]] != 0 {
  217. break
  218. }
  219. }
  220. }
  221. if code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[0]] == 0 && code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[1]] == 0 {
  222. skip_some = 2 /* skips two. */
  223. if code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[2]] == 0 {
  224. skip_some = 3 /* skips three. */
  225. }
  226. }
  227. writeBits(2, uint64(skip_some), storage_ix, storage)
  228. {
  229. var i uint
  230. for i = skip_some; i < codes_to_store; i++ {
  231. var l uint = uint(code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[i]])
  232. writeBits(uint(storeHuffmanTreeOfHuffmanTreeToBitMask_kHuffmanBitLengthHuffmanCodeBitLengths[l]), uint64(storeHuffmanTreeOfHuffmanTreeToBitMask_kHuffmanBitLengthHuffmanCodeSymbols[l]), storage_ix, storage)
  233. }
  234. }
  235. }
  236. func storeHuffmanTreeToBitMask(huffman_tree_size uint, huffman_tree []byte, huffman_tree_extra_bits []byte, code_length_bitdepth []byte, code_length_bitdepth_symbols []uint16, storage_ix *uint, storage []byte) {
  237. var i uint
  238. for i = 0; i < huffman_tree_size; i++ {
  239. var ix uint = uint(huffman_tree[i])
  240. writeBits(uint(code_length_bitdepth[ix]), uint64(code_length_bitdepth_symbols[ix]), storage_ix, storage)
  241. /* Extra bits */
  242. switch ix {
  243. case repeatPreviousCodeLength:
  244. writeBits(2, uint64(huffman_tree_extra_bits[i]), storage_ix, storage)
  245. case repeatZeroCodeLength:
  246. writeBits(3, uint64(huffman_tree_extra_bits[i]), storage_ix, storage)
  247. }
  248. }
  249. }
  250. func storeSimpleHuffmanTree(depths []byte, symbols []uint, num_symbols uint, max_bits uint, storage_ix *uint, storage []byte) {
  251. /* value of 1 indicates a simple Huffman code */
  252. writeBits(2, 1, storage_ix, storage)
  253. writeBits(2, uint64(num_symbols)-1, storage_ix, storage) /* NSYM - 1 */
  254. {
  255. /* Sort */
  256. var i uint
  257. for i = 0; i < num_symbols; i++ {
  258. var j uint
  259. for j = i + 1; j < num_symbols; j++ {
  260. if depths[symbols[j]] < depths[symbols[i]] {
  261. var tmp uint = symbols[j]
  262. symbols[j] = symbols[i]
  263. symbols[i] = tmp
  264. }
  265. }
  266. }
  267. }
  268. if num_symbols == 2 {
  269. writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
  270. writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
  271. } else if num_symbols == 3 {
  272. writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
  273. writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
  274. writeBits(max_bits, uint64(symbols[2]), storage_ix, storage)
  275. } else {
  276. writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
  277. writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
  278. writeBits(max_bits, uint64(symbols[2]), storage_ix, storage)
  279. writeBits(max_bits, uint64(symbols[3]), storage_ix, storage)
  280. /* tree-select */
  281. var tmp int
  282. if depths[symbols[0]] == 1 {
  283. tmp = 1
  284. } else {
  285. tmp = 0
  286. }
  287. writeBits(1, uint64(tmp), storage_ix, storage)
  288. }
  289. }
  290. /*
  291. num = alphabet size
  292. depths = symbol depths
  293. */
  294. func storeHuffmanTree(depths []byte, num uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
  295. var huffman_tree [numCommandSymbols]byte
  296. var huffman_tree_extra_bits [numCommandSymbols]byte
  297. var huffman_tree_size uint = 0
  298. var code_length_bitdepth = [codeLengthCodes]byte{0}
  299. var code_length_bitdepth_symbols [codeLengthCodes]uint16
  300. var huffman_tree_histogram = [codeLengthCodes]uint32{0}
  301. var i uint
  302. var num_codes int = 0
  303. /* Write the Huffman tree into the brotli-representation.
  304. The command alphabet is the largest, so this allocation will fit all
  305. alphabets. */
  306. var code uint = 0
  307. assert(num <= numCommandSymbols)
  308. writeHuffmanTree(depths, num, &huffman_tree_size, huffman_tree[:], huffman_tree_extra_bits[:])
  309. /* Calculate the statistics of the Huffman tree in brotli-representation. */
  310. for i = 0; i < huffman_tree_size; i++ {
  311. huffman_tree_histogram[huffman_tree[i]]++
  312. }
  313. for i = 0; i < codeLengthCodes; i++ {
  314. if huffman_tree_histogram[i] != 0 {
  315. if num_codes == 0 {
  316. code = i
  317. num_codes = 1
  318. } else if num_codes == 1 {
  319. num_codes = 2
  320. break
  321. }
  322. }
  323. }
  324. /* Calculate another Huffman tree to use for compressing both the
  325. earlier Huffman tree with. */
  326. createHuffmanTree(huffman_tree_histogram[:], codeLengthCodes, 5, tree, code_length_bitdepth[:])
  327. convertBitDepthsToSymbols(code_length_bitdepth[:], codeLengthCodes, code_length_bitdepth_symbols[:])
  328. /* Now, we have all the data, let's start storing it */
  329. storeHuffmanTreeOfHuffmanTreeToBitMask(num_codes, code_length_bitdepth[:], storage_ix, storage)
  330. if num_codes == 1 {
  331. code_length_bitdepth[code] = 0
  332. }
  333. /* Store the real Huffman tree now. */
  334. storeHuffmanTreeToBitMask(huffman_tree_size, huffman_tree[:], huffman_tree_extra_bits[:], code_length_bitdepth[:], code_length_bitdepth_symbols[:], storage_ix, storage)
  335. }
  336. /*
  337. Builds a Huffman tree from histogram[0:length] into depth[0:length] and
  338. bits[0:length] and stores the encoded tree to the bit stream.
  339. */
  340. func buildAndStoreHuffmanTree(histogram []uint32, histogram_length uint, alphabet_size uint, tree []huffmanTree, depth []byte, bits []uint16, storage_ix *uint, storage []byte) {
  341. var count uint = 0
  342. var s4 = [4]uint{0}
  343. var i uint
  344. var max_bits uint = 0
  345. for i = 0; i < histogram_length; i++ {
  346. if histogram[i] != 0 {
  347. if count < 4 {
  348. s4[count] = i
  349. } else if count > 4 {
  350. break
  351. }
  352. count++
  353. }
  354. }
  355. {
  356. var max_bits_counter uint = alphabet_size - 1
  357. for max_bits_counter != 0 {
  358. max_bits_counter >>= 1
  359. max_bits++
  360. }
  361. }
  362. if count <= 1 {
  363. writeBits(4, 1, storage_ix, storage)
  364. writeBits(max_bits, uint64(s4[0]), storage_ix, storage)
  365. depth[s4[0]] = 0
  366. bits[s4[0]] = 0
  367. return
  368. }
  369. for i := 0; i < int(histogram_length); i++ {
  370. depth[i] = 0
  371. }
  372. createHuffmanTree(histogram, histogram_length, 15, tree, depth)
  373. convertBitDepthsToSymbols(depth, histogram_length, bits)
  374. if count <= 4 {
  375. storeSimpleHuffmanTree(depth, s4[:], count, max_bits, storage_ix, storage)
  376. } else {
  377. storeHuffmanTree(depth, histogram_length, tree, storage_ix, storage)
  378. }
  379. }
  380. func buildAndStoreHuffmanTreeFast(histogram []uint32, histogram_total uint, max_bits uint, depth []byte, bits []uint16, storage_ix *uint, storage []byte) {
  381. var count uint = 0
  382. var symbols = [4]uint{0}
  383. var length uint = 0
  384. var total uint = histogram_total
  385. for total != 0 {
  386. if histogram[length] != 0 {
  387. if count < 4 {
  388. symbols[count] = length
  389. }
  390. count++
  391. total -= uint(histogram[length])
  392. }
  393. length++
  394. }
  395. if count <= 1 {
  396. writeBits(4, 1, storage_ix, storage)
  397. writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
  398. depth[symbols[0]] = 0
  399. bits[symbols[0]] = 0
  400. return
  401. }
  402. chooseBitDepths(histogram[:length], depth[:length], 14)
  403. convertBitDepthsToSymbols(depth, length, bits)
  404. if count <= 4 {
  405. var i uint
  406. /* value of 1 indicates a simple Huffman code */
  407. writeBits(2, 1, storage_ix, storage)
  408. writeBits(2, uint64(count)-1, storage_ix, storage) /* NSYM - 1 */
  409. /* Sort */
  410. for i = 0; i < count; i++ {
  411. var j uint
  412. for j = i + 1; j < count; j++ {
  413. if depth[symbols[j]] < depth[symbols[i]] {
  414. var tmp uint = symbols[j]
  415. symbols[j] = symbols[i]
  416. symbols[i] = tmp
  417. }
  418. }
  419. }
  420. if count == 2 {
  421. writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
  422. writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
  423. } else if count == 3 {
  424. writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
  425. writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
  426. writeBits(max_bits, uint64(symbols[2]), storage_ix, storage)
  427. } else {
  428. writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
  429. writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
  430. writeBits(max_bits, uint64(symbols[2]), storage_ix, storage)
  431. writeBits(max_bits, uint64(symbols[3]), storage_ix, storage)
  432. /* tree-select */
  433. var tmp int
  434. if depth[symbols[0]] == 1 {
  435. tmp = 1
  436. } else {
  437. tmp = 0
  438. }
  439. writeBits(1, uint64(tmp), storage_ix, storage)
  440. }
  441. } else {
  442. var previous_value byte = 8
  443. var i uint
  444. /* Complex Huffman Tree */
  445. storeStaticCodeLengthCode(storage_ix, storage)
  446. /* Actual RLE coding. */
  447. for i = 0; i < length; {
  448. var value byte = depth[i]
  449. var reps uint = 1
  450. var k uint
  451. for k = i + 1; k < length && depth[k] == value; k++ {
  452. reps++
  453. }
  454. i += reps
  455. if value == 0 {
  456. writeBits(uint(kZeroRepsDepth[reps]), kZeroRepsBits[reps], storage_ix, storage)
  457. } else {
  458. if previous_value != value {
  459. writeBits(uint(kCodeLengthDepth[value]), uint64(kCodeLengthBits[value]), storage_ix, storage)
  460. reps--
  461. }
  462. if reps < 3 {
  463. for reps != 0 {
  464. reps--
  465. writeBits(uint(kCodeLengthDepth[value]), uint64(kCodeLengthBits[value]), storage_ix, storage)
  466. }
  467. } else {
  468. reps -= 3
  469. writeBits(uint(kNonZeroRepsDepth[reps]), kNonZeroRepsBits[reps], storage_ix, storage)
  470. }
  471. previous_value = value
  472. }
  473. }
  474. }
  475. }
  476. type symbolAndCount struct {
  477. symbol uint32
  478. count uint32
  479. }
  480. func chooseBitDepths(histogram []uint32, depth []byte, maxBits int) {
  481. totalCodeSpace := 1 << maxBits
  482. symbols := make([]symbolAndCount, 0, 704 /* static capacity so that it will be stack allocated */)
  483. var totalCount uint32 = 0
  484. for i, n := range histogram {
  485. if n != 0 {
  486. symbols = append(symbols, symbolAndCount{
  487. symbol: uint32(i),
  488. count: n,
  489. })
  490. totalCount += n
  491. }
  492. }
  493. slices.SortFunc(symbols, func(a, b symbolAndCount) int {
  494. return int(b.count) - int(a.count)
  495. })
  496. // boundaries contains indexes into symbols such that (for example)
  497. // boundaries[8] is the index of the first 8-bit symbol.
  498. boundaries := make([]int, maxBits+1, 20 /* static capacity for stack allocation */)
  499. codeSpaceUsed := 0
  500. // Assign initial boundaries conservatively, making sure no symbol uses more
  501. // than its share of code space.
  502. totalRatio := float64(totalCount) / float64(totalCodeSpace)
  503. currentDepth := 1
  504. for i, symbol := range symbols {
  505. for currentDepth < maxBits && float64(symbol.count)/float64(int(1)<<(maxBits-currentDepth)) < totalRatio {
  506. currentDepth++
  507. boundaries[currentDepth] = i
  508. }
  509. codeSpaceUsed += 1 << (maxBits - currentDepth)
  510. }
  511. for i := currentDepth + 1; i <= maxBits; i++ {
  512. boundaries[i] = len(symbols)
  513. }
  514. // Move the boundaries till the code space is filled.
  515. for codeSpaceUsed < totalCodeSpace {
  516. available := totalCodeSpace - codeSpaceUsed
  517. // Find the most efficient boundary to move, based on the ratio of how
  518. // many times the symbol was used to how much code space will be consumed.
  519. bestRatio := 0.0
  520. bestBoundary := 0
  521. for i := 2; i <= maxBits; i++ {
  522. cost := 1 << (maxBits - i) // code space that would be used by moving this boundary
  523. if cost > available {
  524. continue
  525. }
  526. if boundaries[i] == len(symbols) {
  527. continue
  528. }
  529. if i < maxBits && boundaries[i] == boundaries[i+1] {
  530. continue
  531. }
  532. ratio := float64(symbols[boundaries[i]].count) / float64(cost)
  533. if ratio > bestRatio {
  534. bestRatio = ratio
  535. bestBoundary = i
  536. }
  537. }
  538. boundaries[bestBoundary]++
  539. codeSpaceUsed += 1 << (maxBits - bestBoundary)
  540. }
  541. for i := range depth {
  542. depth[i] = 0
  543. }
  544. for i := 1; i < maxBits; i++ {
  545. for j := boundaries[i]; j < boundaries[i+1]; j++ {
  546. depth[symbols[j].symbol] = byte(i)
  547. }
  548. }
  549. for j := boundaries[maxBits]; j < len(symbols); j++ {
  550. depth[symbols[j].symbol] = byte(maxBits)
  551. }
  552. }
  553. func buildAndStoreHuffmanTreeFastBW(histogram []uint32, histogram_total uint, max_bits uint, depth []byte, bits []uint16, bw *bitWriter) {
  554. var count uint = 0
  555. var symbols = [4]uint{0}
  556. var length uint = 0
  557. var total uint = histogram_total
  558. for total != 0 {
  559. if histogram[length] != 0 {
  560. if count < 4 {
  561. symbols[count] = length
  562. }
  563. count++
  564. total -= uint(histogram[length])
  565. }
  566. length++
  567. }
  568. if count <= 1 {
  569. bw.writeBits(4, 1)
  570. bw.writeBits(max_bits, uint64(symbols[0]))
  571. depth[symbols[0]] = 0
  572. bits[symbols[0]] = 0
  573. return
  574. }
  575. chooseBitDepths(histogram[:length], depth[:length], 14)
  576. convertBitDepthsToSymbols(depth, length, bits)
  577. if count <= 4 {
  578. var i uint
  579. /* value of 1 indicates a simple Huffman code */
  580. bw.writeBits(2, 1)
  581. bw.writeBits(2, uint64(count)-1) /* NSYM - 1 */
  582. /* Sort */
  583. for i = 0; i < count; i++ {
  584. var j uint
  585. for j = i + 1; j < count; j++ {
  586. if depth[symbols[j]] < depth[symbols[i]] {
  587. var tmp uint = symbols[j]
  588. symbols[j] = symbols[i]
  589. symbols[i] = tmp
  590. }
  591. }
  592. }
  593. if count == 2 {
  594. bw.writeBits(max_bits, uint64(symbols[0]))
  595. bw.writeBits(max_bits, uint64(symbols[1]))
  596. } else if count == 3 {
  597. bw.writeBits(max_bits, uint64(symbols[0]))
  598. bw.writeBits(max_bits, uint64(symbols[1]))
  599. bw.writeBits(max_bits, uint64(symbols[2]))
  600. } else {
  601. bw.writeBits(max_bits, uint64(symbols[0]))
  602. bw.writeBits(max_bits, uint64(symbols[1]))
  603. bw.writeBits(max_bits, uint64(symbols[2]))
  604. bw.writeBits(max_bits, uint64(symbols[3]))
  605. /* tree-select */
  606. bw.writeSingleBit(depth[symbols[0]] == 1)
  607. }
  608. } else {
  609. var previous_value byte = 8
  610. var i uint
  611. /* Complex Huffman Tree */
  612. storeStaticCodeLengthCodeBW(bw)
  613. /* Actual RLE coding. */
  614. for i = 0; i < length; {
  615. var value byte = depth[i]
  616. var reps uint = 1
  617. var k uint
  618. for k = i + 1; k < length && depth[k] == value; k++ {
  619. reps++
  620. }
  621. i += reps
  622. if value == 0 {
  623. bw.writeBits(uint(kZeroRepsDepth[reps]), kZeroRepsBits[reps])
  624. } else {
  625. if previous_value != value {
  626. bw.writeBits(uint(kCodeLengthDepth[value]), uint64(kCodeLengthBits[value]))
  627. reps--
  628. }
  629. if reps < 3 {
  630. for reps != 0 {
  631. reps--
  632. bw.writeBits(uint(kCodeLengthDepth[value]), uint64(kCodeLengthBits[value]))
  633. }
  634. } else {
  635. reps -= 3
  636. bw.writeBits(uint(kNonZeroRepsDepth[reps]), kNonZeroRepsBits[reps])
  637. }
  638. previous_value = value
  639. }
  640. }
  641. }
  642. }
  643. func indexOf(v []byte, v_size uint, value byte) uint {
  644. var i uint = 0
  645. for ; i < v_size; i++ {
  646. if v[i] == value {
  647. return i
  648. }
  649. }
  650. return i
  651. }
  652. func moveToFront(v []byte, index uint) {
  653. var value byte = v[index]
  654. var i uint
  655. for i = index; i != 0; i-- {
  656. v[i] = v[i-1]
  657. }
  658. v[0] = value
  659. }
  660. func moveToFrontTransform(v_in []uint32, v_size uint, v_out []uint32) {
  661. var i uint
  662. var mtf [256]byte
  663. var max_value uint32
  664. if v_size == 0 {
  665. return
  666. }
  667. max_value = v_in[0]
  668. for i = 1; i < v_size; i++ {
  669. if v_in[i] > max_value {
  670. max_value = v_in[i]
  671. }
  672. }
  673. assert(max_value < 256)
  674. for i = 0; uint32(i) <= max_value; i++ {
  675. mtf[i] = byte(i)
  676. }
  677. {
  678. var mtf_size uint = uint(max_value + 1)
  679. for i = 0; i < v_size; i++ {
  680. var index uint = indexOf(mtf[:], mtf_size, byte(v_in[i]))
  681. assert(index < mtf_size)
  682. v_out[i] = uint32(index)
  683. moveToFront(mtf[:], index)
  684. }
  685. }
  686. }
  687. /*
  688. Finds runs of zeros in v[0..in_size) and replaces them with a prefix code of
  689. the run length plus extra bits (lower 9 bits is the prefix code and the rest
  690. are the extra bits). Non-zero values in v[] are shifted by
  691. *max_length_prefix. Will not create prefix codes bigger than the initial
  692. value of *max_run_length_prefix. The prefix code of run length L is simply
  693. Log2Floor(L) and the number of extra bits is the same as the prefix code.
  694. */
  695. func runLengthCodeZeros(in_size uint, v []uint32, out_size *uint, max_run_length_prefix *uint32) {
  696. var max_reps uint32 = 0
  697. var i uint
  698. var max_prefix uint32
  699. for i = 0; i < in_size; {
  700. var reps uint32 = 0
  701. for ; i < in_size && v[i] != 0; i++ {
  702. }
  703. for ; i < in_size && v[i] == 0; i++ {
  704. reps++
  705. }
  706. max_reps = brotli_max_uint32_t(reps, max_reps)
  707. }
  708. if max_reps > 0 {
  709. max_prefix = log2FloorNonZero(uint(max_reps))
  710. } else {
  711. max_prefix = 0
  712. }
  713. max_prefix = brotli_min_uint32_t(max_prefix, *max_run_length_prefix)
  714. *max_run_length_prefix = max_prefix
  715. *out_size = 0
  716. for i = 0; i < in_size; {
  717. assert(*out_size <= i)
  718. if v[i] != 0 {
  719. v[*out_size] = v[i] + *max_run_length_prefix
  720. i++
  721. (*out_size)++
  722. } else {
  723. var reps uint32 = 1
  724. var k uint
  725. for k = i + 1; k < in_size && v[k] == 0; k++ {
  726. reps++
  727. }
  728. i += uint(reps)
  729. for reps != 0 {
  730. if reps < 2<<max_prefix {
  731. var run_length_prefix uint32 = log2FloorNonZero(uint(reps))
  732. var extra_bits uint32 = reps - (1 << run_length_prefix)
  733. v[*out_size] = run_length_prefix + (extra_bits << 9)
  734. (*out_size)++
  735. break
  736. } else {
  737. var extra_bits uint32 = (1 << max_prefix) - 1
  738. v[*out_size] = max_prefix + (extra_bits << 9)
  739. reps -= (2 << max_prefix) - 1
  740. (*out_size)++
  741. }
  742. }
  743. }
  744. }
  745. }
  746. const symbolBits = 9
  747. var encodeContextMap_kSymbolMask uint32 = (1 << symbolBits) - 1
  748. func encodeContextMap(context_map []uint32, context_map_size uint, num_clusters uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
  749. var i uint
  750. var rle_symbols []uint32
  751. var max_run_length_prefix uint32 = 6
  752. var num_rle_symbols uint = 0
  753. var histogram [maxContextMapSymbols]uint32
  754. var depths [maxContextMapSymbols]byte
  755. var bits [maxContextMapSymbols]uint16
  756. storeVarLenUint8(num_clusters-1, storage_ix, storage)
  757. if num_clusters == 1 {
  758. return
  759. }
  760. rle_symbols = make([]uint32, context_map_size)
  761. moveToFrontTransform(context_map, context_map_size, rle_symbols)
  762. runLengthCodeZeros(context_map_size, rle_symbols, &num_rle_symbols, &max_run_length_prefix)
  763. histogram = [maxContextMapSymbols]uint32{}
  764. for i = 0; i < num_rle_symbols; i++ {
  765. histogram[rle_symbols[i]&encodeContextMap_kSymbolMask]++
  766. }
  767. {
  768. var use_rle bool = (max_run_length_prefix > 0)
  769. writeSingleBit(use_rle, storage_ix, storage)
  770. if use_rle {
  771. writeBits(4, uint64(max_run_length_prefix)-1, storage_ix, storage)
  772. }
  773. }
  774. buildAndStoreHuffmanTree(histogram[:], uint(uint32(num_clusters)+max_run_length_prefix), uint(uint32(num_clusters)+max_run_length_prefix), tree, depths[:], bits[:], storage_ix, storage)
  775. for i = 0; i < num_rle_symbols; i++ {
  776. var rle_symbol uint32 = rle_symbols[i] & encodeContextMap_kSymbolMask
  777. var extra_bits_val uint32 = rle_symbols[i] >> symbolBits
  778. writeBits(uint(depths[rle_symbol]), uint64(bits[rle_symbol]), storage_ix, storage)
  779. if rle_symbol > 0 && rle_symbol <= max_run_length_prefix {
  780. writeBits(uint(rle_symbol), uint64(extra_bits_val), storage_ix, storage)
  781. }
  782. }
  783. writeBits(1, 1, storage_ix, storage) /* use move-to-front */
  784. rle_symbols = nil
  785. }
  786. /* Stores the block switch command with index block_ix to the bit stream. */
  787. func storeBlockSwitch(code *blockSplitCode, block_len uint32, block_type byte, is_first_block bool, storage_ix *uint, storage []byte) {
  788. var typecode uint = nextBlockTypeCode(&code.type_code_calculator, block_type)
  789. var lencode uint
  790. var len_nextra uint32
  791. var len_extra uint32
  792. if !is_first_block {
  793. writeBits(uint(code.type_depths[typecode]), uint64(code.type_bits[typecode]), storage_ix, storage)
  794. }
  795. getBlockLengthPrefixCode(block_len, &lencode, &len_nextra, &len_extra)
  796. writeBits(uint(code.length_depths[lencode]), uint64(code.length_bits[lencode]), storage_ix, storage)
  797. writeBits(uint(len_nextra), uint64(len_extra), storage_ix, storage)
  798. }
  799. /*
  800. Builds a BlockSplitCode data structure from the block split given by the
  801. vector of block types and block lengths and stores it to the bit stream.
  802. */
  803. func buildAndStoreBlockSplitCode(types []byte, lengths []uint32, num_blocks uint, num_types uint, tree []huffmanTree, code *blockSplitCode, storage_ix *uint, storage []byte) {
  804. var type_histo [maxBlockTypeSymbols]uint32
  805. var length_histo [numBlockLenSymbols]uint32
  806. var i uint
  807. var type_code_calculator blockTypeCodeCalculator
  808. for i := 0; i < int(num_types+2); i++ {
  809. type_histo[i] = 0
  810. }
  811. length_histo = [numBlockLenSymbols]uint32{}
  812. initBlockTypeCodeCalculator(&type_code_calculator)
  813. for i = 0; i < num_blocks; i++ {
  814. var type_code uint = nextBlockTypeCode(&type_code_calculator, types[i])
  815. if i != 0 {
  816. type_histo[type_code]++
  817. }
  818. length_histo[blockLengthPrefixCode(lengths[i])]++
  819. }
  820. storeVarLenUint8(num_types-1, storage_ix, storage)
  821. if num_types > 1 { /* TODO: else? could StoreBlockSwitch occur? */
  822. buildAndStoreHuffmanTree(type_histo[0:], num_types+2, num_types+2, tree, code.type_depths[0:], code.type_bits[0:], storage_ix, storage)
  823. buildAndStoreHuffmanTree(length_histo[0:], numBlockLenSymbols, numBlockLenSymbols, tree, code.length_depths[0:], code.length_bits[0:], storage_ix, storage)
  824. storeBlockSwitch(code, lengths[0], types[0], true, storage_ix, storage)
  825. }
  826. }
  827. /* Stores a context map where the histogram type is always the block type. */
  828. func storeTrivialContextMap(num_types uint, context_bits uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
  829. storeVarLenUint8(num_types-1, storage_ix, storage)
  830. if num_types > 1 {
  831. var repeat_code uint = context_bits - 1
  832. var repeat_bits uint = (1 << repeat_code) - 1
  833. var alphabet_size uint = num_types + repeat_code
  834. var histogram [maxContextMapSymbols]uint32
  835. var depths [maxContextMapSymbols]byte
  836. var bits [maxContextMapSymbols]uint16
  837. var i uint
  838. for i := 0; i < int(alphabet_size); i++ {
  839. histogram[i] = 0
  840. }
  841. /* Write RLEMAX. */
  842. writeBits(1, 1, storage_ix, storage)
  843. writeBits(4, uint64(repeat_code)-1, storage_ix, storage)
  844. histogram[repeat_code] = uint32(num_types)
  845. histogram[0] = 1
  846. for i = context_bits; i < alphabet_size; i++ {
  847. histogram[i] = 1
  848. }
  849. buildAndStoreHuffmanTree(histogram[:], alphabet_size, alphabet_size, tree, depths[:], bits[:], storage_ix, storage)
  850. for i = 0; i < num_types; i++ {
  851. var tmp uint
  852. if i == 0 {
  853. tmp = 0
  854. } else {
  855. tmp = i + context_bits - 1
  856. }
  857. var code uint = tmp
  858. writeBits(uint(depths[code]), uint64(bits[code]), storage_ix, storage)
  859. writeBits(uint(depths[repeat_code]), uint64(bits[repeat_code]), storage_ix, storage)
  860. writeBits(repeat_code, uint64(repeat_bits), storage_ix, storage)
  861. }
  862. /* Write IMTF (inverse-move-to-front) bit. */
  863. writeBits(1, 1, storage_ix, storage)
  864. }
  865. }
  866. /* Manages the encoding of one block category (literal, command or distance). */
  867. type blockEncoder struct {
  868. histogram_length_ uint
  869. num_block_types_ uint
  870. block_types_ []byte
  871. block_lengths_ []uint32
  872. num_blocks_ uint
  873. block_split_code_ blockSplitCode
  874. block_ix_ uint
  875. block_len_ uint
  876. entropy_ix_ uint
  877. depths_ []byte
  878. bits_ []uint16
  879. }
  880. var blockEncoderPool sync.Pool
  881. func getBlockEncoder(histogram_length uint, num_block_types uint, block_types []byte, block_lengths []uint32, num_blocks uint) *blockEncoder {
  882. self, _ := blockEncoderPool.Get().(*blockEncoder)
  883. if self != nil {
  884. self.block_ix_ = 0
  885. self.entropy_ix_ = 0
  886. self.depths_ = self.depths_[:0]
  887. self.bits_ = self.bits_[:0]
  888. } else {
  889. self = &blockEncoder{}
  890. }
  891. self.histogram_length_ = histogram_length
  892. self.num_block_types_ = num_block_types
  893. self.block_types_ = block_types
  894. self.block_lengths_ = block_lengths
  895. self.num_blocks_ = num_blocks
  896. initBlockTypeCodeCalculator(&self.block_split_code_.type_code_calculator)
  897. if num_blocks == 0 {
  898. self.block_len_ = 0
  899. } else {
  900. self.block_len_ = uint(block_lengths[0])
  901. }
  902. return self
  903. }
  904. func cleanupBlockEncoder(self *blockEncoder) {
  905. blockEncoderPool.Put(self)
  906. }
  907. /*
  908. Creates entropy codes of block lengths and block types and stores them
  909. to the bit stream.
  910. */
  911. func buildAndStoreBlockSwitchEntropyCodes(self *blockEncoder, tree []huffmanTree, storage_ix *uint, storage []byte) {
  912. buildAndStoreBlockSplitCode(self.block_types_, self.block_lengths_, self.num_blocks_, self.num_block_types_, tree, &self.block_split_code_, storage_ix, storage)
  913. }
  914. /*
  915. Stores the next symbol with the entropy code of the current block type.
  916. Updates the block type and block length at block boundaries.
  917. */
  918. func storeSymbol(self *blockEncoder, symbol uint, storage_ix *uint, storage []byte) {
  919. if self.block_len_ == 0 {
  920. self.block_ix_++
  921. var block_ix uint = self.block_ix_
  922. var block_len uint32 = self.block_lengths_[block_ix]
  923. var block_type byte = self.block_types_[block_ix]
  924. self.block_len_ = uint(block_len)
  925. self.entropy_ix_ = uint(block_type) * self.histogram_length_
  926. storeBlockSwitch(&self.block_split_code_, block_len, block_type, false, storage_ix, storage)
  927. }
  928. self.block_len_--
  929. {
  930. var ix uint = self.entropy_ix_ + symbol
  931. writeBits(uint(self.depths_[ix]), uint64(self.bits_[ix]), storage_ix, storage)
  932. }
  933. }
  934. /*
  935. Stores the next symbol with the entropy code of the current block type and
  936. context value.
  937. Updates the block type and block length at block boundaries.
  938. */
  939. func storeSymbolWithContext(self *blockEncoder, symbol uint, context uint, context_map []uint32, storage_ix *uint, storage []byte, context_bits uint) {
  940. if self.block_len_ == 0 {
  941. self.block_ix_++
  942. var block_ix uint = self.block_ix_
  943. var block_len uint32 = self.block_lengths_[block_ix]
  944. var block_type byte = self.block_types_[block_ix]
  945. self.block_len_ = uint(block_len)
  946. self.entropy_ix_ = uint(block_type) << context_bits
  947. storeBlockSwitch(&self.block_split_code_, block_len, block_type, false, storage_ix, storage)
  948. }
  949. self.block_len_--
  950. {
  951. var histo_ix uint = uint(context_map[self.entropy_ix_+context])
  952. var ix uint = histo_ix*self.histogram_length_ + symbol
  953. writeBits(uint(self.depths_[ix]), uint64(self.bits_[ix]), storage_ix, storage)
  954. }
  955. }
  956. func buildAndStoreEntropyCodesLiteral(self *blockEncoder, histograms []histogramLiteral, histograms_size uint, alphabet_size uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
  957. var table_size uint = histograms_size * self.histogram_length_
  958. if cap(self.depths_) < int(table_size) {
  959. self.depths_ = make([]byte, table_size)
  960. } else {
  961. self.depths_ = self.depths_[:table_size]
  962. }
  963. if cap(self.bits_) < int(table_size) {
  964. self.bits_ = make([]uint16, table_size)
  965. } else {
  966. self.bits_ = self.bits_[:table_size]
  967. }
  968. {
  969. var i uint
  970. for i = 0; i < histograms_size; i++ {
  971. var ix uint = i * self.histogram_length_
  972. buildAndStoreHuffmanTree(histograms[i].data_[0:], self.histogram_length_, alphabet_size, tree, self.depths_[ix:], self.bits_[ix:], storage_ix, storage)
  973. }
  974. }
  975. }
  976. func buildAndStoreEntropyCodesCommand(self *blockEncoder, histograms []histogramCommand, histograms_size uint, alphabet_size uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
  977. var table_size uint = histograms_size * self.histogram_length_
  978. if cap(self.depths_) < int(table_size) {
  979. self.depths_ = make([]byte, table_size)
  980. } else {
  981. self.depths_ = self.depths_[:table_size]
  982. }
  983. if cap(self.bits_) < int(table_size) {
  984. self.bits_ = make([]uint16, table_size)
  985. } else {
  986. self.bits_ = self.bits_[:table_size]
  987. }
  988. {
  989. var i uint
  990. for i = 0; i < histograms_size; i++ {
  991. var ix uint = i * self.histogram_length_
  992. buildAndStoreHuffmanTree(histograms[i].data_[0:], self.histogram_length_, alphabet_size, tree, self.depths_[ix:], self.bits_[ix:], storage_ix, storage)
  993. }
  994. }
  995. }
  996. func buildAndStoreEntropyCodesDistance(self *blockEncoder, histograms []histogramDistance, histograms_size uint, alphabet_size uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
  997. var table_size uint = histograms_size * self.histogram_length_
  998. if cap(self.depths_) < int(table_size) {
  999. self.depths_ = make([]byte, table_size)
  1000. } else {
  1001. self.depths_ = self.depths_[:table_size]
  1002. }
  1003. if cap(self.bits_) < int(table_size) {
  1004. self.bits_ = make([]uint16, table_size)
  1005. } else {
  1006. self.bits_ = self.bits_[:table_size]
  1007. }
  1008. {
  1009. var i uint
  1010. for i = 0; i < histograms_size; i++ {
  1011. var ix uint = i * self.histogram_length_
  1012. buildAndStoreHuffmanTree(histograms[i].data_[0:], self.histogram_length_, alphabet_size, tree, self.depths_[ix:], self.bits_[ix:], storage_ix, storage)
  1013. }
  1014. }
  1015. }
  1016. func jumpToByteBoundary(storage_ix *uint, storage []byte) {
  1017. *storage_ix = (*storage_ix + 7) &^ 7
  1018. storage[*storage_ix>>3] = 0
  1019. }
  1020. func storeMetaBlock(input []byte, start_pos uint, length uint, mask uint, prev_byte byte, prev_byte2 byte, is_last bool, params *encoderParams, literal_context_mode int, commands []command, mb *metaBlockSplit, storage_ix *uint, storage []byte) {
  1021. var pos uint = start_pos
  1022. var i uint
  1023. var num_distance_symbols uint32 = params.dist.alphabet_size
  1024. var num_effective_distance_symbols uint32 = num_distance_symbols
  1025. var tree []huffmanTree
  1026. var literal_context_lut contextLUT = getContextLUT(literal_context_mode)
  1027. var dist *distanceParams = &params.dist
  1028. if params.large_window && num_effective_distance_symbols > numHistogramDistanceSymbols {
  1029. num_effective_distance_symbols = numHistogramDistanceSymbols
  1030. }
  1031. storeCompressedMetaBlockHeader(is_last, length, storage_ix, storage)
  1032. tree = make([]huffmanTree, maxHuffmanTreeSize)
  1033. literal_enc := getBlockEncoder(numLiteralSymbols, mb.literal_split.num_types, mb.literal_split.types, mb.literal_split.lengths, mb.literal_split.num_blocks)
  1034. command_enc := getBlockEncoder(numCommandSymbols, mb.command_split.num_types, mb.command_split.types, mb.command_split.lengths, mb.command_split.num_blocks)
  1035. distance_enc := getBlockEncoder(uint(num_effective_distance_symbols), mb.distance_split.num_types, mb.distance_split.types, mb.distance_split.lengths, mb.distance_split.num_blocks)
  1036. buildAndStoreBlockSwitchEntropyCodes(literal_enc, tree, storage_ix, storage)
  1037. buildAndStoreBlockSwitchEntropyCodes(command_enc, tree, storage_ix, storage)
  1038. buildAndStoreBlockSwitchEntropyCodes(distance_enc, tree, storage_ix, storage)
  1039. writeBits(2, uint64(dist.distance_postfix_bits), storage_ix, storage)
  1040. writeBits(4, uint64(dist.num_direct_distance_codes)>>dist.distance_postfix_bits, storage_ix, storage)
  1041. for i = 0; i < mb.literal_split.num_types; i++ {
  1042. writeBits(2, uint64(literal_context_mode), storage_ix, storage)
  1043. }
  1044. if mb.literal_context_map_size == 0 {
  1045. storeTrivialContextMap(mb.literal_histograms_size, literalContextBits, tree, storage_ix, storage)
  1046. } else {
  1047. encodeContextMap(mb.literal_context_map, mb.literal_context_map_size, mb.literal_histograms_size, tree, storage_ix, storage)
  1048. }
  1049. if mb.distance_context_map_size == 0 {
  1050. storeTrivialContextMap(mb.distance_histograms_size, distanceContextBits, tree, storage_ix, storage)
  1051. } else {
  1052. encodeContextMap(mb.distance_context_map, mb.distance_context_map_size, mb.distance_histograms_size, tree, storage_ix, storage)
  1053. }
  1054. buildAndStoreEntropyCodesLiteral(literal_enc, mb.literal_histograms, mb.literal_histograms_size, numLiteralSymbols, tree, storage_ix, storage)
  1055. buildAndStoreEntropyCodesCommand(command_enc, mb.command_histograms, mb.command_histograms_size, numCommandSymbols, tree, storage_ix, storage)
  1056. buildAndStoreEntropyCodesDistance(distance_enc, mb.distance_histograms, mb.distance_histograms_size, uint(num_distance_symbols), tree, storage_ix, storage)
  1057. tree = nil
  1058. for _, cmd := range commands {
  1059. var cmd_code uint = uint(cmd.cmd_prefix_)
  1060. storeSymbol(command_enc, cmd_code, storage_ix, storage)
  1061. storeCommandExtra(&cmd, storage_ix, storage)
  1062. if mb.literal_context_map_size == 0 {
  1063. var j uint
  1064. for j = uint(cmd.insert_len_); j != 0; j-- {
  1065. storeSymbol(literal_enc, uint(input[pos&mask]), storage_ix, storage)
  1066. pos++
  1067. }
  1068. } else {
  1069. var j uint
  1070. for j = uint(cmd.insert_len_); j != 0; j-- {
  1071. var context uint = uint(getContext(prev_byte, prev_byte2, literal_context_lut))
  1072. var literal byte = input[pos&mask]
  1073. storeSymbolWithContext(literal_enc, uint(literal), context, mb.literal_context_map, storage_ix, storage, literalContextBits)
  1074. prev_byte2 = prev_byte
  1075. prev_byte = literal
  1076. pos++
  1077. }
  1078. }
  1079. pos += uint(commandCopyLen(&cmd))
  1080. if commandCopyLen(&cmd) != 0 {
  1081. prev_byte2 = input[(pos-2)&mask]
  1082. prev_byte = input[(pos-1)&mask]
  1083. if cmd.cmd_prefix_ >= 128 {
  1084. var dist_code uint = uint(cmd.dist_prefix_) & 0x3FF
  1085. var distnumextra uint32 = uint32(cmd.dist_prefix_) >> 10
  1086. var distextra uint64 = uint64(cmd.dist_extra_)
  1087. if mb.distance_context_map_size == 0 {
  1088. storeSymbol(distance_enc, dist_code, storage_ix, storage)
  1089. } else {
  1090. var context uint = uint(commandDistanceContext(&cmd))
  1091. storeSymbolWithContext(distance_enc, dist_code, context, mb.distance_context_map, storage_ix, storage, distanceContextBits)
  1092. }
  1093. writeBits(uint(distnumextra), distextra, storage_ix, storage)
  1094. }
  1095. }
  1096. }
  1097. cleanupBlockEncoder(distance_enc)
  1098. cleanupBlockEncoder(command_enc)
  1099. cleanupBlockEncoder(literal_enc)
  1100. if is_last {
  1101. jumpToByteBoundary(storage_ix, storage)
  1102. }
  1103. }
  1104. func buildHistograms(input []byte, start_pos uint, mask uint, commands []command, lit_histo *histogramLiteral, cmd_histo *histogramCommand, dist_histo *histogramDistance) {
  1105. var pos uint = start_pos
  1106. for _, cmd := range commands {
  1107. var j uint
  1108. histogramAddCommand(cmd_histo, uint(cmd.cmd_prefix_))
  1109. for j = uint(cmd.insert_len_); j != 0; j-- {
  1110. histogramAddLiteral(lit_histo, uint(input[pos&mask]))
  1111. pos++
  1112. }
  1113. pos += uint(commandCopyLen(&cmd))
  1114. if commandCopyLen(&cmd) != 0 && cmd.cmd_prefix_ >= 128 {
  1115. histogramAddDistance(dist_histo, uint(cmd.dist_prefix_)&0x3FF)
  1116. }
  1117. }
  1118. }
  1119. func storeDataWithHuffmanCodes(input []byte, start_pos uint, mask uint, commands []command, lit_depth []byte, lit_bits []uint16, cmd_depth []byte, cmd_bits []uint16, dist_depth []byte, dist_bits []uint16, storage_ix *uint, storage []byte) {
  1120. var pos uint = start_pos
  1121. for _, cmd := range commands {
  1122. var cmd_code uint = uint(cmd.cmd_prefix_)
  1123. var j uint
  1124. writeBits(uint(cmd_depth[cmd_code]), uint64(cmd_bits[cmd_code]), storage_ix, storage)
  1125. storeCommandExtra(&cmd, storage_ix, storage)
  1126. for j = uint(cmd.insert_len_); j != 0; j-- {
  1127. var literal byte = input[pos&mask]
  1128. writeBits(uint(lit_depth[literal]), uint64(lit_bits[literal]), storage_ix, storage)
  1129. pos++
  1130. }
  1131. pos += uint(commandCopyLen(&cmd))
  1132. if commandCopyLen(&cmd) != 0 && cmd.cmd_prefix_ >= 128 {
  1133. var dist_code uint = uint(cmd.dist_prefix_) & 0x3FF
  1134. var distnumextra uint32 = uint32(cmd.dist_prefix_) >> 10
  1135. var distextra uint32 = cmd.dist_extra_
  1136. writeBits(uint(dist_depth[dist_code]), uint64(dist_bits[dist_code]), storage_ix, storage)
  1137. writeBits(uint(distnumextra), uint64(distextra), storage_ix, storage)
  1138. }
  1139. }
  1140. }
  1141. func storeMetaBlockTrivial(input []byte, start_pos uint, length uint, mask uint, is_last bool, params *encoderParams, commands []command, storage_ix *uint, storage []byte) {
  1142. var lit_histo histogramLiteral
  1143. var cmd_histo histogramCommand
  1144. var dist_histo histogramDistance
  1145. var lit_depth [numLiteralSymbols]byte
  1146. var lit_bits [numLiteralSymbols]uint16
  1147. var cmd_depth [numCommandSymbols]byte
  1148. var cmd_bits [numCommandSymbols]uint16
  1149. var dist_depth [maxSimpleDistanceAlphabetSize]byte
  1150. var dist_bits [maxSimpleDistanceAlphabetSize]uint16
  1151. var tree []huffmanTree
  1152. var num_distance_symbols uint32 = params.dist.alphabet_size
  1153. storeCompressedMetaBlockHeader(is_last, length, storage_ix, storage)
  1154. histogramClearLiteral(&lit_histo)
  1155. histogramClearCommand(&cmd_histo)
  1156. histogramClearDistance(&dist_histo)
  1157. buildHistograms(input, start_pos, mask, commands, &lit_histo, &cmd_histo, &dist_histo)
  1158. writeBits(13, 0, storage_ix, storage)
  1159. tree = make([]huffmanTree, maxHuffmanTreeSize)
  1160. buildAndStoreHuffmanTree(lit_histo.data_[:], numLiteralSymbols, numLiteralSymbols, tree, lit_depth[:], lit_bits[:], storage_ix, storage)
  1161. buildAndStoreHuffmanTree(cmd_histo.data_[:], numCommandSymbols, numCommandSymbols, tree, cmd_depth[:], cmd_bits[:], storage_ix, storage)
  1162. buildAndStoreHuffmanTree(dist_histo.data_[:], maxSimpleDistanceAlphabetSize, uint(num_distance_symbols), tree, dist_depth[:], dist_bits[:], storage_ix, storage)
  1163. tree = nil
  1164. storeDataWithHuffmanCodes(input, start_pos, mask, commands, lit_depth[:], lit_bits[:], cmd_depth[:], cmd_bits[:], dist_depth[:], dist_bits[:], storage_ix, storage)
  1165. if is_last {
  1166. jumpToByteBoundary(storage_ix, storage)
  1167. }
  1168. }
  1169. func storeMetaBlockFast(input []byte, start_pos uint, length uint, mask uint, is_last bool, params *encoderParams, commands []command, storage_ix *uint, storage []byte) {
  1170. var num_distance_symbols uint32 = params.dist.alphabet_size
  1171. var distance_alphabet_bits uint32 = log2FloorNonZero(uint(num_distance_symbols-1)) + 1
  1172. storeCompressedMetaBlockHeader(is_last, length, storage_ix, storage)
  1173. writeBits(13, 0, storage_ix, storage)
  1174. if len(commands) <= 128 {
  1175. var histogram = [numLiteralSymbols]uint32{0}
  1176. var pos uint = start_pos
  1177. var num_literals uint = 0
  1178. var lit_depth [numLiteralSymbols]byte
  1179. var lit_bits [numLiteralSymbols]uint16
  1180. for _, cmd := range commands {
  1181. var j uint
  1182. for j = uint(cmd.insert_len_); j != 0; j-- {
  1183. histogram[input[pos&mask]]++
  1184. pos++
  1185. }
  1186. num_literals += uint(cmd.insert_len_)
  1187. pos += uint(commandCopyLen(&cmd))
  1188. }
  1189. buildAndStoreHuffmanTreeFast(histogram[:], num_literals, /* max_bits = */
  1190. 8, lit_depth[:], lit_bits[:], storage_ix, storage)
  1191. storeStaticCommandHuffmanTree(storage_ix, storage)
  1192. storeStaticDistanceHuffmanTree(storage_ix, storage)
  1193. storeDataWithHuffmanCodes(input, start_pos, mask, commands, lit_depth[:], lit_bits[:], kStaticCommandCodeDepth[:], kStaticCommandCodeBits[:], kStaticDistanceCodeDepth[:], kStaticDistanceCodeBits[:], storage_ix, storage)
  1194. } else {
  1195. var lit_histo histogramLiteral
  1196. var cmd_histo histogramCommand
  1197. var dist_histo histogramDistance
  1198. var lit_depth [numLiteralSymbols]byte
  1199. var lit_bits [numLiteralSymbols]uint16
  1200. var cmd_depth [numCommandSymbols]byte
  1201. var cmd_bits [numCommandSymbols]uint16
  1202. var dist_depth [maxSimpleDistanceAlphabetSize]byte
  1203. var dist_bits [maxSimpleDistanceAlphabetSize]uint16
  1204. histogramClearLiteral(&lit_histo)
  1205. histogramClearCommand(&cmd_histo)
  1206. histogramClearDistance(&dist_histo)
  1207. buildHistograms(input, start_pos, mask, commands, &lit_histo, &cmd_histo, &dist_histo)
  1208. buildAndStoreHuffmanTreeFast(lit_histo.data_[:], lit_histo.total_count_, /* max_bits = */
  1209. 8, lit_depth[:], lit_bits[:], storage_ix, storage)
  1210. buildAndStoreHuffmanTreeFast(cmd_histo.data_[:], cmd_histo.total_count_, /* max_bits = */
  1211. 10, cmd_depth[:], cmd_bits[:], storage_ix, storage)
  1212. buildAndStoreHuffmanTreeFast(dist_histo.data_[:], dist_histo.total_count_, /* max_bits = */
  1213. uint(distance_alphabet_bits), dist_depth[:], dist_bits[:], storage_ix, storage)
  1214. storeDataWithHuffmanCodes(input, start_pos, mask, commands, lit_depth[:], lit_bits[:], cmd_depth[:], cmd_bits[:], dist_depth[:], dist_bits[:], storage_ix, storage)
  1215. }
  1216. if is_last {
  1217. jumpToByteBoundary(storage_ix, storage)
  1218. }
  1219. }
  1220. /*
  1221. This is for storing uncompressed blocks (simple raw storage of
  1222. bytes-as-bytes).
  1223. */
  1224. func storeUncompressedMetaBlock(is_final_block bool, input []byte, position uint, mask uint, len uint, storage_ix *uint, storage []byte) {
  1225. var masked_pos uint = position & mask
  1226. storeUncompressedMetaBlockHeader(uint(len), storage_ix, storage)
  1227. jumpToByteBoundary(storage_ix, storage)
  1228. if masked_pos+len > mask+1 {
  1229. var len1 uint = mask + 1 - masked_pos
  1230. copy(storage[*storage_ix>>3:], input[masked_pos:][:len1])
  1231. *storage_ix += len1 << 3
  1232. len -= len1
  1233. masked_pos = 0
  1234. }
  1235. copy(storage[*storage_ix>>3:], input[masked_pos:][:len])
  1236. *storage_ix += uint(len << 3)
  1237. /* We need to clear the next 4 bytes to continue to be
  1238. compatible with BrotliWriteBits. */
  1239. writeBitsPrepareStorage(*storage_ix, storage)
  1240. /* Since the uncompressed block itself may not be the final block, add an
  1241. empty one after this. */
  1242. if is_final_block {
  1243. writeBits(1, 1, storage_ix, storage) /* islast */
  1244. writeBits(1, 1, storage_ix, storage) /* isempty */
  1245. jumpToByteBoundary(storage_ix, storage)
  1246. }
  1247. }