public static void __hx_ctor_encode_metablock_MetaBlockSplit(global::encode.metablock.MetaBlockSplit __hx_this) { __hx_this.distance_histograms = new global::Array <object>(); __hx_this.command_histograms = new global::Array <object>(); __hx_this.literal_histograms = new global::Array <object>(); { int[] this1 = null; this1 = new int[0]; __hx_this.distance_context_map = ((int[])(this1)); } { int[] this1 = null; this1 = new int[0]; __hx_this.literal_context_map = ((int[])(this1)); } __hx_this.distance_split = new global::encode.metablock.BlockSplit(); __hx_this.command_split = new global::encode.metablock.BlockSplit(); __hx_this.literal_split = new global::encode.metablock.BlockSplit(); }
public static void OptimizeHistograms(int num_direct_distance_codes, int distance_postfix_bits, global::encode.metablock.MetaBlockSplit mb) { unchecked { { int _g1 = 0; int _g = mb.literal_histograms.length; while ((_g1 < _g)) { global::encode.Entropy_encode.OptimizeHuffmanCountsForRle(256, ((global::encode.histogram.Histogram)(mb.literal_histograms[_g1++])).data_); } } { int _g11 = 0; int _g2 = mb.command_histograms.length; while ((_g11 < _g2)) { global::encode.Entropy_encode.OptimizeHuffmanCountsForRle(704, ((global::encode.histogram.Histogram)(mb.command_histograms[_g11++])).data_); } } int num_distance_codes = ((16 + num_direct_distance_codes) + ((48 << distance_postfix_bits))); { int _g12 = 0; int _g3 = mb.distance_histograms.length; while ((_g12 < _g3)) { global::encode.Entropy_encode.OptimizeHuffmanCountsForRle(num_distance_codes, ((global::encode.histogram.Histogram)(mb.distance_histograms[_g12++])).data_); } } } }
public static void BuildMetaBlock(uint[] ringbuffer, int pos, int mask, uint prev_byte, uint prev_byte2, global::Array <object> cmds, int num_commands, int literal_context_mode, global::encode.metablock.MetaBlockSplit mb) { unchecked { global::encode.Block_splitter.SplitBlock(cmds, num_commands, ringbuffer, (pos & mask), mb.literal_split, mb.command_split, mb.distance_split); global::Array <int> literal_context_modes = new global::Array <int>(); { int _g1 = 0; int _g = mb.literal_split.num_types; while ((_g1 < _g)) { literal_context_modes[_g1++] = literal_context_mode; } } int num_literal_contexts = (mb.literal_split.num_types << 6); int num_distance_contexts = (mb.distance_split.num_types << 2); global::Array <object> literal_histograms = new global::Array <object>(); { int _g11 = 0; while ((_g11 < num_literal_contexts)) { ++_g11; literal_histograms.push(new global::encode.histogram.Histogram(((int)(global::encode.Histogram_functions.HistogramLiteralInt)))); } } mb.command_histograms = new global::Array <object>(new object[] {}); { int _g12 = 0; int _g2 = mb.command_split.num_types; while ((_g12 < _g2)) { ++_g12; mb.command_histograms.push(new global::encode.histogram.Histogram(((int)(global::encode.Histogram_functions.HistogramCommandInt)))); } } global::Array <object> distance_histograms = new global::Array <object>(); { int _g13 = 0; while ((_g13 < num_distance_contexts)) { ++_g13; distance_histograms.push(new global::encode.histogram.Histogram(((int)(global::encode.Histogram_functions.HistogramDistanceInt)))); } } global::encode.Histogram_functions.BuildHistograms(cmds, num_commands, mb.literal_split, mb.command_split, mb.distance_split, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_modes, literal_histograms, mb.command_histograms, distance_histograms); { int _g14 = 0; int _g3 = literal_histograms.length; while ((_g14 < _g3)) { int i = _g14++; mb.literal_histograms[i] = new global::encode.histogram.Histogram(((int)(global::encode.Histogram_functions.HistogramLiteralInt))); ((global::encode.histogram.Histogram)(mb.literal_histograms[i])).bit_cost_ = ((global::encode.histogram.Histogram)(literal_histograms[i])).bit_cost_; { int _g31 = 0; int _g21 = (((int[])(((global::encode.histogram.Histogram)(literal_histograms[i])).data_)) as global::System.Array).Length; while ((_g31 < _g21)) { int a = _g31++; ((int[])(((global::encode.histogram.Histogram)(mb.literal_histograms[i])).data_))[a] = ((int[])(((global::encode.histogram.Histogram)(literal_histograms[i])).data_))[a]; } } ((global::encode.histogram.Histogram)(mb.literal_histograms[i])).kDataSize = ((global::encode.histogram.Histogram)(literal_histograms[i])).kDataSize; ((global::encode.histogram.Histogram)(mb.literal_histograms[i])).total_count_ = ((global::encode.histogram.Histogram)(literal_histograms[i])).total_count_; } } mb.literal_context_map = ((int[])(new int[(64 * mb.literal_split.num_types)])); global::encode.Cluster.ClusterHistograms(literal_histograms, 64, mb.literal_split.num_types, 256, mb.literal_histograms, global::encode.Histogram_functions.HistogramLiteralInt, mb.literal_context_map); { int _g15 = 0; int _g4 = distance_histograms.length; while ((_g15 < _g4)) { int i1 = _g15++; mb.distance_histograms[i1] = new global::encode.histogram.Histogram(((int)(global::encode.Histogram_functions.HistogramDistanceInt))); ((global::encode.histogram.Histogram)(mb.distance_histograms[i1])).bit_cost_ = ((global::encode.histogram.Histogram)(distance_histograms[i1])).bit_cost_; { int _g32 = 0; int _g22 = (((int[])(((global::encode.histogram.Histogram)(distance_histograms[i1])).data_)) as global::System.Array).Length; while ((_g32 < _g22)) { int a1 = _g32++; ((int[])(((global::encode.histogram.Histogram)(mb.distance_histograms[i1])).data_))[a1] = ((int[])(((global::encode.histogram.Histogram)(distance_histograms[i1])).data_))[a1]; } } ((global::encode.histogram.Histogram)(mb.distance_histograms[i1])).kDataSize = ((global::encode.histogram.Histogram)(distance_histograms[i1])).kDataSize; ((global::encode.histogram.Histogram)(mb.distance_histograms[i1])).total_count_ = ((global::encode.histogram.Histogram)(distance_histograms[i1])).total_count_; } } mb.distance_context_map = ((int[])(new int[(4 * mb.distance_split.num_types)])); global::encode.Cluster.ClusterHistograms(distance_histograms, 4, mb.distance_split.num_types, 256, mb.distance_histograms, global::encode.Histogram_functions.HistogramDistanceInt, mb.distance_context_map); } }
public static void BuildMetaBlockGreedyWithContexts(uint[] ringbuffer, int pos, int mask, uint prev_byte, uint prev_byte2, int literal_context_mode, int num_contexts, global::Array <int> static_context_map, global::Array <object> commands, int n_commands, global::encode.metablock.MetaBlockSplit mb) { unchecked { int num_literals = 0; { int _g1 = 0; while ((_g1 < n_commands)) { num_literals += ((global::encode.command.Command)(commands[_g1++])).insert_len_; } } global::encode.metablock.ContextBlockSplitter lit_blocks = new global::encode.metablock.ContextBlockSplitter(global::encode.Histogram_functions.HistogramLiteralInt, 256, num_contexts, 512, 400.0, num_literals, mb.literal_split, mb.literal_histograms); global::encode.metablock.BlockSplitter cmd_blocks = new global::encode.metablock.BlockSplitter(global::encode.Histogram_functions.HistogramCommandInt, 704, 1024, 500.0, n_commands, mb.command_split, mb.command_histograms); global::encode.metablock.BlockSplitter dist_blocks = new global::encode.metablock.BlockSplitter(global::encode.Histogram_functions.HistogramDistanceInt, 64, 512, 100.0, n_commands, mb.distance_split, mb.distance_histograms); { int _g11 = 0; while ((_g11 < n_commands)) { global::encode.command.Command cmd = ((global::encode.command.Command)(commands[_g11++])); cmd_blocks.AddSymbol(((int)(cmd.cmd_prefix_[0]))); { int _g3 = 0; int _g2 = cmd.insert_len_; while ((_g3 < _g2)) { ++_g3; uint literal = ((uint)(((uint[])(ringbuffer))[(pos & mask)])); lit_blocks.AddSymbol(((int)(literal)), static_context_map[((int)(global::encode.Context.ContextFunction(prev_byte, prev_byte2, literal_context_mode)))]); prev_byte2 = prev_byte; prev_byte = literal; ++pos; } } pos += cmd.copy_len_; if ((cmd.copy_len_ > 0)) { prev_byte2 = ((uint)(((uint[])(ringbuffer))[((pos - 2) & mask)])); prev_byte = ((uint)(((uint[])(ringbuffer))[((pos - 1) & mask)])); if ((((int)(cmd.cmd_prefix_[0])) >= 128)) { dist_blocks.AddSymbol(((int)(cmd.dist_prefix_[0]))); } } } } lit_blocks.FinishBlock(true); cmd_blocks.FinishBlock(true); dist_blocks.FinishBlock(true); mb.literal_context_map = global::FunctionMalloc.mallocInt((mb.literal_split.num_types << 6)); { int _g12 = 0; int _g = mb.literal_split.num_types; while ((_g12 < _g)) { int i = _g12++; { int _g31 = 0; while ((_g31 < 64)) { int j = _g31++; ((int[])(mb.literal_context_map))[(((i << 6)) + j)] = ((i * num_contexts) + static_context_map[j]); } } } } } }
public static void BuildMetaBlockGreedy(uint[] ringbuffer, int pos, int mask, global::Array <object> commands, int n_commands, global::encode.metablock.MetaBlockSplit mb) { unchecked { int num_literals = 0; { int _g1 = 0; while ((_g1 < n_commands)) { num_literals += ((global::encode.command.Command)(commands[_g1++])).insert_len_; } } global::encode.metablock.BlockSplitter lit_blocks = new global::encode.metablock.BlockSplitter(global::encode.Histogram_functions.HistogramLiteralInt, 256, 512, 400.0, num_literals, mb.literal_split, mb.literal_histograms); global::encode.metablock.BlockSplitter cmd_blocks = new global::encode.metablock.BlockSplitter(global::encode.Histogram_functions.HistogramCommandInt, 704, 1024, 500.0, n_commands, mb.command_split, mb.command_histograms); global::encode.metablock.BlockSplitter dist_blocks = new global::encode.metablock.BlockSplitter(global::encode.Histogram_functions.HistogramDistanceInt, 64, 512, 100.0, n_commands, mb.distance_split, mb.distance_histograms); { int _g11 = 0; while ((_g11 < n_commands)) { global::encode.command.Command cmd = ((global::encode.command.Command)(commands[_g11++])); cmd_blocks.AddSymbol(((int)(cmd.cmd_prefix_[0]))); { int _g3 = 0; int _g2 = cmd.insert_len_; while ((_g3 < _g2)) { ++_g3; lit_blocks.AddSymbol(((int)(((uint)(((uint[])(ringbuffer))[(pos & mask)]))))); ++pos; } } pos += cmd.copy_len_; if (((cmd.copy_len_ > 0) && ((bool)((cmd.cmd_prefix_[0] >= 128))))) { dist_blocks.AddSymbol(((int)(cmd.dist_prefix_[0]))); } } } lit_blocks.FinishBlock(true); cmd_blocks.FinishBlock(true); dist_blocks.FinishBlock(true); } }
public static bool StoreMetaBlock(uint[] input, int start_pos, int length, int mask, uint prev_byte, uint prev_byte2, bool is_last, int num_direct_distance_codes, int distance_postfix_bits, int literal_context_mode, global::Array <object> commands, int n_commands, global::encode.metablock.MetaBlockSplit mb, global::Array <int> storage_ix, uint[] storage) { unchecked { if (!(global::encode.Brotli_bit_stream.StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage))) { return(false); } if ((length == 0)) { global::encode.Brotli_bit_stream.JumpToByteBoundary(storage_ix, storage); return(true); } global::encode.brotli_bit_stream.BlockEncoder literal_enc = new global::encode.brotli_bit_stream.BlockEncoder(256, mb.literal_split.num_types, mb.literal_split.types, mb.literal_split.lengths); global::encode.brotli_bit_stream.BlockEncoder command_enc = new global::encode.brotli_bit_stream.BlockEncoder(704, mb.command_split.num_types, mb.command_split.types, mb.command_split.lengths); global::encode.brotli_bit_stream.BlockEncoder distance_enc = new global::encode.brotli_bit_stream.BlockEncoder(((16 + num_direct_distance_codes) + ((48 << distance_postfix_bits))), mb.distance_split.num_types, mb.distance_split.types, mb.distance_split.lengths); literal_enc.BuildAndStoreBlockSwitchEntropyCodes(storage_ix, storage); command_enc.BuildAndStoreBlockSwitchEntropyCodes(storage_ix, storage); distance_enc.BuildAndStoreBlockSwitchEntropyCodes(storage_ix, storage); global::encode.Write_bits.WriteBits(2, ((uint)(distance_postfix_bits)), storage_ix, storage); global::encode.Write_bits.WriteBits(4, ((uint)((num_direct_distance_codes >> distance_postfix_bits))), storage_ix, storage); { int _g1 = 0; int _g = mb.literal_split.num_types; while ((_g1 < _g)) { ++_g1; global::encode.Write_bits.WriteBits(2, ((uint)(literal_context_mode)), storage_ix, storage); } } if (((((int[])(mb.literal_context_map)) as global::System.Array).Length == 0)) { global::encode.Brotli_bit_stream.StoreTrivialContextMap(mb.literal_histograms.length, 6, storage_ix, storage); } else { global::encode.Brotli_bit_stream.EncodeContextMap(mb.literal_context_map, mb.literal_histograms.length, storage_ix, storage); } if (((((int[])(mb.distance_context_map)) as global::System.Array).Length == 0)) { global::encode.Brotli_bit_stream.StoreTrivialContextMap(mb.distance_histograms.length, 2, storage_ix, storage); } else { global::encode.Brotli_bit_stream.EncodeContextMap(mb.distance_context_map, mb.distance_histograms.length, storage_ix, storage); } literal_enc.BuildAndStoreEntropyCodes(mb.literal_histograms, storage_ix, storage); command_enc.BuildAndStoreEntropyCodes(mb.command_histograms, storage_ix, storage); distance_enc.BuildAndStoreEntropyCodes(mb.distance_histograms, storage_ix, storage); int pos = start_pos; { int _g11 = 0; while ((_g11 < n_commands)) { global::encode.command.Command cmd = ((global::encode.command.Command)(commands[_g11++])); int lennumextra = ((int)(((uint)(((uint)((((uint)(cmd.cmd_extra_[0])) >> 16))))))); global::Array <uint> lenextra = cmd.cmd_extra_; command_enc.StoreSymbol(((int)(cmd.cmd_prefix_[0])), storage_ix, storage); if ((lennumextra >= 32)) { global::encode.Write_bits.WriteBits((lennumextra - 32), lenextra[0], storage_ix, storage); } global::encode.Write_bits.WriteBits((((lennumextra < 32)) ? (lennumextra) : (32)), lenextra[1], storage_ix, storage); if (((((int[])(mb.literal_context_map)) as global::System.Array).Length == 0)) { int _g3 = 0; int _g2 = cmd.insert_len_; while ((_g3 < _g2)) { ++_g3; literal_enc.StoreSymbol(((int)(((uint)(((uint[])(input))[(pos & mask)])))), storage_ix, storage); ++pos; } } else { int _g31 = 0; int _g21 = cmd.insert_len_; while ((_g31 < _g21)) { ++_g31; int literal = ((int)(((uint)(((uint[])(input))[(pos & mask)])))); literal_enc.StoreSymbolWithContext(6, literal, ((int)(global::encode.Context.ContextFunction(prev_byte, prev_byte2, literal_context_mode))), mb.literal_context_map, storage_ix, storage); prev_byte2 = prev_byte; prev_byte = ((uint)(literal)); ++pos; } } pos += cmd.copy_len_; if ((cmd.copy_len_ > 0)) { prev_byte2 = ((uint)(((uint[])(input))[((pos - 2) & mask)])); prev_byte = ((uint)(((uint[])(input))[((pos - 1) & mask)])); if (((bool)((cmd.cmd_prefix_[0] >= 128)))) { int dist_code = ((int)(cmd.dist_prefix_[0])); int distnumextra = ((int)(((uint)(((uint)((((uint)(cmd.dist_extra_[0])) >> 24))))))); int distextra = ((int)(((uint)((cmd.dist_extra_[0] & 16777215))))); if (((((int[])(mb.distance_context_map)) as global::System.Array).Length == 0)) { distance_enc.StoreSymbol(dist_code, storage_ix, storage); } else { distance_enc.StoreSymbolWithContext(2, dist_code, cmd.DistanceContext(), mb.distance_context_map, storage_ix, storage); } global::encode.Write_bits.WriteBits(distnumextra, ((uint)(distextra)), storage_ix, storage); } } } } if (is_last) { global::encode.Brotli_bit_stream.JumpToByteBoundary(storage_ix, storage); } return(true); } }
public virtual bool WriteMetaBlockInternal(bool is_last, bool utf8_mode, global::Array <int> out_size, global::Array <object> output) { unchecked { int bytes = (this.input_pos_ - this.last_flush_pos_); uint[] data = this.ringbuffer_.start(); int mask = this.ringbuffer_.mask(); uint[] storage = this.GetBrotliStorage(((2 * bytes) + 500)); ((uint[])(storage))[0] = this.last_byte_; global::Array <int> storage_ix = new global::Array <int>(new int[] { ((int)(this.last_byte_bits_)) }); bool uncompressed = false; if ((this.num_commands_ < (((bytes >> 8)) + 2))) { if ((this.num_literals_ > (0.99 * bytes))) { int[] literal_histo = global::FunctionMalloc.mallocInt(256); double kBitCostThreshold = ((bytes * 7.92) / 13); int i = this.last_flush_pos_; while ((i < this.input_pos_)) { { uint _g = ((uint)(((uint[])(data))[(i & mask)])); ((int[])(literal_histo))[((int)(_g))] = (((int)(((int[])(literal_histo))[((int)(_g))])) + 1); } i += 13; } if ((global::encode.Bit_cost.BitsEntropy(literal_histo, 0, 256) > kBitCostThreshold)) { uncompressed = true; } } } if ((bytes == 0)) { if (!(global::encode.Brotli_bit_stream.StoreCompressedMetaBlockHeader(is_last, 0, storage_ix, storage))) { return(false); } storage_ix[0] = ((storage_ix[0] + 7) & -8); } else if (uncompressed) { global::DefaultFunctions.memcpy_Int(this.dist_cache_, 0, this.saved_dist_cache_, 0, (((int[])(this.dist_cache_)) as global::System.Array).Length); if (!(global::encode.Brotli_bit_stream.StoreUncompressedMetaBlock(is_last, data, this.last_flush_pos_, mask, bytes, storage_ix, storage, 0))) { return(false); } } else { int num_direct_distance_codes = 0; int distance_postfix_bits = 0; if (((this.params_.quality > 9) && (this.params_.mode == ((int)(2))))) { num_direct_distance_codes = 12; distance_postfix_bits = 1; global::encode.Encode.RecomputeDistancePrefixes(this.commands_, this.num_commands_, 12, 1); } if ((this.params_.quality < global::encode.Encode.kMinQualityForBlockSplit)) { if (!(global::encode.Brotli_bit_stream.StoreMetaBlockTrivial(data, this.last_flush_pos_, bytes, mask, is_last, this.commands_, this.num_commands_, storage_ix, storage, 0))) { return(false); } } else { global::encode.metablock.MetaBlockSplit mb = new global::encode.metablock.MetaBlockSplit(); global::Array <int> literal_context_mode = new global::Array <int>(new int[] { ((utf8_mode) ? (2) : (3)) }); if ((this.params_.quality <= 9)) { global::Array <int> num_literal_contexts = new global::Array <int>(new int[] { 1 }); global::Array <object> literal_context_map = new global::Array <object>(new object[] { new global::Array <int>(new int[] { -1 }) }); global::encode.Encode.DecideOverLiteralContextModeling(data, this.last_flush_pos_, bytes, mask, this.params_.quality, literal_context_mode, num_literal_contexts, literal_context_map); if ((((global::Array <int>)(global::Array <object> .__hx_cast <int>(((global::Array)(literal_context_map[0])))))[0] == -1)) { global::encode.Metablock.BuildMetaBlockGreedy(data, this.last_flush_pos_, mask, this.commands_, this.num_commands_, mb); } else { global::encode.Metablock.BuildMetaBlockGreedyWithContexts(data, this.last_flush_pos_, mask, this.prev_byte_, this.prev_byte2_, literal_context_mode[0], num_literal_contexts[0], ((global::Array <int>)(global::Array <object> .__hx_cast <int>(((global::Array)(literal_context_map[0]))))), this.commands_, this.num_commands_, mb); } } else { global::encode.Metablock.BuildMetaBlock(data, this.last_flush_pos_, mask, this.prev_byte_, this.prev_byte2_, this.commands_, this.num_commands_, literal_context_mode[0], mb); } if ((this.params_.quality >= global::encode.Encode.kMinQualityForOptimizeHistograms)) { global::encode.Metablock.OptimizeHistograms(num_direct_distance_codes, distance_postfix_bits, mb); } if (!(global::encode.Brotli_bit_stream.StoreMetaBlock(data, this.last_flush_pos_, bytes, mask, this.prev_byte_, this.prev_byte2_, is_last, num_direct_distance_codes, distance_postfix_bits, literal_context_mode[0], this.commands_, this.num_commands_, mb, storage_ix, storage))) { return(false); } } if (((bytes + 4) < (storage_ix[0] >> 3))) { global::DefaultFunctions.memcpy_Int(this.dist_cache_, 0, this.saved_dist_cache_, 0, (((int[])(this.dist_cache_)) as global::System.Array).Length); ((uint[])(storage))[0] = this.last_byte_; storage_ix[0] = ((int)(this.last_byte_bits_)); if (!(global::encode.Brotli_bit_stream.StoreUncompressedMetaBlock(is_last, data, this.last_flush_pos_, mask, bytes, storage_ix, storage, 0))) { return(false); } } } this.last_byte_ = ((uint)(((uint[])(storage))[(storage_ix[0] >> 3)])); this.last_byte_bits_ = ((uint)((storage_ix[0] & 7))); this.last_flush_pos_ = this.input_pos_; this.last_processed_pos_ = this.input_pos_; this.prev_byte_ = ((uint[])(data))[((this.last_flush_pos_ - 1) & mask)]; this.prev_byte2_ = ((uint[])(data))[((this.last_flush_pos_ - 2) & mask)]; this.num_commands_ = 0; this.num_literals_ = 0; global::DefaultFunctions.memcpy_Int(this.saved_dist_cache_, 0, this.dist_cache_, 0, (((int[])(this.dist_cache_)) as global::System.Array).Length); output[0] = storage; out_size[0] = (storage_ix[0] >> 3); return(true); } }