All Downloads are FREE. Search and download functionalities are using the official Maven repository.

SevenZip.Compression.RangeCoder.Decoder Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2016-2022 Deephaven Data Labs and Patent Pending
 */
package SevenZip.Compression.RangeCoder;

import java.io.IOException;

public class Decoder {
    static final int kTopMask = ~((1 << 24) - 1);

    static final int kNumBitModelTotalBits = 11;
    static final int kBitModelTotal = (1 << kNumBitModelTotalBits);
    static final int kNumMoveBits = 5;

    int Range;
    int Code;

    java.io.InputStream Stream;

    public final void SetStream(java.io.InputStream stream) {
        Stream = stream;
    }

    public final void ReleaseStream() {
        Stream = null;
    }

    public final void Init() throws IOException {
        Code = 0;
        Range = -1;
        for (int i = 0; i < 5; i++)
            Code = (Code << 8) | Stream.read();
    }

    public final int DecodeDirectBits(int numTotalBits) throws IOException {
        int result = 0;
        for (int i = numTotalBits; i != 0; i--) {
            Range >>>= 1;
            int t = ((Code - Range) >>> 31);
            Code -= Range & (t - 1);
            result = (result << 1) | (1 - t);

            if ((Range & kTopMask) == 0) {
                Code = (Code << 8) | Stream.read();
                Range <<= 8;
            }
        }
        return result;
    }

    public int DecodeBit(short[] probs, int index) throws IOException {
        int prob = probs[index];
        int newBound = (Range >>> kNumBitModelTotalBits) * prob;
        if ((Code ^ 0x80000000) < (newBound ^ 0x80000000)) {
            Range = newBound;
            probs[index] = (short) (prob + ((kBitModelTotal - prob) >>> kNumMoveBits));
            if ((Range & kTopMask) == 0) {
                Code = (Code << 8) | Stream.read();
                Range <<= 8;
            }
            return 0;
        } else {
            Range -= newBound;
            Code -= newBound;
            probs[index] = (short) (prob - ((prob) >>> kNumMoveBits));
            if ((Range & kTopMask) == 0) {
                Code = (Code << 8) | Stream.read();
                Range <<= 8;
            }
            return 1;
        }
    }

    public static void InitBitModels(short[] probs) {
        for (int i = 0; i < probs.length; i++)
            probs[i] = (kBitModelTotal >>> 1);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy