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

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

?? coder_vq.c

?? 好東西呢
?? C
字號:

#define QUANTIZER 0

/*****

on checa 256 @ 0.50 bpp

z = 2 : psnr 36.89
z = 0 : psnr 37.16

so fixing is slightly better, but not much

on checa 256 @ 0.25 bpp

z = 10 : psnr 31.78
z = 4  : psnr 32.54
z = 0  : psnr 33.09

*****/

//#define MTF_ADDED 	// move it to front ; hurts 0.007
//#define MTF_ONE_ADDED 	// identical to the big mtf_added ! ?

#define FIRST_MATCH		//else best : first HELPS 0.02 , big surprise

#define MTF_BIGSTEP		// helps 0.05
#define BIGSTEP_SHIFT	2	/** two seems optimal **/

#define DO_LOG

//#define AMORTIZE_ERROR
#define AMORTIZE_MAX_ERR 	50
#define AMORTIZE_MAX_IDX	4		/** best at -1 **/
#define AMORTIZE_SHIFTDOWN	3
	/*** this never helps, contrary to intuition.
	*	compression is *VERY* sensitive to the exact setting of all of these param!  
	*		lots of wierd local minima & maxima
	*	Changes of even 1 make a huge difference!
	*		and the optimum varies strongly with 'q' and 'z' ;
	****/

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

an LRU vector quantizer.

this simple coder is quite competitive at high 'q' and low 'l'

	we need high 'q' because our "escape" is pretty poor
	we need low 'l' because we handle the top levels so poorly

	about 0.05 bpp off of the "bitplane" coder, only slightly
		better than the "order 0" coder.

todos :

	0. Amortize_Max todos :
		addVec() currently adds a new one : should we replace the amortized one instead?

	1. MTF_BIGSTEP helped so much, we should try more improvements of the lru walking 

	2. we're operating as a *terrible* quantizer right now; increasing the mainline
		quantizer helps much more than increasing our "quantizer".  We work best lossless.

performance concerns :

	0. scontext with such large alphabets is awfully slow

	1. code literals as delta to nearest match?

	2.	possible inefficiency :
			add a vec A to the database
			code a vec B which differs only slightly
			code B 9999 times -> large total error,
			A stays in database, B never added
		this is not as rare as it might seem; for example the
			common vector "0010" will never get added if
			"0000" is added first.
		how to fix?
			always send delta after coding from a vector?
				(tried : doesn't seem to change the R-D curve)
			detect this special case of a vector in error being
				sent many times and explicitly choose to send it
				as an escape?  (hard to code this logic).
			**** VQ is fixing about (1/3) of matches now, I think this is critical

				tried to handle this with the "Amortize Error" option, which	
				adds a new vector whenever it seems that an old one is being
				coded from often & inexactly.


theory from Vetterli :

	1. periodically update lru-vectors to the midpoints of the source-vectors coded onto them

	2. don't always add a new escaped-out vector ; only do so if the cost of the escape is
		less than the cost incurred by adding a new vector

	3. periodically shrink the dictionary to cut chaffe ;
		not really important if we add often and entropy code correctly

	4. VQ-Vetterli gets 30 dB at 0.5 bpp on Lena !  SPIHT gets 37 dB !!!
			VQ bites ASS!!!

tried, didn't work :

	1. add vectors after fixing (hurt oodles!)

	2. mtf nearest when failing a match (on fenwick's tip) ; didn't hurt, and slow

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

#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 tot_err;
	int A,B,C,D;
} vector;

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

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

extern int tune_param;

#define NUM_VECS		100		/** compression roughly monotonically decreases with more vecs **/
#define VEC_ESCAPE		NUM_VECS

#define VEC_CNTXMAX			4		/** helps a bunch when 'quant' is small, irrelevant when large **/
#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 coderVQ_encodeBand(coder *me,int *band,int w,int h,int fullw,int *parent);
void coderVQ_decodeBand(coder *me,int *band,int w,int h,int fullw,int *parent);

typedef struct {
	scontext **vec_o1,*lit_o0,*delta_o0;
	vector * vec_alloc;
	vector ** lru;
	arithInfo * ari;
	int max_err;
	bool fix_errors;
} myInfo;

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

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

	c->data = d;

	d->ari = c->arith;

	if ( (d->vec_alloc = newarray(vector,NUM_VECS)) == NULL )
		errexit("alloc failed");
	if ( (d->lru = newarray(vector *,NUM_VECS)) == NULL )
		errexit("alloc failed");
	for(i=0;i<NUM_VECS;i++) {
		d->lru[i] = &(d->vec_alloc[i]);
	}

	d->max_err = QUANTIZER * QUANTIZER;
		/** we do the quantizing, not just the coding
		*	err = mse * 4  (four pels per vec)
		*		= (quantizer/2)^2 * 4 = quantizer^2
		***/

	if ( d->max_err == 0 ) {
		d->max_err = 2;
		d->fix_errors = true;
	}

	/*** tuning shows roughly an 0.3 psnr change for each increment of max_err
	**		(= 0.6 mse change , or almost exacly 0.1 rmse change)
	*	we get about an 0.1 bpp improvement for each increment of max_err up to 2,
	*		and then it slows to 0.02 bpp.  Hence our choice.
	*****/

	/** <> load in some stock vectors ? ; not very important
	***	since the first plane we pass is random anyway **/

	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");
}

