📄 jpxstream.h
字号:
//========================================================================//// JPXStream.h//// Copyright 2002-2003 Glyph & Cog, LLC////========================================================================#ifndef JPXSTREAM_H#define JPXSTREAM_H#include <aconf.h>#ifdef USE_GCC_PRAGMAS#pragma interface#endif#include "gtypes.h"#include "Object.h"#include "Stream.h"class JArithmeticDecoder;class JArithmeticDecoderStats;//------------------------------------------------------------------------enum JPXColorSpaceType { jpxCSBiLevel = 0, jpxCSYCbCr1 = 1, jpxCSYCbCr2 = 3, jpxCSYCBCr3 = 4, jpxCSPhotoYCC = 9, jpxCSCMY = 11, jpxCSCMYK = 12, jpxCSYCCK = 13, jpxCSCIELab = 14, jpxCSsRGB = 16, jpxCSGrayscale = 17, jpxCSBiLevel2 = 18, jpxCSCIEJab = 19, jpxCSCISesRGB = 20, jpxCSROMMRGB = 21, jpxCSsRGBYCbCr = 22, jpxCSYPbPr1125 = 23, jpxCSYPbPr1250 = 24};struct JPXColorSpecCIELab { Guint rl, ol, ra, oa, rb, ob, il;};struct JPXColorSpecEnumerated { JPXColorSpaceType type; // color space type union { JPXColorSpecCIELab cieLab; };};struct JPXColorSpec { Guint meth; // method int prec; // precedence union { JPXColorSpecEnumerated enumerated; };};//------------------------------------------------------------------------struct JPXPalette { Guint nEntries; // number of entries in the palette Guint nComps; // number of components in each entry Guint *bpc; // bits per component, for each component int *c; // color data: // c[i*nComps+j] = entry i, component j};//------------------------------------------------------------------------struct JPXCompMap { Guint nChannels; // number of channels Guint *comp; // codestream components mapped to each channel Guint *type; // 0 for direct use, 1 for palette mapping Guint *pComp; // palette components to use};//------------------------------------------------------------------------struct JPXChannelDefn { Guint nChannels; // number of channels Guint *idx; // channel indexes Guint *type; // channel types Guint *assoc; // channel associations};//------------------------------------------------------------------------struct JPXTagTreeNode { GBool finished; // true if this node is finished Guint val; // current value};//------------------------------------------------------------------------struct JPXCoeff { Gushort flags; // flag bits Gushort len; // number of significant bits in mag Guint mag; // magnitude value};// coefficient flags#define jpxCoeffSignificantB 0#define jpxCoeffTouchedB 1#define jpxCoeffFirstMagRefB 2#define jpxCoeffSignB 7#define jpxCoeffSignificant (1 << jpxCoeffSignificantB)#define jpxCoeffTouched (1 << jpxCoeffTouchedB)#define jpxCoeffFirstMagRef (1 << jpxCoeffFirstMagRefB)#define jpxCoeffSign (1 << jpxCoeffSignB)//------------------------------------------------------------------------struct JPXCodeBlock { //----- size Guint x0, y0, x1, y1; // bounds //----- persistent state GBool seen; // true if this code-block has already // been seen Guint lBlock; // base number of bits used for pkt data length Guint nextPass; // next coding pass //---- info from first packet Guint nZeroBitPlanes; // number of zero bit planes //----- info for the current packet Guint included; // code-block inclusion in this packet: // 0=not included, 1=included Guint nCodingPasses; // number of coding passes in this pkt Guint dataLen; // pkt data length //----- coefficient data JPXCoeff *coeffs; // the coefficients JArithmeticDecoder // arithmetic decoder *arithDecoder; JArithmeticDecoderStats // arithmetic decoder stats *stats;};//------------------------------------------------------------------------struct JPXSubband { //----- computed Guint x0, y0, x1, y1; // bounds Guint nXCBs, nYCBs; // number of code-blocks in the x and y // directions //----- tag trees Guint maxTTLevel; // max tag tree level JPXTagTreeNode *inclusion; // inclusion tag tree for each subband JPXTagTreeNode *zeroBitPlane; // zero-bit plane tag tree for each // subband //----- children JPXCodeBlock *cbs; // the code-blocks (len = nXCBs * nYCBs)};//------------------------------------------------------------------------struct JPXPrecinct { //----- computed Guint x0, y0, x1, y1; // bounds of the precinct //----- children JPXSubband *subbands; // the subbands};//------------------------------------------------------------------------struct JPXResLevel { //----- from the COD and COC segments (main and tile) Guint precinctWidth; // log2(precinct width) Guint precinctHeight; // log2(precinct height) //----- computed Guint x0, y0, x1, y1; // bounds of the tile-comp (for this res level) Guint bx0[3], by0[3], // subband bounds bx1[3], by1[3]; //---- children JPXPrecinct *precincts; // the precincts};//------------------------------------------------------------------------struct JPXTileComp { //----- from the SIZ segment GBool sgned; // 1 for signed, 0 for unsigned Guint prec; // precision, in bits Guint hSep; // horizontal separation of samples Guint vSep; // vertical separation of samples //----- from the COD and COC segments (main and tile) Guint style; // coding style parameter (Scod / Scoc) Guint nDecompLevels; // number of decomposition levels Guint codeBlockW; // log2(code-block width) Guint codeBlockH; // log2(code-block height) Guint codeBlockStyle; // code-block style Guint transform; // wavelet transformation //----- from the QCD and QCC segments (main and tile) Guint quantStyle; // quantization style Guint *quantSteps; // quantization step size for each subband Guint nQuantSteps; // number of entries in quantSteps //----- computed Guint x0, y0, x1, y1; // bounds of the tile-comp, in ref coords Guint cbW; // code-block width Guint cbH; // code-block height //----- image data int *data; // the decoded image data int *buf; // intermediate buffer for the inverse // transform //----- children JPXResLevel *resLevels; // the resolution levels // (len = nDecompLevels + 1)};//------------------------------------------------------------------------struct JPXTile { //----- from the COD segments (main and tile) Guint progOrder; // progression order Guint nLayers; // number of layers Guint multiComp; // multiple component transformation //----- computed Guint x0, y0, x1, y1; // bounds of the tile, in ref coords Guint maxNDecompLevels; // max number of decomposition levels used // in any component in this tile //----- progression order loop counters Guint comp; // component Guint res; // resolution level Guint precinct; // precinct Guint layer; // layer //----- children JPXTileComp *tileComps; // the tile-components (len = JPXImage.nComps)};//------------------------------------------------------------------------struct JPXImage { //----- from the SIZ segment Guint xSize, ySize; // size of reference grid Guint xOffset, yOffset; // image offset Guint xTileSize, yTileSize; // size of tiles Guint xTileOffset, // offset of first tile yTileOffset; Guint nComps; // number of components //----- computed Guint nXTiles; // number of tiles in x direction Guint nYTiles; // number of tiles in y direction //----- children JPXTile *tiles; // the tiles (len = nXTiles * nYTiles)};//------------------------------------------------------------------------class JPXStream: public FilterStream {public: JPXStream(Stream *strA); virtual ~JPXStream(); virtual StreamKind getKind() { return strJPX; } virtual void reset(); virtual void close(); virtual int getChar(); virtual int lookChar(); virtual GString *getPSFilter(int psLevel, char *indent); virtual GBool isBinary(GBool last = gTrue); virtual void getImageParams(int *bitsPerComponent, StreamColorSpaceMode *csMode);private: void fillReadBuf(); void getImageParams2(int *bitsPerComponent, StreamColorSpaceMode *csMode); GBool readBoxes(); GBool readColorSpecBox(Guint dataLen); GBool readCodestream(Guint len); GBool readTilePart(); GBool readTilePartData(Guint tileIdx, Guint tilePartLen, GBool tilePartToEOC); GBool readCodeBlockData(JPXTileComp *tileComp, JPXResLevel *resLevel, JPXPrecinct *precinct, JPXSubband *subband, Guint res, Guint sb, JPXCodeBlock *cb); void inverseTransform(JPXTileComp *tileComp); void inverseTransformLevel(JPXTileComp *tileComp, Guint r, JPXResLevel *resLevel, Guint nx0, Guint ny0, Guint nx1, Guint ny1); void inverseTransform1D(JPXTileComp *tileComp, int *data, Guint stride, Guint i0, Guint i1); GBool inverseMultiCompAndDC(JPXTile *tile); GBool readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen); int readMarkerHdr(int *segType, Guint *segLen); GBool readUByte(Guint *x); GBool readByte(int *x); GBool readUWord(Guint *x); GBool readULong(Guint *x); GBool readNBytes(int nBytes, GBool signd, int *x); GBool readBits(int nBits, Guint *x); void startBitBuf(Guint byteCountA); Guint finishBitBuf(); Guint nComps; // number of components Guint *bpc; // bits per component, for each component Guint width, height; // image size GBool haveImgHdr; // set if a JP2/JPX image header has been // found JPXColorSpec cs; // color specification GBool haveCS; // set if a color spec has been found JPXPalette palette; // the palette GBool havePalette; // set if a palette has been found JPXCompMap compMap; // the component mapping GBool haveCompMap; // set if a component mapping has been found JPXChannelDefn channelDefn; // channel definition GBool haveChannelDefn; // set if a channel defn has been found JPXImage img; // JPEG2000 decoder data Guint bitBuf; // buffer for bit reads int bitBufLen; // number of bits in bitBuf GBool bitBufSkip; // true if next bit should be skipped // (for bit stuffing) Guint byteCount; // number of available bytes left Guint curX, curY, curComp; // current position for lookChar/getChar Guint readBuf; // read buffer Guint readBufLen; // number of valid bits in readBuf};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -