亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ezw.c

?? VC小波應用 視頻編碼播放 EZW2 WAVLETS TRANSFORMER
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
/* EZW2 - Embedded Zerotree Wavelet Coder
 * 
 * Author : Mow-Song, Ng
 * Data   : 20-07-2002
 *
 * Last update : 31-08-2002
 *
 * A large portion/idea of the codes come from:
 * C. Valens - Embedded Zerotree Wavelet Encoder Tutorial.
 * G. Davis - Baseline Wavelet Transform Coder Construction Kit
 *
 * The authors copyrights to the codes are acknowledged.
 * The EZW coder is patented by Jerome Shapiro. As far as I know, these are
 * the patent numbers 
 * 5315670 (Issued May 24, 1994), 5321776 (Issued June 14, 1994) and 
 * 5412741 (Issued May 2, 1995).
 *
 *
 * Well, I wrote the coder with some one else codes, add some lines, remove 
 * some lines, sometimes just verbatim. Any way, if you feel that I am worth
 * the acknowledgement, please do so, or perhaps drop me an e-mail.
 *
 * Please refer to my website for more info.
 *
 * My contact:
 * msng@mmu.edu.my
 * http://www.pesona.mmu.edu.my/~msng
 *
 */
/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	

#include "ezw.h"

/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
void EZW2Encode(WTRANSFORM *transform, ArithEncoder *encoder, 
					 int threshold, int HistoCount, int ByteBudget, 
					 int ScanOrder);

void EZW2BuildZerotreeMap(WTRANSFORM *transform, SubbandSymbol *ztmap);

void EncodeDominantPassMortonScan(DLNode *DomList, SLNode *SubList,
											 int *SubListSize, WTRANSFORM *transform, 
											 MAP *map, int threshold, 
											 ArithEncoder *encoder, 
											 BasicCoder **DominantPassCoder, 
											 SubbandSymbol *ztmap, int ByteBudget);

void EncodeNode(SLNode *SubList, int *SubListSize, WTRANSFORM *transform, 
					 DLNode *node, SubbandSymbol *ztmap, int threshold);

void EncodeSubordinatePass(SLNode *SubList, int SubListSize, int threshold, 
							ArithEncoder *encoder, BasicCoder *SubordinateListCoder, 
							int ByteBudget);

void EZW2Error(char *fmt, ...);
void EZW2Warning(char *fmt, ...);

/* termination flag */
Boolean EndEncoding;

