brotli 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +6 -3
  3. data/.github/workflows/publish.yml +7 -17
  4. data/.gitmodules +1 -1
  5. data/README.md +2 -2
  6. data/ext/brotli/brotli.c +1 -0
  7. data/ext/brotli/extconf.rb +6 -0
  8. data/lib/brotli/version.rb +1 -1
  9. data/test/brotli_test.rb +4 -1
  10. data/vendor/brotli/c/common/constants.c +1 -1
  11. data/vendor/brotli/c/common/constants.h +2 -1
  12. data/vendor/brotli/c/common/context.c +1 -1
  13. data/vendor/brotli/c/common/dictionary.c +5 -3
  14. data/vendor/brotli/c/common/platform.c +2 -1
  15. data/vendor/brotli/c/common/platform.h +60 -113
  16. data/vendor/brotli/c/common/shared_dictionary.c +521 -0
  17. data/vendor/brotli/c/common/shared_dictionary_internal.h +75 -0
  18. data/vendor/brotli/c/common/transform.c +1 -1
  19. data/vendor/brotli/c/common/version.h +31 -6
  20. data/vendor/brotli/c/dec/bit_reader.c +10 -8
  21. data/vendor/brotli/c/dec/bit_reader.h +172 -100
  22. data/vendor/brotli/c/dec/decode.c +467 -200
  23. data/vendor/brotli/c/dec/huffman.c +7 -4
  24. data/vendor/brotli/c/dec/huffman.h +2 -1
  25. data/vendor/brotli/c/dec/prefix.h +2 -1
  26. data/vendor/brotli/c/dec/state.c +33 -9
  27. data/vendor/brotli/c/dec/state.h +70 -35
  28. data/vendor/brotli/c/enc/backward_references.c +81 -19
  29. data/vendor/brotli/c/enc/backward_references.h +5 -4
  30. data/vendor/brotli/c/enc/backward_references_hq.c +148 -52
  31. data/vendor/brotli/c/enc/backward_references_hq.h +6 -5
  32. data/vendor/brotli/c/enc/backward_references_inc.h +31 -5
  33. data/vendor/brotli/c/enc/bit_cost.c +8 -7
  34. data/vendor/brotli/c/enc/bit_cost.h +5 -4
  35. data/vendor/brotli/c/enc/block_splitter.c +37 -14
  36. data/vendor/brotli/c/enc/block_splitter.h +5 -4
  37. data/vendor/brotli/c/enc/block_splitter_inc.h +86 -45
  38. data/vendor/brotli/c/enc/brotli_bit_stream.c +132 -110
  39. data/vendor/brotli/c/enc/brotli_bit_stream.h +11 -6
  40. data/vendor/brotli/c/enc/cluster.c +10 -9
  41. data/vendor/brotli/c/enc/cluster.h +7 -6
  42. data/vendor/brotli/c/enc/cluster_inc.h +25 -20
  43. data/vendor/brotli/c/enc/command.c +1 -1
  44. data/vendor/brotli/c/enc/command.h +5 -4
  45. data/vendor/brotli/c/enc/compound_dictionary.c +207 -0
  46. data/vendor/brotli/c/enc/compound_dictionary.h +74 -0
  47. data/vendor/brotli/c/enc/compress_fragment.c +93 -83
  48. data/vendor/brotli/c/enc/compress_fragment.h +32 -7
  49. data/vendor/brotli/c/enc/compress_fragment_two_pass.c +99 -87
  50. data/vendor/brotli/c/enc/compress_fragment_two_pass.h +21 -3
  51. data/vendor/brotli/c/enc/dictionary_hash.c +3 -1
  52. data/vendor/brotli/c/enc/encode.c +473 -404
  53. data/vendor/brotli/c/enc/encoder_dict.c +611 -4
  54. data/vendor/brotli/c/enc/encoder_dict.h +117 -3
  55. data/vendor/brotli/c/enc/entropy_encode.c +3 -2
  56. data/vendor/brotli/c/enc/entropy_encode.h +2 -1
  57. data/vendor/brotli/c/enc/entropy_encode_static.h +5 -2
  58. data/vendor/brotli/c/enc/fast_log.c +1 -1
  59. data/vendor/brotli/c/enc/fast_log.h +2 -1
  60. data/vendor/brotli/c/enc/find_match_length.h +15 -22
  61. data/vendor/brotli/c/enc/hash.h +285 -45
  62. data/vendor/brotli/c/enc/hash_composite_inc.h +26 -11
  63. data/vendor/brotli/c/enc/hash_forgetful_chain_inc.h +20 -18
  64. data/vendor/brotli/c/enc/hash_longest_match64_inc.h +34 -39
  65. data/vendor/brotli/c/enc/hash_longest_match_inc.h +6 -10
  66. data/vendor/brotli/c/enc/hash_longest_match_quickly_inc.h +4 -4
  67. data/vendor/brotli/c/enc/hash_rolling_inc.h +4 -4
  68. data/vendor/brotli/c/enc/hash_to_binary_tree_inc.h +6 -5
  69. data/vendor/brotli/c/enc/histogram.c +4 -4
  70. data/vendor/brotli/c/enc/histogram.h +7 -6
  71. data/vendor/brotli/c/enc/literal_cost.c +20 -15
  72. data/vendor/brotli/c/enc/literal_cost.h +4 -2
  73. data/vendor/brotli/c/enc/memory.c +29 -5
  74. data/vendor/brotli/c/enc/memory.h +19 -2
  75. data/vendor/brotli/c/enc/metablock.c +72 -58
  76. data/vendor/brotli/c/enc/metablock.h +9 -8
  77. data/vendor/brotli/c/enc/metablock_inc.h +8 -6
  78. data/vendor/brotli/c/enc/params.h +4 -3
  79. data/vendor/brotli/c/enc/prefix.h +3 -2
  80. data/vendor/brotli/c/enc/quality.h +40 -3
  81. data/vendor/brotli/c/enc/ringbuffer.h +4 -3
  82. data/vendor/brotli/c/enc/state.h +104 -0
  83. data/vendor/brotli/c/enc/static_dict.c +60 -4
  84. data/vendor/brotli/c/enc/static_dict.h +3 -2
  85. data/vendor/brotli/c/enc/static_dict_lut.h +2 -0
  86. data/vendor/brotli/c/enc/utf8_util.c +1 -1
  87. data/vendor/brotli/c/enc/utf8_util.h +2 -1
  88. data/vendor/brotli/c/enc/write_bits.h +2 -1
  89. data/vendor/brotli/c/include/brotli/decode.h +67 -2
  90. data/vendor/brotli/c/include/brotli/encode.h +55 -2
  91. data/vendor/brotli/c/include/brotli/port.h +28 -11
  92. data/vendor/brotli/c/include/brotli/shared_dictionary.h +100 -0
  93. metadata +9 -3
