Android Camera原理之camera provider启动

转载 Android Camera原理之camera provider启动

1. camera provider进程介绍:

# ps -e | grep camera
root           390     1   11732   2628 __skb_wait_for_more_packets 0 S camera_supervisor
cameraserver   597     1   26504  11988 binder_ioctl_write_read 0 S android.hardware.camera.provider@2.4-service
cameraserver   829     1   31712  15024 binder_ioctl_write_read 0 S cameraserver

cameraserver 597 1 26504 11988 binder_ioctl_write_read 0 S android.hardware.camera.provider@2.4-service

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

手机上运行的android.hardware.camera.provider@2.4-service进程是支持camera运行的重要进程。
camera架构
上面这张图比较清楚的表现了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/

/hardware/interfaces/camera/provider$ tree
.
├── 2.4
│   ├── Android.bp
│   ├── default
│   │   ├── Android.bp
│   │   ├── android.hardware.camera.provider@2.4-external-service.rc
│   │   ├── android.hardware.camera.provider@2.4-service_64.rc
│   │   ├── android.hardware.camera.provider@2.4-service.rc
│   │   ├── CameraProvider.cpp
│   │   ├── CameraProvider.h
│   │   ├── ExternalCameraProvider.cpp
│   │   ├── ExternalCameraProvider.h
│   │   ├── external-service.cpp
│   │   ├── OWNERS
│   │   └── service.cpp
│   ├── ICameraProviderCallback.hal
│   ├── ICameraProvider.hal
│   └── vts
│       ├── functional
│       │   ├── Android.bp
│       │   └── VtsHalCameraProviderV2_4TargetTest.cpp
│       └── OWNERS
└── README.md

4 directories, 18 files

可以看出来在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结构体对象
/hardware/libhardware/include/hardware/camera_common.h

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层接口,
例如v4l2_camera_hal.cpp 底下实现的

/*
 * The framework calls the following wrappers, which in turn
 * call the corresponding methods of the global HAL object.
 */

static int get_number_of_cameras() {
  return gCameraHAL.getNumberOfCameras();
}

static int get_camera_info(int id, struct camera_info* info) {
  return gCameraHAL.getCameraInfo(id, info);
}

static int set_callbacks(const camera_module_callbacks_t* callbacks) {
  return gCameraHAL.setCallbacks(callbacks);
}

static void get_vendor_tag_ops(vendor_tag_ops_t* ops) {
  return gCameraHAL.getVendorTagOps(ops);
}

static int open_legacy(const hw_module_t* module,
                       const char* id,
                       uint32_t halVersion,
                       hw_device_t** device) {
  return gCameraHAL.openLegacy(module, id, halVersion, device);
}

static int set_torch_mode(const char* camera_id, bool enabled) {
  return gCameraHAL.setTorchMode(camera_id, enabled);
}

static int open_dev(const hw_module_t* module,
                    const char* name,
                    hw_device_t** device) {
  return gCameraHAL.openDevice(module, name, device);
}

}  // namespace v4l2_camera_hal

static hw_module_methods_t v4l2_module_methods = {
    .open = v4l2_camera_hal::open_dev};

camera_module_t HAL_MODULE_INFO_SYM __attribute__((visibility("default"))) = {
    .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 = "V4L2 Camera HAL v3",
            .author = "The Android Open Source Project",
            .methods = &v4l2_module_methods,
            .dso = nullptr,
            .reserved = {0},
        },
    .get_number_of_cameras = v4l2_camera_hal::get_number_of_cameras,
    .get_camera_info = v4l2_camera_hal::get_camera_info,
    .set_callbacks = v4l2_camera_hal::set_callbacks,
    .get_vendor_tag_ops = v4l2_camera_hal::get_vendor_tag_ops,
    .open_legacy = v4l2_camera_hal::open_legacy,
    .set_torch_mode = v4l2_camera_hal::set_torch_mode,
    .init = nullptr,
    .reserved = {nullptr, nullptr, nullptr, nullptr, nullptr}};

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值