searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

android系统中camera流程分析

2023-07-20 02:13:17
103
0
 
一、android camera应用层或者说framework层相关介绍,官方文档资料地址:https://developer.android.com
 
1.其中,CameraX是最新的framework层的架构,基于Camera2而来。
camera是比较老的架构,可以先看camera架构,可以理解为Camera1.
其中提到,拍照,查看照片,录制视频等基础的相机功能,可以通过Intent的方式,调用其他camera应用来实现。
 
2.在camera1架构当中,如果要从零开始实现一个相机应用,则查看“控制相机” “camera API”这两个,里面有相关代码实现。
如果想详细了解framework侧的代码架构,也可以从这里入手。
 
3.上层应用代码,可以参考android sdk当中的packages/apps/Camera2的实例。
API代码在frameworks/base/core/java/android/hardware当中。
这里不光有camera相关的API,也有其他硬件的API,包括sensor,display,radio等。
 
camera1API的路径是frameworks/base/core/java/android/hardware/Camera.java
camera2API的路径是frameworks/base/core/java/android/hardware/camera2
 
 
二、cameraAPI调用cameraHAL关系
API1 API2调用HAL1 HAL3最关键的判断是在frameworks/av/services/camera/libcameraservice/CameraService.cpp当中的
makeClient函数。
CameraService::connect ----> CameraService::connectHelper ----> CameraService::makeClient
从makeClient函数分析可以得知:
1.deviceVersion从底层获取的值是goldfish代码当中getCameraInfo->device_version.
代码在EmulatedCamera::getCameraInfo ----> EmulatedBaseCamera::getCameraInfo
初始化的值为HARDWARE_DEVICE_API_VERSION(1, 0)。在EmulatedCamera构造函数中。
2.halVersion值都是默认为-1,effectiveApiLevel值默认为API1。这两个值可以看从connect函数当中看到。
3.所以,按照makeClient函数当中的判断逻辑,从底层获取到的deviceversion值是关键,如果该值为HAL1,则调用CameraClient
如果该值为HAL3,则调用Camera2Client。
从上面的分析可以得知,不管camera API到底是API1还是API2,创建camera 设备的时候,根据deviceversion来决定到底调用哪个接口。
 
4.如果上层调用的时候,指定了halVersion值,并且只能指定为HAL1,并且从底层获取到的deviceVersion值要大于HAL1,则调用CameraClient。其他的hal版本暂时不支持指定。
注意:halVersion值可以理解为上层传递下来的参数,是上层有指定hal版本的需求。而真正的hal版本值,是deviceVersion值,因为这个值
是从底层获取上来的。
 
从上面的分析,可以知道,API和HAL直接的两两调用如下:
1.API1---> HAL1(CameraClient)
2.API2-->API1--->HAL1(CameraClient)API2接口需转成API1,android framework代码当中有专门的转换接口
3.API2---->HAL3(Camera2Client)
4.API1--->API2--->HAL3(Camera2Client)API1接口需转成API2,android framework代码当中有专门的转换接口
 
 
0条评论
0 / 1000
m****n
3文章数
0粉丝数
m****n
3 文章 | 0 粉丝
m****n
3文章数
0粉丝数
m****n
3 文章 | 0 粉丝
原创

android系统中camera流程分析

2023-07-20 02:13:17
103
0
 
一、android camera应用层或者说framework层相关介绍,官方文档资料地址:https://developer.android.com
 
1.其中,CameraX是最新的framework层的架构,基于Camera2而来。
camera是比较老的架构,可以先看camera架构,可以理解为Camera1.
其中提到,拍照,查看照片,录制视频等基础的相机功能,可以通过Intent的方式,调用其他camera应用来实现。
 
2.在camera1架构当中,如果要从零开始实现一个相机应用,则查看“控制相机” “camera API”这两个,里面有相关代码实现。
如果想详细了解framework侧的代码架构,也可以从这里入手。
 
3.上层应用代码,可以参考android sdk当中的packages/apps/Camera2的实例。
API代码在frameworks/base/core/java/android/hardware当中。
这里不光有camera相关的API,也有其他硬件的API,包括sensor,display,radio等。
 
camera1API的路径是frameworks/base/core/java/android/hardware/Camera.java
camera2API的路径是frameworks/base/core/java/android/hardware/camera2
 
 
二、cameraAPI调用cameraHAL关系
API1 API2调用HAL1 HAL3最关键的判断是在frameworks/av/services/camera/libcameraservice/CameraService.cpp当中的
makeClient函数。
CameraService::connect ----> CameraService::connectHelper ----> CameraService::makeClient
从makeClient函数分析可以得知:
1.deviceVersion从底层获取的值是goldfish代码当中getCameraInfo->device_version.
代码在EmulatedCamera::getCameraInfo ----> EmulatedBaseCamera::getCameraInfo
初始化的值为HARDWARE_DEVICE_API_VERSION(1, 0)。在EmulatedCamera构造函数中。
2.halVersion值都是默认为-1,effectiveApiLevel值默认为API1。这两个值可以看从connect函数当中看到。
3.所以,按照makeClient函数当中的判断逻辑,从底层获取到的deviceversion值是关键,如果该值为HAL1,则调用CameraClient
如果该值为HAL3,则调用Camera2Client。
从上面的分析可以得知,不管camera API到底是API1还是API2,创建camera 设备的时候,根据deviceversion来决定到底调用哪个接口。
 
4.如果上层调用的时候,指定了halVersion值,并且只能指定为HAL1,并且从底层获取到的deviceVersion值要大于HAL1,则调用CameraClient。其他的hal版本暂时不支持指定。
注意:halVersion值可以理解为上层传递下来的参数,是上层有指定hal版本的需求。而真正的hal版本值,是deviceVersion值,因为这个值
是从底层获取上来的。
 
从上面的分析,可以知道,API和HAL直接的两两调用如下:
1.API1---> HAL1(CameraClient)
2.API2-->API1--->HAL1(CameraClient)API2接口需转成API1,android framework代码当中有专门的转换接口
3.API2---->HAL3(Camera2Client)
4.API1--->API2--->HAL3(Camera2Client)API1接口需转成API2,android framework代码当中有专门的转换接口
 
 
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0