@@ -10,20 +10,20 @@
10
10
  second pass we emit them into the bit stream using prefix codes built based
11
11
  on the actual command and literal byte histograms. */
12
12
 
13
- #include "./compress_fragment_two_pass.h"
13
+ #include "compress_fragment_two_pass.h"
14
14
 
15
15
  #include <string.h> /* memcmp, memcpy, memset */
16
16
 
17
+ #include <brotli/types.h>
18
+
17
19
  #include "../common/constants.h"
18
20
  #include "../common/platform.h"
19
- #include <brotli/types.h>
20
- #include "./bit_cost.h"
21
- #include "./brotli_bit_stream.h"
22
- #include "./entropy_encode.h"
23
- #include "./fast_log.h"
24
- #include "./find_match_length.h"
25
- #include "./memory.h"
26
- #include "./write_bits.h"
21
+ #include "bit_cost.h"
22
+ #include "brotli_bit_stream.h"
23
+ #include "entropy_encode.h"
24
+ #include "fast_log.h"
25
+ #include "find_match_length.h"
26
+ #include "write_bits.h"
27
27
 
28
28
  #if defined(__cplusplus) || defined(c_plusplus)
29
29
  extern "C" {
@@ -66,53 +66,53 @@ static BROTLI_INLINE BROTLI_BOOL IsMatch(const uint8_t* p1, const uint8_t* p2,
66
66
 
67
67
  /* Builds a command and distance prefix code (each 64 symbols) into "depth" and
68
68
  "bits" based on "histogram" and stores it into the bit stream. */
69
- static void BuildAndStoreCommandPrefixCode(
70
- const uint32_t histogram[128],
71
- uint8_t depth[128], uint16_t bits[128],
72
- size_t* storage_ix, uint8_t* storage) {
69
+ static void BuildAndStoreCommandPrefixCode(BrotliTwoPassArena* s,
70
+ size_t* storage_ix,
71
+ uint8_t* storage) {
73
72
  /* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */
74
- HuffmanTree tree[129];
75
- uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS] = { 0 };
76
- uint16_t cmd_bits[64];
77
- BrotliCreateHuffmanTree(histogram, 64, 15, tree, depth);
78
- BrotliCreateHuffmanTree(&histogram[64], 64, 14, tree, &depth[64]);
73
+ /* TODO(eustas): initialize once. */
74
+ memset(s->tmp_depth, 0, sizeof(s->tmp_depth));
75
+ BrotliCreateHuffmanTree(s->cmd_histo, 64, 15, s->tmp_tree, s->cmd_depth);
76
+ BrotliCreateHuffmanTree(&s->cmd_histo[64], 64, 14, s->tmp_tree,
77
+ &s->cmd_depth[64]);
79
78
  /* We have to jump through a few hoops here in order to compute
80
79
  the command bits because the symbols are in a different order than in
81
80
  the full alphabet. This looks complicated, but having the symbols
82
81
  in this order in the command bits saves a few branches in the Emit*
83
82
  functions. */
84
- memcpy(cmd_depth, depth + 24, 24);
85
- memcpy(cmd_depth + 24, depth, 8);
86
- memcpy(cmd_depth + 32, depth + 48, 8);
87
- memcpy(cmd_depth + 40, depth + 8, 8);
88
- memcpy(cmd_depth + 48, depth + 56, 8);
89
- memcpy(cmd_depth + 56, depth + 16, 8);
90
- BrotliConvertBitDepthsToSymbols(cmd_depth, 64, cmd_bits);
91
- memcpy(bits, cmd_bits + 24, 16);
92
- memcpy(bits + 8, cmd_bits + 40, 16);
93
- memcpy(bits + 16, cmd_bits + 56, 16);
94
- memcpy(bits + 24, cmd_bits, 48);
95
- memcpy(bits + 48, cmd_bits + 32, 16);
96
- memcpy(bits + 56, cmd_bits + 48, 16);
97
- BrotliConvertBitDepthsToSymbols(&depth[64], 64, &bits[64]);
83
+ memcpy(s->tmp_depth, s->cmd_depth + 24, 24);
84
+ memcpy(s->tmp_depth + 24, s->cmd_depth, 8);
85
+ memcpy(s->tmp_depth + 32, s->cmd_depth + 48, 8);
86
+ memcpy(s->tmp_depth + 40, s->cmd_depth + 8, 8);
87
+ memcpy(s->tmp_depth + 48, s->cmd_depth + 56, 8);
88
+ memcpy(s->tmp_depth + 56, s->cmd_depth + 16, 8);
89
+ BrotliConvertBitDepthsToSymbols(s->tmp_depth, 64, s->tmp_bits);
90
+ memcpy(s->cmd_bits, s->tmp_bits + 24, 16);
91
+ memcpy(s->cmd_bits + 8, s->tmp_bits + 40, 16);
92
+ memcpy(s->cmd_bits + 16, s->tmp_bits + 56, 16);
93
+ memcpy(s->cmd_bits + 24, s->tmp_bits, 48);
94
+ memcpy(s->cmd_bits + 48, s->tmp_bits + 32, 16);
95
+ memcpy(s->cmd_bits + 56, s->tmp_bits + 48, 16);
96
+ BrotliConvertBitDepthsToSymbols(&s->cmd_depth[64], 64, &s->cmd_bits[64]);
98
97
  {
99
98
  /* Create the bit length array for the full command alphabet. */
100
99
  size_t i;
101
- memset(cmd_depth, 0, 64); /* only 64 first values were used */
102
- memcpy(cmd_depth, depth + 24, 8);
103
- memcpy(cmd_depth + 64, depth + 32, 8);
104
- memcpy(cmd_depth + 128, depth + 40, 8);
105
- memcpy(cmd_depth + 192, depth + 48, 8);
106
- memcpy(cmd_depth + 384, depth + 56, 8);
100
+ memset(s->tmp_depth, 0, 64); /* only 64 first values were used */
101
+ memcpy(s->tmp_depth, s->cmd_depth + 24, 8);
102
+ memcpy(s->tmp_depth + 64, s->cmd_depth + 32, 8);
103
+ memcpy(s->tmp_depth + 128, s->cmd_depth + 40, 8);
104
+ memcpy(s->tmp_depth + 192, s->cmd_depth + 48, 8);
105
+ memcpy(s->tmp_depth + 384, s->cmd_depth + 56, 8);
107
106
  for (i = 0; i < 8; ++i) {
108
- cmd_depth[128 + 8 * i] = depth[i];
109
- cmd_depth[256 + 8 * i] = depth[8 + i];
110
- cmd_depth[448 + 8 * i] = depth[16 + i];
107
+ s->tmp_depth[128 + 8 * i] = s->cmd_depth[i];
108
+ s->tmp_depth[256 + 8 * i] = s->cmd_depth[8 + i];
109
+ s->tmp_depth[448 + 8 * i] = s->cmd_depth[16 + i];
111
110
  }
112
- BrotliStoreHuffmanTree(
113
- cmd_depth, BROTLI_NUM_COMMAND_SYMBOLS, tree, storage_ix, storage);
111
+ BrotliStoreHuffmanTree(s->tmp_depth, BROTLI_NUM_COMMAND_SYMBOLS,
112
+ s->tmp_tree, storage_ix, storage);
114
113
  }
115
- BrotliStoreHuffmanTree(&depth[64], 64, tree, storage_ix, storage);
114
+ BrotliStoreHuffmanTree(&s->cmd_depth[64], 64, s->tmp_tree, storage_ix,
115
+ storage);
116
116
  }
117
117
 
118
118
  static BROTLI_INLINE void EmitInsertLen(
@@ -330,6 +330,8 @@ trawl:
330
330
  ip += matched;
331
331
  BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
332
332
  EmitInsertLen((uint32_t)insert, commands);
333
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %d copy = %d\n",
334
+ (int)(next_emit - base_ip), insert, 2));
333
335
  memcpy(*literals, next_emit, (size_t)insert);
334
336
  *literals += insert;
335
337
  if (distance == last_distance) {
@@ -340,6 +342,12 @@ trawl:
340
342
  last_distance = distance;
341
343
  }
342
344
  EmitCopyLenLastDistance(matched, commands);
345
+ BROTLI_LOG(("[CompressFragment] pos = %d distance = %d\n"
346
+ "[CompressFragment] pos = %d insert = %d copy = %d\n"
347
+ "[CompressFragment] pos = %d distance = %d\n",
348
+ (int)(base - base_ip), (int)distance,
349
+ (int)(base - base_ip) + 2, 0, (int)matched - 2,
350
+ (int)(base - base_ip) + 2, (int)distance));
343
351
 
344
352
  next_emit = ip;
345
353
  if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) {
@@ -395,6 +403,10 @@ trawl:
395
403
  BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
396
404
  EmitCopyLen(matched, commands);
397
405
  EmitDistance((uint32_t)last_distance, commands);
406
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %d copy = %d\n"
407
+ "[CompressFragment] pos = %d distance = %d\n",
408
+ (int)(base - base_ip), 0, (int)matched,
409
+ (int)(base - base_ip), (int)last_distance));
398
410
 
