文档章节

Android Camera原理之camera provider启动

天王盖地虎626
 天王盖地虎626
发布于 07/12 23:00
字数 922
阅读 60
收藏 0
c++

行业解决方案、产品招募中!想赚钱就来传!>>>

1.camera provider进程介绍:

 

 
 


cameraserver 736 1 274664 69564 binder_thread_read f3de10cc S android.hardware.camera.provider@2.4-service

 

其中的pid是736,说明camera provider进程启动的时机比较早,而且权限组是 cameraserver

手机上运行的android.hardware.camera.provider@2.4-service进程是支持camera运行的重要进程。

 
camera架构.jpg

 

上面这张图比较清楚的表现了camera provider进程在camera架构中位置,作为承上启下的部分,和cameraserver进程和底层的驱动交互,camera provider进程非常重要,camera HAL层几乎全部运行在camera provider进程中完成。

android.hardware.camera.provider@2.4-service在手机启动的时候就会启动起来,下面整体分析一下android.hardware.camera.provider@2.4-service进程的启动过程。

2.camera provider进程启动流程:

首先看下camera provider所在源码中的位置:hardware/interfaces/camera/provider/

 
cameraprovider代码目录.jpg


可以看出来在hardware/interfaces/camera/provider/2.4/default/ 下面有几个rc文件,Android初始化就是执行这些rc文件,这里执行的是android.hardware.camera.provider@2.4-service.rc文件,看看其中的执行代码。

 

service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service
    class hal user cameraserver group audio camera input drmrpc ioprio rt 4 capabilities SYS_NICE writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks 

第一行就看到了启动一个 /vendor/bin/hw/android.hardware.camera.provider@2.4-service 进程。

下面列出camera provider进程的启动流程,大家可以先看一下。

 

 
camera provider进程启动流程.jpg

 

service.cpp : hardware/interfaces/camera/provider/2.4/default/service.cpp

CameraProvider : hardware/interfaces/camera/provider/2.4/default/CameraProvider.cpp

hardware.c : hardware/libhardware/hardware.c

CameraModule : hardware/interfaces/camera/common/1.0/default/CameraModule.cpp

QCamera2Factory : hardware/qcom/camera/QCamera2Factory.cpp

QCameraFlash : hardware/qcom/camera/QCamera2/util/QCameraFlash.cpp

QCamera3HardwareInterface : hardware/qcom/camera/QCamera2/HAL3/QCamera3HWI.cpp

这儿值得讲一讲的就是native中的函数指针的问题,从camera interfaces中将函数指针映射到camera hal层中。
主要从CameraModule中调用到QCamera2Factory中。期间使用了camera_module_t这个结构体。可以看下 CameraModule::init函数。

int CameraModule::init() {
    ATRACE_CALL();
    int res = OK;
    if (getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4 &&
            mModule->init != NULL) {
        ATRACE_BEGIN("camera_module->init"); res = mModule->init(); ATRACE_END(); } mCameraInfoMap.setCapacity(getNumberOfCameras()); return res; } 

这儿调用的mModule->init(); 这个mModule就是camera_module_t结构体对象,这时候翻看一下《Android Camera原理之camera HAL底层数据结构与类总结》

typedef struct camera_module {
    hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); int (*set_callbacks)(const camera_module_callbacks_t *callbacks); void (*get_vendor_tag_ops)(vendor_tag_ops_t* ops); int (*open_legacy)(const struct hw_module_t* module, const char* id, uint32_t halVersion, struct hw_device_t** device); int (*set_torch_mode)(const char* camera_id, bool enabled); int (*init)(); void* reserved[5]; } camera_module_t; 

结构体中有一些函数指针,我们现在需要搞清楚这些函数指针被映射到什么地方了?
hardware中interface中提供了原生的映射方法,在hardware/libhardware/modules/camera/3_0/CameraHAL.cpp中。

