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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? coder_frac.c

?? 用C++語言實現(xiàn)的基于小波分析的源代碼,實現(xiàn)了小波分析的諸多算法
?? C
字號:

#define FIX_ERRORS
#define DO_LOG

#define MAX_SCALE_0
//#define MAX_SCALE_1	
	/** allowing scales hurts about 0.1 bpp,
	*		fixes and escapes are both reduce by about 200 (1400 -> 1200)
	*		but coding the scale is about 1 bit per match even though it's
	*		peaked around scale == 0
	***/

/************

a Fractal-Inspired vector quantizer.

	we beat VQ by about 0.05 when quant < 5
	VQ stomps us by about 0.5 (!!!) when quant >= 10
		presumably this is because when quant is large, compressiblity is high,
		and we are sending about 3 bits for the index regardless.

	Many todos are needed before this becomes a competitive coder.

todo :

	1. perhaps our biggest problem is that in the very bottom HH levels, we
		use parents for contexts which are much noisier than we are.  Allowing
		scale down isn't the solution.  Perhaps the best solution is #3
		Another way would be to use the neighboring bands of the same size as
		context, instead of the parent.

	2.	A. skip over redundant vectors in the idx_to_vec search
		B. skip over vectors that differ by a scale factor (if scaling)
			(2B is probably not worth the effort)

	3. search also already-sent vectors in current plane (frac/vq hybrid)
			Perhaps do context-inspired switching between Frac and VQ !?
			(switch to frac after success in VQ, switch to VQ after failure in Frac)

	4. instead of just taking the first vec under error, do a full R-D search (?)

*************/

#include <stdio.h>
#include <stdlib.h>
#include <crblib/inc.h>
#include <crblib/arithc.h>
#include <crblib/scontext.h>
#include <crblib/intmath.h>

typedef struct {
	int A,B,C,D;
} vector;

extern int tune_param;

#ifdef DO_LOG
static int matches=0,escapes=0,fixes=0,nscale0=0,nscale1=0;
#endif

#ifdef DO_LOG
#define LOG(x)	if(0) ; else { x; }
#else
#define LOG(x)
#endif

#define VEC_ESCAPE			8		/** best at == 0 !! just doing order-0 ! **/

#define VEC_CNTXMAX			3		/** helps **/
#define VEC_CONTEXTS		(VEC_CNTXMAX+1)
#define VEC_CONTEXT(cntx)	min(VEC_CNTXMAX,intlog2(cntx))

#define VEC_TOTMAX		5000
#define VEC_INC			15
#define VEC_ALPHABET	(VEC_ESCAPE+1)

#define LIT_ESCAPE		30
#define LIT_TOTMAX		5000
#define LIT_INC			5
#define LIT_ALPHABET	(LIT_ESCAPE+1)

#include "coder.h"

void coderFrac_encodeBand(coder *me,int *band,int w,int h,int fullw,int *parent);
void coderFrac_decodeBand(coder *me,int *band,int w,int h,int fullw,int *parent);

typedef struct {
	scontext **vec_o1,*lit_o0,*delta_o0,*scale_o0;
	arithInfo * ari;
	int max_err;
} myInfo;

void coderFrac_init(coder *c)
{
myInfo *d;
int i;

	if ( (d = new(myInfo)) == NULL )
		errexit("alloc failed");

	c->data = d;

	d->ari = c->arith;

	d->max_err = 2;
#ifdef FIX_ERRORS
	if ( d->max_err != 2 ) errexit("max err must be 2 to fix error");
#endif

	if ( (d->vec_o1 = newarray(scontext *,VEC_CONTEXTS)) == NULL )
		errexit("alloc failed");

	for(i=0;i<VEC_CONTEXTS;i++) {
		if ( (d->vec_o1[i] = scontextCreate(c->arith,VEC_ALPHABET,0,VEC_TOTMAX,VEC_INC,true)) == NULL )
			errexit("ozero init failed");
	}

	if ( (d->lit_o0 = scontextCreate(c->arith,LIT_ALPHABET,0,LIT_TOTMAX,LIT_INC,true)) == NULL )
		errexit("ozero init failed");

	if ( (d->delta_o0 = scontextCreate(c->arith,3,0,10000,30,true)) == NULL )
		errexit("ozero init failed");

	if ( (d->scale_o0 = scontextCreate(c->arith,3,0,10000,30,true)) == NULL )
		errexit("ozero init failed");
}

