Android camera libcamera动态库实现流程总结.docx_第1页
Android camera libcamera动态库实现流程总结.docx_第2页
Android camera libcamera动态库实现流程总结.docx_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android camera libcamera动态库实现流程总结libcamera.so流程总结framework/base/include/ui下的CameraHardwareInterface.h定义了libCameraService.so需要的所有接口:getPreviewHeap(),startPreview(preview_callbackcb, 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,boolcancel_jpeg)setParameters(),getParameters()release(), dump(),openCameraHardware()其中还定义了5个函数指针,分别指向CameraService.cpp中定义的5个callback函数:void(*preview_callback)(const sp& mem, void*user);void (*shutter_callback)(void* user);void(*raw_callback)(const sp& mem, void* user);void(*jpeg_callback)(const sp& 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()通知CameraServiceautofocus成功。之后,上层的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数据流的过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论