You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
352 lines
10 KiB
352 lines
10 KiB
15 years ago
|
//========================================================================
|
||
|
//
|
||
|
// 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
|