android4.0 USB Camera实例(四)CMOS

上一篇说了下usb camera uvc标准的 顺便把CMOS做到一起 操作上基本一至 上一篇HAL层里我已经提供了CMOS的相关接口 

JNIEXPORT jint JNICALL Java_com_dao_usbcam_Fimcgzsd_yuvtorgb

如果使用和UVC一样的处理 图像显示不出来 所以用另外一种方法 同时这里使用的是斯道ICOOL210开发板测试的 如果使用CMOS还需要修改一些地方 HAL层修改如下

首先增加一个函数如下

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int select_input(int input)  
  2. {  
  3.     int ret;  
  4.     ret = ioctl(fd, VIDIOC_S_INPUT, &input);  
  5.     if (ret) {  
  6.         printf("xioctl VIDIOC_S_INPUT failed+++++\n");  
  7.     }     
  8.   
  9.     return ret;  
  10. }  
init里调用 init修改如下

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. JNIEXPORT jint JNICALL Java_com_dao_usbcam_Fimcgzsd_init(JNIEnv * env, jclass obj, jint width, jint height,jint numbuf,jint ctype)  
  2. {  
  3.     int ret;  
  4.     int i;  
  5.     bufnum = numbuf;  
  6.     mwidth = width;  
  7.     mheight = height;  
  8.     c_type = ctype;  
  9.     struct v4l2_format fmt;   
  10.     struct v4l2_capability cap;  
  11.   
  12.     if(c_type == 2)  
  13.         select_input(0);  
  14.     else if(c_type == 3)  
  15.         select_input(1);  
  16.   
  17.     ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);  
  18.     if (ret < 0) {  
  19.         LOGE("%d :VIDIOC_QUERYCAP failed\n",__LINE__);  
  20.         return -1;  
  21.     }  
  22.     if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {  
  23.         LOGE("%d : no capture devices\n",__LINE__);  
  24.         return -1;  
  25.     }  
  26.                   
  27.     memset( &fmt, 0, sizeof(fmt));  
  28.     fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  29.     if(c_type > 0)  
  30.         fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;  
  31.     else  
  32.         fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB565;  
  33.     if(c_type > 1) {  
  34.         fmt.fmt.pix.field = V4L2_FIELD_NONE;//V4L2_FIELD_INTERLACED;//V4L2_FIELD_NONE;  
  35.         fmt.fmt.pix.priv = 1;  
  36.     }  
  37.     fmt.fmt.pix.width = width;  
  38.     fmt.fmt.pix.height = height;                      
  39.     if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0)  
  40.     {  
  41.         LOGE("++++%d : set format failed\n",__LINE__);  
  42.         return -1;  
  43.     }  
  44.   
  45.     struct v4l2_requestbuffers req;  
  46.     req.count = numbuf;  
  47.     req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  48.     req.memory = V4L2_MEMORY_MMAP;  
  49.   
  50.     ret = ioctl(fd, VIDIOC_REQBUFS, &req);  
  51.     if (ret < 0) {  
  52.         LOGE("++++%d : VIDIOC_REQBUFS failed\n",__LINE__);  
  53.         return -1;  
  54.     }  
  55.   
  56.     buffers = calloc(req.count, sizeof(*buffers));  
  57.     if (!buffers) {  
  58.         LOGE ("++++%d Out of memory\n",__LINE__);  
  59.         return -1;  
  60.     }  
  61.   
  62.     for(i = 0; i< bufnum; ++i) {  
  63.         memset(&v4l2_buf, 0, sizeof(v4l2_buf));  
  64.         v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  65.         v4l2_buf.memory = V4L2_MEMORY_MMAP;  
  66.         v4l2_buf.index = i;  
  67.         ret = ioctl(fd , VIDIOC_QUERYBUF, &v4l2_buf);  
  68.         if(ret < 0) {  
  69.            LOGE("+++%d : VIDIOC_QUERYBUF failed\n",__LINE__);  
  70.            return -1;  
  71.         }  
  72.         buffers[i].length = v4l2_buf.length;  
  73.         if ((buffers[i].start = (char *)mmap(0, v4l2_buf.length,  
  74.                                              PROT_READ | PROT_WRITE, MAP_SHARED,  
  75.                                              fd, v4l2_buf.m.offset)) < 0) {  
  76.              LOGE("%d : mmap() failed",__LINE__);  
  77.              return -1;  
  78.         }  
  79.     }  
  80.     rgb = (int *)malloc(sizeof(int) * (mwidth*mheight));  
  81.     ybuf = (int *)malloc(sizeof(int) * (mwidth*mheight));  
  82.     return 0;  
  83. }  

修改地方不是很多 这里当c_type为2的时候是针对CMOS的接口通道1 为3的时候是通道2

同时在

void yuyv422torgb(unsigned char *src,int *mrgb)

最后需要修改下 在测试过程中发现红色和蓝色反了 所以把最后的

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. *lrgb++ = 0xff000000 | b1<<16 | g1<<8 | r1;    
  2. *lrgb++ = 0xff000000 | b2<<16 | g2<<8 | r2;    
修改为

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. *lrgb++ = 0xff000000 | r1<<16 | g1<<8 | b1;  
  2. *lrgb++ = 0xff000000 | r2<<16 | g2<<8 | b2;  
最后 应用里的相关修改如下

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class StartThread extends Thread {  
  2.   
  3.         @Override  
  4.         public void run() {  
  5.             // TODO Auto-generated method stub  
  6.             //super.run();  
  7.             while(true) {  
  8.                 index = Fimcgzsd.dqbuf(mdata);  
  9.                 if(index < 0) {  
  10.                     onDestroy();  
  11.                     break;  
  12.                 }  
  13.                 switch(ctype) {  
  14.                     case 0:  
  15.                         mHandler.post(mUpdateUI);  
  16.                         bitmap = BitmapFactory.decodeByteArray(mdata, 0, width * height);  
  17.                         Fimcgzsd.qbuf(index);  
  18.                         break;  
  19.                     case 1:  
  20.                         Fimcgzsd.pixeltobmp(bmp);  
  21.                         mHandler.post(mUpdateUI);  
  22.                         bitmap = bmp;  
  23.                         Fimcgzsd.qbuf(index);  
  24.                         break;  
  25.                     case 2case 3:  
  26.                         Fimcgzsd.yuvtorgb(mdata, rgb);   
  27.                         mHandler.post(mUpdateUI);  
  28.                         bitmap = Bitmap.createBitmap(rgb,width,height,Bitmap.Config.ARGB_8888);  
  29.                         Fimcgzsd.qbuf(index);  
  30.                         break;  
  31.                 }  
  32.             }  
  33.         }  
最后应用修改如下 这里主要是去实现功能 界面比较简单



CMOS效果如下


============================================
作者:hclydao
http://blog.csdn.net/hclydao
版权没有,但是转载请保留此段声明

============================================


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值