在上两篇文章基于V4L2驱动程序的USB摄像头Android(JNI)的编写(一)和基于V4L2驱动程序的USB摄像头Android(JNI)的编写(二)中,我详细介绍了如何配置V4L2的环境、设置捕获视频数据的格式,以及视频流数据捕获的过程。但是由于我们捕获到的视频数据是YUYV422格式的,那么在这一篇文章中,我将主要介绍如何将YUYV422格式的数据转换成ARGB格式的数据,同时将ARGB格式数据转换成bitmap格式并上传给上层应用程序。
YUYV转ARGB
在YUYV422格式的数据转换成ARGB格式数据,我们这里采用了一个比较通用的转换函数。源代码如下:
void yuyv422toABGRY(unsigned char *src)
{
int width=0;
int height=0;
width = IMG_WIDTH;
height = IMG_HEIGHT;
//后面会介绍为什么这里要乘以2
int frameSize =width*height*2;
int i;
if((!rgb || !ybuf)){
return;
}
int *lrgb = NULL;
int *lybuf = NULL;
//将rgb的首地址赋给lrgb,这样只要给lrgb指向的地址赋值,那么rgb的值也会相应改变。
lrgb = &rgb[0];
lybuf = &ybuf[0];
if(yuv_tbl_ready==0){
for(i=0 ; i<256 ; i++){
//按照下面的代码,y1192_tbl[i]前面的16个数组都为0
y1192_tbl[i] = 1192*(i-16);
if(y1192_tbl[i]<0){
y1192_tbl[i]=0;
}
v1634_tbl[i] =