Spaces:
Runtime error
Runtime error
| //======================================================================== | |
| // | |
| // JArithmeticDecoder.h | |
| // | |
| // Arithmetic decoder used by the JBIG2 and JPEG2000 decoders. | |
| // | |
| // Copyright 2002-2004 Glyph & Cog, LLC | |
| // | |
| //======================================================================== | |
| //======================================================================== | |
| // | |
| // Modified under the Poppler project - http://poppler.freedesktop.org | |
| // | |
| // All changes made under the Poppler project to this file are licensed | |
| // under GPL version 2 or later | |
| // | |
| // Copyright (C) 2018, 2021 Albert Astals Cid <aacid@kde.org> | |
| // Copyright (C) 2019 Volker Krause <vkrause@kde.org> | |
| // Copyright (C) 2020 Even Rouault <even.rouault@spatialys.com> | |
| // | |
| // To see a description of the changes please see the Changelog file that | |
| // came with your tarball or type make ChangeLog if you are building from git | |
| // | |
| //======================================================================== | |
| class Stream; | |
| //------------------------------------------------------------------------ | |
| // JArithmeticDecoderStats | |
| //------------------------------------------------------------------------ | |
| class JArithmeticDecoderStats | |
| { | |
| public: | |
| explicit JArithmeticDecoderStats(int contextSizeA); | |
| ~JArithmeticDecoderStats(); | |
| JArithmeticDecoderStats(const JArithmeticDecoderStats &) = delete; | |
| JArithmeticDecoderStats &operator=(const JArithmeticDecoderStats &) = delete; | |
| JArithmeticDecoderStats *copy(); | |
| void reset(); | |
| int getContextSize() { return contextSize; } | |
| void copyFrom(JArithmeticDecoderStats *stats); | |
| void setEntry(unsigned int cx, int i, int mps); | |
| bool isValid() const { return cxTab != nullptr; } | |
| private: | |
| unsigned char *cxTab; // cxTab[cx] = (i[cx] << 1) + mps[cx] | |
| int contextSize; | |
| friend class JArithmeticDecoder; | |
| }; | |
| //------------------------------------------------------------------------ | |
| // JArithmeticDecoder | |
| //------------------------------------------------------------------------ | |
| class JArithmeticDecoder | |
| { | |
| public: | |
| JArithmeticDecoder(); | |
| ~JArithmeticDecoder(); | |
| JArithmeticDecoder(const JArithmeticDecoder &) = delete; | |
| JArithmeticDecoder &operator=(const JArithmeticDecoder &) = delete; | |
| void setStream(Stream *strA) | |
| { | |
| str = strA; | |
| dataLen = 0; | |
| limitStream = false; | |
| } | |
| void setStream(Stream *strA, int dataLenA) | |
| { | |
| str = strA; | |
| dataLen = dataLenA; | |
| limitStream = true; | |
| } | |
| // Start decoding on a new stream. This fills the byte buffers and | |
| // runs INITDEC. | |
| void start(); | |
| // Restart decoding on an interrupted stream. This refills the | |
| // buffers if needed, but does not run INITDEC. (This is used in | |
| // JPEG 2000 streams when codeblock data is split across multiple | |
| // packets/layers.) | |
| void restart(int dataLenA); | |
| // Read any leftover data in the stream. | |
| void cleanup(); | |
| // Decode one bit. | |
| int decodeBit(unsigned int context, JArithmeticDecoderStats *stats); | |
| // Decode eight bits. | |
| int decodeByte(unsigned int context, JArithmeticDecoderStats *stats); | |
| // Returns false for OOB, otherwise sets *<x> and returns true. | |
| bool decodeInt(int *x, JArithmeticDecoderStats *stats); | |
| unsigned int decodeIAID(unsigned int codeLen, JArithmeticDecoderStats *stats); | |
| void resetByteCounter() { nBytesRead = 0; } | |
| unsigned int getByteCounter() { return nBytesRead; } | |
| private: | |
| unsigned int readByte(); | |
| int decodeIntBit(JArithmeticDecoderStats *stats); | |
| void byteIn(); | |
| static const unsigned int qeTab[47]; | |
| static const int nmpsTab[47]; | |
| static const int nlpsTab[47]; | |
| static const int switchTab[47]; | |
| unsigned int buf0, buf1; | |
| unsigned int c, a; | |
| int ct; | |
| unsigned int prev; // for the integer decoder | |
| Stream *str; | |
| unsigned int nBytesRead; | |
| int dataLen; | |
| bool limitStream; | |
| }; | |