android4.0 USB Camera執行個體(四)CMOS

來源:互聯網
上載者:User

標籤:des   android   style   class   blog   code   

上一篇說了下usb camera uvc標準的 順便把CMOS做到一起 操作上基本一至 上一篇HAL層裡我已經提供了CMOS的相關介面

JNIEXPORT jint JNICALL Java_com_dao_usbcam_Fimcgzsd_yuvtorgb

如果使用和UVC一樣的處理 映像顯示不出來 所以用另外一種方法 同時這裡使用的是斯道ICOOL210開發板測試的 如果使用CMOS還需要修改一些地方 HAL層修改如下

首先增加一個函數如下

int select_input(int input){int ret;ret = ioctl(fd, VIDIOC_S_INPUT, &input);if (ret) {printf("xioctl VIDIOC_S_INPUT failed+++++\n");}   return ret;}
init裡調用 init修改如下

JNIEXPORT jint JNICALL Java_com_dao_usbcam_Fimcgzsd_init(JNIEnv * env, jclass obj, jint width, jint height,jint numbuf,jint ctype){int ret;int i;bufnum = numbuf;mwidth = width;mheight = height;c_type = ctype;struct v4l2_format fmt;struct v4l2_capability cap;if(c_type == 2)select_input(0);else if(c_type == 3)select_input(1);    ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);    if (ret < 0) {        LOGE("%d :VIDIOC_QUERYCAP failed\n",__LINE__);        return -1;    }    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {        LOGE("%d : no capture devices\n",__LINE__);        return -1;    }memset( &fmt, 0, sizeof(fmt));fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;if(c_type > 0)fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;elsefmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB565;if(c_type > 1) {fmt.fmt.pix.field = V4L2_FIELD_NONE;//V4L2_FIELD_INTERLACED;//V4L2_FIELD_NONE;fmt.fmt.pix.priv = 1;}fmt.fmt.pix.width = width;fmt.fmt.pix.height = height;if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0){LOGE("++++%d : set format failed\n",__LINE__);return -1;}    struct v4l2_requestbuffers req;    req.count = numbuf;    req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;    req.memory = V4L2_MEMORY_MMAP;    ret = ioctl(fd, VIDIOC_REQBUFS, &req);    if (ret < 0) {        LOGE("++++%d : VIDIOC_REQBUFS failed\n",__LINE__);        return -1;    }    buffers = calloc(req.count, sizeof(*buffers));    if (!buffers) {        LOGE ("++++%d Out of memory\n",__LINE__);return -1;    }for(i = 0; i< bufnum; ++i) {memset(&v4l2_buf, 0, sizeof(v4l2_buf));v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;v4l2_buf.memory = V4L2_MEMORY_MMAP;v4l2_buf.index = i;ret = ioctl(fd , VIDIOC_QUERYBUF, &v4l2_buf);if(ret < 0) {   LOGE("+++%d : VIDIOC_QUERYBUF failed\n",__LINE__);   return -1;}buffers[i].length = v4l2_buf.length;if ((buffers[i].start = (char *)mmap(0, v4l2_buf.length,                                     PROT_READ | PROT_WRITE, MAP_SHARED,                                     fd, v4l2_buf.m.offset)) < 0) {     LOGE("%d : mmap() failed",__LINE__);     return -1;}}rgb = (int *)malloc(sizeof(int) * (mwidth*mheight));ybuf = (int *)malloc(sizeof(int) * (mwidth*mheight));return 0;}

修改地方不是很多 這裡當c_type為2的時候是針對CMOS的介面通道1 為3的時候是通道2

同時在

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

最後需要修改下 在測試過程中發現紅色和藍色反了 所以把最後的

        *lrgb++ = 0xff000000 | b1<<16 | g1<<8 | r1;          *lrgb++ = 0xff000000 | b2<<16 | g2<<8 | r2;  
修改為

*lrgb++ = 0xff000000 | r1<<16 | g1<<8 | b1;*lrgb++ = 0xff000000 | r2<<16 | g2<<8 | b2;
最後 應用裡的相關修改如下

class StartThread extends Thread {@Overridepublic void run() {// TODO Auto-generated method stub//super.run();while(true) {index = Fimcgzsd.dqbuf(mdata);if(index < 0) {onDestroy();break;}switch(ctype) {case 0:mHandler.post(mUpdateUI);bitmap = BitmapFactory.decodeByteArray(mdata, 0, width * height);Fimcgzsd.qbuf(index);break;case 1:Fimcgzsd.pixeltobmp(bmp);mHandler.post(mUpdateUI);bitmap = bmp;Fimcgzsd.qbuf(index);break;case 2: case 3:                    Fimcgzsd.yuvtorgb(mdata, rgb);                     mHandler.post(mUpdateUI);                    bitmap = Bitmap.createBitmap(rgb,width,height,Bitmap.Config.ARGB_8888);                    Fimcgzsd.qbuf(index);break;}}}
最後應用修改如下 這裡主要是去實現功能 介面比較簡單



CMOS效果如下



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.