camera_module_t HAL_MODULE_INFO_SYM __attribute__ ((visibility("default"))) = {
    .common = {
        .tag                = HARDWARE_MODULE_TAG,
        .module_api_version = CAMERA_MODULE_API_VERSION_2_2,
        .hal_api_version    = HARDWARE_HAL_API_VERSION,
        .id                 = CAMERA_HARDWARE_MODULE_ID,
        .name               = "Default Camera HAL",
        .author             = "The Android Open Source Project", .methods = &gCameraModuleMethods, .dso = NULL, .reserved = {0}, }, .get_number_of_cameras = get_number_of_cameras, .get_camera_info = get_camera_info, .set_callbacks = set_callbacks, .get_vendor_tag_ops = get_vendor_tag_ops, .open_legacy = NULL, .set_torch_mode = NULL, .init = NULL, .reserved = {0}, }; 

这是通用的映射,我们手机的芯片会重新这个HAL层接口,例如使用高通芯片的话,会在hardware/qcom/camera/QCamera2/QCamera2Hal.cpp中重写这个函数映射。
实际上可能不是这个路径,根据你本地实际的hal层重新方法来查找这些函数映射。

static hw_module_t camera_common = {
    .tag                    = HARDWARE_MODULE_TAG,
    .module_api_version     = CAMERA_MODULE_API_VERSION_2_4,
    .hal_api_version        = HARDWARE_HAL_API_VERSION,
    .id                     = CAMERA_HARDWARE_MODULE_ID,
    .name                   = "QCamera Module",
    .author                 = "Qualcomm Innovation Center Inc",
    .methods                = &qcamera::QCamera2Factory::mModuleMethods,
    .dso                    = NULL,
    .reserved               = {0} }; camera_module_t HAL_MODULE_INFO_SYM = { .common = camera_common, .get_number_of_cameras = qcamera::QCamera2Factory::get_number_of_cameras, .get_camera_info = qcamera::QCamera2Factory::get_camera_info, .set_callbacks = qcamera::QCamera2Factory::set_callbacks, .get_vendor_tag_ops = qcamera::QCamera3VendorTags::get_vendor_tag_ops, .open_legacy = NULL, .set_torch_mode = qcamera::QCamera2Factory::set_torch_mode, .init = NULL, .reserved = {0} }; 

明确这些函数映射之后,接下来可以直接调用到hal层了。再底层就是芯片中复写的核心方法了,暂时不作深入介绍了。

天王盖地虎626

天王盖地虎626

粉丝 43
博文 741
码字总数 26673
作品 0
南京
私信 提问
加载中
请先登录后再评论。
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
662
1
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.4K
16
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
6.6K
8
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.2K
1
跨平台手机应用开发--Gideros

Gideros 可以让你轻松快速创建 iOS 和 Android 应用,提供用户友好的集成开发环境,内建模拟器对应用进行不同屏幕大小、分辨率下的测试,最大的优点是可即时修改代码即时进行测试,无需编译安...

匿名
2013/02/19
2.7K
1

没有更多内容

加载失败,请刷新页面

加载更多

听说你还不会jwt和swagger-饭我都不吃了带着实践项目我就来了

前言 哈喽,大家好,我是asong,这是我的第八篇原创文章。听说你们还不会jwt、swagger,所以我带来一个入门级别的小项目。实现用户登陆、修改密码的操作。使用GIN(后台回复Golang梦工厂:g...

sunsong2020
今天
3
0
python合并excel的多个sheet

简介 因为,每天都会有的大量excel报表汇总处理任务,所以写了一个脚本来处理。 就是找出每一个excel中特定的sheet,把这些sheet的特定列读取出来合并到一个sheet中。 因为每一个sheet的数据...

trayvon
21分钟前
7
0
如何设计一个幂等接口

什么叫幂等接口 幂等性,就是只多次操作的结果是一致的。这里可能有人会有疑问。 问:为什么要多次操作结果都一致呢?比如我查询数据,每次查出来的都一样,即使我修改了每次查出来的也都要一...

贪挽懒月
昨天
0
0
华为阿里下班时间曝光:所有的光鲜,都有加班的味道

点击上方 Z先生点记,加为星标 第一时间收到 Python 技术干货! 来源:GitHubPorn 声明:本文由HR人力资源成长俱乐部整理发布。素材来源程序员之家。如需转载,请务必注明以上信息,侵权必究...

zeroing1
08/06
0
0
Proguard 常用规则

入口 为了决定哪些代码要被保留哪些代码要出丢弃和混淆,必须指定入口点。这些入口点通常是 main方法,activity,service等。 在压缩阶段,Proguard从这些入口点开始递归确定哪些类或类成员要...

佛系编码
28分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部