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

📄 frame.c

📁 由bmp生成mpeg2 的I_frame 数据
💻 C
📖 第 1 页 / 共 2 页
字号:
	vb = bottom->v + prm->prm.in_step + prm->prm.c_offset;

	b = out;
	g = out+1;
	r = out+2;

	for(i=0;i<prm->prm.height/2;i++){
		for(j=0;j<prm->prm.width;j++){
			b[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->bu * (((int)ut[j/2]) - 128)) >> 16)];
			g[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->gu * (((int)ut[j/2]) - 128) + prm->gv * (((int)vt[j/2]) - 128)) >> 16)];
			r[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->rv * (((int)vt[j/2]) - 128)) >> 16)];
		}
		yt += prm->prm.in_step*2;
		ut += prm->prm.in_step*2;
		vt += prm->prm.in_step*2;
		b += prm->prm.out_step;
		g += prm->prm.out_step;
		r += prm->prm.out_step;
		
		for(j=0;j<prm->prm.width;j++){
			b[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yb[j] - prm->yo) + prm->bu * (((int)ub[j/2]) - 128)) >> 16)];
			g[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yb[j] - prm->yo) + prm->gu * (((int)ub[j/2]) - 128) + prm->gv * (((int)vb[j/2]) - 128)) >> 16)];
			r[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yb[j] - prm->yo) + prm->rv * (((int)vb[j/2]) - 128)) >> 16)];
		}
		yb += prm->prm.in_step*2;
		ub += prm->prm.in_step*2;
		vb += prm->prm.in_step*2;
		b += prm->prm.out_step;
		g += prm->prm.out_step;
		r += prm->prm.out_step;
	}

	if(prm->prm.height%2){
		for(j=0;j<prm->prm.width;j++){
			b[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->bu * (((int)ut[j/2]) - 128)) >> 16)];
			g[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->gu * (((int)ut[j/2]) - 128) + prm->gv * (((int)vt[j/2]) - 128)) >> 16)];
			r[j*3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(( prm->yg * ((int)yt[j] - prm->yo) + prm->rv * (((int)vt[j/2]) - 128)) >> 16)];
		}
	}
}

void __stdcall yuv444_to_yuy2(FRAME *top, FRAME *bottom, unsigned char *out, CONVERSION_PARAMETER *prm)
{
	int i, j;
	unsigned char *yt, *ut, *vt;
	unsigned char *yb, *ub, *vb;

	yt = top->y;
	ut = top->u;
	vt = top->v;

	yb = bottom->y + prm->in_step;
	ub = bottom->u + prm->in_step;
	vb = bottom->v + prm->in_step;

	for(i=0;i<prm->height/2;i++){
		out[0] = yt[0];
		out[1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ut[0]*3+ut[1]+2)>>2)];
		out[2] = yt[0+1];
		out[3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vt[0]*3+vt[1]+2)>>2)];
		for(j=2;j<prm->width-2;j+=2){
			out[j*2+0] = yt[j];
			out[j*2+1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ut[j-1]+ut[j]*2+ut[j+1]+2)>>2)];
			out[j*2+2] = yt[j+1];
			out[j*2+3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vt[j-1]+vt[j]*2+vt[j+1]+2)>>2)];
		}
		out[j*2+0] = yt[j];
		out[j*2+1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ut[j-1]+ut[j]*3+2)>>2)];
		out[j*2+2] = yt[j+1];
		out[j*2+3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vt[j-1]+vt[j]*3+2)>>2)];
		yt += prm->in_step*2;
		ut += prm->in_step*2;
		vt += prm->in_step*2;
		out += prm->out_step;

		
		out[0] = yb[0];
		out[1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ub[0]+ub[1]*3+2)>>2)];
		out[2] = yb[1];
		out[3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vb[0]+vb[1]*3+2)>>2)];
		for(j=2;j<prm->width-2;j+=2){
			out[j*2+0] = yb[j];
			out[j*2+1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ub[j-1]+ub[j]*2+ub[j+1]+2)>>2)];
			out[j*2+2] = yb[j+1];
			out[j*2+3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vb[j-1]+vb[j]*2+vb[j+1]+2)>>2)];
		}
		out[j*2+0] = yb[j];
		out[j*2+1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ub[j-1]+ub[j]*3+2)>>2)];
		out[j*2+2] = yb[j+1];
		out[j*2+3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vb[j-1]+vb[j]*3+2)>>2)];
		yb += prm->in_step*2;
		ub += prm->in_step*2;
		vb += prm->in_step*2;
		out += prm->out_step;
	}

	if(prm->height%2){
		out[0] = yt[0];
		out[1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ut[0]*3+ut[1]+2)>>2)];
		out[2] = yt[0+1];
		out[3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vt[0]*3+vt[1]+2)>>2)];
		for(j=2;j<prm->width-2;j+=2){
			out[j*2+0] = yt[j];
			out[j*2+1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ut[j-1]+ut[j]*2+ut[j+1]+2)>>2)];
			out[j*2+2] = yt[j+1];
			out[j*2+3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vt[j-1]+vt[j]*2+vt[j+1]+2)>>2)];
		}
		out[j*2+0] = yt[j];
		out[j*2+1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((ut[j-1]+ut[j]*3+2)>>2)];
		out[j*2+2] = yt[j+1];
		out[j*2+3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+((vt[j-1]+vt[j]*3+2)>>2)];
	}
}

