📄 yuv2rgb.c
字号:
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 + -