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

📄 yuv2rgb.c

📁 PocketMVP V0.8082503 source for Pocket 的程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			quant_error_l=l3&mask;
			l4 = _S(puc_y[x+1]+quant_error_l+Brightness); 
			quant_error_l=l4&mask;
			pus_out[0] = (unsigned char) (l&0xC0)|((l2&0xC0)>>2)|((l3&0xC0)>>4)|((l4&0xC0)>>6);
			pus_out[we] = (unsigned char) (l2&0xC0)|((l&0xC0)>>2)|((l4&0xC0)>>4)|((l3&0xC0)>>6);
			pus_out++; 
		} 
		pus_out+=we;
		pus_out+=(nExtra>>2);
		puc_y += stride_y; 
	} 
} 

void yuv2rgb_565R(uint8_t *puc_y, int stride_y, 
 
uint8_t *puc_out, int width_y, int height_y, int Extra, int Dither,int Brightness) 
{ 
	register int x,y; 
	unsigned char *pus_out; 
	register unsigned int l,l2,l3,l4; 
	register unsigned int quant_error_l;	
	register unsigned int mask=0;
	if (Extra<0) Extra=0;
	if (Dither==1){mask=0x3F;}
	pus_out = (unsigned char *) puc_out; 
	quant_error_l=0;
	for (y=0; y<(height_y>>2); y++) 
	{ 
		pus_out = (unsigned char *) puc_out;
		pus_out+=y;
		for (x=width_y-1;x!=0;x--)
		{ 
			l = _S(puc_y[x]+quant_error_l+Brightness); 
			quant_error_l=l&mask;		
			l2 = _S(puc_y[x+stride_y]+quant_error_l+Brightness);
			quant_error_l=l2&mask;	
			l3 = _S(puc_y[x+(stride_y<<1)]+quant_error_l+Brightness); 
			quant_error_l=l3&mask;		
			l4 = _S(puc_y[x+(stride_y<<2)]+quant_error_l+Brightness);
			quant_error_l=l4&mask;
			pus_out[0] = (unsigned char)(l&0xC0)|((l2&0xC0)>>2)|((l3&0xC0)>>4)|((l4&0xC0)>>6); 
			pus_out+=(height_y+Extra)>>2;
		} 
		puc_y += (stride_y<<2); 
	} 
} 

void yuv2rgb_565RZ(uint8_t *puc_y, int stride_y, 
 
uint8_t *puc_out, int width_y, int height_y, int nExtra, int Dither,int Brightness) 
{ 

	register int x,y; 
	unsigned char *pus_out; 
	register unsigned int l,l2; 
	register unsigned int quant_error_l;
	register unsigned int mask=0;
	if (nExtra<0) nExtra=0;
	if (Dither==1){mask=0x3F;}
	pus_out = (unsigned char *) puc_out;
	quant_error_l=0;	 
	for (y=0; y<(height_y>>1); y++) 
	{ 
		pus_out = (unsigned char *) puc_out;
		pus_out+=y;
		for (x=width_y-1;x!=0;x--)
		{ 
			l= _S(puc_y[x]+quant_error_l+Brightness); 
			quant_error_l=l&mask;
			l2= _S(puc_y[x+stride_y]+quant_error_l+Brightness); 
			quant_error_l=l2&mask;
			pus_out[0] = pus_out[(height_y>>1)+(nExtra>>1)] =(unsigned char)(l&0xC0)|((l&0xC0)>>2)|((l2&0xC0)>>4)|((l2&0xC0)>>6); 
			pus_out+=height_y+nExtra;

		} 
		puc_y += (stride_y<<1); 
	} 
	
} 

#elif emul
#define _S(a) (a)>255 ? 255 : a 

void yuv2rgb_565(uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, int width_y, int height_y, int stride_dest, int Dither,int Brightness,uint8_t *puc_yp,uint8_t *puc_up,uint8_t *puc_vp, __int8 slowopt, int invert)
 
