先看一下CameraHAL整体的类图。
很乱,我们一块一块的看。
第一部分,CameraAdapter的继承关系:
V4LCameraAdapter:
V4LCameraAdapter是处于最底层的类,他负责跟硬件的通讯,并且实现了大部分的控制功能。
V4LCameraAdapter内部定义了PreviewThread线程。
V4LCameraAdapter的mVideoinfo实现了对VideoInfo的引用,而VideoInfo定义了Camera Video的相关信息。
BaseCameraAdapter:
BaseCameraAdapter实现了MessageNotifier及FrameNotifier的全部接口,及一些不需要与硬件交互的接口。而下列接口都由V4LCameraAdapter实现:
takePicture [android::BaseCameraAdapter]
stopImageCapture [android::BaseCameraAdapter]
startBracketing [android::BaseCameraAdapter]
stopBracketing [android::BaseCameraAdapter]
beginAutoFocusThread [android]
autoFocus [android::BaseCameraAdapter]
cancelAutoFocus [android::BaseCameraAdapter]
startSmoothZoom [android::BaseCameraAdapter]
stopSmoothZoom [android::BaseCameraAdapter]
startPreview [android::BaseCameraAdapter]
stopPreview [android::BaseCameraAdapter]
useBuffers [android::BaseCameraAdapter]
fillThisBuffer [android::BaseCameraAdapter]
getFrameSize [android::BaseCameraAdapter]
getFrameDataSize [android::BaseCameraAdapter]
getPictureBufferSize [android::BaseCameraAdapter]
startFaceDetection [android::BaseCameraAdapter]
stopFaceDetection [android::BaseCameraAdapter]
switchToExecuting [android::BaseCameraAdapter]
disableMirror [android::BaseCameraAdapter]
BaseCameraAdapter定义了两个消息队列mFrameQ及mAdapterQ,但这两个消息队列没有被使用到。所以,初步推断,CameraAdapter与其他线程交互的接口完全是FrameNotifier的回调函数实现的。在回调函数的实现中会调用到消息队列,从而达到与其他线程交互的目的。
现有的理解,需要格外关注的实现是enableMsgType相关的应用,TODO:由此入手,学习AdapterCamera的相关内容:Android CameraHal CameraAdapter相关(1)
CameraAdapter:
CameraAdapter是接口类,成员函数完全由其子类实现。
另外定义了一些枚举变量,用于指示状态,命令类型等:
AdapterActiveStates [android::CameraAdapter]
CameraCommands [android::CameraAdapter]
CameraMode [android::CameraAdapter]
AdapterState [android::CameraAdapter]
第二部分:从线程入手:
右下两个线程,NotificationThread及DisplayThread,两者都是使用消息队列实现调用的。
NotificationThread定义在AppCallbackNotifier中,负责与上层应用的交互,主要是消息通知及传递Frame等。
DisplayThread定义在ANativeWindowDisplayAdapter中,负责与NativeWindow的交互,负责显示部分的交互。
而ANativeWindowDisplayAdapter与AppCallbackNotifier则是通过引用FrameProvider实现与CameraAdapter的交互。