使用zc301 USB摄像头,这个摄像头返回JPEG图形留,camera的preview需要进行jpeg解码(没做),但是可以直接take jpeg照片。
1、修改你的BoardConfig.mk
USE_CAMERA_STUB := false
将stub设置为false,在编译时不会编译android2.1/frameworks/base/camera/libcameraservice中的
CameraHardwareStub.cpp
CameraHardwareStub.h
FakeCamera.cpp
FakeCamera.h
几个文件
2、hardware下建立Camera HAL目录,android2.1/hardware/your board/libcamera
复制以上几个文件
CameraHardwareStub.cpp
CameraHardwareStub.h
FakeCamera.cpp
FakeCamera.h
可以将其重命名
S3C6410CameraHardware.cpp
UsbCamera.cpp
文件中的Fake和Stub同样可以替换
3、编写Android.mk文件
================================================================
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= S3C6410CameraHardware.cpp \
UsbCamera.cpp
LOCAL_C_INCLUDES := \
external/jpeg
LOCAL_SHARED_LIBRARIES:= libutils libbinder libui liblog
LOCAL_STATIC_LIBRARIES:= \
libjpeg
LOCAL_MODULE:= libcamera
include $(BUILD_SHARED_LIBRARY)
=================================================================
其中jpeg库是为了将来解码jpeg使用的,根据这个脚本可编译出libcamera.so
4、修改FakeCamera.cpp->UsbCamera.cpp
目前只实现了基本功能
该文件可以按照V4L2流程来写
网上也有现成的patch,使用mmap方式,可惜是1.6的,没编译过去,待研究
1)构造函数中进行初始化
UsbCamera::UsbCamera(int width, int height)
: mTmpRgb16Buffer(0)
{
fd = open (DEFAULT_DEVICE, O_RDWR /* required */ | O_NONBLOCK, 0);
LOGE("open /dev/video0 fd is %d",fd);
ioctl (fd, VIDIOC_QUERYCAP, &cap);
CLEAR (fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 640;
fmt.fmt.pix.height = 480;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
ioctl (fd, VIDIOC_S_FMT, &fmt);
length = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;
}
2)获取一帧数据
void UsbCamera::getNextFrameAsYuv422(uint8_t *buffer)
{
LOGE("read to get a pic from camera!");
for (;;)
{
fd_set fds;
struct timeval tv;
int r;
FD_ZERO (&fds);
FD_SET (fd, &fds);
/* Timeout. */
tv.tv_sec = 3;
tv.tv_usec = 0;
r = select (fd + 1, &fds, NULL, NULL, &tv);
if (-1 == r) {
LOGE ("select"); }
if (0 == r) {
LOGE ("select timeout\n"); }
if (read (fd, buffer, length));
break;
}
}
3)析构函数
UsbCamera::~UsbCamera()
{
delete[] mTmpRgb16Buffer;
close (fd);
}
5、修改CameraHardwareStub.cpp->S3C6410CameraHardware.cpp
1)改成640x480吧
void CameraHardware::initDefaultParameters()
{
CameraParameters p;
p.setPreviewSize(640,480);
p.setPreviewFrameRate(1);
p.setPreviewFormat("yuv422sp");//("yuv422sp");
p.setPictureSize(640, 480);
p.setPictureFormat("jpeg");//("jpeg");
if (setParameters(p) != NO_ERROR) {
LOGE("Failed to set default parameters?!");
}
}
2)拍照部分要改,因为可以直接获取压缩的jpeg图片
int CameraHardware::pictureThread()
{
UsbCamera* usbCamera = mUsbCamera;
if (mMsgEnabled & CAMERA_MSG_SHUTTER)
mNotifyCb(CAMERA_MSG_SHUTTER, 0, 0, mCallbackCookie);
if (mMsgEnabled & CAMERA_MSG_RAW_IMAGE) {
//FIXME: use a canned YUV image!
// In the meantime just make another fake camera picture.
//int w, h;
//mParameters.getPictureSize(&w, &h);
//sp<MemoryBase> mem = new MemoryBase(mRawHeap, 0, w * 2 * h);
LOGE("CAMERA_MSG_RAW_IMAGE");
//UsbCamera cam(w, h);
//cam.getNextFrameAsYuv422((uint8_t *)mRawHeap->base());
//mDataCb(CAMERA_MSG_RAW_IMAGE, mem, mCallbackCookie);
}
if (mMsgEnabled & CAMERA_MSG_COMPRESSED_IMAGE) {
//sp<MemoryHeapBase> heap = new MemoryHeapBase(20000);
//sp<MemoryBase> mem = new MemoryBase(heap, 0, 20000);
//memcpy(heap->base(), kCannedJpeg, 20000);
LOGE("CAMERA_MSG_COMPRESSED_IMAGE");
int w, h;
mParameters.getPictureSize(&w, &h);
sp<MemoryBase> mem = new MemoryBase(mRawHeap, 0, w * 2 * h);
//UsbCamera cam(w, h);
usbCamera->getNextFrameAsYuv422((uint8_t *)mRawHeap->base());
mDataCb(CAMERA_MSG_COMPRESSED_IMAGE, mem, mCallbackCookie);
}
return NO_ERROR;
}
3)status_t CameraHardware::setParameters(const CameraParameters& params)
有个地方只让take 320x240的pic,要注释掉
/* if (w != 320 && h != 240) {
LOGE("Still picture size must be size of canned JPEG (%dx%d)",
320, 240);
return -1;
}*/
至此Camera HAL已经可以拍照了。
存在问题:
1)需要做jpeg->YUV以实现preview功能,libjpeg没用过,暂时不做。
2)UsbCamera.cpp要改成V4L2标准流程,现在这种read模式太简单,效率低。
分享到:
相关推荐
【eoe_Android特刊】第十七期:Android摄像头的... Android Camera HAL设计初步_阿虚(Rockie)的电子小屋_百度空间.pdf Video for Linux Two(V4L2)——驱动编写指南.pdf 基于Android的 USB照相机的研究与实现.pdf
android camera hal到kernel driver通信
此patch为将raw12数据流传输给上层,高通平台默认支持raw10和raw16,按照基础框架将raw12添加进camera HAL3代码中即可。
有关android的hal层的camera代码实现。一般这个代码从不对外公布。
网上找的android camera HAL资料及V4L2资料,V4L2一个文档中含V4L2的简单实现例程
一个简单的USB camera HAL源码,帮助学习android HAL的编写方法。
Android Camera Hal学习资料(MTK平台) 适合入门、了解学习 MTK Camera平台
自己总结的Android Camera系统架构及源码分析,以framework和hal为主。
Android camera 架构HAL3及其演进,V4L2介绍 PPT
Linux摄像头驱动的设计优化及其对应的Android下HAL封装设计方法探究.pdf
camera HAL 层Log详细打印分析,仅供参考 camera
RK3399 Android7.1 Hal层Camera模块通过回填的形式获取HDMI输入图像数据
不错的android hal培训课件 ,201003在深圳的,jollen
Camera整体架构简单整理一.Android Camera整体架构简述1.1 Android Camera 基本分层...自Android8.0之后大多机型采用Camera API2 HAL3架构, 先盗改谷歌的一张图,读完整部代码后再看这张图,真的是很清晰,很简洁,很到位
android4.0 hal层源码,方便大家学习hal层原理
在android的HAL层用C语言编写可执行测试程序来模拟andoird的HAL层来与RIL进行socket通信为例来介绍电话模块以外的其他模块如何向Modem发送AT命令。
android camera hal3在添加水印功能时需要yuv420sp格式的图像转换才能合成图像,所以需要去解析bmp或者其他格式的图像,在转换成yuv420sp格式。所以提供一份32x24分辨率格式bmp的图像资源。
Android GPS HAL driver porting 笔记,详细的描述了Android GPS 硬件抽象层的基本架构
在android的Camera Hal3实现添加水印功能或者弹幕功能。该部分主要是读取bmp文件并解析bmp图像,获取到argb格式的图像。图像分辨率宽高是32x24,如果图像太大,那么在yuv合成时计算量变大,就消耗更多CPU的处理时间...
android framework hal