android camera HAL v3.0详细介绍(二)

3.Startup and expected operation sequence

这段描述了使用camera API的详细步骤。其中涉及到的结构体和函数请参考文件:platform/hardware/libhardware/include/hardware/camera3.h

1.       Framework层调用函数camera_module_t->common.open(),将返回一个hardware_device_t类型的结构体。

2.       Framework层检查字段hardware_device_t->version,根据版本信息,实例化一个适合这个版本的camera硬件设备的句柄。例如版本号是CAMERA_DEVICE_API_VERSION_3_0,则这个设备将被转化为camera3_device_t

3.       Framework层调用函数camera3_device_t->ops->initialize(),并传递了framework层的回调函数指针。这个函数只能被调用一次,且在调用函数open()之后,在其他函数被调用之前。

4.       Framework层调用函数camera3_device_t->ops->configure_streams(),向这个HAL层设备传递了输入输出的流信息。

5.       Framework层分配grallocbuffer;调用函数camera3_device_t->ops->register_stream_buffers(),至少使用一个configure_streams中列举的输出流。同一个流只能被注册一次。

6.       Framework层通过调用camera3_device_t->ops->construct_default_request_settings()获取用例的默认设置。这个在第三步之后任意地方进行调用。

7.       Framework层使用默认设置集合中某一套设置,且保证之前注册了至少一个输出流,创建并向HAL层发第一个捕获请求。这个请求将通过调用函数camera3_device_t->ops->process_capture_request()发送到HAL层。HAL必须阻止函数返回,直到HAL准备好接收下一个请求。

8.       Framework层连续地提交请求。可能会调用函数register_stream_buffers()来注册没有注册过的流,调用函数construct_default_request_settings获取其他用例所需的默认设置。

9.       当一个请求的捕获开始时(sensor开始曝光),HAL层将调用函数camera3_callback_ops_t->notify()通知上层SHUTTER事件,其中包括sensor开始曝光的帧号和时间戳。调用函数process_capture_result()处理这个帧号对应的数据之前,HAL层必须发出SHUTTER通知。

10.    流水线持续一些时间后,HAL层开始使用函数camera3_callback_ops_t->process_capture_result()framework层返回处理完的图像数据。返回结果的次序与提交请求的次序完全一致。多个请求可以被一次提交,但这取决于camera HAL层设备的流水线深度。

11.    工作一段时间之后,framework层可能会停止提交新的请求,等待其他请求被完成(所有buffer被填充,所有结果被返回),然后再次调用函数configure_streams()。这是为一组新的输入输出流重启camera硬件和流水线。前面配置的一些流可能会被重复使用;如果流的buffer已经注册到了HAL层,它们将不再被注册。如果有一个被注册的输出流还存在,则framework层将从第七步重新开始(否则,将从第五步开始)。

12.    Framework层将调用函数camera3_device_t->common->close()结束camera会话。当framework层没有其他调用时,可以在任何时间调用这个函数,尽管这个调用会阻塞,直到所有正在处理的捕获被完成(所有结果被返回,所有buffer被填充)。函数close()返回之后,不允许HAL调用camera3_callback_ops_t的任何函数。一旦函数close()被调用,framework层将不能调用其他任何HAL层设备函数。

13.    如果发生错误或者其他异步事件,HAL层必须调用函数camera3_callback_ops_t->notify()告知上层对应的错误或者事件信息。一个与设备相关的致命错误被通知上层后,HAL应该像被调用了函数close()一样。但是,在调用函数notify()之前,HAL必须取消或者完成所有未结束的数据捕获操作,以便致命错误被上报之后,framework不会收到设备的任何回调函数。除了函数close(),致命错误信息发出后,其他函数只能返回-ENODEV或者NULL

 

Figure4. Camera operational flow

 

4.Operational modes

Camera HALv3版本的设备实现两种可能的操作模式之一:limited模式和full模式。新的高端设备预计会支持full模式。Limited模式与camera HALv1版本一样,对硬件需求很低,用于旧的或者低价设备。Full模式是limited模式的超集,如上面所述,它们有着基本上一样的操作流程。

Camera HAL层必须使用静态元数据android.info.supportedHardwareLevel指明其所支持的模式。0表示支持limited模式,1表示支持full模式。