{
	register int x,y; 
	unsigned short *pus_out; 
	register unsigned int l; 
	unsigned int quant_error_l;
	if (stride_dest<0) stride_dest=0;
	pus_out = (unsigned short *) puc_out; 
	quant_error_l=0;
	for (y=0; y<height_y; y+=2) 
	{ 
		for (x=0;x<width_y;x++)
		{ 
			l = _S(puc_y[x]+quant_error_l+Brightness); 
			quant_error_l=l&0x0F;
			pus_out[0] = (unsigned short) (l&0xF0)<<8|((l&0xF0))<<3|((l&0xF0)>>3);
			pus_out++; 
		} 
		puc_y += stride_y; 
		pus_out+=stride_dest; 
		for (x=0;x<width_y;x++)
		{ 
			l = _S(puc_y[x]+quant_error_l+Brightness); 
			quant_error_l=l&0x0F;
			pus_out[0] = (unsigned short) (l&0xF0)<<8|((l&0xF0))<<3|((l&0xF0)>>3);
			pus_out++; 
		} 
		puc_y += stride_y; 
		pus_out+=stride_dest; 
	} 
} 

void yuv2rgb_565Z(uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, int width_y, int height_y, int stride_dest, int Dither,int Brightness,uint8_t *puc_yp,uint8_t *puc_up,uint8_t *puc_vp, __int8 slowopt, int invert)
{ }

void yuv2rgb_565R(uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, int width_y, int height_y, int stride_dest, int Dither,int Brightness,uint8_t *puc_yp,uint8_t *puc_up,uint8_t *puc_vp, __int8 slowopt, int invert)
{ }

void yuv2rgb_565RZ(uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, int width_y, int height_y, int stride_dest, int Dither,int Brightness,uint8_t *puc_yp,uint8_t *puc_up,uint8_t *puc_vp, __int8 slowopt, int invert)
{ }


#else


#define _S(a) (a)<0 ? 0 : (a)>255? 255:(a) 
//#define _S(a) LimitValue[a];
#define _R(y,u,v) ((y)  			       + 0x3343*(u)) /0x2000
#define _G(y,u,v) ((y) - 0x0c92*(v) - 0x1a1e*(u)) /0x2000
#define _B(y,u,v) ((y) + 0x40cf*(v))					     /0x2000

#define _Ps565(r,g,b) ( ((r & 0xF8) >> 3) | (((g & 0xFC) << 3)) | (((b & 0xF8) << 8)))
#define _Ps5652(r,g,b) ( ((r & 0xF8) << 13) | (((g & 0xFC) << 19)) | (((b & 0xF8) << 24)))
//#define _Ps565(R,G,B)	((B << 8) & 0xf800) | ((G << 3) & 0x07e0) |((R >> 3) & 0x001f)
//#define _Ps565(r,g,b) (((((b >> 3)<<6) | (g >> 2)) << 5) | (r >> 3))
//#define _Ps565(r,g,b) ((b>>3)<<11) + ((g>>2)<<5) + (r>>3)

#ifdef MIPS

