首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

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

2012-02-22 
各位老大哪位有基于arm的yuv420p到rgb565转换的函数,c的和汇编的都可以如题,谢谢。[解决办法]int iWidthin

各位老大哪位有基于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等变量自己改下。
[解决办法]
开源代码里的这个函数很多,你可以拿来用

热点排行