Android的图像编码,涉及的主要是Camera服务,其架构主要涉及驱动和HAL模块、Camera原生服务,以及上层对服务的封装和应用等3个层次的内容。下图显示的是Camera的软件架构。

Camera软件架构
1)Camera驱动和HAL模块
这一层次内容主要包括运行在内核空间的Camera驱动和运行在用户空间的Camera 的HAL实现及接口等。开发中涉及I2C、GPIO、PMIC、VFE aDSP等。其元数据一般为YUV数据或者Bayer数据。
2)Camera原生服务
Camera的原生服务主要是提供Camera服务的原生服务,以及提供给上层Java部分的原生接口等。
3)上层应用和接口
这一层次的内容主要包括调用原生服务的Java JNI的Java接口和与用户直接交互的UI部分。
本文主要阐述的是Camera原生服务。
Camera原生服务代码位于frameworks\base\camera\libcameraservice和frameworks\base\ include\ui目录下。在Android中,Camera的原生服务是基于C/S架构的。
Camera原生服务主要的文件包括:Camera.h、ICamera.h、ICameraClient.h、ICameraService.h、CameraService.cpp、CameraHardwareStub.cpp、FakeCamera.cpp等。其中FakeCamera.cpp提供了在模拟器上的Camera仿真功能。下图显示了Camera原生服务框架的类图。

Camera原生服务框架类图
其中在ICamera接口内部有两个内部类:BpCamera和BnCamera,BnCamera为本地ICamera对象,BpCamera为远程ICamera对象在本地进程的代理。ICameraClient为Camera原生服务的客户端,ICameraClient定义了若干个回调函数,接收服务器端传来的拍照音、预览、拍照、录像的回调数据。ICameraService为Camera原生服务的服务器端接口。
在C++层,Camera原生服务和其他服务一样,客户端和服务器端的通信都是基于IBinder进行的。
为了使上层应用能够利用Camera原生服务,首先需要将Camera原生服务在服务管理器中注册。下面是Camera原生服务的注册过程:
void CameraService::instantiate()
{
defaultServiceManager()->addService(String16("media.camera"), new CameraService());
}
为了使用Camera原生服务,首先需要从服务管理器中获得Camera原生服务的句柄。具体如下:
代码:获得Camera原生服务的句柄
const sp< ICameraService>& Camera::getCameraService()
{
Mutex::Autolock _l(mLock);
if (mCameraService.get()==0) {
sp< IServiceManager> sm=defaultServiceManager(); //服务管理器
sp< IBinder> binder;
do {
binder=sm->getService(String16("media.camera")); //Camera原生服务
if (binder != 0)
break;
LOGW("CameraService not published, waiting...");
usleep(500000); // 0.5s
} while(true);
if (mDeathNotifier==NULL) {
mDeathNotifier=new DeathNotifier();
}
binder->linkToDeath(mDeathNotifier);
mCameraService=interface_cast< ICameraService>(binder);
}
LOGE_IF(mCameraService==0, "no CameraService!?");
return mCameraService;
}
另外,Camera的原生服务和Java层的原生接口实现位于android_hardware_Camera.cpp文件中。在Camera中,原生接口包括native_setup、native_release、setPreviewDisplay、startPreview、stopPreview、previewEnabled、setHasPreviewCallback、native_autoFocus、native_takePicture、native_setParameters、native_getParameters、reconnect、lock、unlock等。