void coderFrac_free(coder *c)
{

#ifdef DO_LOG
if ( matches+escapes > 0 ) {
	printf("matches = %d, fixes = %d, escapes = %d\n",matches,fixes,escapes);
	printf("nscale0 = %d,nscale>0 = %d \n",nscale0,nscale1);
	matches = fixes = escapes = 0; nscale0=nscale1=0;
}
#endif

	if ( c->data ) {
		myInfo *d;
		d = c->data;
		if ( d->vec_o1 ) { int i;
			for(i=0;i<VEC_CONTEXTS;i++)
				if ( d->vec_o1[i] ) scontextFree(d->vec_o1[i]);
			free(d->vec_o1);
		}
		if ( d->lit_o0 ) scontextFree(d->lit_o0);
		if ( d->delta_o0 ) scontextFree(d->delta_o0);
		if ( d->scale_o0 ) scontextFree(d->scale_o0);
		free(d);
		c->data = NULL;
	}
}

coder coderFrac = {
		"fractal",
		coderFrac_init,
		coderFrac_free,
		coderFrac_encodeBand,
		coderFrac_decodeBand
	};


static void idx_to_vec_init(int *zplane,int zwidth,int zheight,int zfullw);
static void idx_to_vec(vector *into,int idx,int x,int y);

static int diffVecScaled(vector *x,vector *y,int *scaleptr)	/** x can be scaled down **/
{
int err0,err1,err2;
	err0 =	(x->A - y->A)*(x->A - y->A) + (x->B - y->B)*(x->B - y->B) +
			(x->C - y->C)*(x->C - y->C) + (x->D - y->D)*(x->D - y->D);
#ifdef MAX_SCALE_0
	*scaleptr = 0; return err0;
#endif
	err1 =	((x->A >>1) - y->A)*((x->A >>1) - y->A) + ((x->B >>1) - y->B)*((x->B >>1) - y->B) +
			((x->C >>1) - y->C)*((x->C >>1) - y->C) + ((x->D >>1) - y->D)*((x->D >>1) - y->D);
#ifdef MAX_SCALE_1
	if ( err0 <= err1 ) {
		*scaleptr = 0; return err0;
	} else {
		*scaleptr = 1; return err1;
	}
#endif
	err2 =	((x->A >>2) - y->A)*((x->A >>2) - y->A) + ((x->B >>2) - y->B)*((x->B >>2) - y->B) +
			((x->C >>2) - y->C)*((x->C >>2) - y->C) + ((x->D >>2) - y->D)*((x->D >>2) - y->D);
	if ( err0 <= err1 && err0 <= err2 ) {
		*scaleptr = 0; return err0;
	} else if ( err1 <= err2 ) {
		*scaleptr = 1; return err1;
	} else {
		*scaleptr = 2; return err2;
	}
}

static void encode_esc(scontext *o0,arithInfo *ari,int val)
{
if ( val == 0 ) { scontextEncode(o0,0); return; }
else { 
	int v = abs(val);
	if ( v < LIT_ESCAPE ) scontextEncode(o0,v);
	else {
		scontextEncode(o0,LIT_ESCAPE);
		encode_m1(ari,v - LIT_ESCAPE);
	}
	if ( isneg(val) ) arithBit(ari,1);
	else arithBit(ari,0);
	}
}

static int decode_esc(scontext *o0,arithInfo *ari)
{
int val;
	val = scontextDecode(o0);
	if ( val == 0 ) return 0;
	else if ( val == LIT_ESCAPE ) {
		val += decode_m1(ari);
	}
	if ( arithGetBit(ari) ) val = -val;
return val;
}

