android Camera 架构简介

目前需要做一个语音通话及视频聊天功能开发,主要分为音频及视频两个部分,必然会涉及到Camera及AudioFlinger部分,对于显示部分又会涉及到SurfaceFlinger部分,因此需要一步步的进行学习并确认设计是否合理.


这篇文章主要针对Camera作个简要的介绍,了解需要开发的各个环节。

 


摄像头系统提供的功能如下几个方面:

a、预览功能preview

b、视频儿取功能 recording

c、拍照功能 takePicture

d、参数设置

 


1、android中基本的架构都是C/S层架构,客户端提供调用接口,实现工作由服务端完成,那么Camera也同样

   满足此条件:Client进程虽然不曾拥有任何实质的Camera数据,但是service端为它提供了丰富的接口,

   它可以轻松的获得Camera数据的地址,然后处理这些数据。两者通过Binder进行通讯。

  

首先我们来理清其工作流程,如此才能够知道到底是个啥回事:

 \

 按照上图的流程,一路下来都是客户端调用与实现,而这些接口的真正实现却在服务端:

\

 

通过阅读其interface函数知道,ICamera中提供的都是控制类接口,而ICameraClient定义的都是回调函数

 接口,即真正的数据流传输都是通过回调函数实现的。

 ok,通过以上应该知道了基本的摄像头基本层次结构

        

2、重点介绍一下CamerService , 这是一个承上启下的服务进程

   代码路径: frameworks\base\camera\libcameraservice 

   这部分内容编译生成libcameraservice库,这里有个fake的摄像头代码,由USE_CAMERA_STUB宏进行设定。

 


class CameraService : public BnCameraService

{

// ICameraService interface

virtual sp<ICamera>     connect(const sp<ICameraClient>& cameraClient);
 

void            removeClient(const sp<ICameraClient>& cameraClient);
 

//... 省略部分内容

 


class Client : public BnCamera

{

//... 省略部分内容 

} }

 


运行过程中,利用CameraService::connect得于一个CameraService::Client 代码如下所示:

sp<ICamera> CameraService::connect(const sp<ICameraClient>& cameraClient) 

{

...

// create a new Client object

 client = new Client(this, cameraClient, callingPid);

mClient = client;

return client;

}

 


使用过程中,主要通过mClient这个类的接口来实现完成Camera 的功能


具体看下实现层代码:

拍照功能:

/

status_t CameraService::Client::takePicture()

{


    LOGV("takePicture (pid %d)", getCallingPid());


    Mutex::Autolock lock(mLock);
    status_t result = checkPid();
    if (result != NO_ERROR) return result;


    if (mHardware == 0) {
        LOGE("mHardware is NULL, returning.");
        return INVALID_OPERATION;
    }


    mHardware->enableMsgType(CAMERA_MSG_SHUTTER |
                             CAMERA_MSG_POSTVIEW_FRAME |
                             CAMERA_MSG_RAW_IMAGE |
                             CAMERA_MSG_COMPRESSED_IMAGE);


    return mHardware->takePicture();


}

 


这里用到了mHardware对象,调用所有的HAL层接口都是通过这个对象进行操作的,而这是如何生成的呢?


  mHardware = openCameraHardware();

   注意这个函数 openCameraHardware() , 这个函数位于硬件抽象层libcamera.so库中,函数定义如下:

 
extern "C" sp<CameraHardwareInterface> openCameraHardware();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值