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函数:
有了这个,也就可以摒弃froyo中的openCameraHardware()接口了。
再看一下两个版本之间,CameraHardwareInterface类中各方法实现的变化。以startPreview为例。
froyo:
ICS:
越来越像linux风络了。
另外,ICS的CameraHardwareInterface又添加了一些private的成员。
data_callback函数,也多加了一个参数*metadata。