void yuv2rgb_565( 
uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, 
uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, 
int width_y, int height_y,int stride_dest, int Dither) 
{ 
//YUV2RGB MIPS ASM v1.1 
//v1.2->Crop support added 
//v1.1->peque駉 aumento de velocidad
// 
__asm ( //creamos nueva pila y salvamos registros 
  "addiu sp,sp,-36;" 
  "sw  $18,20(sp);" 
  "sw  $17,16(sp);" 
  "sw  $16,12(sp);" 
 
  //calculamos stride_uv 
 
  "srl $14,$5,1;" 
 
  //cargamos todas las variables necesarias 
  "lw  $18,68(sp);"//cargamos stride_dest 
  "lw  $2,64(sp);" 
  "lw  $13,60(sp);" 
  "lw  $25,56(sp);" 
  "lbu $11,0($6);" 
  "lbu $12,0($7);" 
  "lbu $10,0($4);" 
 
  "sll $18,$18,1;");//para poder usar stride_dest como pixels 
__asm( 
	 
	// crop x
 
  "addi $8,$13,-240;"
  "blez $8,no_x_crop;"
  
  "li	$13,240;"
  "srl	$8,$8,1;"
  "add	$4,$4,$8;"
  "srl	$8,$8,1;"
  "add	$6,$6,$8;"
  "add	$7,$7,$8;"

  // crop y
  "no_x_crop:addi $8,$2,-320;"
  "blez $8,no_y_crop;"
  
  "li	$2,320;"
    
  "srl	$8,$8,1;"
  "mul	$8,$8,$5;"
  "add	$4,$4,$8;"
  "srl	$8,$8,2;"
  "add	$6,$6,$8;"
  "add	$7,$7,$8;"

  //diferencias de strides 
 
  "no_y_crop:sub $16,$5,$13;" 
  "srl $8,$13,1;" 
  "sub $14,$14,$8;" 
 
  // 
 
  "sll $17,$13,1;" 
  "add $17,$25,$17;" 
 
  //dividimos Y por 2 y comenzamos bucle 
 
  "srl $2,$2,1;" 
 
  "bucle_y:add $15,$4,$5;" 
  "srl $3,$13,1;" 
 
  //bucle x 
 
  "add $17,$17,$18;"//dst_buf2+ 
 
  "bucle_x:addi $11,$11,-144;" 
  "addi $12,$12,-144;" 
);
__asm(
  //r1 
 
  "add $9,$10,$11;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "srl $24,$9,3;" 
 
  //g1 
 
  "addi $9,$10,-16;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "andi $9,$9,0x00FC;" 
  "sll $9,$9,3;" 
  "or  $24,$24,$9;" 
 
  //b1 
 
  "add $9,$10,$12;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;"); 
 
__asm( "andi $9,$9,0x00F8;" 
  "lbu $10,1($4);"//cargamos aqui para no tener interbloqueo 
 
  "sll $9,$9,8;" 
  "or  $24,$24,$9;" 
 
  //primer punto ,ahora procesamos segundo. 
 
  //r2 
 
  "add $9,$10,$11;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;"
  "andi $9,$9,0x00F8;"
  "sll $9,$9,13;" 
  "or  $24,$24,$9;" 
 
  //g2 
 
  "addi $9,$10,-16;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "andi $9,$9,0x00FC;" 
  "sll $9,$9,19;" 
  "or  $24,$24,$9;" 
 
  //b2 
 
  "add $9,$10,$12;" 
  "lbu $10,0($15);"//cargamos aqui para no tener interbloqueo 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "andi $9,$9,0x00F8;" 
  "sll $9,$9,24;" 
  "or  $24,$24,$9;" 
 
  //presentamos el punto 
 
  "sw  $24,0($25);" 
); 
 
__asm( 
  //ahora procesamos la segunda l韓ea 
 
  //f2r1 
 
  "add $9,$10,$11;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "srl $24,$9,3;" 
 
  //f2g1 
 
  "addi $9,$10,-16;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "andi $9,$9,0x00FC;" 
  "sll $9,$9,3;" 
  "or  $24,$24,$9;" 
 
  //f2b1 
 
  "add $9,$10,$12;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "andi $9,$9,0x00F8;" 
  "lbu $10,1($15);"//cargamos aqui para no tener interbloqueo 
 
  "sll $9,$9,8;" 
  "or  $24,$24,$9;"); 
 
  //primer punto ,ahora procesamos segundo. 
 
  //f2r2 
 
__asm( "add $9,$10,$11;" 
  "lbu $11,1($6);" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;"
  "andi $9,$9,0x00F8;"
  "sll $9,$9,13;" 
  "or  $24,$24,$9;" 
 
  //f2g2 
 
  "addi $9,$10,-16;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "andi $9,$9,0x00FC;" 
  "sll $9,$9,19;" 
  "or  $24,$24,$9;" 
 
  //f2b2 
 
  "add $9,$10,$12;" 
  "lbu $12,1($7);" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "andi $9,$9,0x00F8;" 
 
  "sll $9,$9,24;" 
  "lbu $10,2($4);" 
  "or  $24,$24,$9;" 
 
  //presentamos el punto 
 
  "sw  $24,0($17);" );
 
  //incrementamos todos los punteros y volvemos al bucle 
__asm(
  "addi $4,$4,+2;" 
  "addi $15,$15,+2;" 
  "addi $6,$6,+1;" 
  "addi $7,$7,+1;" 
  "addi $3,$3,-1;" 
  "addi $25,$25,+4;" 
  "addi $17,$17,+4;" 
 
  "bgtz $3,bucle_x;" 
 
  "add $4,$15,$16;" 
 
  "addu $6,$6,$14;" 
  "addu $7,$7,$14;" 
 
  //cargamos aqui para no tener interbloqueo 
  "lbu $11,0($6);" 
  "lbu $10,0($4);" 
  "lbu $12,0($7);" 
 
  "add $25,$25,$18;"//dest+stride_dest 
  "add $25,$25,$18;" 
  "add $17,$17,$18;" 
 
  "addi $2,$2,-1;" 
  "sll $8,$13,1;" 
  "add $25,$25,$8;" 
  "add $17,$17,$8;" 
 
  "bgtz $2,bucle_y;" 
 
  //restauramos registros, la pila y finalizamos 
  "lw  $16,12(sp);" 
  "lw  $17,16(sp);" 
  "lw  $18,20(sp);" 
  "addiu sp,sp,+36;" 
 
);} 