void coderVQ_free(coder *c)
{

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

	if ( c->data ) {
		myInfo *d;
		d = c->data;
		smartfree(d->vec_alloc);
		smartfree(d->lru);
		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);
		free(d);
		c->data = NULL;
	}
}

coder coderVQ = {
		"VQ",
		coderVQ_init,
		coderVQ_free,
		coderVQ_encodeBand,
		coderVQ_decodeBand
	};


static int diffVec(vector *x,vector *y)
{
return
	(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);
}

static void mtfVec(myInfo *mi,int i)
{
int steps;
vector *swap;

	if ( i == 0 ) return; //do nothing

#ifdef MTF_BIGSTEP
	steps = i>>(BIGSTEP_SHIFT);
	if ( steps < 1 ) steps=1;
#else /** just one step **/
	steps = 1;
#endif
	swap = mi->lru[i];
	while(steps--) {
		mi->lru[i] = mi->lru[i-1];
		i--;
	}
	mi->lru[i] = swap;
}

static void mtfOneVec(myInfo *mi,int i)
{
vector *swap;

	if ( i == 0 ) return; //do nothing

	swap = mi->lru[i];
	mi->lru[i] = mi->lru[i-1];
	mi->lru[i-1] = swap;
}

static void addVec(myInfo *mi,vector *vec)
{
int tail;

	/** add at tail **/

	tail = NUM_VECS -1;
	memcpy(mi->lru[tail],vec,sizeof(vector));
	mi->lru[tail]->tot_err = 0;

#ifdef MTF_ADDED // move it to front
	mtfVec(mi,tail);
#endif
#ifdef MTF_ONE_ADDED // slide it a taddle
	mtfOneVec(mi,tail);
#endif
}

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 encodeDelta(myInfo *mi,vector *delta,int err)
{
int pos,sign,sign2;

	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,int err) /** add the delta onto vec **/
{
int pos,sign,sign2;

	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 coderVQ_encodeBand(coder *me,int *band,int width,int height,int fullw,int *parent)
{
int x,y,cntx,i,cur_err;
int best_i,best_err;
int *dp,*pp,*dpn;
vector vec,*vs,delta;
myInfo *mi = (myInfo *)(me->data); 
arithInfo *ari = mi->ari;

	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_err = mi->max_err + 1; best_i = NUM_VECS;
			for(i=0;i<NUM_VECS;i++) {
				vs = mi->lru[i];
				cur_err = diffVec(vs,&vec);
				if ( cur_err < best_err ) {
					best_i = i; best_err = cur_err;	
#ifdef FIRST_MATCH
					break;
#endif
				}
			}

#ifdef AMORTIZE_ERROR
			if ( !mi->fix_errors && best_i < NUM_VECS ) {
				if ( mi->lru[best_i]->tot_err > AMORTIZE_MAX_ERR && best_i <= AMORTIZE_MAX_IDX ) {
					mi->lru[best_i]->tot_err >>= AMORTIZE_SHIFTDOWN;
					best_i = NUM_VECS; /** force escape **/
				}
			}
#endif
			if ( best_i == NUM_VECS ) {	/** escape **/
				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);
				addVec(mi,&vec);
			} else {
				i = best_i; vs = mi->lru[i];
				scontextEncode(mi->vec_o1[cntx],i);
				mtfVec(mi,i);
				LOG(matches++);
				if ( mi->fix_errors ) {
					scontextEncode(mi->delta_o0,best_err);
					if ( best_err > 0 ) {
						LOG(fixes++);
						vs->tot_err += best_err;
						delta.A = vec.A - vs->A;
						delta.B = vec.B - vs->B;
						delta.C = vec.C - vs->C;
						delta.D = vec.D - vs->D;
						encodeDelta(mi,&delta,best_err);
#ifdef AMORTIZE_ERROR
						if ( vs->tot_err > AMORTIZE_MAX_ERR && i <= AMORTIZE_MAX_IDX ) {
							vs->tot_err >>= AMORTIZE_SHIFTDOWN;
							addVec(mi,&vec); 
						}
#endif
					}
				} else {
					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;
						vs->tot_err += best_err;
						/** decoder doesn't know what this error is, but we can
						** 	use it for amortizing, because we explicitly send an escape
						***/
					}
				}
			}
		}
		pp += fullw;
		dp += fullw + fullw;
	}
}

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

	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]	= vec.A = decode_esc(mi->lit_o0,ari);
				dp[x+1] = vec.B = decode_esc(mi->lit_o0,ari);
				dpn[x] 	= vec.C = decode_esc(mi->lit_o0,ari);
				dpn[x+1]= vec.D = decode_esc(mi->lit_o0,ari);
				addVec(mi,&vec);
			} else {
				vs = mi->lru[idx];
				mtfVec(mi,idx);
				if ( mi->fix_errors ) {
					err = scontextDecode(mi->delta_o0);
					if ( err ) {
						vs->tot_err += err;
						memcpy(&vec,vs,sizeof(vector));
						decodeDelta(mi,&vec,err);
						dp[x]  = vec.A;	dp[x+1]  = vec.B;
						dpn[x] = vec.C;	dpn[x+1] = vec.D;
#ifdef AMORTIZE_ERROR
						if ( vs->tot_err > AMORTIZE_MAX_ERR && idx <= AMORTIZE_MAX_IDX ) {
							vs->tot_err >>= AMORTIZE_SHIFTDOWN;
							addVec(mi,&vec); 
						}
#endif
					} else {
						dp[x]  = vs->A;	dp[x+1]  = vs->B;
						dpn[x] = vs->C;	dpn[x+1] = vs->D;
					}
				} else {
					dp[x]  = vs->A;	dp[x+1]  = vs->B;
					dpn[x] = vs->C;	dpn[x+1] = vs->D;
				}
			}
		}
		pp += fullw;
		dp += fullw + fullw;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区不卡视频在线观看| 欧美一级淫片007| 麻豆91在线观看| 欧美国产一区视频在线观看| 欧美色爱综合网| 91在线码无精品| 日韩精品1区2区3区| 亚洲欧洲av在线| 欧美r级在线观看| 日韩中文字幕一区二区三区| 日韩一区日韩二区| 国产丝袜欧美中文另类| 91精品国产91综合久久蜜臀| 日本最新不卡在线| 亚洲精品国产第一综合99久久| 久久久午夜精品| 91精品麻豆日日躁夜夜躁| 91亚洲精华国产精华精华液| 国产精品一区专区| 九色综合国产一区二区三区| 亚洲成人中文在线| 一区二区日韩电影| 亚洲精品大片www| 94-欧美-setu| 成人av网址在线| 国产成人av一区二区三区在线| 久久99精品一区二区三区三区| 亚洲成av人片在www色猫咪| 一区二区三区四区不卡在线| 国产精品国产三级国产aⅴ原创| 久久久久久久国产精品影院| 欧美刺激脚交jootjob| 9191精品国产综合久久久久久| 91久久线看在观草草青青| 91视频精品在这里| 亚洲综合激情另类小说区| 亚洲精品国产成人久久av盗摄| 亚洲日本一区二区三区| 亚洲色欲色欲www| 亚洲精品欧美专区| 亚洲卡通欧美制服中文| 亚洲黄色小说网站| 亚洲尤物在线视频观看| 婷婷国产v国产偷v亚洲高清| 日韩在线观看一区二区| 日本成人在线电影网| 免费日本视频一区| 极品销魂美女一区二区三区| 蜜臀av一区二区在线免费观看| 日本特黄久久久高潮| 久久精品国产99国产| 国产在线精品一区二区不卡了| 国产精品亚洲第一| www.成人网.com| 欧美系列亚洲系列| 91精品国产综合久久福利软件 | 欧美日韩色一区| 欧美精品久久天天躁| 欧美影片第一页| 欧美一区二区精品久久911| 日韩一区二区三区免费观看| 26uuu国产一区二区三区| 国产亚洲一区二区在线观看| 18欧美亚洲精品| 亚洲综合视频在线观看| 激情综合色综合久久综合| 国产精品亚洲а∨天堂免在线| 色中色一区二区| 欧美一级在线观看| 国产精品不卡在线观看| 亚洲国产成人av网| 国内精品第一页| 色婷婷av一区二区| 日韩亚洲国产中文字幕欧美| 中文字幕第一区第二区| 亚洲地区一二三色| 国产乱子伦视频一区二区三区| 成人自拍视频在线| 欧美日韩精品综合在线| 欧美精品一区二区三区蜜桃| 中文字幕佐山爱一区二区免费| 亚洲国产成人精品视频| 国产精品亚洲专一区二区三区| 日韩精品乱码免费| 成人三级伦理片| 自拍偷拍欧美精品| 视频一区二区欧美| 成人性生交大片免费看在线播放 | 成人白浆超碰人人人人| 欧美视频在线一区二区三区| 欧美α欧美αv大片| 亚洲视频免费在线观看| 经典三级一区二区| 欧美日韩性生活| 中文文精品字幕一区二区| 亚洲va韩国va欧美va精品| 国产成人av电影在线| 欧美狂野另类xxxxoooo| 日韩毛片视频在线看| 国产最新精品精品你懂的| 欧美性极品少妇| 国产日韩欧美麻豆| 麻豆一区二区99久久久久| 在线观看三级视频欧美| 国产精品天干天干在观线| 久久99精品国产91久久来源| 欧美体内she精高潮| 国产精品大尺度| 国产一区欧美一区| 欧美日韩成人高清| 亚洲永久免费av| 91碰在线视频| 国产精品久久久久影视| 国产精品一级片在线观看| 91精品国产综合久久久久| 亚洲自拍偷拍欧美| 一本色道亚洲精品aⅴ| 国产人久久人人人人爽| 国产在线不卡一区| 精品国产sm最大网站| 麻豆国产欧美一区二区三区| 欧美久久久久久久久| 亚洲第一福利视频在线| 在线欧美一区二区| 亚洲精选免费视频| 日本韩国视频一区二区| 亚洲人快播电影网| 91丨九色丨黑人外教| 亚洲国产高清aⅴ视频| 懂色av中文一区二区三区| 久久久精品日韩欧美| 国产精品亚洲人在线观看| 久久久国际精品| 国产98色在线|日韩| 国产偷v国产偷v亚洲高清| 国产大陆亚洲精品国产| 欧美激情一区二区三区蜜桃视频| 国产成人精品免费网站| 中文字幕成人网| 91在线观看美女| 亚洲男人天堂一区| 欧美日韩在线精品一区二区三区激情| 亚洲国产欧美在线| 91精品国产综合久久婷婷香蕉| 日韩国产高清在线| 精品日产卡一卡二卡麻豆| 激情综合色播激情啊| 国产欧美日韩另类视频免费观看 | 91麻豆国产精品久久| 尤物在线观看一区| 欧美网站大全在线观看| 美女久久久精品| 欧美激情综合网| 一本色道a无线码一区v| 亚洲国产日韩精品| 日韩欧美自拍偷拍| 粉嫩av一区二区三区| 一区二区三区自拍| 91麻豆精品国产91久久久久| 韩日av一区二区| 亚洲欧洲日韩女同| 欧美人妖巨大在线| 国内精品免费**视频| 久久久精品天堂| 在线观看一区日韩| 蜜臀va亚洲va欧美va天堂| 国产精品久久久久四虎| 欧美撒尿777hd撒尿| 韩日av一区二区| 亚洲女性喷水在线观看一区| 欧美一区二区在线免费播放| 国产成人综合网站| 亚洲国产人成综合网站| 国产香蕉久久精品综合网| 91视频你懂的| 黄色日韩三级电影| 亚洲精品成a人| 日韩亚洲电影在线| www.爱久久.com| 九九视频精品免费| 玉米视频成人免费看| 久久久国产午夜精品 | 中文字幕免费观看一区| 欧美日韩精品免费观看视频| 国产一区二区三区四| 国产精品久久久久久久久免费樱桃 | 日韩一区二区电影网| 亚洲国产日韩一级| 日韩不卡免费视频| 欧美激情一区在线观看| 欧美日精品一区视频| 国产精品一区在线观看乱码| 亚洲尤物视频在线| 久久影院电视剧免费观看| 色婷婷综合久色| 国产一区二区三区久久悠悠色av | 一区二区三区在线不卡| 久久免费美女视频| 欧美日本一道本在线视频| 成人爽a毛片一区二区免费|