libcamera动态库实现流程总结
2010-07-03 13:23
197 查看
libcamera.so 流程总结
framework/base/include/ui下的CameraHardwareInterface.h 定义了 libCameraService.so需要的所有接口:
getPreviewHeap(),startPreview(preview_callback cb, void* user),stopPreview(),previewEnabled(),
autoFocus(autofocus_callback, void* user),
takePicture(shutter_callback,raw_callback,jpeg_callback,void* user)
cancelPicture(bool cancel_shutter,bool cancel_raw,bool cancel_jpeg)
setParameters(),getParameters()
release(), dump(), openCameraHardware()
其中还定义了5个函数指针,分别指向CameraService.cpp中定义的5个callback函数:
void (*preview_callback)(const sp<IMemory>& mem, void* user);
void (*shutter_callback)(void* user);
void (*raw_callback)(const sp<IMemory>& mem, void* user);
void (*jpeg_callback)(const sp<IMemory>& mem, void* user);
void (*autofocus_callback)(bool focused, void* user);
libCamera.so是对CameraHardwareInterface.h的具体实现。其中S3C6410CameraHWInterface.cpp实现了接口中的全部函数。
S3C6410Camera.cpp负责与设备通信。被S3C6410CameraHWInterface.cpp调用。
libcameraService.so先调用openCameraHardware(),得到Camera实例。
然后调用S3C6410CameraHWInterface.cpp中的getParameters(),setParameters()初始化这个Camera实例.
S3C6410CameraHWInterface.cpp在setParameters()之后会调用initHeapLocked(),该函数用来分配存放帧数据的堆,
并在已分配的堆空间上分配Buffer数组,每个数组变量存储一帧数据。
libcameraService.so在Startpreview()中调用getPreviewHeap()得到libcamera.so中存放帧数据的堆的首地址。
然后将这个地址注册到SurfaceFlinger的Buffer中以便提高preview的显示效率。
CameraService.cpp在调用S3C6410CameraHWInterface.cpp的Startpreview()时会将自己的previewCallback()函数传进去,
这样当libcamera.so在调用getPreview()收集到一帧新数据时,就可以通过函数指针调用libcameraService.so中的回调函数previewCallback(),
将新收集到的帧数据的首地址传出去。CameraService.cpp接着调用postFrame(), surfcace->postBuffer()等将该地址传到surfaceFlinger中以显示当前的帧数据。
S3C6410CameraHWInterface.cpp在startpreview()中新建一个线程previewThread(),在该线程中调用S3C6410Camera.cpp中的getpreview()
将设备收集到的帧数据copy到存放帧数据的堆中。
然后在线程中接着调用CameraService.cpp中的回调函数previewCallback(),将当前帧的偏移地址传给surfaceFlinger。
以上是camera的 preview过程的实现流程。
在调用takePicture()之前,cameraService.cpp会先调用autofocus(),同时将自己定义的autofocus函数传进去。cameraService.cpp中的autofocus()
会调用S3C6410CameraHWInterface.cpp中的autoFocus()函数创建一个线程,在该线程中通过函数指针调用CameraService.cpp中的autoFocuscallback()
通知CameraService autofocus成功。
之后,上层的APK会调用getParameter(),setParameter()重新初始化Camera实例。
当调用takePicture()时,CameraService.cpp 会将自己定义的shuttercallback(),rawcallback(),jpegcallback()函数
传给S3C6410CameraHWInterface.cpp中的takepicture()函数。
它会创建一个线程beginPictureThread(),在其中调用函数pictureThread()。
pictureThread()函数通过函数指针调用CameraService.cpp中的shuttercallback(),yuvPictureCallback(),
其中yuvPictureCallback()的作用是将要拍摄的图像在preview模式下显示出来。
为了调用CameraService.cpp中的 jpegPictureCallback(),pictureThread()需要先调用S3C6410Camera中的getjpeg()函数取得jpeg数据流,
再重新开辟一块堆空间,将jpeg数据流copy进去。
之后就可以通过函数指针调用CameraService.cpp中的 jpegPictureCallback(),将得到的jpeg数据流传给CameraService.cpp.
得到jpeg数据流的过程:
S3C6410Camera中的getjpeg()先调用m_frameSize()计算getsnapshot()得到的原始数据所需的空间,按此大小开辟一块内存区存放getsnapshot()得到的原始数据。
在通过yuv2Jpeg()函数将得到的原始数据压缩成jpeg数据流。
framework/base/include/ui下的CameraHardwareInterface.h 定义了 libCameraService.so需要的所有接口:
getPreviewHeap(),startPreview(preview_callback cb, void* user),stopPreview(),previewEnabled(),
autoFocus(autofocus_callback, void* user),
takePicture(shutter_callback,raw_callback,jpeg_callback,void* user)
cancelPicture(bool cancel_shutter,bool cancel_raw,bool cancel_jpeg)
setParameters(),getParameters()
release(), dump(), openCameraHardware()
其中还定义了5个函数指针,分别指向CameraService.cpp中定义的5个callback函数:
void (*preview_callback)(const sp<IMemory>& mem, void* user);
void (*shutter_callback)(void* user);
void (*raw_callback)(const sp<IMemory>& mem, void* user);
void (*jpeg_callback)(const sp<IMemory>& mem, void* user);
void (*autofocus_callback)(bool focused, void* user);
libCamera.so是对CameraHardwareInterface.h的具体实现。其中S3C6410CameraHWInterface.cpp实现了接口中的全部函数。
S3C6410Camera.cpp负责与设备通信。被S3C6410CameraHWInterface.cpp调用。
libcameraService.so先调用openCameraHardware(),得到Camera实例。
然后调用S3C6410CameraHWInterface.cpp中的getParameters(),setParameters()初始化这个Camera实例.
S3C6410CameraHWInterface.cpp在setParameters()之后会调用initHeapLocked(),该函数用来分配存放帧数据的堆,
并在已分配的堆空间上分配Buffer数组,每个数组变量存储一帧数据。
libcameraService.so在Startpreview()中调用getPreviewHeap()得到libcamera.so中存放帧数据的堆的首地址。
然后将这个地址注册到SurfaceFlinger的Buffer中以便提高preview的显示效率。
CameraService.cpp在调用S3C6410CameraHWInterface.cpp的Startpreview()时会将自己的previewCallback()函数传进去,
这样当libcamera.so在调用getPreview()收集到一帧新数据时,就可以通过函数指针调用libcameraService.so中的回调函数previewCallback(),
将新收集到的帧数据的首地址传出去。CameraService.cpp接着调用postFrame(), surfcace->postBuffer()等将该地址传到surfaceFlinger中以显示当前的帧数据。
S3C6410CameraHWInterface.cpp在startpreview()中新建一个线程previewThread(),在该线程中调用S3C6410Camera.cpp中的getpreview()
将设备收集到的帧数据copy到存放帧数据的堆中。
然后在线程中接着调用CameraService.cpp中的回调函数previewCallback(),将当前帧的偏移地址传给surfaceFlinger。
以上是camera的 preview过程的实现流程。
在调用takePicture()之前,cameraService.cpp会先调用autofocus(),同时将自己定义的autofocus函数传进去。cameraService.cpp中的autofocus()
会调用S3C6410CameraHWInterface.cpp中的autoFocus()函数创建一个线程,在该线程中通过函数指针调用CameraService.cpp中的autoFocuscallback()
通知CameraService autofocus成功。
之后,上层的APK会调用getParameter(),setParameter()重新初始化Camera实例。
当调用takePicture()时,CameraService.cpp 会将自己定义的shuttercallback(),rawcallback(),jpegcallback()函数
传给S3C6410CameraHWInterface.cpp中的takepicture()函数。
它会创建一个线程beginPictureThread(),在其中调用函数pictureThread()。
pictureThread()函数通过函数指针调用CameraService.cpp中的shuttercallback(),yuvPictureCallback(),
其中yuvPictureCallback()的作用是将要拍摄的图像在preview模式下显示出来。
为了调用CameraService.cpp中的 jpegPictureCallback(),pictureThread()需要先调用S3C6410Camera中的getjpeg()函数取得jpeg数据流,
再重新开辟一块堆空间,将jpeg数据流copy进去。
之后就可以通过函数指针调用CameraService.cpp中的 jpegPictureCallback(),将得到的jpeg数据流传给CameraService.cpp.
得到jpeg数据流的过程:
S3C6410Camera中的getjpeg()先调用m_frameSize()计算getsnapshot()得到的原始数据所需的空间,按此大小开辟一块内存区存放getsnapshot()得到的原始数据。
在通过yuv2Jpeg()函数将得到的原始数据压缩成jpeg数据流。
相关文章推荐
- libcamera动态库实现流程总
- Android camera libcamera动态库实现流程总结
- TCP通信与UDP通信WINDOWS实现流程总结
- 流程总结:实现增删改查一组功能的步骤
- IPv6实现--传入包的处理流程(1)
- Struts2流程总结
- win7下硬盘安装ubuntu实现双系统的经验和技术总结
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- 关于c++多态性实现的理解过程(给自己看的总结,比较跳跃)
- android 设置壁纸wallpaper 流程总结
- php的cli模式下的内部实现流程概述
- SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇
- MyBatis学习总结(5)——实现关联表查询
- K2 blackpearl 结合MOSS表单库实现请假流程
- 二叉树学习总结(Java实现)
- 关于Android实现滑动返回的几种方法总结
- Php如何实现下载功能超详细流程分析
- 通过ServiceBroker实现订阅(Publish- Subscribe)框架发布【个人总结】
- 微信公众号支付流程(Node实现)
- Atitit 游戏的通常流程 attilax 总结 基于cocos2d api