void yuv2rgb_565R( 
uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, 
uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, 
int width_y, int height_y,int stride_dest, int Dither) 
{ 
//YUV2RGB MIPS ASM v1.1 
//v1.2->Crop support added 
//v1.1->peque駉 aumento de velocidad
// 
__asm ( //creamos nueva pila y salvamos registros 
  "addiu sp,sp,-36;" 
  "sw  $19,24(sp);"
  "sw  $18,20(sp);" 
  "sw  $17,16(sp);" 
  "sw  $16,12(sp);" 
 
  //calculamos stride_uv 
 
  "srl $14,$5,1;" 
 
  //cargamos todas las variables necesarias 
  "lw  $18,68(sp);"//cargamos stride_dest 
  "lw  $2,64(sp);" 
  "lw  $13,60(sp);" 
  "lw  $25,56(sp);" 
  "lbu $11,0($6);" 
  "lbu $12,0($7);" 
  "lbu $10,0($4);" 
 
  "sll $18,$18,1;");//para poder usar stride_dest como pixels 
__asm( // crop x
 
  "addi $8,$13,-320;"
  "blez $8,no_x_cropR;"
  
  "li	$13,320;"
  "srl	$8,$8,1;"
  "add	$4,$4,$8;"
  "srl	$8,$8,1;"
  "add	$6,$6,$8;"
  "add	$7,$7,$8;"

  // crop y
  "no_x_cropR:addi $8,$2,-240;"
  "blez $8,no_y_cropR;"
  
  "li	$2,240;"
  "srl	$8,$8,1;"
  "mul	$8,$8,$5;"
  "add	$4,$4,$8;"
  "srl	$8,$8,2;"
  "add	$6,$6,$8;"
  "add	$7,$7,$8;"
   
  //diferencias de strides 
 
  "no_y_cropR:sub $16,$5,$13;" 
  "srl $8,$13,1;" 
  "sub $14,$14,$8;" 

  "sll $8,$2,1;"
  "add $17,$18,$8;" //(height+stride)*2 (short)
 
  "addi $8,$13,-1;"
  "mul $8,$8,$17;"
  "addu $25,$25,$8;" //puntero_video+desplazamiento 
  
  //dividimos Y por 2 y comenzamos bucle 
 
  "srl $2,$2,1;" 
 
  "bucle_yR:add $15,$4,$5;" 
  "srl $3,$13,1;" 
 
  //bucle x 
 
  "bucle_xR:addi $11,$11,-144;" 
  "addi $12,$12,-144;" 
);
__asm(//r1 
 
  "add $9,$10,$11;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "srl $24,$9,3;" 
 
  //g1 
 
  "addi $9,$10,-16;" 
  "sra $8,$9,31;" 
  "srlv $9,$9,$8;" 
  "andi $9,$9,0x00FC;" 
  "sll $9,$9,3;" 
  "or  $24,$24,$9;" 
 
  //b1 

⌨️ 快捷键说明

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