static void codeDelta(myInfo *mi,vector *delta,int err)
{
int pos,sign,sign2;

	scontextEncode(mi->delta_o0,err);

	switch(err) {
		case 0: 
			break;
		case 1:
			// 8 values : 2 bit pos, 1 bit sign

#if 0
pos = abs(delta->A) + abs(delta->B) + abs(delta->C) + abs(delta->D);
if ( pos > 1 ) errexit("err > 1");
#endif

			if ( delta->A ) { pos=0; sign = delta->A; }
			if ( delta->B ) { pos=1; sign = delta->B; }
			if ( delta->C ) { pos=2; sign = delta->C; }
			if ( delta->D ) { pos=3; sign = delta->D; }

			if ( sign == -1 ) pos += 4;
			arithEncode(mi->ari,pos,pos+1,8);
			break;
		case 2:
			// 6 positions, 4 sign values

			if ( delta->A ) { sign = delta->A; 
				if ( delta->B ) { pos=0; sign2 = delta->B; }
				else if ( delta->C ) { pos=1; sign2 = delta->C; }
				else if ( delta->D ) { pos=2; sign2 = delta->D; }
				else errexit("should not get here");
			} else if ( delta->B ) { sign = delta->B; 
				if ( delta->C ) { pos=3; sign2 = delta->C; }
				else if ( delta->D ) { pos=4; sign2 = delta->D; }
				else errexit("should not get here");
			} else { pos =5; sign = delta->C; sign2 = delta->D; }

			if ( sign == - 1) pos += 6;
			if ( sign2 == - 1) pos += 12;

			arithEncode(mi->ari,pos,pos+1,24);
			break;
	}
}

static void decodeDelta(myInfo * mi,vector *vec) /** add the delta onto vec **/
{
int err,pos,sign,sign2;

err = scontextDecode(mi->delta_o0);

	switch(err) {
		case 0: 
			break;
		case 1:
			pos = arithGet(mi->ari,8); arithDecode(mi->ari,pos,pos+1,8);
			if ( pos&4 ) { pos -=4; sign = -1; }
			else sign = 1;
			switch(pos) {
				case 0: vec->A += sign; break;
				case 1: vec->B += sign; break;
				case 2: vec->C += sign; break;
				case 3: vec->D += sign; break;
			}
			break;
		case 2:
			pos = arithGet(mi->ari,24); arithDecode(mi->ari,pos,pos+1,24);
			if ( pos >= 12) { pos -= 12; sign2 = -1; } else sign2 = 1;
			if ( pos >= 6) { pos -= 6; sign = -1; } else sign = 1;

			switch(pos) {
				case 0: vec->A += sign; vec->B += sign2; break;
				case 1: vec->A += sign; vec->C += sign2; break;
				case 2: vec->A += sign; vec->D += sign2; break;
				case 3: vec->B += sign; vec->C += sign2; break;
				case 4: vec->B += sign; vec->D += sign2; break;
				case 5: vec->C += sign; vec->D += sign2; break;
				default: errexit("should not get here");
			}
			break;
	}
}

