www.pudn.com > xiaobo.zip.zip > coder.h


#ifndef CODER_H 
#define CODER_H 
 
/*** 
 
***/ 
 
#include  
 
#define arithBit	arithEncBitRaw 
#define arithGetBit	arithDecBitRaw 
 
typedef struct _image image; 
typedef struct _coder coder; 
typedef struct _quantInfo quantInfo; 
typedef struct _wavelet wavelet; 
typedef struct _subband subband; 
typedef struct _subband_leaf subband_leaf; 
 
typedef void (*coder_init) (void *); 
typedef void (*coder_free) (void *); 
typedef void (*coder_encodeBand) (void *,int *,int,int,int,int *); 
typedef void (*coder_decodeBand) (void *,int *,int,int,int,int *); 
typedef void (*coder_flush) (void *); 
typedef void (*coder_encodeBandBP) (void *,int *,int,int,int,int *,int); 
typedef void (*coder_decodeBandBP) (void *,int *,int,int,int,int *,int); 
typedef void (*coder_encodeBandZT) (void *,int *,int,int,int,int,int **); 
typedef void (*coder_decodeBandZT) (void *,int *,int,int,int,int,int **); 
typedef void (*coder_encodeSubbandBP) (void *,subband_leaf *,int); 
typedef void (*coder_decodeSubbandBP) (void *,subband_leaf *,int); 
 
struct _wavelet { 
	int complen,levels; 
	int width,height,planes; 
	int stoplen,stopline; 
	const coder * coder_template; 
	ubyte * comp; 
	image *im; 
 
	/* these are not necessarily set up if you did not use 
	*	the wavelet to do the quantizing and transforming 
	**/ 
 
	quantInfo *qi; 
	int transform; 
	subband *subband_root; 
}; 
 
typedef struct _coder { 
	const char * name; 
	coder_init init; 
	coder_free free; 
 
		/** one family of pairs must be provided : **/ 
	coder_encodeBand encodeBand; 
	coder_decodeBand decodeBand; 
	coder_encodeBandBP encodeBandBP;	 
	coder_decodeBandBP decodeBandBP; 
	coder_encodeBandZT encodeBandZT;	 
	coder_decodeBandZT decodeBandZT; 
	coder_encodeSubbandBP encodeSubbandBP;	 
	coder_decodeSubbandBP decodeSubbandBP; 
 
	coder_flush flush;	/** optional ; set to null if you need no flushing **/ 
	void * data;	/** setup by init, killed by free **/ 
 
	arithInfo * arith;	/** controlled by the global coder routines **/ 
	wavelet *w; 
} coder; 
 
extern wavelet * newWavelet(const image *template,int levels); 
extern void freeWavelet(wavelet *w); 
extern void waveletRealloc(wavelet *w);	// call after complen is set correctly 
 
extern coder * coder_create_write(const coder *template,wavelet *w,int stoplen); 
extern coder * coder_create_read( wavelet *w); 
extern void coder_flush_write(coder *); 
extern void coder_flush_read(coder *); 
extern void coder_destroy(coder *); 
 
#define coder_getpos(c)			arithTellEncPos(c->arith) 
#define coder_getposd(c)		arithTellDecPos(c->arith) 
#define coder_timetostop(c)		( coder_getpos(c)  >= (c)->w->stoplen ) 
#define coder_timetostopd(c,y)	( coder_getposd(c) >= (c)->w->stoplen ) 
//#define coder_timetostopd(c,y)	( ( coder_getposd(c) >= (c)->w->stoplen && ((y) == (c)->w->stopline) ) || ( (coder_getposd(c)) >= (c)->w->stoplen && (y) == 0 ) ) 
#define coder_didstop(c,y)		do { if ( (c)->w->stopline < 0 ) (c)->w->stopline = y; } while(0); 
	/** getposd makes sure we're in the same band, but isn't reliable for picking the 
	** right line because of the hidden 4 bytes in the arithcoder state variables 
	**	we need the 'or' in later bands (if we stop before the last) 
	***/ 
 
extern void coder_encodeDPCM(coder *c,int *plane,int width,int height,int rowpad); 
extern void coder_decodeDPCM(coder *c,int *plane,int width,int height,int rowpad); 
 
// some order -1 routines for your convenience: 
 
extern void encode_m1(arithInfo * ari,int sym); 
extern int  decode_m1(arithInfo *ari); 
 
/**** zero tree flags : *****/ 
 
#define BASE_SHIFT				29 
#define FLAG_ISOLATED_ZERO		(1<<(BASE_SHIFT)) 
#define FLAG_CHILD_ZERO			(1<<(BASE_SHIFT-1)) 
#define FLAG_ALREADY_DECODED	FLAG_CHILD_ZERO 
#define CODE_MAX_BPN			(BASE_SHIFT-2) 
#define CODE_MAX_VAL			(1<