亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
韩国视频一区二区| 亚洲特黄一级片| 欧美成人一区二区三区片免费 | 国产免费成人在线视频| 久久久高清一区二区三区| 337p日本欧洲亚洲大胆精品| 欧美一区三区二区| 久久亚洲影视婷婷| 久久综合色8888| 国产精品白丝在线| 亚洲一区二区五区| 国产在线乱码一区二区三区| 国产精品69毛片高清亚洲| 不卡在线视频中文字幕| 欧美在线观看视频一区二区 | 亚洲mv在线观看| 蜜臀av国产精品久久久久| 国产成人精品综合在线观看| 91在线精品一区二区| 日韩一区二区三区观看| 国产免费久久精品| 午夜精品久久久久久久99樱桃| 午夜精品国产更新| 成人精品视频.| 欧美一级片在线观看| 日本一区二区三区四区| 亚洲国产欧美日韩另类综合| 国产最新精品精品你懂的| 欧美日韩一区二区三区在线看| 精品少妇一区二区三区在线播放| 国产精品情趣视频| 国精产品一区一区三区mba视频| 91一区在线观看| 中文字幕欧美日韩一区| 免费一区二区视频| 欧美一区二区三区四区五区| 亚洲青青青在线视频| 欧美一区二区在线观看| 国产精品美女视频| 激情六月婷婷久久| 欧美精品久久99| 亚洲午夜免费福利视频| 欧洲在线/亚洲| 亚洲国产视频在线| 欧美日韩久久不卡| 亚洲小少妇裸体bbw| 欧美日韩成人一区| 日日欢夜夜爽一区| 欧美一区二区三区视频在线观看 | 成人毛片老司机大片| 久久久国产综合精品女国产盗摄| 免费观看在线色综合| 久久在线免费观看| 国产二区国产一区在线观看| 国产日产欧美一区| 91麻豆福利精品推荐| 亚洲电影你懂得| 国产日韩欧美在线一区| 91浏览器打开| 久久福利视频一区二区| 国产女人aaa级久久久级| 91视频观看免费| 久久精品久久综合| 国产精品久久综合| 555夜色666亚洲国产免| 国产一区二区三区不卡在线观看| 国产精品国产三级国产普通话99| 欧美日韩dvd在线观看| 国产综合成人久久大片91| 亚洲日本乱码在线观看| 欧美日韩欧美一区二区| 国产精品一区一区| 亚洲国产中文字幕| 亚洲国产精品二十页| 91精品国产91久久久久久一区二区| 国产99久久久国产精品| 秋霞午夜鲁丝一区二区老狼| 国产精品免费丝袜| 久久综合久久综合久久综合| 欧美日本不卡视频| 一本久道中文字幕精品亚洲嫩| 国产美女主播视频一区| 精品一区二区国语对白| 日本不卡不码高清免费观看| 亚洲成在人线在线播放| 一区二区三区在线播放| 亚洲视频免费在线观看| 一区在线观看免费| 中文字幕亚洲区| 亚洲欧美一区二区三区孕妇| 国产清纯在线一区二区www| 中文字幕不卡一区| 亚洲欧美日韩在线播放| 亚洲午夜免费电影| 日韩精品亚洲专区| 男人的j进女人的j一区| 激情综合色综合久久综合| 国产一区二区三区不卡在线观看 | 欧美日韩精品欧美日韩精品| 欧美色窝79yyyycom| 欧美日韩一二三区| 日韩精品在线网站| 亚洲日本电影在线| 日本欧美一区二区在线观看| 国产激情一区二区三区四区 | 国产日韩亚洲欧美综合| 国产精品第四页| 夜夜精品视频一区二区 | 成人国产视频在线观看| 成人美女视频在线看| 欧美剧情电影在线观看完整版免费励志电影 | 日日摸夜夜添夜夜添亚洲女人| 狠狠狠色丁香婷婷综合激情| 91亚洲国产成人精品一区二区三| 欧美精品在线视频| 中文字幕一区二区三区在线观看| 丝袜美腿亚洲一区二区图片| 成人综合婷婷国产精品久久| 欧美一区二区三区白人 | 成人动漫一区二区三区| 欧美一区永久视频免费观看| 国产精品久久久久久久久晋中| 久久精品国产亚洲高清剧情介绍| 不卡av在线网| 日本一区二区不卡视频| 国产精品一区一区三区| 日韩欧美一二区| 激情久久久久久久久久久久久久久久| 色婷婷综合激情| 亚洲色图都市小说| 日本道色综合久久| 亚洲午夜一区二区| 欧美日韩精品久久久| 亚洲综合网站在线观看| 91丨九色丨尤物| 亚洲自拍偷拍综合| 97se亚洲国产综合自在线观| 亚洲女人的天堂| 欧美日韩国产综合久久| 午夜欧美在线一二页| 日韩欧美三级在线| 国产一区二区三区四区在线观看| 久久亚洲免费视频| 激情综合五月天| 亚洲摸摸操操av| 欧美一卡2卡三卡4卡5免费| 国精产品一区一区三区mba视频 | 91黄色激情网站| 亚洲va中文字幕| 国产欧美视频在线观看| 色综合婷婷久久| 人人精品人人爱| 亚洲另类中文字| 精品久久久网站| 欧美亚洲愉拍一区二区| 久久成人羞羞网站| 亚洲欧美在线视频| 精品第一国产综合精品aⅴ| 成人aa视频在线观看| 日韩精品福利网| 中文字幕视频一区| 精品国产青草久久久久福利| 91天堂素人约啪| 韩国av一区二区三区四区| 亚洲成人午夜影院| 中文字幕视频一区| 国产日韩欧美高清| 久久一夜天堂av一区二区三区 | 亚洲午夜av在线| 中文字幕日韩欧美一区二区三区| 日韩欧美国产综合一区| 欧美在线不卡视频| 91在线免费看| 白白色 亚洲乱淫| 99精品国产99久久久久久白柏| 久久国产精品99精品国产 | 欧美色涩在线第一页| 一本高清dvd不卡在线观看| 99久久国产综合色|国产精品| 国产一区91精品张津瑜| 久久精品理论片| 国产成人免费网站| 国产成人精品综合在线观看| 成人av高清在线| 91久久精品国产91性色tv| av动漫一区二区| 在线观看日韩av先锋影音电影院| 日本二三区不卡| 日韩欧美电影在线| 国产精品丝袜黑色高跟| 综合久久久久久| 日韩va欧美va亚洲va久久| 久久99国产精品久久99 | 欧美激情一区二区三区在线| 亚洲国产精品成人综合色在线婷婷| 亚洲欧美日韩精品久久久久| 亚欧色一区w666天堂| 国产一区二区三区视频在线播放| av一区二区久久| 亚洲精品在线观看网站|