android4.0 camera hal 移植

来源:互联网 发布:雀神作弊软件 编辑:程序博客网 时间:2024/04/30 14:31

http://blog.csdn.net/qq69696698/article/details/7174129

转自:http://blog.csdn.net/muojie/article/details/6988297

先从Camera Hal提供给Camera Service 的接口(CameraHardwareInterface.h)开始看起。

从注释可以看出,基本的流程是没有变的。

/**
 * CameraHardwareInterface.h defines the interface to the
 * camera hardware abstraction layer, used for setting and getting
 * parameters, live previewing, and taking pictures.
 *
 * It is a referenced counted interface with RefBase as its base class.
 * CameraService calls openCameraHardware() to retrieve a strong pointer to the
 * instance of this interface and may be called multiple times. The
 * following steps describe a typical sequence:
 *
 *   -# After CameraService calls openCameraHardware(), getParameters() and
 *      setParameters() are used to initialize the camera instance.
 *      CameraService calls getPreviewHeap() to establish access to the
 *      preview heap so it can be registered with SurfaceFlinger for
 *      efficient display updating while in preview mode.
 *   -# startPreview() is called.  The camera instance then periodically
 *      sends the message CAMERA_MSG_PREVIEW_FRAME (if enabled) each time
 *      a new preview frame is available.  If data callback code needs to use
 *      this memory after returning, it must copy the data.
 *
 * Prior to taking a picture, CameraService calls autofocus(). When auto
 * focusing has completed, the camera instance sends a CAMERA_MSG_FOCUS notification,
 * which informs the application whether focusing was successful. The camera instance
 * only sends this message once and it is up  to the application to call autoFocus()
 * again if refocusing is desired.
 *
 * CameraService calls takePicture() to request the camera instance take a
 * picture. At this point, if a shutter, postview, raw, and/or compressed callback
 * is desired, the corresponding message must be enabled. As with CAMERA_MSG_PREVIEW_FRAME,
 * any memory provided in a data callback must be copied if it's needed after returning.
 */

但是在具体的实现上,做了改动。一个C++的风格,一个C的风格。现在Hal层也越来越像linux了。

在froyo的Hal层,主要是去实现一个继承自CameraHardwareInterface抽象类的子类,在这个类里去实现父类的(纯)虚函数。

但是在ICS里,CameraHarwareInterface类的方法实现变了,现在是通过hw_module_t结构体获得hw_device_t的结构体,而这个结构体里包括Hal层的各方法回调。也就是froyo里的sensor架构。

看一下initialize函数:

  1. status_t initialize(hw_module_t *module)  
  2. {  
  3.     LOGI("Opening camera %s", mName.string());  
  4.     int rc = module->methods->open(module, mName.string(),  
  5.                                    (hw_device_t **)&mDevice);  
  6.     if (rc != OK) {  
  7.         LOGE("Could not open camera %s: %d", mName.string(), rc);  
  8.         return rc;  
  9.     }  
  10.     initHalPreviewWindow();  
  11.     return rc;  
  12. }  

有了这个,也就可以摒弃froyo中的openCameraHardware()接口了。

  1. /** factory function to instantiate a camera hardware object */  
  2. extern "C" sp<CameraHardwareInterface> openCameraHardware();  

再看一下两个版本之间,CameraHardwareInterface类中各方法实现的变化。以startPreview为例。

froyo:

  1. /** 
  2.  * Start preview mode. 
  3.  */  
  4. virtual status_t    startPreview() = 0;  

ICS:

  1. status_t startPreview()  
  2. {  
  3.     LOGV("%s(%s)", __FUNCTION__, mName.string());  
  4.     if (mDevice->ops->start_preview)  
  5.         return mDevice->ops->start_preview(mDevice);  
  6.     return INVALID_OPERATION;  
  7. }  

越来越像linux风络了。

另外,ICS的CameraHardwareInterface又添加了一些private的成员。

data_callback函数,也多加了一个参数*metadata。

  1. typedef void (*data_callback)(int32_t msgType,  
  2.                             const sp<IMemory> &dataPtr,  
  3.                             camera_frame_metadata_t *metadata,  
  4.                             void* user);  
原创粉丝点击