Android Camera FW到Camera Hal调用流程

2024-01-24 18:32
文章标签 android 流程 调用 hal camera fw

本文主要是介绍Android Camera FW到Camera Hal调用流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.       首先是调用framework层的Camera.java(frameworks\base\core\java\android\hardware)的takePicture方法
2.       接着会调用到JNI层的android_hardware_Camera.cpp(frameworks\base\core\jni)的android_hardware_Camera_takePicture方法,其中会通过get_native_camera获取一个Camera对象。
3.       上述Camera对象的定义在Camera.h(frameworks\av\include\camera),camera.h同时定义了CameraInfo。Camera对象继承自publicBnCameraClient,DeathRecipient。Camera对象的真正实现是在Camera.cpp(frameworks\av\camera)   。BnCameraClient是作为CameraService回调而存在的。Camera对象内含有一个mCameraService变量用于保存CameraService引用。
class Camera : public BnCameraClient,public IBinder::DeathRecipient
constsp<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"));if (binder != 0)break;ALOGW("CameraService notpublished, waiting...");usleep(500000); // 0.5 s} while(true);if (mDeathNotifier == NULL) {mDeathNotifier = newDeathNotifier();}binder->linkToDeath(mDeathNotifier);mCameraService =interface_cast<ICameraService>(binder);}

4.       在ICameraClient.h和ICameraService.h文件中,ICameraClient和ICameraService都继承自IInterface,也就是Binder通信的基础,此外ICamera.h也继承自IInterface
class ICameraClient:public IInterface
class ICameraService :public IInterface
class ICamera: publicIInterface
然后发现BnCameraClient继承自BnInterface<ICameraClient>,作为ICameraClient的服务器端存在:
class BnCameraClient: publicBnInterface<ICameraClient>
BnCameraService继承自BnInterface<ICameraService>,作为ICameraService的服务器端存在:
class BnCameraService: publicBnInterface<ICameraService>
BnCamera继承自BnInterface<ICamera>,作为ICamera的服务器端存在:
class BnCamera: public BnInterface<ICamera>
对应的上述三个分别存在一个作为Binder客户端的类存在,为Bp***:
class BpCameraClient:public BpInterface<ICameraClient>
class BpCameraService:public BpInterface<ICameraService>
class BpCamera: publicBpInterface<ICamera>
上述三个的实现分别在ICameraClient.cpp、ICameraService.cpp、ICamera.cpp,在这三支文件中分别实现了三组Binder的Server端和Client端,Camera常用的方法都在ICamera中实现。
5.       Camera.cpp文件connect方法在JNI层去setupCamera的时候会调用,JNI层是在上层opencamera的时候被调用的,在camera.cpp的connect方法中获取一个ICamera对象来完成对Camera的真正操作。
sp<Camera>Camera::connect(int cameraId)
{ALOGV("connect");sp<Camera> c = new Camera();const sp<ICameraService>& cs =getCameraService();if (cs != 0) {c->mCamera = cs->connect(c, cameraId);}if (c->mCamera != 0) {c->mCamera->asBinder()->linkToDeath(c);c->mStatus = NO_ERROR;} else {c.clear();}return c;
}

6.       在CameraService.h文件中可以看到CameraService定义内部类Client,CameraClient继承此类,在CameraService中持有对mClient对象的一个数组,这个数组也是Camera.cpp客户端调用connect方法后需要返回的Binder引用对象
class Client : public BnCamera
class CameraClient : public CameraService::Client
wp<Client>         mClient[MAX_CAMERAS];switch(deviceVersion) {case CAMERA_DEVICE_API_VERSION_1_0:client = new CameraClient(this,cameraClient, cameraId,info.facing, callingPid, getpid());break;case CAMERA_DEVICE_API_VERSION_2_0:client = new Camera2Client(this,cameraClient, cameraId,info.facing, callingPid,getpid());

并且Google好像有开发新的API2.0,在此处通过判断不同的version实例化不同的CameraClient的Binder引用对象回去,目前Camera2文件夹有Burst等实现

7.       在CameraService层的CameraClient对象的定义中,持有CameraHardwareInterface对象的引用mHardware.在CameraClient的initilize方法中会创建此对象,在对象的构造方法中传入需要打开的Camera的ID。
sp<CameraHardwareInterface>     mHardware;
status_t CameraClient::initialize(camera_module_t *module) {int callingPid = getCallingPid();LOG1("CameraClient::initialize E (pid%d, id %d)", callingPid, mCameraId);char camera_device_name[10];status_t res;snprintf(camera_device_name, sizeof(camera_device_name),"%d", mCameraId);mHardware = new CameraHardwareInterface(camera_device_name);res = mHardware->initialize(&module->common);if (res != OK) {ALOGE("%s: Camera %d: unable toinitialize device: %s (%d)",__FUNCTION__, mCameraId,strerror(-res), res);mHardware.clear();return NO_INIT;}mHardware->setCallbacks(notifyCallback,dataCallback,dataCallbackTimestamp,(void*)mCameraId);//Enable zoom, error, focus, and metadata messages by defaultenableMsgType(CAMERA_MSG_ERROR | CAMERA_MSG_ZOOM | CAMERA_MSG_FOCUS |CAMERA_MSG_PREVIEW_METADATA | CAMERA_MSG_FOCUS_MOVE);
//!++
#ifdef  MTK_CAMERA_BSP_SUPPORT// Enable MTK-extended messages by defaultenableMsgType(MTK_CAMERA_MSG_EXT_NOTIFY |MTK_CAMERA_MSG_EXT_DATA);
#endif
//!--LOG1("CameraClient::initialize X (pid%d, id %d)", callingPid, mCameraId);return OK;
}

8.       在CameraService的onFirstRef方法中,会加载CameraHal  Module

void CameraService:: onFirstRef()
{BnCameraService::onFirstRef();if (hw_get_module(CAMERA_HARDWARE_MODULE_ID,(const hw_module_t**)&mModule) < 0) {ALOGE("Could not load camera HALmodule");mNumberOfCameras = 0;}else {mNumberOfCameras =mModule->get_number_of_cameras();if (mNumberOfCameras > MAX_CAMERAS){ALOGE("Number of cameras(%d)> MAX_CAMERAS(%d).",mNumberOfCameras, MAX_CAMERAS);mNumberOfCameras = MAX_CAMERAS;}for (int i = 0; i <mNumberOfCameras; i++) {setCameraFree(i);}}
}

hw_get_module方法的实现在hardware/libhardware/Hardware.c文件中实现
int hw_get_module(constchar *id, const struct hw_module_t **module)
{
return hw_get_module_by_class(id, NULL,module);
}
Camera_module_t的结构体定义在camera_common.h文件中
typedef structcamera_module {
hw_module_t common;
int (*get_number_of_cameras)(void);
int (*get_camera_info)(int camera_id,struct camera_info *info);
} camera_module_t;
Hw_module_t的定义在hardware.h文件中,hw_module_t持有对hw_module_methods_t引用,其中有定义一个open指针
typedef structhw_module_methods_t {
/** Open a specific device */
int (*open)(const struct hw_module_t*module, const char* id,
struct hw_device_t** device);
} hw_module_methods_t;
而加载CamDevice的操作是在CameraHardwareInterface的init方法中调用open
int rc =module->methods->open(module, mName.string(),
(hw_device_t **)&mDevice);


转载:http://www.2cto.com/kf/201303/196681.html

可参考:http://blog.163.com/shawpin@126/blog/static/116663752201092394147937/

这篇关于Android Camera FW到Camera Hal调用流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640601

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使