android4.0 USB Camera实例(四)CMOS

上一篇说了下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;
	else
		fmt.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 {

		@Override
		public 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效果如下

android4.0 USB Camera实例(四)CMOS,布布扣,bubuko.com

时间: 2024-07-30 10:06:21

android4.0 USB Camera实例(四)CMOS的相关文章

android4.0 USB Camera实例(五补充)jpg压缩

前一篇最后 我们说了一个直接将yuv转成jpg的函数 但是转换没有成功 原函数是yuv420转jpg的 研究了下发现 yuv420隔行扫描的的序列是这样的 YYYY YYYY UVUV 而yuv422的隔行扫描的序列是这样的 YU YV YU YV YU YV 所以将函数作如下修改 static int put_jpeg_yuv420p_memory(unsigned char *dest_image, unsigned char *input_image, int width, int hei

android4.0 USB Camera实例(六)ffmpeg mpeg编码

前面本来说是做h264编码的 研究了两天发现ffmpeg里的h264编码似乎是要信赖第三方库x264 还是怎么简单怎么来吧所以就整了个mpeg编码 ffmpeg移植前面我有一篇ffmpeg解码里已经给了 具体链接在这http://blog.csdn.net/hclydao/article/details/18546757 怎么使用那里面也已经说了 这里主要是通过ffmpeg将yuv422格式转换成rgb 然后就是yuv422转成mpeg格式 接前面几篇 获取到yuv422数据后 为了能显示出来

android4.0 USB Camera实例(五)jpg压缩

最近大部分时间都在研究usb 摄像头顺便把jpg编码也写上 下面大部分函数都是我在网上找的 然后稍微的改一点就可以使用了 不过找这些函数费了不少时间 jpg编码网上有很多说明 大致流程都是一样的 我也没深入研究这里就不说了 接前面几篇Camera的文章 这里主要同把获取到的yuv数据通过jpg压缩 以及压缩成mjpeg视频流 首先说明下摄像头获取到的数据格式是yuv422(p16) 这个是在你初始化摄像头设置pixelformat我们当初设置的是V4L2_PIX_FMT_YUYV它的实际格式就是

android4.0 USB Camera实例(三)UVC

passport.baidu.com/?business&un=%5F%E5%B0%8F%E5%A7%90%E8%8E%B1%E9%98%B3%E6%8F%B4%E4%BA%A4#0 passport.baidu.com/?business&un=%5F%E5%B0%8F%E5%A7%90%E6%B5%B7%E9%98%B3%E6%8F%B4%E4%BA%A4#0 passport.baidu.com/?business&un=%E5%8C%85%E5%A4%9C%5F%E8%8E

android4.0 USB Camera示例(五个辅助)jpg压缩

前的最后一个 我们说,一个直接yuv变成jpg该功能 但是转换不成功 主要功能是yuv420转jpg的 根据研究发现 yuv420的序列是这种 YYYY YYYY UVUV 而yuv422的隔行扫描的序列是这种 YU YV YU YV YU YV 所以将函数作例如以下改动 static int put_jpeg_yuv420p_memory(unsigned char *dest_image, unsigned char *input_image, int width, int height)

Android4.0设置界面修改总结(四)

之前有跟大家分享设置Tab风格和Item圆角的实现,希望能给有需要的朋友一点点帮助,今天再和大家分享一下用ViewPager实现设置分页,小米和OPPO就是这样的设置,先来看看效果图:   为了帮助大家更清晰的理解,我单独拿出一个小例子,有需要的朋友可以下载下来看看: http://git.oschina.net/way/SettingTab/tree/master 其实要实现这样的风格并不难,只要能比较深入的理解PreferenceActivity.java就可以了.我们都知道Settings

51全志R58平台Android4.4下Camera的HAL层修改

51全志R58平台Android4.4下Camera的HAL层修改 2018/11/7 15:20 版本:V1.0 开发板:SC5806 1.系统编译: (略) 2.全志R58平台Android4.4下Camera的HAL层在这个目录: /home/wwt/r58_android_v4.4/android/device/softwinner/octopus-common/hardware/camera 可以使用mm编译: BuildImg 0 Dragon execute image.cfg S

Android4.0(Phone)拨号启动过程分析(二)

接上:Android4.0(Phone)拨号启动过程分析(一) InCallScreen处理来电和拨号的界面,接通电话也是这个界面,接下来分析InCallScreen类是如何处理拨号流程的: @Override protected void onCreate(Bundle icicle) { Log.i(LOG_TAG, "onCreate()... this = " + this); Profiler.callScreenOnCreate(); super.onCreate(icic

jQuery插件实例四:手风琴效果[无动画版]

手风琴效果就是内容的折叠与打开,在这个插件中,使用了三种数据来源:1.直接写在DOM结构中:2.将数据写在配置项中:3.从Ajax()中获取数据.在这一版中,各项的切换没有添加动画效果,在下一版中会是有动画效果的. 在这个插件中,CSS和JS的配置非常重要,需要特别注意.另外,加个思考,请先看完后再想这个问题:当点击其中某项时,给width直接添加animate是否合适,当快速在其上移动时,如何保证效果? 效果图预览 插件JS accordionB.js 1 ; 2 (function ($,