void coderFrac_encodeBand(coder *me,int *band,int width,int height,int fullw,int *parent)
{
int x,y,cntx,idx,err,scale;
int best_idx,best_err,best_scale;
int *dp,*pp,*dpn;
vector vec,vs;
myInfo *mi = (myInfo *)(me->data); 
arithInfo *ari = mi->ari;

	idx_to_vec_init(parent,width>>1,height>>1,fullw);

	dp = band;	pp = parent;
	for(y=0;y<height;y+=2) {
		dpn = dp + fullw;
		if ( coder_timetostop(me) ) { coder_didstop(me,y); return; }
		for(x=0;x<width;x+=2) {
			cntx = abs(pp[x>>1]);
			cntx = VEC_CONTEXT(cntx);

			vec.A = dp[x];	vec.B = dp[x+1];
			vec.C = dpn[x];	vec.D = dpn[x+1];

			best_idx = VEC_ESCAPE; best_err = mi->max_err + 1;
			for(idx=0;idx<VEC_ESCAPE;idx++) {
				idx_to_vec(&vs,idx,x>>1,y>>1);
				err = diffVecScaled(&vs,&vec,&scale);
				if ( err < best_err ) {
					best_err = err; best_idx = idx; best_scale = scale;
					if ( err == 0 ) break;
				}
			}
				
			if ( best_err <= mi->max_err ) {
				idx_to_vec(&vs,best_idx,x>>1,y>>1);
				LOG(matches++);
				LOG( if (best_scale ==0) nscale0++; else nscale1++; );
				scontextEncode(mi->vec_o1[cntx],best_idx);
				scontextEncode(mi->scale_o0,best_scale);
				vs.A >>= best_scale; vs.B >>= best_scale;
				vs.C >>= best_scale; vs.D >>= best_scale;
#ifdef FIX_ERRORS
				if ( best_err > 0 ) LOG(fixes++);
				vec.A -= vs.A;	vec.B -= vs.B;
				vec.C -= vs.C;	vec.D -= vs.D;
				codeDelta(mi,&vec,best_err);
#else // FIX_ERRORS
				if ( best_err != 0 ) {	/** must put in the used values for context coding **/
					dp[x] =  vs.A;	dp[x+1]= vs.B;
					dpn[x] = vs.C;	dpn[x+1]=vs.D;
				}
#endif
			} else {
				LOG(escapes++);
				scontextEncode(mi->vec_o1[cntx],VEC_ESCAPE);
				encode_esc(mi->lit_o0,ari,vec.A); encode_esc(mi->lit_o0,ari,vec.B);
				encode_esc(mi->lit_o0,ari,vec.C); encode_esc(mi->lit_o0,ari,vec.D);
			}
		}
		pp += fullw;
		dp += fullw + fullw;
	}
}

void coderFrac_decodeBand(coder *me,int *band,int width,int height,int fullw,int *parent)
{
int x,y,cntx,idx,scale;
int *dp,*pp,*dpn;
vector vec;
myInfo *mi = (myInfo *)(me->data); 
arithInfo *ari = mi->ari;

	idx_to_vec_init(parent,width>>1,height>>1,fullw);

	dp = band;	pp = parent;
	for(y=0;y<height;y+=2) {
		dpn = dp + fullw;
		if ( coder_timetostopd(me,y) ) return;
		for(x=0;x<width;x+=2) {	/** x & y are the parent's location *2 **/
			cntx = abs(pp[x>>1]);
			cntx = VEC_CONTEXT(cntx);

			idx = scontextDecode(mi->vec_o1[cntx]);

			if ( idx == VEC_ESCAPE ) {
				dp[x]	= decode_esc(mi->lit_o0,ari);
				dp[x+1] = decode_esc(mi->lit_o0,ari);
				dpn[x] 	= decode_esc(mi->lit_o0,ari);
				dpn[x+1]= decode_esc(mi->lit_o0,ari);
			} else {
				idx_to_vec(&vec,idx,x>>1,y>>1);
				scale = scontextDecode(mi->scale_o0);
				vec.A >>= scale; vec.B >>= scale;
				vec.C >>= scale; vec.D >>= scale;
#ifdef FIX_ERRORS
				decodeDelta(mi,&vec);
#endif
				dp[x]  = vec.A;	dp[x+1]  = vec.B;
				dpn[x] = vec.C;	dpn[x+1] = vec.D;
			}
		}
		pp += fullw;
		dp += fullw + fullw;
	}
}

/******** idx_to_vec section : *********/

static int *plane,width,height,fullw;

static void idx_to_vec_init(int *zplane,int zwidth,int zheight,int zfullw)
{
plane = zplane;
width = zwidth;
height = zheight;
fullw = zfullw;
}

