虽然HAL层负责实现3A算法,但HAL interface定义了一个高层次的状态机描述,允许HAL层设备和framework层交流3A当前状态和3A事件的触发情况。
当设备被打开时,所有3A状态都应该是STATE_INACTIVE。码流配置不需重置3A。例如,需要通过调用configure()来修改固定焦点。
要触发3A行为,需要为下一个请求简单地设置相关触发器实体,以引导触发器的启动。例如,启动自动聚焦的触发器需要在一个请求中将ANDROID_CONTROL_AF_TRIGGER设置为ANDROID_CONTROL_AF_TRIGGER_START。停止自动聚焦需要将ANDROID_CONTROL_AF_TRIGGER设置为ANDROID_CONTRL_AF_TRIGGER_CANCEL。否则,实体不存在或者被设置为ANDROID_CONTROL_AF_TRIGGER_IDLE。每个请求对触发器设置一个非IDLE的值,都会引发一个独立的触发器事件。
在顶层,通过设置ANDROID_CONTROL_MODE控制3A。可以选择没有3A(ANDROID_CONTROL_MODE_OFF),自动模式(ANDROID_CONTROL_MODE_AUTO)和场景模式(ANDROID_CONTROL_USE_SCENE_MODE)。
· 在OFF模式下,自动聚焦(AF),自动曝光(AE)和自动白平衡(AEB)模式都被关闭。3A事例不会重置捕获控制中的任何设置。
· 在AUTO模式下,AF,AE和AWB模式运行各自的独立算法,它们有自己的模式,状态和触发器元数据实体,如下段描述。
· 在USE_SCENE_MODE模式下,ANDROID_CONTROL_SCENE_MODE的值决定3A事例的行为。在除了FACE_PRIORITY的SCENE_MODE中,HAL层必须将ANDROID_CONTROL_AE/AWB/AF_MODE的值重置为更适合被选择的SCENE_MODE的模式。例如,HAL层喜欢在SCENE_MODE_NIGHT场景中使用AF的CONTINUOUS_FOCUS模式。当这些场景模式被忽略时,将使用用户对AE/AWB/AF_MODE的选择。
· 对SCENE_MODE_FACE_PRIORITY的场景,AE/AWB/AFMODE工作在ANDROID_CONTROL_MODE_AUTO模式下。但是3A算法需要侧重对场景中检测出来的脸进行测光和聚焦。
1. Auto-focus settings and result entries
Main metadata entries:
ANDROID_CONTROL_AF_MODE:控制当前自动聚焦模式的选择。通过framework层在请求中设置。
AF_MODE_OFF:AF关闭;framework/app直接控制镜头的位置。
AF_MODE_AUTO:Single-sweep自动聚焦。只有AF被触发,镜头才会移动。
AF_MODE_MACRO:Single-sweep微距自动聚焦。只有AF被触发,镜头才会移动。
AF_MODE_CONTINUOUS_VIDEO:平滑的持续聚焦,用于视频录制。触发则立即在当前位置锁住焦点。取消而继续持续聚焦。
AF_MODE_CONTINUOUS_PICTURE:快速持续聚焦,用于静态图片的ZSL捕获。一旦达到扫描目标,触发则立即锁住焦点。取消而继续持续聚焦。
AF_MODE_EDOF:高级的景深聚焦。没有自动聚焦的浏览,触发和取消没有意义。通过HAL层控制图像的聚集。
ANDROID_CONTROL_AF_STATE:描述当前AF算法状态的动态元数据,HAL层在结果的元数据中报告该信息。
AF_STATE_INACTIVE:不做聚焦,或者算法被重置。镜头不移动。这个状态总是用于MODE_OFF或者MODE_EDOF。当设备刚被打开时,必须处于这个状态。
AF_STATE_PASSIVE_SCAN:一个持续聚焦的算法正在做扫描。镜头正在移动中。
AF_STATE_PASSIVE_FOCUSED:一个持续聚焦的算法认为已经聚焦成功。镜头不在移动。HAL层会自动地离开这个状态。
AF_STATE_PASSIVE_UNFOCUSED:一个持续聚焦的算法认为聚焦失败。镜头不在移动。HAL层会自动地离开这个状态。
AF_STATE_ACTIVE_SCAN:用户触发的扫描正在进行中。
AF_STATE_FOCUSED_LOCKED:AF算法认为聚焦结束。镜头不再移动。
AF_STATE_NOT_FOCUSED_LOCKED:AF算法没能完成聚焦。镜头不再移动。
ANDROID_CONTROL_AFTRIGGER:控制启动自动聚集扫描,其意义由所选择的模式和状态决定。Framework层在请求中设置该值。
AF_TRIGGER_IDLE:没有触发器。
AF_TRIGGER_START:触发AF扫描。其作用取决于模式和状态。
AF_TRIGGER_CANCEL:停止当前的AF扫描,重置算法到默认状态。
其他元数据实体:
ANDROID_CONTROL_AF_REGIONS:控制视角区域的选择,用于检测好的聚焦点。用于所有可进行聚焦扫描的AF模式。Framework层在请求中设置该值。
2. Auto-exposure settings and result entries
Main metadata entries:
ANDROID_CONTROL_AE_MODE:控制当前自动曝光模式的选择。Framework层在请求中设置该值。
AE_MODE_OFF:关闭自动曝光;用户控制曝光,增益,帧周期和闪光灯。
AE_MODE_ON:标准的自动聚焦,闪光灯关闭。用户设置闪光灯启动或者手电筒模式。
AE_MODE_ON_AUTO_FLASH:标准自动曝光,开启闪光灯。HAL层精确控制捕获前和捕获静态图片时闪光。用户可控制闪光灯关闭。
AE_MODE_ON_ALWAYS_FLASH:标准自动曝光,拍照时闪光灯一直开启。HAL层精确控制捕获前闪光。用户可控制闪光灯关闭。
AE_MODE_ON_AUTO_FLASH_REDEYE:标准自动曝光。HAL层精确控制预闪和捕获静态图片时闪光。在前面捕获序列的最后一帧启动一次闪光灯,以减少后面图片中的红眼现象。用户可控制闪光灯关闭。
ANDROID_CONTROL_AE_STATE:描述当前AE算法状态的动态元数据,HAL层在结果的元数据中报告该信息。
AE_STATE_INACTIVE:模式切换后AE初始状态。当设备刚打开时,AE必须处于这个状态。
AE_STATE_SEARCHING:AE没有达到曝光目标,正在调整曝光参数。
AE_STATE_CONVERGED:AE已经找到当前场景的正确的曝光值,曝光参数不再改变。HAL层会自动离开这个状态,寻找更好的解决方案。
AE_STATE_LOCKED:使用AE_LOCK已经锁住了AE。曝光值不再改变。
AE_STATE_FLASH_REQUIRED:HAL层已经曝光成功,但为了获取更亮的图片,需要开启闪光灯。用于ZSL模式。
AE_STATE_PRECAPTURE:HAL在捕获序列中间进行控制。根据AE模式,这种模式采用启动闪光灯测光或者瞬间开启关闭闪光灯预防红眼。
ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER:在捕获一张高质量图像之前,控制启动一个测光序列。Framework层在请求中设置该值。
PRECAPTURE_TRIGGER_IDLE:没有触发器。
PRECAPTURE_TRIGGER_START:启动一个捕获序列。HAL层使用后续的请求为获取高分辨率图像决定理想的曝光/白平衡。
Additional metadata entries:
ANDROID_CONTROL_AE_LOCK:控制锁住AE当前的值。
ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION:控制调整AE算法目标亮度点。
ANDROID_CONTROL_AE_TARGET_FPS_RANGE:控制选择AE算法的目标帧率区间。AE事例不能使用这个区间之外的帧率值。
ANDROID_CONTROL_AE_REGIONS:控制视角区域的选择,用于检测好的曝光值。用于所有除了OOF的AE模式。
3. Auto-whitebalance settings and resultentries
Main metadata entries:
ANDROID_CONTROL_AWB_MODE:控制当前白平衡模式的选择。
AWB_MODE_OFF:关闭自动白平衡。用户控制颜色矩阵。
AWB_MODE_AUTO:使能自动白平衡;3A控制颜色转换,可能会使用比简单矩阵更复杂的转换。
AWB_MODE_INCANDESCENT:用于室内白zhi灯的白平衡设置,色温大概2700K。
AWB_MODE_FLUORESCENT:用于荧光灯的白平衡设置,色温大概5000K。
AWB_MODE_WARM_FLUORESCENT:用于荧光灯的白平衡设置,色温大概3000K。
AWB_MODE_DAYLIGHT:用于晴天的白平衡设置,色温大概5500K。
AWB_MODE_CLOUDY_DAYLIGHT:用于阴天的白平衡设置,色温大概6500K。
AWB_MODE_TWILIGHT:用于日出/日落的白平衡设置,色温大概15000K。
AWB_MODE_SHADE:用于阴影处的白平衡设置,色温大概7500K。
ANDROID_CONTROL_AWB_STATE:描述当前AWB算法状态的动态元数据,HAL层在结果的元数据中报告该信息。
AWB_STATE_INACTIVE:切换模式后AWB的初始状态。当设备刚打开时,AWB必须处于这个状态。
AWB_STATE_SEARCHING:AWB没有收敛到目标值,在改变颜色调整参数。
AWB_STATE_CONVERGED:AWB为当前场景已经找到了理想的颜色调整值,这些参数不再改变。HAL层会自动离开该状态去寻找更好的解决方案。
AWB_STATE_LOCKED:使用AWB_LOCK锁住了AWB。颜色调整值不再改变。
Additional metadata entries:
ANDROID_CONTROL_AWB_LOCK:控制锁住当前AWB的值。
ANDROID_CONTROL_AWB_REGIONS:控制视角区域的选择,用于检测好的颜色平衡值。只用于自动白平衡模式。
4. General state machine transition notes
在切换AF,AE和AWB的不同模式是总会将算法的状态重置为INACTIVE。同样地,在CONTROL_MODE和CONTROL_SCENE_MODE(CONTROL_MODE == USE_SCENE_MODE)之间切换时,也需要将算法的状态重置为INACTIVE。
5. AF state machines
mode = AF_MODE_OFF or AF_MODE_EDOF | |||
State | Transformation cause | New state | Notes |
---|---|---|---|
INACTIVE | AF is disabled | ||
mode = AF_MODE_AUTO or AF_MODE_MACRO | |||
State | Transformation cause | New state | Notes |
INACTIVE | AF_TRIGGER | ACTIVE_SCAN | Start AF sweep Lens now moving |
ACTIVE_SCAN | AF sweep done | FOCUSED_LOCKED | If AF successful Lens now locked |
ACTIVE_SCAN | AF sweep done | NOT_FOCUSED_LOCKED | If AF successful Lens now locked |
ACTIVE_SCAN | AF_CANCEL | INACTIVE | Cancel/reset AF Lens now locked |
FOCUSED_LOCKED | AF_CANCEL | INACTIVE | Cancel/reset AF |
FOCUSED_LOCKED | AF_TRIGGER | ACTIVE_SCAN | Start new sweep Lens now moving |
NOT_FOCUSED_LOCKED | AF_CANCEL | INACTIVE | Cancel/reset AF |
NOT_FOCUSED_LOCKED | AF_TRIGGER | ACTIVE_SCAN | Start new sweep Lens now moving |
All states | mode change | INACTIVE | |
mode = AF_MODE_CONTINUOUS_VIDEO | |||
State | Transformation cause | New state | Notes |
INACTIVE | HAL initiates new scan | PASSIVE_SCAN | Start AF sweep Lens now moving |
INACTIVE | AF_TRIGGER | NOT_FOCUSED_LOCKED | AF state query Lens now locked |
PASSIVE_SCAN | HAL completes current scan | PASSIVE_FOCUSED | End AF scan Lens now locked |
PASSIVE_SCAN | AF_TRIGGER | FOCUSED_LOCKED | Immediate transformation if focus is good Lens now locked |
PASSIVE_SCAN | AF_TRIGGER | NOT_FOCUSED_LOCKED | Immediate transformation if focus is bad Lens now locked |
PASSIVE_SCAN | AF_CANCEL | INACTIVE | Reset lens position Lens now locked |
PASSIVE_FOCUSED | HAL initiates new scan | PASSIVE_SCAN | Start AF scan Lens now moving |
PASSIVE_FOCUSED | AF_TRIGGER | FOCUSED_LOCKED | Immediate transformation if focus is good Lens now locked |
PASSIVE_FOCUSED | AF_TRIGGER | NOT_FOCUSED_LOCKED | Immediate transformation if focus is bad Lens now locked |
FOCUSED_LOCKED | AF_TRIGGER | FOCUSED_LOCKED | No effect |
FOCUSED_LOCKED | AF_CANCEL | INACTIVE | Restart AF scan |
NOT_FOCUSED_LOCKED | AF_TRIGGER | NOT_FOCUSED_LOCKED | No effect |
NOT_FOCUSED_LOCKED | AF_CANCEL | INACTIVE | Restart AF scan |
mode = AF_MODE_CONTINUOUS_PICTURE | |||
State | Transformation cause | New state | Notes |
INACTIVE | HAL initiates new scan | PASSIVE_SCAN | Start AF scan Lens now moving |
INACTIVE | AF_TRIGGER | NOT_FOCUSED_LOCKED | AF state query Lens now locked |
PASSIVE_SCAN | HAL completes current scan | PASSIVE_FOCUSED | End AF scan Lens now locked |
PASSIVE_SCAN | AF_TRIGGER | FOCUSED_LOCKED | Eventual transformation once focus good Lens now locked |
PASSIVE_SCAN | AF_TRIGGER | NOT_FOCUSED_LOCKED | Eventual transformation if cannot focus Lens now locked |
PASSIVE_SCAN | AF_CANCEL | INACTIVE | Reset lens position Lens now locked |
PASSIVE_FOCUSED | HAL initiates new scan | PASSIVE_SCAN | Start AF scan Lens now moving |
PASSIVE_FOCUSED | AF_TRIGGER | FOCUSED_LOCKED | Immediate transformation if focus is good Lens now locked |
PASSIVE_FOCUSED | AF_TRIGGER | NOT_FOCUSED_LOCKED | Immediate transformation if focus is bad Lens now locked |
FOCUSED_LOCKED | AF_TRIGGER | FOCUSED_LOCKED | No effect |
FOCUSED_LOCKED | AF_CANCEL | INACTIVE | Restart AF scan |
NOT_FOCUSED_LOCKED | AF_TRIGGER | NOT_FOCUSED_LOCKED | No effect |
NOT_FOCUSED_LOCKED | AF_CANCEL | INACTIVE | Restart AF scan |
6. AE and AWB state machines
AE和AWB的状态机基本上是完全相同的。AE有额外的FLASH_REQUIRED和PRECAPTURE状态。所以下面行中涉及这两个状态时,AWB状态机忽略之。
mode = AE_MODE_OFF / AWB mode not AUTO | |||
State | Transformation cause | New state | Notes |
---|---|---|---|
INACTIVE | AE/AWB disabled | ||
mode = AE_MODE_ON_* / AWB_MODE_AUTO | |||
State | Transformation cause | New state | Notes |
INACTIVE | HAL initiates AE/AWB scan | SEARCHING | |
INACTIVE | AE/AWB_LOCK on | LOCKED | Values locked |
SEARCHING | HAL finishes AE/AWB scan | CONVERGED | Good values, not changing |
SEARCHING | HAL finishes AE scan | FLASH_REQUIRED | Converged but too dark without flash |
SEARCHING | AE/AWB_LOCK on | LOCKED | Values locked |
CONVERGED | HAL initiates AE/AWB scan | SEARCHING | Values locked |
CONVERGED | AE/AWB_LOCK on | LOCKED | Values locked |
FLASH_REQUIRED | HAL initiates AE/AWB scan | SEARCHING | Values locked |
FLASH_REQUIRED | AE/AWB_LOCK on | LOCKED | Values locked |
LOCKED | AE/AWB_LOCK off | SEARCHING | Values not good after unlock |
LOCKED | AE/AWB_LOCK off | CONVERGED | Values good after unlock |
LOCKED | AE_LOCK off | FLASH_REQUIRED | Exposure good, but too dark |
All AE states | PRECAPTURE_START | PRECAPTURE | Start precapture sequence |
PRECAPTURE | Sequence done, AE_LOCK off | CONVERGED | Ready for high-quality capture |
PRECAPTURE | Sequence done, AE_LOCK on | LOCKED | Ready for high-quality capture |
7. Enabling manual control
在配置3A模块中所涉及的一些控制,允许application直接控制。
对于每个请求,HAL层负责3A控制的模块会检查3A控制字段的状态。如果有3A事例使能,这些事例可能会重置该事例相关的控制变量,重置的值会放置于此次捕获的结果元数据中。例如,如果在一个请求中自动曝光使能,HAL层会重置这个请求中的曝光值,增益和帧周期字段(和潜在的闪光灯字段,依赖于AE模式)。相关控制如下:
Control name | Unit | Notes |
---|---|---|
android.control.mode | enum: OFF, AUTO, USE_SCENE_MODE | High-level 3A control. When set to OFF, all 3A control by the HAL is disabled. The application must set the fields for capture parameters itself. When set to AUTO, the individual algorithm controls in android.control.* are in effect, such as android.control.afMode. When set to USE_SCENE_MODE, the individual controls in android.control.* are mostly disabled, and the HAL implements one of the scene mode settings (such as ACTION, SUNSET, or PARTY) as it wishes. |
android.control.afMode | enum | OFF means manual control of lens focusing through android.lens.focusDistance. |
android.control.aeMode | enum | OFF means manual control of exposure/gain/frame duration through android.sensor.exposureTime / .sensitivity / .frameDuration |
android.control.awbMode | enum | OFF means manual control of white balance. |
(全文完)