您的位置:华清远见教育科技集团 >> Android资料 >> Android Camera原生服务架构  
 
Android Camera原生服务架构
分享到:

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等。

 更多相关文章

·Android Camera录像过程分析
·Android 原生层媒体播放过程
·Android 视频解码过程详解
·Android 视频编码源码分享
·Android 双缓冲局部渲染