各位老大哪位有基于arm的yuv420p到rgb565转换的函数,c的和汇编的都可以,该如何处理

各位老大哪位有基于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)];