简单来讲,limited模式设备不允许应用程序控制捕获数据信息的设置(3A控制除外),大分辨率图像的高帧率捕获,raw数据的获取,或者上面所说的最大视频分辨率的YUV输出流(对于大图像只支持JPEG)。
Limited
模式行为的细节如下:

·        Limited模式的设备不需要实现请求配置与实际捕获图像数据的完全匹配。相反,将来有时改变配置将更高效,可能也不需要一个配置必须对应一个同样的输出帧。快速改变配置可能会使得某些配置从来没有被使用过。但是,有高分辨率(大于1080P)输出buffer的捕获必须使用指定的配置(处理速度的描述如下)。

·        limited模式下,有高分辨率(大于1080P)输出buffer的捕获在函数process_capture_request()中会阻塞,直到所有输出buffer都被填充。Full模式HAL层设备必须按照静态元数据中指定的速率,处理相应像素格式的高分辨率请求的序列。HAL层调用函数process_capture_result()产生输出结果;framework层需要为函数process_capture_request()做好准备,然后阻塞,直到limited模式设备的高分辨率捕获请求被函数process_capture_result()执行完毕。

·        Limited设备不需要支持大多数的配置、结果、静态信息。只有下面的配置期待被limited模式HAL层设备所支持:

o   android.control.aeAntibandingMode(controls)

o   android.control.aeExposureCompensation(controls)

o   android.control.aeLock(controls)

o   android.control.aeMode(controls)

o   [OFF meansON_FLASH_TORCH]

o   android.control.aeRegions(controls)

o   android.control.aeTargetFpsRange(controls)

o   android.control.afMode(controls)

o   [OFF means infinityfocus]

o   android.control.afRegions(controls)

o   android.control.awbLock(controls)

o   android.control.awbMode(controls)

o   [OFF not supported]

o   android.control.awbRegions(controls)

o   android.control.captureIntent(controls)

o   android.control.effectMode(controls)

o   android.control.mode(controls)

o   [OFF not supported]

o   android.control.sceneMode(controls)

o   android.control.videoStabilizationMode(controls)

o   android.control.aeAvailableAntibandingModes(static)

o   android.control.aeAvailableModes(static)

o   android.control.aeAvailableTargetFpsRanges(static)

o   android.control.aeCompensationRange(static)

o   android.control.aeCompensationStep(static)

o   android.control.afAvailableModes(static)

o   android.control.availableEffects(static)

o   android.control.availableSceneModes(static)

o   android.control.availableVideoStabilizationModes(static)

o   android.control.awbAvailableModes(static)

o   android.control.maxRegions(static)

o   android.control.sceneModeOverrides(static)

o   android.control.aeRegions(dynamic)

o   android.control.aeState(dynamic)

o   android.control.afMode(dynamic)

o   android.control.afRegions(dynamic)

o   android.control.afState(dynamic)

o   android.control.awbMode(dynamic)

o   android.control.awbRegions(dynamic)

o   android.control.awbState(dynamic)

o   android.control.mode(dynamic)

o   android.flash.info.available(static)

o   android.info.supportedHardwareLevel(static)

o   android.jpeg.gpsCoordinates(controls)

o   android.jpeg.gpsProcessingMethod(controls)

o   android.jpeg.gpsTimestamp(controls)

o   android.jpeg.orientation(controls)

o   android.jpeg.quality(controls)

o   android.jpeg.thumbnailQuality(controls)

o   android.jpeg.thumbnailSize(controls)

o   android.jpeg.availableThumbnailSizes(static)

o   android.jpeg.maxSize(static)

o   android.jpeg.gpsCoordinates(dynamic)

o   android.jpeg.gpsProcessingMethod(dynamic)

o   android.jpeg.gpsTimestamp(dynamic)

o   android.jpeg.orientation(dynamic)

o   android.jpeg.quality(dynamic)

o   android.jpeg.size(dynamic)

o   android.jpeg.thumbnailQuality(dynamic)

o   android.jpeg.thumbnailSize(dynamic)

o   android.lens.info.minimumFocusDistance(static)

o   android.request.id(controls)

o   android.request.id(dynamic)

