Android Camera API2.0下全新的Camera FWHAL架构简述
更新时间:2023-10-24 03:34:01 阅读量: 综合文库 文档下载
- android是什么手机推荐度:
- 相关推荐
Android Camera API2.0下全新的Camera FW/HAL架构简述
前沿:
前面博文大多少总结的是Camera HAL1到HAL3的系统架构,但这些架构对于Camera APP开发来说依旧还是处于Camera API1.0的标准。而随着
Camera3、HAL3.0等的不断更新,Google先是在Framework中更改了整个架构从而去匹配Camera API1.0的处理逻辑,随着时间的推移,Google直接对
Camera API进行了全新的升级,去除了原先的Camera.java的相关接口,取而代之的是设计了Camera API2来完全匹配之前设计的Camera3以及HAL3,这样的好处是整个架构看起来会更简单。
本文主要简单的说明一下API2.0下Camera在Framewrok层中的处理逻辑,以及对比之前API1.0下他放弃了什么,同时增加了什么?
1. 全新的Camera API2.0 在API2.0中你再也看不得之前的startPreview、takePicture、AutoFocus等标准的操作接口,取而代之的是出现了大量涉及到
CaptureRequest/CaptureResult相关的API,Google 在API Level21中即Android5.0版本中开始使用,并deprecate旧的Camera.java相关的接口。
2. AIDL技术在CameraService中的出现 AIDL是Android Java层实现C/S架构的一种方式,在Native Binder机制的帮助下,在Java层直接建立一种进程间通信。在Camera API2.0下可以看到大量的ADIL处理方式在Java层中出现,替代之前API1.0下都需要进入了Native层来完成通信。 对于CameraService而言,无论是哪种架构或者方式,都是应该满足下面的几个过程: (1)CameraService启动;
1
(2)一个Client端通过CameraService Proxy连接到CameraService,并获得一个CameraClient Proxy。后续通过CameraClient Proxy直接和CameraService来交互。
(3)Client要提供Callback实体接口到Service端,即每个Service端的CameraClient都需要一个Callback Proxy来完成数据、消息的Callback。 无论Android怎么升级,Camera模块基本都处于这种工作模式下,只是具体的实现方式不同而已。此外,上面所提的到C/S架构基本都是通过Binder IPC来实现的。 传统的CameraService架构是在API1.0下请求Service在客户端创建一个Camera,是一种很明显的C++层的C/S架构,但在API2.0的架构下原先在Client层的Camera直接是交由Java层CameraDevice来维护,通过AIDL的处理方式实现接口ICameraDeviceUser,在Java层维护一个Camera proxy,好处很明显是响应的速度会更快一些: [java] view plaincopy
1. interface ICameraDeviceUser 2. { 3. /** 4. * Keep up-to-date with frameworks/av/include/camera/camera2/ICameraDeviceUser.h 5. */ 6. void disconnect(); 7. 8. // ints here are status_t 9. 10. // non-negative value is the requestId. negative value is status_t 11. int submitRequest(in CaptureRequest request, boolean streaming); 12. 13. int cancelRequest(int requestId); 14. 15. int deleteStream(int streamId); 16. 17. // non-negative value is the stream ID. negative value is status_t 18. int createStream(int width, int height, int format, in Surface surface); 19. 2
20. int createDefaultRequest(int templateId, out CameraMetadataNative request); 21. 22. int getCameraInfo(out CameraMetadataNative info); 23. 24. int waitUntilIdle(); 25. 26. int flush(); 27. } 同样的我们看到CameraSevice在Android Java层处的ICameraService.AIDL文件:
[cpp] view plaincopy
1. interface ICameraService 2. { 3. /** 4. * Keep up-to-date with frameworks/av/include/camera/ICameraService.h 5. */ 6. int getNumberOfCameras(); 7. 8. // rest of 'int' return values in this file are actually status_t 9. 10. int getCameraInfo(int cameraId, out CameraInfo info); 11. 12. int connect(ICameraClient client, int cameraId, 13. String clientPackageName, 14. int clientUid, 15. // Container for an ICamera object 16. out BinderHolder device); 17. 18. int connectPro(IProCameraCallbacks callbacks, int cameraId, 19. String clientPackageName, 20. int clientUid, 21. // Container for an IProCameraUser object 22. out BinderHolder device); 3
23. 24. int connectDevice(ICameraDeviceCallbacks callbacks, int cameraId, 25. String clientPackageName, 26. int clientUid, 27. // Container for an ICameraDeviceUser object 28. out BinderHolder device); 29. 30. int addListener(ICameraServiceListener listener); 31. int removeListener(ICameraServiceListener listener); 32. 33. int getCameraCharacteristics(int cameraId, out CameraMetadataNative info); 34. }
3.Camera2Client消失,CameraDeviceClient出世
CameraDeviceClient可以说是替代了原先API1.0下升级后的Camera2Client,此外在API2.0下是不允许Camera HAL Module 版本号为
CAMERA_DEVICE_API_VERSION_1_0的,至于选择使用的是Camera2Device还是Camera3Device来连接HAL3主要通过HAL的
CAMERA_DEVICE_API_VERSION来指定。此外HAL中的VERSION必须要在CAMERA_DEVICE_API_VERSION_2_0以上才允许建立CameraDeviceClient。
4. Native消失了的各种Stream创建者 在之前的博文中,一直都在重点强调Camera2Client下出现了各种,目前看来这些只能停留在API1.0的世界里面了,随着时间的推移Android版本的升级也许会慢慢的消逝,也就直接告诉我们HAL1.0的CameraHardwareInterface的实现方式将不复存在,当然一切还得取决于厂商的实现方式。 在这里要重点说明的是在Camera2Client下出现了CallbackProcessor、FrameProcessor、StreamingProcessor等模块,每个模块负责处理不同的业务以及相关底层视频图像数据的处理与回调,其中对于数据的处理通过建立
CPUConsumer与Surface的架构,更多的是以一种Consumer的角度实现对Buffer的queue与dequeue相关的操作,最终实现Camera3Device标准下的处理逻辑。
而在API2中在Framework层中,这些模块将不再被使用,代替他们的是在Android5.0中的Java层中出现的各种Consumer,类似与Preview模式下的
4
SurfaceFlinger在Java层中的surfaceview,这种模式是通过建立不同类型的Consumer,然后在Native层建立一个BufferQueue,并将这个BufferQueue的IGraphicBufferConsumer用于构建CPUConsumer,将IGraphicBufferProducer通过createStream给CameraDevice增加一个Stream。
当然本质上看起来两者实现方式的机制是一样的,都是需要create一个
Stream,然后Stream需要对应的ANativeWindow类型的Surface,用于从HAL3中获取数据,一旦获取数据后和这个Surface绑定的Consumer就可以通过
OnFrameAvailable()来接收处理buffer。下面的接口说明了在API2下对于不同数据处理模块只需要get一个Surface后通过AIDL实现方式就可以创建一个stream接口,用于数据的接收。 [cpp] view plaincopy
1. status_t CameraDeviceClient::createStream(int width, int height, int format, 2. const sp
25. return ALREADY_EXISTS; 26. } 27. } 28. 29. ............. 30. 31. int32_t disallowedFlags = GraphicBuffer::USAGE_HW_VIDEO_ENCODER | 32. GRALLOC_USAGE_RENDERSCRIPT; 33. int32_t allowedFlags = GraphicBuffer::USAGE_SW_READ_MASK | 34. GraphicBuffer::USAGE_HW_TEXTURE | 35. GraphicBuffer::USAGE_HW_COMPOSER; 36. bool flexibleConsumer = (consumerUsage & disallowedFlags) == 0 && 37. (consumerUsage & allowedFlags) != 0; 38. 39. sp
6
等不同模式的数据流将由MediaRecoder、SurfaceView、ImageReader等来直接处理,总体来说效率会更佳。
5. FrameProcessorBase依然存在
该类在旧版本中被FrameProcessor用来处理3A相关的信息,主要是
Callback每一帧的ExtraResult到APP,也就是3A相关的数据信息。这也是在API1和API2中唯一都需要手动CallBack的模块,其余的数据流都是被上述提到的模块自动处理,其中实现的方式如2小节(3)所描述,其中采用ICameraDeviceCallbacks将每一视频帧数据回传: [cpp] view plaincopy
1. interface ICameraDeviceCallbacks 2. { 3. /** 4. * Keep up-to-date with frameworks/av/include/camera/camera2/ICameraDeviceCallbacks.h 5. */ 6. 7. oneway void onCameraError(int errorCode); 8. oneway void onCameraIdle(); 9. oneway void onCaptureStarted(int requestId, long timestamp); 10. oneway void onResultReceived(int requestId, in CameraMetadataNative result); 11. }
6 小结,整个API2下Camera3的架构简图
7
8
正在阅读:
Android Camera API2.0下全新的Camera FWHAL架构简述10-24
岗位目标管理责任书(车队队长)新05-28
关爱他人很简单作文03-10
浅谈企业绩效考核07-22
必修五 unit4 词汇学案01-07
苏教版5BU1-U4知识归纳05-21
初中7年级双语汉语课本第八课蚂蚁06-10
圆锥曲线与方程测试题含05-31
风管安装及支吊架要求技术交底04-16
经营情况介绍06-22
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- Camera
- 简述
- 架构
- Android
- 全新
- FWHAL
- API
- 2.0
- 电阻传感器
- 六年级数学《鸽巢原理》说课稿
- 宿舍文化节系列活动策划书
- 锅炉运行值班员(高级技师)第二版理论题库
- noip2010提高组解题报告
- 2013.10秋实九年级10月考题
- 二十五篇自动化最权位的论文
- 文显列毕业论文终稿 - 图文
- 北京市清华附中2013-2014学年高一上学期期末考试物理试题(打印版)
- 水利工程施工监理中存在的问题
- 材料科学基础笔记
- 调研报告:进一步提升巡察工作的质量和效益
- 软件开发管理制度
- 学校食堂行政领导陪餐制度
- 全球化的中国经济与大学生就业
- 三年级科学下册复习题(123)
- 中心小学创书法特色学校的实施方案
- 111中学小学生计算能力分项测试成绩分析
- 2009年3月政府工作报告同传口译及中英文本
- 安健环知识试卷(答案)