• 高通 camera open流程


    1.java调用
    frameworks/base/core/java/android/hardware/Camera.java
    +open(int cameraId)
    +Camera(int cameraId) //new Camera()调用构造
    +native_setup(new WeakReference<Camera>(this), cameraId, packageName); //调用native方法,传递Camera.java对象,id,调用的app包名称

    2.jni调用(libandroid_runtime.so)
    frameworks/base/core/jni/android_hardware_Camera.cpp
    +android_hardware_Camera_native_setup(...) //调用此方法

    frameworks/av/include/camera/Camera.h //camera头文件,方法实现在libcamera_client.so
    +Camera::connect()

    注:之所以能调用上述方法,是通过AndroidRuntime::registerNativeMethods(...) 注册了native_setup参数和方法android_hardware_Camera_native_setup的对应关系
    { "native_setup",
    "(Ljava/lang/Object;ILjava/lang/String;)V",
    (void*)android_hardware_Camera_native_setup },
    第二行参数引用参数类型表示(L包名),I表示 jint,V表示void,即参数类型为:(Object,int,String)void
    libandroid_runtime.so 将目录文件 frameworks/av/include编译进去了,所以Camera.h位于frameworks/av/include/camera/Camera.h

    3.camera客户端调用(libcamera_client.so) **
    frameworks/av/camera/Camera.cpp //mk如何引用Camera.h?
    +Camera::connect() //定义方法

    frameworks/av/camera/CameraBase.cpp
    +CameraBase<TCam, TCamTraits>::connect()
    +CameraBase<TCam, TCamTraits>::getCameraService()
    binder = sm->getService(String16(kCameraServiceName)); //根据camera服务字符串,获取对应的binder对象
    gCameraService = interface_cast<ICameraService>(binder); //根据binder获取ICameraService对象(frameworks/av/include/camera/ICameraService.h)
    TCamConnectService fnConnectService = TCamTraits::fnConnectService;

    frameworks/av/camera/Camera.cpp
    CameraTraits<Camera>::TCamConnectService CameraTraits<Camera>::fnConnectService = &ICameraService::connect; //调用ICameraService::connect方法

    4.camera服务端调用(libcameraservice.so)
    frameworks/av/services/camera/libcameraservice/CameraService.cpp //通过binder调用
    +CameraService::connect()

    5.hal open 调用
    5.1 hardware/libhardware/include/hardware/hardware.h
    typedef struct hw_module_t {
    struct hw_module_methods_t* methods;

    } hw_module_t;
    typedef struct hw_module_methods_t {
    /** Open a specific device */
    int (*open)(const struct hw_module_t* module, const char* id,
    struct hw_device_t** device);

    } hw_module_methods_t;

    5.2 hardware/qcom/camera/QCamera/HAL2/wrapper/QualcommCamera.cpp
    static hw_module_methods_t camera_module_methods = {
    open: camera_device_open,
    };
    open 方法被赋值为camera_device_open


    hardware/qcom/camera/QCamera2/HAL/wrapper/QualcommCamera.cpp
    +camera_device_open() //调用open方法
    camHal->hardware = new QCamera2HardwareInterface(cameraId);

    5.3 hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp
    QCamera2HardwareInterface::QCamera2HardwareInterface(int cameraId) //构造函数
    调用?
    mCameraHandle=camera_open(mCameraId, &mem_hooks);
    +camera_open(mCameraId);

    5.4
    hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c
    +camera_open(uint8_t camera_idx)

    5.5
    hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
    +mm_camera_open(mm_camera_obj_t *my_obj)
    +open(dev_name, O_RDWR | O_NONBLOCK)
    这个将调用系统调用open的方法,打开设备节点dev/video0(后置相机),/dev/video2(前置相机),这个顺序是和内核在启动的是和video的注册顺序相关的。

    6.kernel 驱动最终调用
    kernel/drivers/media/platform/msm/camera_v2/msm.c
    msm_open(struct file *filep)

    v4l2_fh_open

  • 相关阅读:
    use imagination
    tar
    简单抓取安居客房产数据,并保存到Oracle数据库
    svn的安装(整合apache、ldap)包括错误解决post commit FS processing had error
    SVN安装中遇到的问题
    Linux环境源码编译安装SVN
    [转]SVN安装问题The Apache Portable Runtime (APR) library cannot be found
    深入浅出数据分析-脑图
    Python3.5在Windows 7下连接ORACLE数据库
    Python3.5之TuShare
  • 原文地址:https://www.cnblogs.com/adamli/p/3924945.html
Copyright © 2020-2023  润新知