o   android.scaler.cropRegion(controls)

o   [ignores (x,y),assumes center-zoom]

o   android.scaler.availableFormats(static)

o   [RAW not supported]

o   android.scaler.availableJpegMinDurations(static)

o   android.scaler.availableJpegSizes(static)

o   android.scaler.availableMaxDigitalZoom(static)

o   android.scaler.availableProcessedMinDurations(static)

o   android.scaler.availableProcessedSizes(static)

o   [full resolution notsupported]

o   android.scaler.maxDigitalZoom(static)

o   android.scaler.cropRegion(dynamic)

o   android.sensor.orientation(static)

o   android.sensor.timestamp(dynamic)

o   android.statistics.faceDetectMode(controls)

o   android.statistics.info.availableFaceDetectModes(static)

o   android.statistics.faceDetectMode(dynamic)

o   android.statistics.faceIds(dynamic)

o   android.statistics.faceLandmarks(dynamic)

o   android.statistics.faceRectangles(dynamic)

o   android.statistics.faceScores(dynamic)

 

5. Interaction between the application capturerequest, 3A control, and the processing pipeline

根据3A控制模块的配置,camera流水线会忽略应用程序请求中的一些参数,而使用3A控制模块提供的值代替。例如,当自动曝光开启时,曝光时间,帧率,sensor的敏感参数都由3A算法控制,应用程序提供的值全被忽略。3A事务为帧所设置的参数值必须包含在输出的元数据中。下面的表格描述了3A模块的不同模式和被这些模式所控制的属性。属性的定义见文件platform/system/media/camera/docs/docs.html

 

ParameterStateProperties controlled
android.control.aeModeOFFNone
ONandroid.sensor.exposureTime      android.sensor.frameDuration      android.sensor.sensitivity      android.lens.aperture (if supported)      android.lens.filterDensity (if supported)
ON_AUTO_FLASHEverything is ON, plus android.flash.firingPower, android.flash.firingTime, and android.flash.mode
ON_ALWAYS_FLASHSame as ON_AUTO_FLASH
ON_AUTO_FLASH_RED_EYESame as ON_AUTO_FLASH
android.control.awbModeOFFNone
WHITE_BALANCE_*android.colorCorrection.transform. Platform-specific adjustments if android.colorCorrection.mode is FAST or HIGH_QUALITY.
android.control.afModeOFFNone
FOCUS_MODE_*android.lens.focusDistance
android.control.videoStabilizationOFFNone
ONCan adjust android.scaler.cropRegion to implement video stabilization
android.control.modeOFFAE, AWB, and AF are disabled
AUTOIndividual AE, AWB, and AF settings are used
SCENE_MODE_*Can override all parameters listed above. Individual 3A controls are disabled.

所列的3A算法的控制大部分都是与旧的API参数一一匹配(例如曝光补偿,场景模式,或者白平衡模式)。

2中的图像处理模块的控制都是基于一个相似的原则,通常每个模块有三中模式:

·        OFF:这个处理模块不使能。去马赛克,颜色校正和tone曲线调整模块必须使能。

·        FAST:在这种模式,与off模式相比,处理模块不会降低输出帧率,但是对于产生高质量输出时就不受这个限制了。典型地,它被用于预览或者视频录制模式,或者静态图片的快速捕获。在一些设备中,这种模式与OFF模式一样(不工作就不会降低帧率);在一些设备中,它与HIGH_QUALITY模式一样(高质量处理也不会降低帧率)。

·        HIGHQUALITY:在这种模式中,处理模块产生最高质量的结果,如果需要会降低输出帧率。典型地,它被用于高质量静态图片的捕获。一些包括手动控制的模块,可以替代FAST或者HIGHQUALITY。例如,图像校正模块支持一个颜色转换矩阵,而tone曲线调整支持一个任意全局tone映射曲线。

一个camera子系统能够支持的最大帧率是多个元素的函数:

·        输出图像流所需要的分辨率

·        Imagerbinning / skipping模式的支持

·        imager接口的带宽

·        各个ISP处理模块的带宽

因为对于不同的ISPsensor,这些因子有很大的变化,camera HAL层接口想要抽象一个尽可能简单的带宽限制模型。这个模型有如下特性:

