各位老大哪位有基于arm的yuv420p到rgb565转换的函数,c的和汇编的都可以
如题,谢谢。
[解决办法]
int iWidth;
int iHeight;
int *colortab;
int *u_b_tab;
int *u_g_tab;
int *v_g_tab;
int *v_r_tab;
unsigned int *rgb_2_pix;
unsigned int *r_2_pix;
unsigned int *g_2_pix;
unsigned int *b_2_pix;
//创建用于YV12转RGB565的快速查找表
void CreateYUVTab_16(X264_Android_Handle *pHandle)
{
int i;
int u, v;
//tmp_pic = (short*)av_malloc(iWidth*iHeight*2); // 缓存 iWidth * iHeight * 16bits
pHandle->colortab = (int *)av_malloc(4*256*sizeof(int));
pHandle->u_b_tab = &pHandle->colortab[0*256];
pHandle->u_g_tab = &pHandle->colortab[1*256];
pHandle->v_g_tab = &pHandle->colortab[2*256];
pHandle->v_r_tab = &pHandle->colortab[3*256];
for (i=0; i<256; i++)
{
u = v = (i-128);
pHandle->u_b_tab[i] = (int) ( 1.772 * u);
pHandle->u_g_tab[i] = (int) ( 0.34414 * u);
pHandle->v_g_tab[i] = (int) ( 0.71414 * v);
pHandle->v_r_tab[i] = (int) ( 1.402 * v);
}
pHandle->rgb_2_pix = (unsigned int *)av_malloc(3*768*sizeof(unsigned int));
pHandle->r_2_pix = &pHandle->rgb_2_pix[0*768];
pHandle->g_2_pix = &pHandle->rgb_2_pix[1*768];
pHandle->b_2_pix = &pHandle->rgb_2_pix[2*768];
for(i=0; i<256; i++)
{
pHandle->r_2_pix[i] = 0;
pHandle->g_2_pix[i] = 0;
pHandle->b_2_pix[i] = 0;
}
for(i=0; i<248; i++)
{
// pHandle->r_2_pix[i+256] = (i & 0xF8) << 8;
// pHandle->g_2_pix[i+256] = (i & 0xFC) << 3;
// pHandle->b_2_pix[i+256] = (i ) >> 3;
//Edit by MJH, 对后几位进行四舍五入,提高转换精度,降低色彩损失。
pHandle->r_2_pix[i+256] = (i+4 & 0xF8) << 8;
pHandle->g_2_pix[i+256] = (i+2 & 0xFC) << 3;
pHandle->b_2_pix[i+256] = (i+4 ) >> 3;
}
for (i = 248; i<256; i++)
{
pHandle->r_2_pix[i+256] = (i & 0xF8) << 8;
pHandle->g_2_pix[i+256] = (i & 0xFC) << 3;
pHandle->b_2_pix[i+256] = (i ) >> 3;
}
for(i=0; i<256; i++)
{
pHandle->r_2_pix[i+512] = 0xF8 << 8;
pHandle->g_2_pix[i+512] = 0xFC << 3;
pHandle->b_2_pix[i+512] = 0x1F;
}
pHandle->r_2_pix += 256;
pHandle->g_2_pix += 256;
pHandle->b_2_pix += 256;
}
void DeleteYUVTab(X264_Android_Handle *pHandle)
{
av_free(pHandle->colortab);
av_free(pHandle->rgb_2_pix);
}
//YV12转RGB565
void DisplayYUV_16(X264_Android_Handle *pHandle, unsigned int *pdst1, unsigned char *y, unsigned char *u, unsigned char *v, int width, int height, int src_ystride, int src_uvstride, int dst_ystride)
{
//__android_log_print(ANDROID_LOG_ERROR,"Tag","DisplayYUV_16 body");
int i, j;
int r, g, b, rgb;
int yy, ub, ug, vg, vr;
unsigned char* yoff;
unsigned char* uoff;
unsigned char* voff;
unsigned int* pdst=pdst1;
int width2 = width/2;
int height2 = height/2;
if(width2>pHandle->iWidth/2)
{
width2=pHandle->iWidth/2;
y+=(width-pHandle->iWidth)/4*2;
u+=(width-pHandle->iWidth)/4;
v+=(width-pHandle->iWidth)/4;
}
if(height2>pHandle->iHeight)
height2=pHandle->iHeight;
for(j=0; j<height2; j++) // 一次2x2共四个像素
{
yoff = y + j * 2 * src_ystride;
uoff = u + j * src_uvstride;
voff = v + j * src_uvstride;
for(i=0; i<width2; i++)
{
yy = *(yoff+(i<<1));
ub = pHandle->u_b_tab[*(uoff+i)];
ug = pHandle->u_g_tab[*(uoff+i)];
vg = pHandle->v_g_tab[*(voff+i)];
vr = pHandle->v_r_tab[*(voff+i)];
b = yy + ub;
g = yy - ug - vg;
r = yy + vr;
rgb = pHandle->r_2_pix[r] + pHandle->g_2_pix[g] + pHandle->b_2_pix[b];
yy = *(yoff+(i<<1)+1);
b = yy + ub;
g = yy - ug - vg;
r = yy + vr;
pdst[(j*dst_ystride+i)] = (rgb)+((pHandle->r_2_pix[r] + pHandle->g_2_pix[g] + pHandle->b_2_pix[b])<<16);
yy = *(yoff+(i<<1)+src_ystride);
b = yy + ub;
g = yy - ug - vg;
r = yy + vr;
rgb = pHandle->r_2_pix[r] + pHandle->g_2_pix[g] + pHandle->b_2_pix[b];
yy = *(yoff+(i<<1)+src_ystride+1);
b = yy + ub;
g = yy - ug - vg;
r = yy + vr;
pdst [((2*j+1)*dst_ystride+i*2)>>1] = (rgb)+((pHandle->r_2_pix[r] + pHandle->g_2_pix[g] + pHandle->b_2_pix[b])<<16);
}
}
}
YV12的和YUV420的可以通用,里面的pHandle等变量自己改下。
[解决办法]
开源代码里的这个函数很多,你可以拿来用