399
411
  next_emit = ip;
400
412
  if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) {
@@ -447,70 +459,71 @@ emit_remainder:
447
459
  if (next_emit < ip_end) {
448
460
  const uint32_t insert = (uint32_t)(ip_end - next_emit);
449
461
  EmitInsertLen(insert, commands);
462
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %d copy = %d\n",
463
+ (int)(next_emit - base_ip), insert, 2));
450
464
  memcpy(*literals, next_emit, insert);
451
465
  *literals += insert;
452
466
  }
453
467
  }
454
468
 
455
- static void StoreCommands(MemoryManager* m,
469
+ static void StoreCommands(BrotliTwoPassArena* s,
456
470
  const uint8_t* literals, const size_t num_literals,
457
471
  const uint32_t* commands, const size_t num_commands,
458
472
  size_t* storage_ix, uint8_t* storage) {
459
473
  static const uint32_t kNumExtraBits[128] = {
460
- 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24,
461
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
462
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24,
463
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
464
- 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
465
- 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
466
- 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
474
+ 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5,
475
+ 6, 7, 8, 9, 10, 12, 14, 24, 0, 0, 0, 0, 0, 0, 0, 0,
476
+ 1, 1, 2, 2, 3, 3, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0,
477
+ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24,
478
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
479
+ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
480
+ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
481
+ 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
467
482
  };
468
483
  static const uint32_t kInsertOffset[24] = {
469
- 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578,
470
- 1090, 2114, 6210, 22594,
484
+ 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26,
485
+ 34, 50, 66, 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594,
471
486
  };
472
487
 
473
- uint8_t lit_depths[256];
474
- uint16_t lit_bits[256];
475
- uint32_t lit_histo[256] = { 0 };
476
- uint8_t cmd_depths[128] = { 0 };
477
- uint16_t cmd_bits[128] = { 0 };
478
- uint32_t cmd_histo[128] = { 0 };
479
488
  size_t i;
489
+ memset(s->lit_histo, 0, sizeof(s->lit_histo));
490
+ /* TODO(eustas): is that necessary? */
491
+ memset(s->cmd_depth, 0, sizeof(s->cmd_depth));
492
+ /* TODO(eustas): is that necessary? */
493
+ memset(s->cmd_bits, 0, sizeof(s->cmd_bits));
494
+ memset(s->cmd_histo, 0, sizeof(s->cmd_histo));
480
495
  for (i = 0; i < num_literals; ++i) {
481
- ++lit_histo[literals[i]];
496
+ ++s->lit_histo[literals[i]];
482
497
  }
483
- BrotliBuildAndStoreHuffmanTreeFast(m, lit_histo, num_literals,
484
- /* max_bits = */ 8,
485
- lit_depths, lit_bits,
486
- storage_ix, storage);
487
- if (BROTLI_IS_OOM(m)) return;
498
+ BrotliBuildAndStoreHuffmanTreeFast(s->tmp_tree, s->lit_histo, num_literals,
499
+ /* max_bits = */ 8, s->lit_depth,
500
+ s->lit_bits, storage_ix, storage);
488
501
 
489
502
  for (i = 0; i < num_commands; ++i) {
490
503
  const uint32_t code = commands[i] & 0xFF;
491
504
  BROTLI_DCHECK(code < 128);
492
- ++cmd_histo[code];
505
+ ++s->cmd_histo[code];
493
506
  }
494
- cmd_histo[1] += 1;
495
- cmd_histo[2] += 1;
496
- cmd_histo[64] += 1;
497
- cmd_histo[84] += 1;
498
- BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depths, cmd_bits,
499
- storage_ix, storage);
507
+ s->cmd_histo[1] += 1;
508
+ s->cmd_histo[2] += 1;
509
+ s->cmd_histo[64] += 1;
510
+ s->cmd_histo[84] += 1;
511
+ BuildAndStoreCommandPrefixCode(s, storage_ix, storage);
500
512
 
501
513
  for (i = 0; i < num_commands; ++i) {
502
514
  const uint32_t cmd = commands[i];
503
515
  const uint32_t code = cmd & 0xFF;
504
516
  const uint32_t extra = cmd >> 8;
505
517
  BROTLI_DCHECK(code < 128);
506
- BrotliWriteBits(cmd_depths[code], cmd_bits[code], storage_ix, storage);
518
+ BrotliWriteBits(s->cmd_depth[code], s->cmd_bits[code], storage_ix, storage);
507
519
  BrotliWriteBits(kNumExtraBits[code], extra, storage_ix, storage);
508
520
  if (code < 24) {
509
521
  const uint32_t insert = kInsertOffset[code] + extra;
510
522
  uint32_t j;
511
523
  for (j = 0; j < insert; ++j) {
512
524
  const uint8_t lit = *literals;
513
- BrotliWriteBits(lit_depths[lit], lit_bits[lit], storage_ix, storage);
525
+ BrotliWriteBits(s->lit_depth[lit], s->lit_bits[lit], storage_ix,
526
+ storage);
514
527
  ++literals;
515
528
  }
516
529
  }
@@ -521,19 +534,19 @@ static void StoreCommands(MemoryManager* m,
521
534
  #define MIN_RATIO 0.98
522
535
  #define SAMPLE_RATE 43
523
536
 
524
- static BROTLI_BOOL ShouldCompress(
537
+ static BROTLI_BOOL ShouldCompress(BrotliTwoPassArena* s,
525
538
  const uint8_t* input, size_t input_size, size_t num_literals) {
526
539
  double corpus_size = (double)input_size;
527
540
  if ((double)num_literals < MIN_RATIO * corpus_size) {
528
541
  return BROTLI_TRUE;
529
542
  } else {
530
- uint32_t literal_histo[256] = { 0 };
531
543
  const double max_total_bit_cost = corpus_size * 8 * MIN_RATIO / SAMPLE_RATE;
532
544
  size_t i;
545
+ memset(s->lit_histo, 0, sizeof(s->lit_histo));
533
546
  for (i = 0; i < input_size; i += SAMPLE_RATE) {
534
- ++literal_histo[input[i]];
547
+ ++s->lit_histo[input[i]];
535
548
  }
536
- return TO_BROTLI_BOOL(BitsEntropy(literal_histo, 256) < max_total_bit_cost);
549
+ return TO_BROTLI_BOOL(BitsEntropy(s->lit_histo, 256) < max_total_bit_cost);
537
550
  }
538
551
  }
539
552
 
@@ -555,7 +568,7 @@ static void EmitUncompressedMetaBlock(const uint8_t* input, size_t input_size,
555
568
  }
556
569
 
557
570
  static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl(
558
- MemoryManager* m, const uint8_t* input, size_t input_size,
571
+ BrotliTwoPassArena* s, const uint8_t* input, size_t input_size,
559
572
  BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf,
560
573
  int* table, size_t table_bits, size_t min_match,
561
574
  size_t* storage_ix, uint8_t* storage) {
@@ -573,14 +586,13 @@ static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl(
573
586
  CreateCommands(input, block_size, input_size, base_ip, table,
574
587
  table_bits, min_match, &literals, &commands);
575
588
  num_literals = (size_t)(literals - literal_buf);
576
- if (ShouldCompress(input, block_size, num_literals)) {
589
+ if (ShouldCompress(s, input, block_size, num_literals)) {
577
590
  const size_t num_commands = (size_t)(commands - command_buf);
578
591
  BrotliStoreMetaBlockHeader(block_size, 0, storage_ix, storage);
579
592
  /* No block splits, no contexts. */
580
593
  BrotliWriteBits(13, 0, storage_ix, storage);
581
- StoreCommands(m, literal_buf, num_literals, command_buf, num_commands,
594
+ StoreCommands(s, literal_buf, num_literals, command_buf, num_commands,
582
595
  storage_ix, storage);
583
- if (BROTLI_IS_OOM(m)) return;
584
596
  } else {
585
597
  /* Since we did not find many backward references and the entropy of
586
598
  the data is close to 8 bits, we can simply emit an uncompressed block.
@@ -597,18 +609,18 @@ static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl(
597
609
 
598
610
  #define BAKE_METHOD_PARAM_(B) \
599
611
  static BROTLI_NOINLINE void BrotliCompressFragmentTwoPassImpl ## B( \
600
- MemoryManager* m, const uint8_t* input, size_t input_size, \
612
+ BrotliTwoPassArena* s, const uint8_t* input, size_t input_size, \
601
613
  BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf, \
602
614
  int* table, size_t* storage_ix, uint8_t* storage) { \
603
615
  size_t min_match = (B <= 15) ? 4 : 6; \
604
- BrotliCompressFragmentTwoPassImpl(m, input, input_size, is_last, command_buf,\
616
+ BrotliCompressFragmentTwoPassImpl(s, input, input_size, is_last, command_buf,\
605
617
  literal_buf, table, B, min_match, storage_ix, storage); \
606
618
  }
607
619
  FOR_TABLE_BITS_(BAKE_METHOD_PARAM_)
608
620
  #undef BAKE_METHOD_PARAM_
609
621
 
610
622
  void BrotliCompressFragmentTwoPass(
611
- MemoryManager* m, const uint8_t* input, size_t input_size,
623
+ BrotliTwoPassArena* s, const uint8_t* input, size_t input_size,
612
624
  BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf,
613
625
  int* table, size_t table_size, size_t* storage_ix, uint8_t* storage) {
614
626
  const size_t initial_storage_ix = *storage_ix;
@@ -617,7 +629,7 @@ void BrotliCompressFragmentTwoPass(
617
629
  #define CASE_(B) \
618
630
  case B: \
619
631
  BrotliCompressFragmentTwoPassImpl ## B( \
620
- m, input, input_size, is_last, command_buf, \
632
+ s, input, input_size, is_last, command_buf, \
621
633
  literal_buf, table, storage_ix, storage); \
622
634
  break;
623
635
  FOR_TABLE_BITS_(CASE_)
@@ -13,16 +13,34 @@
13
13
  #ifndef BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
14
14
  #define BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
15
15
 
16
- #include "../common/platform.h"
17
16
  #include <brotli/types.h>
18
- #include "./memory.h"
17
+
18
+ #include "../common/constants.h"
19
+ #include "../common/platform.h"
20
+ #include "entropy_encode.h"
19
21
 
20
22
  #if defined(__cplusplus) || defined(c_plusplus)
21
23
  extern "C" {
22
24
  #endif
23
25
 
26
+ /* TODO(eustas): turn to macro. */
24
27
  static const size_t kCompressFragmentTwoPassBlockSize = 1 << 17;
25
28
 
29
+ typedef struct BrotliTwoPassArena {
30
+ uint32_t lit_histo[256];
31
+ uint8_t lit_depth[256];
32
+ uint16_t lit_bits[256];
33
+
34
+ uint32_t cmd_histo[128];
35
+ uint8_t cmd_depth[128];
36
+ uint16_t cmd_bits[128];
37
+
38
+ /* BuildAndStoreCommandPrefixCode */
39
+ HuffmanTree tmp_tree[2 * BROTLI_NUM_LITERAL_SYMBOLS + 1];
40
+ uint8_t tmp_depth[BROTLI_NUM_COMMAND_SYMBOLS];
41
+ uint16_t tmp_bits[64];
42
+ } BrotliTwoPassArena;
43
+
26
44
  /* Compresses "input" string to the "*storage" buffer as one or more complete
27
45
  meta-blocks, and updates the "*storage_ix" bit position.
28
46
 
@@ -36,7 +54,7 @@ static const size_t kCompressFragmentTwoPassBlockSize = 1 << 17;
36
54
  REQUIRES: "table_size" is a power of two
37
55
  OUTPUT: maximal copy distance <= |input_size|
38
56
  OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18) */
39
- BROTLI_INTERNAL void BrotliCompressFragmentTwoPass(MemoryManager* m,
57
+ BROTLI_INTERNAL void BrotliCompressFragmentTwoPass(BrotliTwoPassArena* s,
40
58
  const uint8_t* input,
41
59
  size_t input_size,
42
60
  BROTLI_BOOL is_last,
@@ -7,12 +7,13 @@
7
7
  /* Hash table on the 4-byte prefixes of static dictionary words. */
8
8
 
9
9
  #include "../common/platform.h"
10
- #include "./dictionary_hash.h"
10
+ #include "dictionary_hash.h"
11
11
 
12
12
  #if defined(__cplusplus) || defined(c_plusplus)
13
13
  extern "C" {
14
14
  #endif
15
15
 
16
+ /* GENERATED CODE START */
16
17
  BROTLI_INTERNAL const uint16_t kStaticDictionaryHashWords[32768] = {
17
18
  1002,0,0,0,0,0,0,0,0,683,0,0,0,0,0,0,0,1265,0,0,0,0,0,1431,0,0,0,0,0,0,40,0,0,0,
18
19
  0,155,8,741,0,624,0,0,0,0,0,0,0,0,0,0,0,0,66,503,0,0,0,451,0,0,0,0,0,0,0,835,70,
@@ -1840,6 +1841,7 @@ BROTLI_INTERNAL const uint8_t kStaticDictionaryHashLengths[32768] = {
1840
1841
  0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,
1841
1842
  10,7,0,0,0,0,0,0,0,0,9,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,11,0,0,0,0,0,0,0,8,6,0,0,9,
1842
1843
  7,0,0,12,4,0,0,0,0,0,0,12,6,0,6,0,7,0,0,8,5,0,0,0,0};
1844
+ /* GENERATED CODE END */
1843
1845
 
1844
1846
  #if defined(__cplusplus) || defined(c_plusplus)
1845
1847
  } /* extern "C" */