·        Sensor总是输出能满足应用程序请求的输出流大小的最小分辨率图像数据。这个最小分辨率至少与被请求的最大输出流大小一样大。

·        因为任何情况可能会用到被配置的输出流的几个或者所有,所以sensorISP必须被配置为能够将一个图像同时缩放到所有输出流中。

·        JPEG流就像请求的被处理的YUV流;在请求中,它们直接被当作JPEG流来引用。

·        JPEG处理器能够同时处理camera流水线的剩余部分,但不能在同一个时刻处理多于一张的图片。

 

(全文完)

<think>嗯,用户让我介绍一下Android Camera2 HAL3。我得先回忆一下自己对这个主题的了解。Android的相机架构经历过几次大的变化,特别是从Camera1到Camera2,HAL3应该是其中的关键部分。 首先,HAL是硬件抽象层,负责Android框架和硬件驱动程序之间的通信。Camera2 API是在Android 5.0引入的,取代了旧的Camera1 API。HAL3应该对应的是Camera2的支持,可能带来了更多的功能和更好的性能。 需要区分HAL1和HAL3的不同。HAL1可能对应旧的相机架构,而HAL3引入了更灵活的管道模型,允许应用更直接地控制相机硬件,比如手动调节曝光、对焦等。这可能涉及到像Request这样的概念,应用通过发送捕获请求来操作相机。 另外,HAL3可能支持更多的数据流,比如同时处理预览、拍照和录像,而不会像以前那样有性能问题。还有,可能提到的是每个请求可以配置不同的参数,并且有更精细的控制,比如每个帧的元数据。 记得HAL3引入了更结构化的元数据,使用类似标签的系统,让应用可以查询相机的能力,比如支持的分辨率、帧率范围等。这可能涉及到CameraCharacteristics类,应用在打开相机前会先获取这些信息。 可能还需要解释一下HAL3的管道模型,比如将相机设备视为一个处理管道,处理来自应用的请求,生成结果。每个请求会指定输出Surface,比如用于预览的SurfaceView或者用于拍照的ImageReader。 不过,用户可能还想知道HAL3带来的优势,比如低延迟、更好的性能、更高效的资源利用。同时,可能也需要注意兼容性问题,因为旧设备可能不支持HAL3,仍然使用HAL1,这会导致应用需要处理不同的情况。 另外,HAL3CameraX的关系,CameraX是Jetpack库,可能基于HAL3,但提供了更简化的API,帮助开发者处理兼容性问题。不过用户的问题主要是HAL3本身,所以可能需要集中在HAL3的结构和功能上。 可能还需要提到一些关键类或接口,比如CameraDevice、CameraCaptureSession,以及如何通过HAL3进行会话的配置和请求的提交。比如,应用创建一个CaptureRequest,设置参数,然后提交给相机设备,然后处理返回的结果。 还有,HAL3如何处理3A(自动对焦、自动曝光、自动白平衡),允许应用更精细地控制这些过程,或者设置回调来监听状态变化。 需要确保技术术语使用正确,比如HAL3的正确名称,是否称为Camera HAL3,或者Android Camera HAL 3.0版本。可能正确的术语是Camera HAL3,对应Camera2 API的实现。 可能还要提到HAL3的配置方式,比如在设备厂商的实现中,如何通过HIDL接口或者AIDL进行交互,不过这部分可能属于系统内部细节,用户作为开发者可能更关注API层面的使用。 总结一下,回答的结构应该是先介绍HAL3是什么,它在Android相机架构中的位置,然后对比HAL1和HAL3的主要区别,接着详细说明HAL3的关键特性,比如管道模型、请求机制、元数据、多流支持等,最后可能提到开发中的使用方式或注意事项。 要避免错误的信息,比如HAL3是否支持某些特定功能,或者时间线是否正确。比如确认HAL3是从Android 5.0开始引入的,而Camera2 API也是同时推出的。此外,HAL3是否必须由设备支持,还是可选,可能需要说明兼容性情况,比如从某个Android版本开始要求必须支持HAL3,但实际设备可能仍有差异。 还要注意术语的正确使用,比如“管道模型”是否正确,或者是否有其他术语,比如“基于请求的模型”更准确。可能需要查阅相关资料确认,但根据记忆,HAL3确实引入了更灵活的请求处理模型,允许应用发送多个请求,每个请求可以有不同的设置,并且相机设备按顺序处理。 最后,确保回答结构清晰,分点说明主要概念,帮助用户逐步理解HAL3的结构和优势,同时结合实际开发中的例子,比如如何使用Camera2 API与HAL3交互,这样用户能更好地应用这些知识。</think>### Android Camera2 HAL3 介绍 #### 1. **基本概念** - **HAL(硬件抽象层)**:负责连接 Android 框架与硬件驱动,确保上层 API 与底层硬件解耦。 - **Camera2 API**:从 Android 5.0(Lollipop)引入,取代旧版 Camera1 API,提供更精细的控制能力。 - **HAL3**:专为 Camera2 API 设计的硬件抽象层(版本 3.x),支持**基于请求的模型**和**多数据流处理**。 --- #### 2. **HAL3 的核心改进(对比 HAL1)** | **特性** | **HAL1 (Camera1)** | **HAL3 (Camera2)** | |-------------------|---------------------------|-----------------------------| | **控制模式** | 基于“预设场景”的自动模式 | 基于“请求(Request)”的手动控制 | | **数据流** | 单数据流(预览/拍照选一) | 多数据流并行(如同时预览+拍照) | | **性能** | 延迟高,资源利用率低 | 低延迟,更高效的硬件资源调度 | | **元数据** | 固定元数据,灵活性差 | 动态元数据(如每帧参数可配置) | --- #### 3. **HAL3 关键架构与组件** 1. **管道模型(Pipeline Model)** - 将相机硬件抽象为一个处理管道,接收来自应用的**捕获请求(CaptureRequest)**。 - 每个请求包含: - **参数配置**(如曝光时间、对焦模式)。 - **输出目标**(如 `Surface` 用于预览、拍照或录像)。 $$ \text{应用} \xrightarrow{\text{Request}} \text{相机管道} \xrightarrow{\text{Result}} \text{返回图像+元数据} $$ 2. **多流支持(Multi-Stream)** - 允许同时输出到多个 `Surface`(如预览 + 高分辨率拍照)。 - 硬件自动优化数据流路径(Bypass冗余处理)。 3. **动态元数据(Dynamic Metadata)** - 通过 `CameraCharacteristics` 查询设备能力(如支持的分辨率、帧率范围)。 - 每帧返回 `CaptureResult`,包含实时参数(如传感器时间戳、3A状态)。 --- #### 4. **开发中的核心类与流程** 1. **CameraDevice** - 表示物理相机设备,通过 `createCaptureSession()` 创建会话。 2. **CameraCaptureSession** - 管理数据流和请求,通过 `setRepeatingRequest()` 持续发送请求(如预览)。 3. **CaptureRequest** - 定义单次请求的参数(如对焦模式 `CONTROL_AF_MODE_AUTO`)。 ```java // 示例:创建一个拍照请求 CaptureRequest.Builder requestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); requestBuilder.addTarget(imageReader.getSurface()); requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); CaptureRequest request = requestBuilder.build(); ``` --- #### 5. **优势与挑战** - **优势**: - **精细控制**:支持手动调节 ISO、曝光时间等参数。 - **低延迟**:通过多流并行减少数据拷贝。 - **扩展性**:兼容深度相机、多摄像头等新型硬件。 - **挑战**: - **兼容性**:旧设备可能仅支持 HAL1,需用 `CameraManager.getCameraCharacteristics()` 检测能力。 - **复杂度**:需要处理异步回调、线程管理等细节。 --- #### 6. **实际应用建议** - **使用 CameraX**:Google 推荐的 Jetpack 库,基于 HAL3 封装,简化兼容性问题。 - **性能优化**: - 复用 `CaptureRequest` 减少开销。 - 限制输出分辨率(根据 `StreamConfigurationMap` 选择最优配置)。 --- #### 7. **总结** HAL3Android 相机系统的重大升级,通过**请求-响应模型**和**多流架构**,为开发者提供了接近硬件层的控制能力。尽管学习曲线较高,但能实现更专业的拍摄功能(如 RAW 捕获、实时 HDR)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值