JArithmeticDecoder.h [plain text]
#ifndef JARITHMETICDECODER_H
#define JARITHMETICDECODER_H
#include <config.h>
#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif
#include "gtypes.h"
class Stream;
class JArithmeticDecoderStats {
public:
JArithmeticDecoderStats(int contextSizeA);
~JArithmeticDecoderStats();
JArithmeticDecoderStats *copy();
void reset();
int getContextSize() { return contextSize; }
void copyFrom(JArithmeticDecoderStats *stats);
void setEntry(Guint cx, int i, int mps);
private:
Guchar *cxTab; int contextSize;
friend class JArithmeticDecoder;
};
class JArithmeticDecoder {
public:
JArithmeticDecoder();
~JArithmeticDecoder();
void setStream(Stream *strA)
{ str = strA; dataLen = 0; limitStream = gFalse; }
void setStream(Stream *strA, int dataLenA)
{ str = strA; dataLen = dataLenA; limitStream = gTrue; }
void start();
void restart(int dataLenA);
void cleanup();
int decodeBit(Guint context, JArithmeticDecoderStats *stats);
int decodeByte(Guint context, JArithmeticDecoderStats *stats);
GBool decodeInt(int *x, JArithmeticDecoderStats *stats);
Guint decodeIAID(Guint codeLen,
JArithmeticDecoderStats *stats);
private:
Guint readByte();
int decodeIntBit(JArithmeticDecoderStats *stats);
void byteIn();
static Guint qeTab[47];
static int nmpsTab[47];
static int nlpsTab[47];
static int switchTab[47];
Guint buf0, buf1;
Guint c, a;
int ct;
Guint prev;
Stream *str;
int dataLen;
GBool limitStream;
};
#endif