本文首发地址 https://h89.cn/archives/319.html
最新更新地址 https://gitee.com/chenjim/chenjimblog

一、硬件层与驱动交互

  1. 传感器与驱动
    硬件层由图像传感器(如CMOS/CCD)和ISP(图像信号处理器)组成,通过V4L2(Video4Linux2)框架与内核驱动交互。
    源码示例:Camera HAL通过/dev/videoX设备节点与传感器通信,如MTK平台的sensor_list.cpp 中通过get_number_of_cameras枚举设备节点。
  2. HAL硬件抽象层
    HAL层实现CameraHardwareInterface接口,封装硬件操作(如open_camera、set_preview_window)。
    源码示例:在CameraProvider@HIDL中,通过ICameraProvider接口向框架层提供硬件能力查询和初始化。

二、框架层(Framework)

  1. CameraService启动
    CameraService作为系统服务,由MediaServer进程启动,通过BinderService注册到ServiceManager。
    源码路径:frameworks/av/services/camera/libcameraservice/CameraService.cpp 。
  2. 客户端通信
    应用通过CameraManager调用openCamera(),触发CameraDeviceClient的创建。
    源码示例:CameraManager.java 通过JNI调用android_hardware_Camera_getNumberOfCameras()与底层交互。
  3. 预览流程初始化
    应用调用createCaptureSession(),框架层通过CameraCaptureSession配置数据流(如SurfaceView/ImageReader)。
    关键代码:CameraDeviceClient::createSurface()创建IGraphicBufferProducer用于图像传输。

三、HAL层与数据流

  1. HAL与HIDL通信
    Android O后,HAL通过HIDL接口(如ICameraDevice@3.4)与框架层解耦,实现跨进程调用。
    源码示例:cameraserver进程通过CameraProviderManager加载CameraProvider(如external/camera/libcameraservice/)。
  2. 预览数据流传递
    HAL层通过dequeueBuffer()获取缓冲区,填充传感器数据后通过queueBuffer()返回给SurfaceFlinger。
    关键流程:Camera3Device::processCaptureResult()处理HAL返回的帧数据,分发至应用层。

四、应用层显示

  1. SurfaceView与TextureView
    应用通过SurfaceHolder或TextureView.SurfaceTexture接收预览流。
    源码示例:Camera2Basic示例中,ImageReader的onImageAvailable()回调处理YUV或JPEG数据。
  2. 图像渲染
    数据通过SurfaceFlinger合成后,由OpenGL ES或HWComposer渲染到屏幕。
    关键代码:SurfaceTexture::updateTexImage()将图像绑定到GL纹理。

五、关键源码路径汇总

模块 源码路径/类 功能描述
CameraService frameworks/av/services/camera/ 管理相机设备生命周期
HAL接口 hardware/interfaces/camera/ HIDL接口定义
JNI桥接 frameworks/base/core/jni/ Java与Native层交互
预览控制 CameraDeviceClient.cpp 数据流配置与缓冲区管理

六、流程总结

  1. 初始化流程:
    应用调用openCamera() → CameraService创建CameraDeviceClient → HAL层加载CameraProvider → 传感器初始化。

  2. 数据流路径:
    传感器 → V4L2驱动 → HAL层 → Camera3Device → SurfaceFlinger → 应用显示。

  3. 异常处理:
    通过CameraCaptureSession.Callback监听错误,触发onError()或重新初始化。

如需更深入分析特定模块(如HIDL接口或图像处理),可参考源码路径及上述搜索结果。

https://www.n.cn/search/9e4cdb115fa543ce915145ed2a8bd203


本文链接:安卓 Camera 从硬件到应用显示的完整流程及源码分析 - https://h89.cn/archives/319.html

版权声明:原创文章 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文链接和本声明。

标签: Camera

添加新评论