Camera框架简介

本文介绍了Android Camera应用的C/S架构,详细分析了Camera的初始化过程,包括ServiceManager注册、Binder通信、CameraService的创建。此外,还探讨了CameraPreview流程,从startPreview开始,通过JNI层深入到HAL接口,解析了数据如何实时显示在预览界面上。
摘要由CSDN通过智能技术生成

    Camera应用是android多媒体系统中典型的采用C/S架构设计的应用,Client和Server在两个独立的线程间通过Binder机制通信。下面是Camera的总体构架图。

    从应用层的Camera.java(packages\app\Camera),到framework java部分的Camera.java(framework\base\core\java\android\hardware),再到JNI层的android_hardware_camera(framework\base\core),接着转到framework C++部分的Camera.cpp和CameraService.cpp,Camera2Client.cpp。其中Framework C++部分的Binder数据通信结构如下:

                                

下面大致分两个部分来介绍Camera:Camera的初始化以及Camera Preview流程。

Camera的初始化

由于Camera是通过Binder通信的,所以必然会在ServiceManager注册它的service。对应的路径是frameworks\av\media\mediaserver\Main_MediaServer.cpp下有个main函数, 其中CameraService::instantiate()就是注册CameraService服务的。接下来,我们回过头来,从CameraApp的初始化来看这个流程。

点开Camera应用图标后,Camera应用会在Activity的onCreate()方法中启动一个线程叫CameraStartUpThread。在该线程中,按照从启动到预览,分为几个步骤:

1、Open Camera

2、applyXXXCallbacks

3、applyParameters

4、startPreview

注册回调函数主要和Camera预览窗口的图标的点击有关,applyParameter主要和Camera的参数设置相关(如是否开启flash,picture size是多少等等)。这两个后面有机会再展开,这里主要分析openCamera和startPreview。

Util.openCamera(cameraId)

-->CameraHolder.instance().open(cameraId)

-->CameraManager.instance().cameraOpen(cameraId)

-->FrameworksClassFactory.openCamera(cameraId)

-->Camera.open(cameraId)

这里的Camera就是framework java部分的camera了,即framework\base\core\java\android\hardware下的Camera.java。这里的open动作会创建一个Camera实例,实例初始化调用native_setup(newWeakReference<Camera>(this), cameraId, packageName)。从函数名可以看出,调用转到JNI层了,通过JNI的命名规则,我们在android_hardware_Camera.cpp中找到android_hardware_Camera_native_setup()。调用关系:

Camera.open(cameraId)

-->new Camera(cameraId)</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值