Android4.2之Camera系统HAL调用流程

来源:互联网 发布:淘宝买得到的百合小说 编辑:程序博客网 时间:2024/05/13 02:08
一、重要结构体

1.模块

hardware/libhardware/include/hardware/camera_common.h

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. typedef struct camera_module {  
  2.     hw_module_t common;  
  3.     int (*get_number_of_cameras)(void);  
  4.     int (*get_camera_info)(int camera_id, struct camera_info *info);  
  5. } camera_module_t;  

2.设备

hardware/libhardware/include/hardware/camera.h

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. typedef struct camera_device {  
  2.     /** 
  3.      * camera_device.common.version must be in the range 
  4.      * HARDWARE_DEVICE_API_VERSION(0,0)-(1,FF). CAMERA_DEVICE_API_VERSION_1_0 is 
  5.      * recommended. 
  6.      */  
  7.     hw_device_t common;  
  8.     camera_device_ops_t *ops;  
  9.     void *priv;  
  10. } camera_device_t;  
二、流程

1.模块获取

frameworks/av/services/camera/libcameraservice/CameraService.cpp

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. void CameraService::onFirstRef(){  
  2.   BnCameraService::onFirstRef();  
  3.   
  4.   
  5.   if (hw_get_module(CAMERA_HARDWARE_MODULE_ID,  
  6.                 (const hw_module_t **)&mModule) < 0) { //获取Module  
  7.     ALOGE("Could not load camera HAL module");  
  8.     mNumberOfCameras = 0;  
  9.   }  
  10.   else {  
  11.     mNumberOfCameras = mModule->get_number_of_cameras();  
  12.     // if(mNumberOfCameras <= 0) mNumberOfCameras = 1 ;  
  13.     char istv [10];  
  14.     memset(istv,0,sizeof(istv));  
  15.     if (property_get("tv.tvstart_status", istv, NULL) > 0){  
  16.       ALOGD("tv.tvstart_status = %s ,mNumberOfCameras = %d \n",istv,mNumberOfCameras+1);  
  17.     }  
  18.     if(strcmp(istv,"false") == 0)  
  19.       mNumberOfCameras = mNumberOfCameras+1 ;  
  20.   
  21.   
  22.     if (mNumberOfCameras > MAX_CAMERAS) {  
  23.       ALOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",  
  24.                     mNumberOfCameras, MAX_CAMERAS);  
  25.       mNumberOfCameras = MAX_CAMERAS;  
  26.     }  
  27.     for (int i = 0; i < mNumberOfCameras; i++) {  
  28.       setCameraFree(i);  
  29.     }  
  30.   }  
  31. }  
2.设备获取
frameworks/av/services/camera/libcameraservice/CameraService.cpp
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sp<ICamera> CameraService::connect(  
  2.         const sp<ICameraClient>& cameraClient, int cameraId) {  
  3.   int deviceVersion;  
  4.   if (mModule->common.module_api_version == CAMERA_MODULE_API_VERSION_2_0) {  
  5.     deviceVersion = info.device_version;  
  6.   } else {  
  7.      deviceVersion = CAMERA_DEVICE_API_VERSION_1_0;  
  8.   }  
  9.   
  10.   
  11.   switch(deviceVersion) {  
  12.     case CAMERA_DEVICE_API_VERSION_1_0:  
  13.       client = new CameraClient(this, cameraClient, cameraId, info.facing, callingPid, getpid());  
  14.       break;  
  15.     case CAMERA_DEVICE_API_VERSION_2_0:  
  16.       client = new Camera2Client(this, cameraClient, cameraId, info.facing, callingPid, getpid());  
  17.       break;  
  18.     default:  
  19.       ALOGE("Unknown camera device HAL version: %d", deviceVersion);  
  20.       return NULL;  
  21.   }  
  22.   if (client->initialize(mModule) != OK) {  
  23.     return NULL;  
  24.   }  
  25. }  

frameworks/av/services/camera/libcameraservice/CameraClient.cpp

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. status_t CameraClient::initialize(camera_module_t *module) {  
  2.   mHardware = new CameraHardwareInterface(camera_device_name);  
  3.   res = mHardware->initialize(&module->common);  
  4. }  
frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. status_t initialize(hw_module_t *module){  
  2.   int rc = module->methods->open(module, mName.string(), (hw_device_t **)&mDevice); //获得Device  
  3. }  
0 0