Android Camera 浅析

本文详细介绍了Android Camera系统的架构,包括客户端和服务端组件、关键的JNI和HAL层交互细节,以及拍照、预览等功能的具体实现流程。

Android的Camera包含取景器(viewfinder)和拍摄照片的功能。其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。

Camera的JAVA程序的路径:

packages/apps/Camera/src/com/android/camera/

frameworks/base/core/java/android/hardware/Camera.java

frameworks/base/core/jni/android_hardware_Camera.cpp

主要的头文件在以下的目录中:

frameworks/base/include/ui/

Camera底层库在以下的目录中:

frameworks/base/libs/ui/

Camera服务部分:

frameworks/base/camera/libcameraservice/

为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库libcameraservice.so调用。



 在Camera系统的各个库中,libui.so位于核心的位置;

    libcameraservice.so是Camera的服务器程序,它通过继承libui.so的类实现服务器的功能,并且与libui.so中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。


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

a、预览功能preview

b、视频儿取功能 recording

c、拍照功能 takePicture

d、参数设置




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

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

拍照功能:

//* take a picture - image is returned in callback */

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库中,函数定义如下:

  /* factory function to instantiate a camera hardware object */
extern "C" sp<CameraHardwareInterface> openCameraHardware();

拍照的数据流进行分析

主要有两个线程:
pictureThread 拍照线程
当用户使用拍照的功能的时候,拍照线程被调用(非循环),检测队列中的帧数据,将帧数据从队列中取出,
拍照的数据一定需要传到Java层,所有可以将数据转换成JPEG格式再上传,也可以转换成RGB的数据上传给java层

previewThread 预览线程
当预览方法被调用的时候启动预览线程,循环的检测队列中是否有帧数据,如果帧数据存在,读取帧数据,由于读取的数据为YUV格式的数据,所有要将YUV数据转换成RGB的送给显示框架显示,也可以将转换过的数据送给视频编码模块,编码成功后储存变成录像的功能



基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值