void __stdcall yuv422_to_yuy2(FRAME *top, FRAME *bottom, unsigned char *out, CONVERSION_PARAMETER *prm)
{
	int i, j;
	unsigned char *yt, *ut, *vt;
	unsigned char *yb, *ub, *vb;

	yt = top->y;
	ut = top->u + prm->c_offset;
	vt = top->v + prm->c_offset;

	yb = bottom->y + prm->in_step;
	ub = bottom->u + prm->in_step + prm->c_offset;
	vb = bottom->v + prm->in_step + prm->c_offset;

	for(i=0;i<prm->height/2;i++){
		for(j=0;j<prm->width;j+=2){
			out[j*2+0] = yt[j];
			out[j*2+1] = ut[j/2];
			out[j*2+2] = yt[j+1];
			out[j*2+3] = vt[j/2];
		}
		yt += prm->in_step*2;
		ut += prm->in_step*2;
		vt += prm->in_step*2;
		out += prm->out_step;

		for(j=0;j<prm->width;j+=2){
			out[j*2+0] = yb[j];
			out[j*2+1] = ub[j/2];
			out[j*2+2] = yb[j+1];
			out[j*2+3] = vb[j/2];
		}
		yb += prm->in_step*2;
		ub += prm->in_step*2;
		vb += prm->in_step*2;
		out += prm->out_step;
	}
}

void __stdcall yuy2_convert(unsigned char *yuy2, int step, int height, YUY2_CONVERSION_PARAMETER *prm)
{
	int i,j;
	int w;
	int work;
	int ya,yb,u,v;

	if(step>0){
		w = step/4;
	}else{
		w = (0-step)/4;
	}

	for(i=0;i<height;i++){
		for(j=0;j<w;j++){
			ya = yuy2[j*4+0];
			u  = yuy2[j*4+1];
			yb = yuy2[j*4+2];
			v  = yuy2[j*4+3];
			u -= 128;
			v -= 128;
			work = (u*prm->yu + v*prm->yv + 32768)>>16;
			yuy2[j*4+0] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(ya+work)];
			yuy2[j*4+1] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(((u*prm->uu+v*prm->uv+32768)>>16)+128)];
			yuy2[j*4+2] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(yb+work)];
			yuy2[j*4+3] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET+(((u*prm->vu+v*prm->vv+32768)>>16)+128)];
		}
		yuy2 += step;
	}
}

void __stdcall yuy2_convert_none(unsigned char *yuy2, int step, int height, YUY2_CONVERSION_PARAMETER *prm)
{
	// nothing to do
}

static void chroma420i_to_422(unsigned char *data, int width, int height)
{
	int x,y;
	int hw;

	unsigned char *d;
	unsigned char *s;
	
	hw = width >> 1;
	
	s = data;
	d = s + hw;

	/* copy top 2 line */
	memcpy(d, s, hw);
	d += width;
	memcpy(d, s+width, hw);
	d += width;

	/* interpolation */
	for(y=2;y<height-2;y+=4){
		for(x=0;x<hw;x++){
			d[0*width+x] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET + ((s[0*width+x]*5 + s[2*width+x]*3 + 4) >> 3)];
			d[1*width+x] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET + ((s[1*width+x]*7 + s[3*width+x]*1 + 4) >> 3)];
			d[2*width+x] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET + ((s[0*width+x]*1 + s[2*width+x]*7 + 4) >> 3)];
			d[3*width+x] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET + ((s[1*width+x]*3 + s[3*width+x]*5 + 4) >> 3)];
		}
		d += width*4;
		s += width*2;
	}

	/* copy bottom 2 line */
	memcpy(d, s, hw);
	d += width;
	s += width;
	memcpy(d, s, hw);
	
}

static void chroma420p_to_422(unsigned char *data, int width, int height)
{
	int x,y;
	int hw;
	unsigned char *d;
	unsigned char *s;

	hw = width >> 1;
	s = data;
	d = s + hw;

	/* copy top line */
	memcpy(d, s, hw);
	d += width;

	/* interpolation */
	for(y=1;y<height-1;y+=2){
		for(x=0;x<hw;x++){
			d[0*width+x] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET + ((s[0*width+x]*3 + s[1*width+x]*1 + 2) >> 2)];
			d[1*width+x] = uchar_clip_table[UCHAR_CLIP_TABLE_OFFSET + ((s[0*width+x]*1 + s[1*width+x]*3 + 2) >> 2)];
		}
		d += width * 2;
		s += width;
	}

	/* copy bottom line */
	memcpy(d, s, hw);
}

void upsample_chroma_none(FRAME *p)
{
	return;
}

void upsample_chroma_420i(FRAME *p)
{
	chroma420i_to_422(p->u, p->width, p->height);
	chroma420i_to_422(p->v, p->width, p->height);
}

void upsample_chroma_420p(FRAME *p)
{
	chroma420p_to_422(p->u, p->width, p->height);
	chroma420p_to_422(p->v, p->width, p->height);
}

void upsample_chroma_420i_mmx(FRAME *p)
{
	chroma420i_to_422_mmx(p->u, p->width, p->height);
	chroma420i_to_422_mmx(p->v, p->width, p->height);
}

void upsample_chroma_420p_mmx(FRAME *p)
{
	chroma420p_to_422_mmx(p->u, p->width, p->height);
	chroma420p_to_422_mmx(p->v, p->width, p->height);
}

void upsample_chroma_420i_sse2(FRAME *p)
{
	chroma420i_to_422_sse2(p->u, p->width, p->height);
	chroma420i_to_422_sse2(p->v, p->width, p->height);
}

void upsample_chroma_420p_sse2(FRAME *p)
{
	chroma420p_to_422_sse2(p->u, p->width, p->height);
	chroma420p_to_422_sse2(p->v, p->width, p->height);
}

⌨️ 快捷键说明

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