/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
void main(int argc, char **argv)
{
	FIMAGE *InputImage, *DecomposeImage;
   WAVELET *wavelet;
	WTRANSFORM *transform;
	char InputImageFileName[_MAX_PATH];
	char DecomposeImageFileName[_MAX_PATH];
	char EncodeImageFileName[_MAX_PATH];
	int NScale;
	int ByteBudget;
	Boolean KeepDecompose = FALSE;
	Boolean EncodeFileNameSpecify = FALSE;
	ArithEncoder *encoder;
	BIT_FILE *EncodeStream;
	float AbsMaxCoeff;
	float ImageMean;
	int Threshold;
	int i, j;
	int MaxHistogramCount;
	int *bin, nbin;
	int total;
	double TargetBitRate;
	char *ProgramName, *InputImageName;
	int WaveletIndex;
	FILTERSET *Filter[16];
	int ScanOrder;
	double t1;
	
	EndEncoding = FALSE;

	fprintf(stdout, "Embedded Zerotree Wavelet Coder - EZW2 (Encoder)\n");
	
	InitializeFilterSets();
	/* Initialize the filters used */
	Filter[0] = Antonini;
	Filter[1] = Adelson;
	Filter[2] = Odegard;
	Filter[3] = Villa1810;
	Filter[4] = Brislawn;
	Filter[5] = Brislawn2;
	Filter[6] = Haar;
	Filter[7] = Daub4;
	Filter[8] = Daub6;
	Filter[9] = Daub8;
	Filter[10] = Villa1;
	Filter[11] = Villa2;
	Filter[12] = Villa3;
	Filter[13] = Villa4;
	Filter[14] = Villa5;
	Filter[15] = Villa6;
	
	ProgramName = argv[0];
	/* default settings */
	NScale = 6;
	TargetBitRate = 0.25;
	MaxHistogramCount = 256;
	WaveletIndex = 0;
	ScanOrder = 0;

	if (argc<3){
      fprintf(stderr, "Usage: %s [image] [bitrate]\n", ProgramName);
		fprintf(stderr, "\t -l <number of levels>\n");
		fprintf(stderr, "\t -w <wavelet>\n");
		fprintf(stderr, "\t     0 =Antonini 1 =Adelson   2 =Odegard 3 =Villa1810\n");
		fprintf(stderr, "\t     4 =Brislawn 5 =Brislawn2 6 =Haar    7 =Daub4\n");
		fprintf(stderr, "\t     8 =Daub6    9 =Daub8     10=Villa1  11=Villa2\n");
		fprintf(stderr, "\t     12=Villa3   13=Villa4    14=Villa5  15=Villa6\n");
		fprintf(stderr, "\t -h <maximum histogram count>\n");
		fprintf(stderr, "\t -e <encode filename>\n");
		fprintf(stderr, "\t -k  keep decompose image\n");
		//fprintf(stderr, "\t -s <scan order>\n");
		//fprintf(stderr, "\t     0=Morton/1=Raster\n");
      return;
	}

	InputImageName = argv[1];
   TargetBitRate  = atof(argv[2]);
   argv+=3; argc-=3;

	while (argc > 0){
      if (!strcmp("-l", *argv)){
			argv++; argc--;
			NScale = atoi(*argv);
			argv++; argc--;
      } 
		else if (!strcmp("-h", *argv)){
			argv++; argc--;
			MaxHistogramCount = atoi(*argv);
			argv++; argc--;
		}
		else if (!strcmp("-w", *argv)){
			argv++; argc--;
			WaveletIndex = atoi(*argv);
			if (WaveletIndex<0 || WaveletIndex > 15){
				WaveletIndex = 0;
			}
			argv++; argc--;
		}
		else if (!strcmp("-e", *argv)){
			argv++; argc--;
			sprintf(EncodeImageFileName, "%s.ezw", *argv);
			EncodeFileNameSpecify = TRUE;
			argv++; argc--; 
		}
		else if (!strcmp("-k", *argv)){
			argv++; argc--;
			KeepDecompose = TRUE;
		}
		/*
		else if (!strcmp("-s", *argv)){
			argv++; argc--;
			ScanOrder = atoi(*argv);
			if (ScanOrder<0 || ScanOrder > 1){
				ScanOrder = 0;
			}
			argv++; argc--;
		}
		*/
		else{
			fprintf(stderr, "Invalid arguement %s\n", *argv);
			fprintf(stderr, "Usage: %s [image] [bitrate]\n", ProgramName);
			fprintf(stderr, "\t -l <number of levels>\n");
			fprintf(stderr, "\t -w <wavelet>\n");
			fprintf(stderr, "\t     0 =Antonini 1 =Adelson   2 =Odegard 3 =Villa1810\n");
			fprintf(stderr, "\t     4 =Brislawn 5 =Brislawn2 6 =Haar    7 =Daub4\n");
			fprintf(stderr, "\t     8 =Daub6    9 =Daub8     10=Villa1  11=Villa2\n");
			fprintf(stderr, "\t     12=Villa3   13=Villa4    14=Villa5  15=Villa6\n");
			fprintf(stderr, "\t -h <maximum histogram count>\n");
			fprintf(stderr, "\t -e <encoded filename>\n");
			fprintf(stderr, "\t -k  keep decompose image\n");
			//fprintf(stderr, "\t -s <scan order>\n");
			//fprintf(stderr, "\t     0=Morton/1=Raster\n");
			return;
		}
	}
      	
	/* build filenames */
	sprintf(InputImageFileName, "%s.pgm", InputImageName);
	sprintf(DecomposeImageFileName, "%s_%d_%s.decompose.pgm", 
		InputImageName, NScale, FilterName[WaveletIndex]);
	
	if(!EncodeFileNameSpecify){
		sprintf(EncodeImageFileName, "%s_%.6f_%d_%s_%d_%d.ezw", InputImageName, 
			TargetBitRate, NScale, FilterName[WaveletIndex], 
			MaxHistogramCount, ScanOrder);
	}

	/* read data */
	if ((InputImage = ReadPGMToFloat(InputImageFileName))==NULL){
		fprintf(stderr, "Fail to read input image: %s\n", InputImageFileName);
		exit(-1);
	}
	
	if ((InputImage->xsize>>NScale)<<NScale != InputImage->xsize || 
		(InputImage->ysize>>NScale)<<NScale != InputImage->ysize){
		EZW2Error("Image size is not consistent with number of scales.\n");
	}

	/* get image mean */
	ImageMean = 0.0;
	for (i=0; i<InputImage->xsize*InputImage->ysize; i++){
		ImageMean += (float)InputImage->pixelLinear[i];
	}
	ImageMean /=(InputImage->xsize*InputImage->ysize);

	/* subtract mean */
	for (i=0; i<InputImage->xsize*InputImage->ysize; i++){
		InputImage->pixelLinear[i] -=ImageMean;
	}

	/* initialize wavelet filter */
	wavelet = WaveletAlloc(Filter[WaveletIndex]);

	/* transform */
	transform = WaveletTransformAlloc(wavelet, InputImage, NScale, -1);
	
	/* decompose image */
	if (KeepDecompose){
		DecomposeImage = WaveletTransformCodeCoeff(transform, 1);
		WriteFloatToPGM(DecomposeImage, DecomposeImageFileName);
		FImageFree(DecomposeImage);
	}

	fprintf(stdout, "Original Image: %s\nEncoded Image : %s\n", 
		InputImageFileName, EncodeImageFileName);
	fprintf(stdout, "Width: %d   Height: %d   ", 
		InputImage->xsize, InputImage->ysize);
	fprintf(stdout, "Mean : %.3f   ", ImageMean);
	
	/* compute the byte budget */
	ByteBudget = (int)(InputImage->xsize*InputImage->ysize*TargetBitRate / 8.0);
	fprintf(stdout, "Bytes: %d (%.5fbpp)\n", ByteBudget, TargetBitRate);
	
	/* get largest magnitude coefficient */
	AbsMaxCoeff = -1.0;
	for (i=0; i<transform->vsize*transform->hsize; i++){
		if (fabs(transform->value[i]) > AbsMaxCoeff){
			AbsMaxCoeff = (float)fabs(transform->value[i]);
		}
	}
	fprintf(stdout, "Abs Max Coeff : %f\n", AbsMaxCoeff);
	
	/* get threshold */
	Threshold = 1 << (int)(floor(log10(AbsMaxCoeff)/log10(2)));
	fprintf(stdout, "Initial threshold: %d   Levels: %d   Wavelet: %s   Scan: %d\n\n", 
		Threshold, NScale, FilterName[WaveletIndex], ScanOrder);
	
	/* - debug
	printf("Analysing data.\n");

	nbin=log2(Threshold)+2;
	bin = (int*)malloc(sizeof(int)*nbin);

	for (i=0; i<nbin; i++){
		bin[i]=0;
	}

	for (i=0; i<transform->vsize*transform->hsize; i++){
		for (j=0; j<nbin; j++){
			if (fabs(transform->value[i]) < (1<<j)){
				bin[j]++;
				break;
			}
		}
	}

	printf("Thres   Number of Coeffs\n");
	total = 0;
	for (i=0; i<nbin; i++){
		printf("%5d %8d\n", 1<<i, bin[i]);
		total += bin[i];
	}
	printf("Total number of coefficients: %d\n", total);
	*/

	/* initialize encode stream */
	EncodeStream = OpenOutputBitFile(EncodeImageFileName);
	encoder = ArithEncoderAlloc(EncodeStream);
	ArithEncoderStart(encoder);
	
	/* write header */
	BasicCoderWriteNBits(encoder, InputImage->xsize, ImageXSizeBits);					
	BasicCoderWriteNBits(encoder, InputImage->ysize, ImageYSizeBits);			
	BasicCoderWriteNBits(encoder, ScanOrder, ScanOrderBits);
	BasicCoderWriteNBits(encoder, NScale, ScaleBits);
	BasicCoderWriteNBits(encoder, WaveletIndex, WaveletIndexBits);
	BasicCoderWriteNBits(encoder, *((unsigned int *)&ImageMean), ImageMeanBits);	
	BasicCoderWriteNBits(encoder, log2(Threshold), ThresholdBits);					
	BasicCoderWriteNBits(encoder, MaxHistogramCount, MaxHistoCountBits);									

	/* EZW coding */
	EZW2Encode(transform, encoder, Threshold, MaxHistogramCount, 
		ByteBudget, ScanOrder);

	/* Clean up */
	ArithEncoderDone(encoder);
	ArithEncoderDealloc(encoder);
	CloseOutputBitFile(EncodeStream);
	FImageFree(InputImage);
	WaveletTransformDealloc(transform);
	WaveletDealloc(wavelet);
	RemoveFilterSets();
	fprintf(stderr, "Done\n");

	PrintLeaks();

	return;
}

/*----------------------------------------------------------------------------*/	
/*----------------------------------------------------------------------------*/	
void EZW2Encode(WTRANSFORM *transform, ArithEncoder *encoder, 
					int threshold, int HistoCount, int ByteBudget, int ScanOrder)
{
	//定義4個主編碼掃描和一個從屬編碼掃描
	BasicCoder *DominantPassCoder[4];
	BasicCoder *SubordinateListCoder;
	int i, nPass=0;
	int BitsCount, TempCount;
	MAP *map;
	SubbandSymbol *ztmap;
	DLNode *DomList, *DomListTemp1, *DomListTemp2;
	SLNode *SubList;
	int SubListSize;
	
	//建立圖像小波系數的零樹圖
	if ((ztmap=SubbandSymbolAlloc(transform->hsize,
					transform->vsize, transform->nsteps)) == NULL)
	{
		EZW2Error("Fail to allocate subband symbol.\n");
	}	
	EZW2BuildZerotreeMap(transform, ztmap);
	
	//建立主編碼掃描的小波系數表
	if ((DomList = (DLNode *)malloc(sizeof(DLNode)
						*transform->vsize*transform->hsize))==NULL)
	{
		EZW2Error("Fail to allocate dominant list.\n");
	}
		
	//建立從屬編碼掃描的小波系數表
	if ((SubList = (SLNode *)malloc(sizeof(SLNode)
						*transform->vsize*transform->hsize))==NULL)
	{
		EZW2Error("Fail to allocate subordinate list.\n");
	}

	//在主編碼掃描未完成的時候,從屬過程的系數表為空
	SubListSize = 0;
	
	//主編碼掃描過程建立4張系數表
	for (i=0; i<4; i++)
	{
		if ((DominantPassCoder[i] = BasicCoderAlloc(4, HistoCount)) == NULL)
		{
			EZW2Error("Fail to allocate dominanat pass coder.\n");
		}
	}

	//建立一個從屬過程的小波系數上下文表
	if ((SubordinateListCoder = BasicCoderAlloc(2, HistoCount)) == NULL){
		EZW2Error("Fail to allocate subordinate list coder.\n");
	}

	//記錄編碼為POS和NEG的小波系數信息
	if ((map=MapAlloc(transform->hsize, transform->vsize, 
			transform->nsteps))==NULL){
		EZW2Error("Fail to allocate map.\n");
	}

	//統計目前為止編碼器的輸出數據流量
	BitsCount = ArithEncoderNBitsOutput(encoder);

	while((threshold!=0) && (EndEncoding!=TRUE))
	{
		printf("Pass #%2d - ", ++nPass);
		
		if (ScanOrder==0){
			//主編碼掃描過程
			EncodeDominantPassMortonScan(DomList, SubList, &SubListSize, 
				transform, map, threshold, encoder,
				DominantPassCoder, ztmap, ByteBudget);
		}
		else{
			//否則,空操作
		}
		//統計當前編碼輸出流量
		TempCount = ArithEncoderNBitsOutput(encoder);
		//從屬編碼過程
		EncodeSubordinatePass(SubList, SubListSize, threshold>>1, encoder, 
							SubordinateListCoder, ByteBudget);
		//統計輸出流量
		BitsCount = ArithEncoderNBitsOutput(encoder);

		printf("Sign Coeff: %6d  (%5d)  Bytes: %-6d (SB:%d)\n",
			SubListSize, threshold, ROUND((BitsCount/8.0)), BitsCount-TempCount);
		//完成編碼后,將編碼器復位
		if (EndEncoding != TRUE){
			threshold >>= 1;
			for (i=0; i<4; i++){
				BasicCoderReset(DominantPassCoder[i]);
			}
			BasicCoderReset(SubordinateListCoder);
		}
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av在线这里只有精品| 亚洲电影激情视频网站| 精品一区二区久久久| 精品国产第一区二区三区观看体验| 日韩精品五月天| 日韩免费一区二区三区在线播放| 蜜桃91丨九色丨蝌蚪91桃色| 精品久久国产字幕高潮| 国产原创一区二区| 国产精品国产自产拍高清av | 99久久综合色| 亚洲欧美日韩国产一区二区三区 | 久久美女高清视频| 国产成人8x视频一区二区| 亚洲同性同志一二三专区| 欧美日韩成人在线一区| 精品在线一区二区| 最新国产精品久久精品| 7777精品久久久大香线蕉| 精品一区二区精品| 亚洲欧美日韩国产手机在线| 欧美一区二区三区人| 国产激情偷乱视频一区二区三区| 国产精品乱码人人做人人爱| 欧美天天综合网| 国产一区在线不卡| 国产精品视频看| 7777精品伊人久久久大香线蕉超级流畅 | 日韩一区二区在线观看视频| 国产高清无密码一区二区三区| 中文字幕一区二区视频| 91麻豆精品国产91久久久 | 欧美www视频| 91碰在线视频| 国产精品99久| 天堂成人免费av电影一区| 国产午夜精品一区二区三区四区| 91香蕉国产在线观看软件| 免播放器亚洲一区| 亚洲精品成a人| 久久中文娱乐网| 欧美日韩午夜精品| 99免费精品视频| 国产精品亚洲一区二区三区妖精| 一区二区国产盗摄色噜噜| 久久这里只有精品首页| 欧美精品v国产精品v日韩精品 | 91免费在线播放| 国产精品一区二区免费不卡| 午夜视频一区二区| 日韩伦理免费电影| 久久久久9999亚洲精品| 欧美一级欧美一级在线播放| 色哟哟一区二区在线观看| 国产精品一区二区在线观看网站| 天堂精品中文字幕在线| 亚洲一区在线观看免费 | 亚洲蜜桃精久久久久久久| 2021国产精品久久精品| 日韩一区二区三免费高清| 在线看日本不卡| 91麻豆蜜桃一区二区三区| 国产成人av电影| 国产二区国产一区在线观看 | 国精产品一区一区三区mba桃花 | 久久综合色8888| 91精品国产综合久久福利软件| 欧美中文字幕一区| 在线观看区一区二| 在线观看免费成人| 在线这里只有精品| 欧美午夜片在线观看| 91久久精品日日躁夜夜躁欧美| 成人免费三级在线| 成人精品gif动图一区| 国产精品夜夜爽| 成人污污视频在线观看| 福利一区二区在线| 成人av免费在线播放| 不卡电影一区二区三区| jiyouzz国产精品久久| 99国产精品一区| 99re这里只有精品首页| 色综合色综合色综合色综合色综合 | 成人app在线观看| 成人免费观看av| 国产91丝袜在线播放九色| 国产91综合网| 日本精品免费观看高清观看| 91国偷自产一区二区开放时间| 色哟哟一区二区在线观看| 欧美性猛交xxxx黑人交| 欧美卡1卡2卡| 欧美xxxxx裸体时装秀| 欧美激情一区在线观看| 亚洲三级在线观看| 亚洲高清不卡在线| 久久99精品久久久久久国产越南| 国产美女一区二区三区| www.欧美.com| 欧美嫩在线观看| 精品福利一区二区三区| ...av二区三区久久精品| 亚洲国产va精品久久久不卡综合| 奇米影视一区二区三区小说| 国产999精品久久久久久绿帽| 91小视频在线免费看| 欧美一区2区视频在线观看| 久久久久88色偷偷免费| 一区二区三区美女视频| 日韩电影免费在线观看网站| 国产麻豆成人传媒免费观看| 91美女在线看| 日韩欧美国产成人一区二区| 国产精品久久久久永久免费观看 | 亚洲乱码国产乱码精品精小说 | 欧美高清激情brazzers| 精品卡一卡二卡三卡四在线| 综合欧美亚洲日本| 男男视频亚洲欧美| 色综合视频在线观看| 欧美zozozo| 亚洲影视资源网| 国产91色综合久久免费分享| 欧美日韩国产综合一区二区| 久久久99久久| 午夜亚洲福利老司机| 成人听书哪个软件好| 678五月天丁香亚洲综合网| 欧美激情一区二区三区四区 | 一区二区三区影院| 国产精品综合视频| 欧美欧美欧美欧美首页| 亚洲欧洲美洲综合色网| 国产在线视视频有精品| 欧美日韩成人激情| 亚洲色欲色欲www| 国产成人超碰人人澡人人澡| 91精品国产高清一区二区三区 | 一本到高清视频免费精品| 久久这里只有精品6| 亚洲二区视频在线| 色综合中文字幕国产 | 99久久久免费精品国产一区二区| 欧美一级搡bbbb搡bbbb| 亚洲影院理伦片| 色哟哟一区二区在线观看| 国产精品视频麻豆| 国产毛片精品视频| 精品少妇一区二区三区在线视频| 亚洲在线视频网站| 色老汉一区二区三区| 亚洲欧洲一区二区在线播放| 国产综合久久久久影院| 日韩午夜在线影院| 日韩av一区二区在线影视| 欧美亚洲一区二区在线| 亚洲色图欧美在线| 99re视频这里只有精品| 国产精品拍天天在线| 粉嫩蜜臀av国产精品网站| 国产三级欧美三级日产三级99| 免费成人性网站| 欧美精品第1页| 日本在线观看不卡视频| 91精品国产91久久久久久最新毛片| 依依成人综合视频| 在线欧美小视频| 亚洲综合在线第一页| 欧美日韩一区二区在线观看视频 | 日韩一区二区免费在线电影| 日韩av网站免费在线| 91麻豆精品国产自产在线 | 黄页视频在线91| 精品福利一区二区三区免费视频| 极品瑜伽女神91| 久久久久国产精品麻豆| 成人在线视频一区二区| 中文字幕一区三区| 色94色欧美sute亚洲13| 亚洲超丰满肉感bbw| 欧美一区二区三区的| 免费久久99精品国产| 精品日韩av一区二区| 国产激情一区二区三区四区 | 91精选在线观看| 久久99精品久久只有精品| 久久久精品国产免费观看同学| 国产91精品在线观看| 亚洲啪啪综合av一区二区三区| 91视频精品在这里| 天涯成人国产亚洲精品一区av| 欧美成人激情免费网| 粉嫩av一区二区三区在线播放 | 日本午夜精品视频在线观看| 精品久久久久久久久久久院品网| 国产成人精品三级| 亚欧色一区w666天堂| 精品美女在线播放| 91蜜桃传媒精品久久久一区二区|