⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readjpg.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
				if(nzeros >= 0){					if(acc[k] != 0)						increment(h, acc, k, qt[k]<<Al);					else if(nzeros-- == 0)						acc[k] = pending;					k++;					continue;				}				rs = decode(h, acht);				nibbles(rs, &rrrr, &ssss);				if(ssss == 0){					if(rrrr < 15){						eobrun = 0;						if(rrrr > 0)							eobrun = receiveEOB(h, rrrr)-1;						while(k <= Se){							increment(h, acc, k, qt[k]<<Al);							k++;						}						break;					}					for(i=0; i<16; k++){						increment(h, acc, k, qt[k]<<Al);						if(acc[k] == 0)							i++;					}					continue;				}else if(ssss != 1)					jpgerror(h, "ReadJPG: ssss!=1 in progressive increment");				nzeros = rrrr;				pending = receivebit(h);				if(pending == 0)					pending = -1;				pending *= qt[k]<<Al;			}		}		/* process restart marker, if present */		mcu++;		if(ri>0 && mcu<nmcu && mcu%ri==0){			restart(h, mcu);			eobrun = 0;			nzeros = -1;		}	}}staticvoidprogressivescan(Header *h, int colorspace){	uchar *ss;	int Ns, Ss, Ah, Al, c, comp, i;	if(h->dccoeff[0] == nil)		progressiveinit(h, colorspace);	ss = h->ss;	Ns = ss[0];	Ss = ss[1+2*Ns];	nibbles(ss[3+2*Ns], &Ah, &Al);	c = ss[1];	comp = -1;	for(i=0; i<h->Nf; i++)		if(h->comp[i].C == c)			comp = i;	if(comp == -1)		jpgerror(h, "ReadJPG: bad component index in scan header");	if(Ss == 0){		progressivedc(h, comp, Ah, Al);		return;	}	if(Ah == 0){		progressiveac(h, comp, Al);		return;	}	progressiveacinc(h, comp, Al);}enum {	c1 = 2871,	/* 1.402 * 2048 */	c2 = 705,		/* 0.34414 * 2048 */	c3 = 1463,	/* 0.71414 * 2048 */	c4 = 3629,	/* 1.772 * 2048 */};staticvoidcolormap1(Header *h, int colorspace, Rawimage *image, int data[8*8], int mcu, int nacross){	uchar *pic;	int x, y, dx, dy, minx, miny;	int r, k, pici;	USED(colorspace);	pic = image->chans[0];	minx = 8*(mcu%nacross);	dx = 8;	if(minx+dx > h->X)		dx = h->X-minx;	miny = 8*(mcu/nacross);	dy = 8;	if(miny+dy > h->Y)		dy = h->Y-miny;	pici = miny*h->X+minx;	k = 0;	for(y=0; y<dy; y++){		for(x=0; x<dx; x++){			r = clamp[(data[k+x]+128)+CLAMPOFF];			pic[pici+x] = r;		}		pici += h->X;		k += 8;	}}staticvoidcolormapall1(Header *h, int colorspace, Rawimage *image, int data0[8*8], int data1[8*8], int data2[8*8], int mcu, int nacross){	uchar *rpic, *gpic, *bpic, *rp, *gp, *bp;	int *p0, *p1, *p2;	int x, y, dx, dy, minx, miny;	int r, g, b, k, pici;	int Y, Cr, Cb;	rpic = image->chans[0];	gpic = image->chans[1];	bpic = image->chans[2];	minx = 8*(mcu%nacross);	dx = 8;	if(minx+dx > h->X)		dx = h->X-minx;	miny = 8*(mcu/nacross);	dy = 8;	if(miny+dy > h->Y)		dy = h->Y-miny;	pici = miny*h->X+minx;	k = 0;	for(y=0; y<dy; y++){		p0 = data0+k;		p1 = data1+k;		p2 = data2+k;		rp = rpic+pici;		gp = gpic+pici;		bp = bpic+pici;		if(colorspace == CYCbCr)			for(x=0; x<dx; x++){				*rp++ = clamp[*p0++ + 128 + CLAMPOFF];				*gp++ = clamp[*p1++ + 128 + CLAMPOFF];				*bp++ = clamp[*p2++ + 128 + CLAMPOFF];			}		else			for(x=0; x<dx; x++){				Y = (*p0++ + 128) << 11;				Cb = *p1++;				Cr = *p2++;				r = Y+c1*Cr;				g = Y-c2*Cb-c3*Cr;				b = Y+c4*Cb;				*rp++ = clamp[(r>>11)+CLAMPOFF];				*gp++ = clamp[(g>>11)+CLAMPOFF];				*bp++ = clamp[(b>>11)+CLAMPOFF];			}		pici += h->X;		k += 8;	}}staticvoidcolormap(Header *h, int colorspace, Rawimage *image, int *data0[8*8], int *data1[8*8], int *data2[8*8], int mcu, int nacross, int Hmax, int Vmax,  int *H, int *V){	uchar *rpic, *gpic, *bpic;	int x, y, dx, dy, minx, miny;	int r, g, b, pici, H0, H1, H2;	int t, b0, b1, b2, y0, y1, y2, x0, x1, x2;	int Y, Cr, Cb;	rpic = image->chans[0];	gpic = image->chans[1];	bpic = image->chans[2];	minx = 8*Hmax*(mcu%nacross);	dx = 8*Hmax;	if(minx+dx > h->X)		dx = h->X-minx;	miny = 8*Vmax*(mcu/nacross);	dy = 8*Vmax;	if(miny+dy > h->Y)		dy = h->Y-miny;	pici = miny*h->X+minx;	H0 = H[0];	H1 = H[1];	H2 = H[2];	for(y=0; y<dy; y++){		t = y*V[0];		b0 = H0*(t/(8*Vmax));		y0 = 8*((t/Vmax)&7);		t = y*V[1];		b1 = H1*(t/(8*Vmax));		y1 = 8*((t/Vmax)&7);		t = y*V[2];		b2 = H2*(t/(8*Vmax));		y2 = 8*((t/Vmax)&7);		x0 = 0;		x1 = 0;		x2 = 0;		for(x=0; x<dx; x++){			if(colorspace == CYCbCr){				rpic[pici+x] = clamp[data0[b0][y0+x0++*H0/Hmax] + 128 + CLAMPOFF];				gpic[pici+x] = clamp[data1[b1][y1+x1++*H1/Hmax] + 128 + CLAMPOFF];				bpic[pici+x] = clamp[data2[b2][y2+x2++*H2/Hmax] + 128 + CLAMPOFF];			}else{				Y = (data0[b0][y0+x0++*H0/Hmax]+128)<<11;				Cb = data1[b1][y1+x1++*H1/Hmax];				Cr = data2[b2][y2+x2++*H2/Hmax];				r = Y+c1*Cr;				g = Y-c2*Cb-c3*Cr;				b = Y+c4*Cb;				rpic[pici+x] = clamp[(r>>11)+CLAMPOFF];				gpic[pici+x] = clamp[(g>>11)+CLAMPOFF];				bpic[pici+x] = clamp[(b>>11)+CLAMPOFF];			}			if(x0*H0/Hmax >= 8){				x0 = 0;				b0++;			}			if(x1*H1/Hmax >= 8){				x1 = 0;				b1++;			}			if(x2*H2/Hmax >= 8){				x2 = 0;				b2++;			}		}		pici += h->X;	}}/* * decode next 8-bit value from entropy-coded input.  chart F-26 */staticintdecode(Header *h, Huffman *t){	int code, v, cnt, m, sr, i;	int *maxcode;	static int badcode;	maxcode = t->maxcode;	if(h->cnt < 8)		nextbyte(h, 0);	/* fast lookup */	code = (h->sr>>(h->cnt-8))&0xFF;	v = t->value[code];	if(v >= 0){		h->cnt -= t->shift[code];		return v;	}	h->cnt -= 8;	if(h->cnt == 0)		nextbyte(h, 0);	h->cnt--;	cnt = h->cnt;	m = 1<<cnt;	sr = h->sr;	code <<= 1;	i = 9;	for(;;i++){		if(sr & m)			code |= 1;		if(code <= maxcode[i])			break;		code <<= 1;		m >>= 1;		if(m == 0){			sr = nextbyte(h, 0);			m = 0x80;			cnt = 8;		}		cnt--;	}	if(i >= 17){		if(badcode == 0)			fprint(2, "badly encoded %dx%d JPEG file; ignoring bad value\n", h->X, h->Y);		badcode = 1;		i = 0;	}	h->cnt = cnt;	return t->val[t->valptr[i]+(code-t->mincode[i])];}/* * load next byte of input */staticintnextbyte(Header *h, int marker){	int b, b2;	if(h->peek >= 0){		b = h->peek;		h->peek = -1;	}else{		b = Bgetc(h->fd);		if(b == Beof)			jpgerror(h, "truncated file");		b &= 0xFF;	}	if(b == 0xFF){		if(marker)			return b;		b2 = Bgetc(h->fd);		if(b2 != 0){			if(b2 == Beof)				jpgerror(h, "truncated file");			b2 &= 0xFF;			if(b2 == DNL)				jpgerror(h, "ReadJPG: DNL marker unimplemented");			/* decoder is reading into marker; satisfy it and restore state */			Bungetc(h->fd);			h->peek = b;		}	}	h->cnt += 8;	h->sr = (h->sr<<8) | b;	return b;}/* * return next s bits of input, MSB first, and level shift it */staticintreceive(Header *h, int s){	int v, m;	while(h->cnt < s)		nextbyte(h, 0);	h->cnt -= s;	v = h->sr >> h->cnt;	m = (1<<s);	v &= m-1;	/* level shift */	if(v < (m>>1))		v += ~(m-1)+1;	return v;}/* * return next s bits of input, decode as EOB */staticintreceiveEOB(Header *h, int s){	int v, m;	while(h->cnt < s)		nextbyte(h, 0);	h->cnt -= s;	v = h->sr >> h->cnt;	m = (1<<s);	v &= m-1;	/* level shift */	v += m;	return v;}/*  * return next bit of input */staticintreceivebit(Header *h){	if(h->cnt < 1)		nextbyte(h, 0);	h->cnt--;	return (h->sr >> h->cnt) & 1;}/* *  Scaled integer implementation. *  inverse two dimensional DCT, Chen-Wang algorithm * (IEEE ASSP-32, pp. 803-816, Aug. 1984) * 32-bit integer arithmetic (8 bit coefficients) * 11 mults, 29 adds per DCT * * coefficients extended to 12 bit for IEEE1180-1990 compliance */enum {	W1		= 2841,	/* 2048*sqrt(2)*cos(1*pi/16)*/	W2		= 2676,	/* 2048*sqrt(2)*cos(2*pi/16)*/	W3		= 2408,	/* 2048*sqrt(2)*cos(3*pi/16)*/	W5		= 1609,	/* 2048*sqrt(2)*cos(5*pi/16)*/	W6		= 1108,	/* 2048*sqrt(2)*cos(6*pi/16)*/	W7		= 565,	/* 2048*sqrt(2)*cos(7*pi/16)*/	W1pW7	= 3406,	/* W1+W7*/	W1mW7	= 2276,	/* W1-W7*/	W3pW5	= 4017,	/* W3+W5*/	W3mW5	= 799,	/* W3-W5*/	W2pW6	= 3784,	/* W2+W6*/	W2mW6	= 1567,	/* W2-W6*/	R2		= 181	/* 256/sqrt(2)*/};staticvoididct(int b[8*8]){	int x, y, eighty, v;	int x0, x1, x2, x3, x4, x5, x6, x7, x8;	int *p;	/* transform horizontally*/	for(y=0; y<8; y++){		eighty = y<<3;		/* if all non-DC components are zero, just propagate the DC term*/		p = b+eighty;		if(p[1]==0)		if(p[2]==0 && p[3]==0)		if(p[4]==0 && p[5]==0)		if(p[6]==0 && p[7]==0){			v = p[0]<<3;			p[0] = v;			p[1] = v;			p[2] = v;			p[3] = v;			p[4] = v;			p[5] = v;			p[6] = v;			p[7] = v;			continue;		}		/* prescale*/		x0 = (p[0]<<11)+128;		x1 = p[4]<<11;		x2 = p[6];		x3 = p[2];		x4 = p[1];		x5 = p[7];		x6 = p[5];		x7 = p[3];		/* first stage*/		x8 = W7*(x4+x5);		x4 = x8 + W1mW7*x4;		x5 = x8 - W1pW7*x5;		x8 = W3*(x6+x7);		x6 = x8 - W3mW5*x6;		x7 = x8 - W3pW5*x7;		/* second stage*/		x8 = x0 + x1;		x0 -= x1;		x1 = W6*(x3+x2);		x2 = x1 - W2pW6*x2;		x3 = x1 + W2mW6*x3;		x1 = x4 + x6;		x4 -= x6;		x6 = x5 + x7;		x5 -= x7;		/* third stage*/		x7 = x8 + x3;		x8 -= x3;		x3 = x0 + x2;		x0 -= x2;		x2 = (R2*(x4+x5)+128)>>8;		x4 = (R2*(x4-x5)+128)>>8;		/* fourth stage*/		p[0] = (x7+x1)>>8;		p[1] = (x3+x2)>>8;		p[2] = (x0+x4)>>8;		p[3] = (x8+x6)>>8;		p[4] = (x8-x6)>>8;		p[5] = (x0-x4)>>8;		p[6] = (x3-x2)>>8;		p[7] = (x7-x1)>>8;	}	/* transform vertically*/	for(x=0; x<8; x++){		/* if all non-DC components are zero, just propagate the DC term*/		p = b+x;		if(p[8*1]==0)		if(p[8*2]==0 && p[8*3]==0)		if(p[8*4]==0 && p[8*5]==0)		if(p[8*6]==0 && p[8*7]==0){			v = (p[8*0]+32)>>6;			p[8*0] = v;			p[8*1] = v;			p[8*2] = v;			p[8*3] = v;			p[8*4] = v;			p[8*5] = v;			p[8*6] = v;			p[8*7] = v;			continue;		}		/* prescale*/		x0 = (p[8*0]<<8)+8192;		x1 = p[8*4]<<8;		x2 = p[8*6];		x3 = p[8*2];		x4 = p[8*1];		x5 = p[8*7];		x6 = p[8*5];		x7 = p[8*3];		/* first stage*/		x8 = W7*(x4+x5) + 4;		x4 = (x8+W1mW7*x4)>>3;		x5 = (x8-W1pW7*x5)>>3;		x8 = W3*(x6+x7) + 4;		x6 = (x8-W3mW5*x6)>>3;		x7 = (x8-W3pW5*x7)>>3;		/* second stage*/		x8 = x0 + x1;		x0 -= x1;		x1 = W6*(x3+x2) + 4;		x2 = (x1-W2pW6*x2)>>3;		x3 = (x1+W2mW6*x3)>>3;		x1 = x4 + x6;		x4 -= x6;		x6 = x5 + x7;		x5 -= x7;		/* third stage*/		x7 = x8 + x3;		x8 -= x3;		x3 = x0 + x2;		x0 -= x2;		x2 = (R2*(x4+x5)+128)>>8;		x4 = (R2*(x4-x5)+128)>>8;		/* fourth stage*/		p[8*0] = (x7+x1)>>14;		p[8*1] = (x3+x2)>>14;		p[8*2] = (x0+x4)>>14;		p[8*3] = (x8+x6)>>14;		p[8*4] = (x8-x6)>>14;		p[8*5] = (x0-x4)>>14;		p[8*6] = (x3-x2)>>14;		p[8*7] = (x7-x1)>>14;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -