Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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_);
                    }
                }
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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]);
                            }
                        }
                    }
                }
            }
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
        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);
            }
        }