static void idx_to_vec(vector *into,int idx,int x,int y)
{
int offx,offy,size;
int *row;

#define STEP 2		/** <> 1 or 2 ? **/

	/** spiral out **/
	size = STEP;
	offx = 0; offy = 0;
	for(;;) {
		while(offx<size) {
			if ( idx == 0 ) goto got_off;
			idx--; offx += STEP;
		}
		while(offy<size) {
			if ( idx == 0 ) goto got_off;
			idx--; offy += STEP;
		}
		while(offx> -size) {
			if ( idx == 0 ) goto got_off;
			idx--; offx -= STEP;
		}
		while(offy> -size) {
			if ( idx == 0 ) goto got_off;
			idx--; offy -= STEP;
		}
		size += STEP;
	}

	got_off:

	while ( offx > width ) offx -= width;
	while ( offx < 0 ) offx += width;
	while ( offy > height ) offy -= height;
	while ( offy < 0 ) offy += height;

x += offx; y += offy;
row = plane + y*fullw;
into->A = row[x]; into->B = row[x+1];
row += fullw;
into->C = row[x]; into->D = row[x+1];

}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区三区高清免费看看| 久久精品国产久精国产爱| 大白屁股一区二区视频| 欧美精彩视频一区二区三区| 国产精品18久久久久久久久| 久久久不卡网国产精品二区| 欧美色图12p| 亚洲国产欧美日韩另类综合| 欧美视频第二页| 日本成人中文字幕在线视频| 2024国产精品| a在线播放不卡| 亚洲成人精品一区二区| 日韩一区二区三区视频在线| 国产一区二区三区在线观看免费| 中文字幕精品一区二区三区精品| 懂色av一区二区夜夜嗨| 一区二区三区四区国产精品| 777亚洲妇女| 国产精品99久| 亚洲一卡二卡三卡四卡五卡| 日韩女优av电影| zzijzzij亚洲日本少妇熟睡| 亚洲国产一区二区a毛片| 精品三级av在线| 91蜜桃传媒精品久久久一区二区| 性久久久久久久| 日本一区二区三区高清不卡| 欧美三级电影网站| 国产剧情一区二区| 亚洲一二三四区| 国产丝袜在线精品| 欧美体内she精高潮| 国产一区二区三区久久久| 亚洲欧美成人一区二区三区| 精品美女在线播放| 欧美在线看片a免费观看| 老司机午夜精品99久久| 亚洲蜜桃精久久久久久久| 日韩精品在线一区二区| 日本精品一区二区三区四区的功能| 另类小说综合欧美亚洲| 一区二区三区鲁丝不卡| 国产视频一区不卡| 欧美一区2区视频在线观看| 97精品国产露脸对白| 国产在线视频不卡二| 亚洲制服丝袜在线| 国产精品国产三级国产aⅴ无密码| 717成人午夜免费福利电影| 91在线免费视频观看| 国产一区二区三区免费看| 日韩影院免费视频| 亚洲免费在线视频| 国产色91在线| 精品国产一区二区三区忘忧草| 欧美色图在线观看| 91视频在线看| 99国产欧美另类久久久精品| 国产一区91精品张津瑜| 久久国产尿小便嘘嘘| 日韩电影在线免费| 五月天中文字幕一区二区| 亚洲美女免费在线| 亚洲同性同志一二三专区| 久久蜜桃av一区精品变态类天堂 | 中文字幕一区二区三区在线不卡 | 色吊一区二区三区| av在线播放一区二区三区| 国产成人午夜视频| 国产精品一区二区不卡| 精品亚洲aⅴ乱码一区二区三区| 日韩国产一区二| 日韩av一二三| 日韩二区三区在线观看| 日本怡春院一区二区| 日本不卡一二三| 免费成人在线观看| 麻豆91在线观看| 另类成人小视频在线| 久久电影国产免费久久电影| 麻豆精品在线视频| 精品一区精品二区高清| 久久99精品久久久久婷婷| 精品一区二区三区在线播放视频| 老司机免费视频一区二区| 久久99精品久久久久久国产越南| 极品尤物av久久免费看| 国产成人亚洲综合a∨婷婷图片 | 婷婷成人激情在线网| 天堂蜜桃一区二区三区| 日韩在线卡一卡二| 国产呦萝稀缺另类资源| 国产成人8x视频一区二区| 波多野结衣欧美| 色综合咪咪久久| 国产色婷婷亚洲99精品小说| 日本一区二区三区久久久久久久久不| 国产精品久久久久久妇女6080 | 日韩欧美成人一区| 国产亚洲精品免费| 亚洲色图.com| 天堂久久久久va久久久久| 韩国欧美国产1区| jizzjizzjizz欧美| 欧美日韩一区小说| 久久综合成人精品亚洲另类欧美| 亚洲国产经典视频| 亚洲午夜成aⅴ人片| 精品一区在线看| av福利精品导航| 欧美人动与zoxxxx乱| 精品99999| 一区二区三区蜜桃网| 精品一区二区三区日韩| 91丝袜美女网| 日韩一级免费一区| 中文字幕日韩一区| 青青草国产精品亚洲专区无| 成人一道本在线| 制服丝袜在线91| 中文字幕av一区二区三区高 | 亚洲精品乱码久久久久久日本蜜臀| 亚洲综合一区二区三区| 日韩国产欧美三级| jlzzjlzz亚洲日本少妇| 日韩精品在线一区| 一区二区视频在线| 国产精品综合一区二区三区| 在线观看国产一区二区| 国产三级三级三级精品8ⅰ区| 亚洲国产一二三| k8久久久一区二区三区| 精品久久久久一区二区国产| 一区二区三区在线看| 国产精品系列在线播放| 777奇米四色成人影色区| 亚洲欧洲精品天堂一级| 国产一区二区剧情av在线| 欧美日韩一区二区三区视频| 国产精品久久久一本精品| 久久国产婷婷国产香蕉| 欧美日韩三级视频| 最新欧美精品一区二区三区| 国产一区二区精品在线观看| 欧美精品777| 亚洲图片自拍偷拍| 99久久精品免费看| 国产视频一区在线观看| 精品一二三四区| 日韩视频一区二区| 亚洲福中文字幕伊人影院| 91视频观看视频| 中文字幕欧美一区| 成人三级在线视频| 国产三级精品三级在线专区| 狠狠色2019综合网| 日韩视频一区二区三区| 日本美女视频一区二区| 在线电影院国产精品| 亚洲国产精品一区二区久久恐怖片 | 国产在线视频一区二区三区| 日韩精品专区在线影院重磅| 日韩电影免费在线看| 制服视频三区第一页精品| 亚洲二区在线观看| 欧美日韩专区在线| 亚洲丶国产丶欧美一区二区三区| 欧美亚洲高清一区二区三区不卡| 亚洲乱码精品一二三四区日韩在线| 99re66热这里只有精品3直播| 国产精品第五页| 色先锋资源久久综合| 一区二区三区四区五区视频在线观看| 色呦呦网站一区| 亚洲一区自拍偷拍| 在线不卡一区二区| 免费成人在线影院| 精品国产三级电影在线观看| 国产一区二区三区免费观看| 中文字幕av一区二区三区| eeuss鲁片一区二区三区在线观看| 国产精品久久久久久久久免费桃花 | 国产一区二区精品在线观看| 国产欧美综合色| 91在线精品一区二区| 亚洲一区二区综合| 91精品国产一区二区三区香蕉| 男女视频一区二区| 久久久久国产精品人| 成人国产视频在线观看| 一区二区在线观看不卡| 在线不卡中文字幕| 国产精品一二三四| 亚洲精品久久久蜜桃| 日韩欧美资源站| 成人黄色国产精品网站大全在线免费观看| 最新国产成人在线观看| 666欧美在线视频| 国产xxx精品视频大全|