Google源码网地址链接:https://source.android.com/devices/camera
该Google Camera的文档为系列文章,文章列表:
overview
Camera3
HAL Subsystem
Metadata and Controls
3A Modes and State
Output and Cropping
Errors and Streams
Request Creation
External USB Cameras
Multi-Camera Support
Motion Tracking
Session Parameters
Single Producer,Multiple Consumer
Version Support
输出流
相机子系统针对所有分辨率和输出格式都仅在基于 ANativeWindow 的管道上运行。您可以一次配置多个流,以便将单个帧发送至多个目标,例如:GPU、视频编码器、RenderScript,或应用可见的缓冲区(RAW Bayer 缓冲区、经处理的 YUV 缓冲区或经 JPEG 编码的缓冲区)。
出于优化的目的,这些输出流必须提前配置,而且只有有限的输出流可同时存在。这样一来,就可以预先分配内存缓冲区和配置相机硬件,以便在提交列有多个或者不同输出管道的请求时,不会出现请求延迟执行的情况。
有关取决于支持的硬件级别的保证流输出组合的详情,请参阅 createCaptureSession()。
剪裁
完整像素阵列的剪裁(用于数字变焦和需要更小 FOV 的其他使用情况)通过 ANDROID_SCALER_CROP_REGION 设置进行传递。这个设置可按需更改,这种方式对于实现平滑的数字变焦至关重要。
该区域被定义为矩形(x 和 y 分别表示宽和高),其中 (x,y) 表示矩形的左上角。该矩形在传感器有源像素阵列的坐标系中进行定义,其中 (0,0) 对应有源像素阵列的左上角像素。因此,宽度和高度不能大于 ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY 静态信息字段中所报告的尺寸。允许的最小宽度和高度由 HAL 通过 ANDROID_SCALER_MAX_DIGITAL_ZOOM 静态信息字段进行报告,该字段描述了所支持的缩放因子的最大值。因此,最小剪裁区域的宽度和高度为:
{width, height} =
{ floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM),
floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
如果剪裁区域需要满足特定需求(例如:要求起始位置坐标为偶数,并且其宽度/高度需均为偶数),则 HAL 必须进行必要的舍入运算,并写出输出结果元数据中所用的最终剪裁区域。同样,HAL 要实现视频防抖功能,则必须调整结果剪裁区域,以描述在应用视频防抖功能后输出结果中实际包含的区域。一般情况下,使用相机的应用必须能够根据剪裁区域、图像传感器的尺寸和镜头焦距确定其接收的视野范围。
由于剪裁区域适用于所有视频流,这些视频流的宽高比可能与剪裁区域的不同,所以每路视频流所用的实际传感器区域可能小于剪裁区域。具体而言,每路视频流应尽量避免进一步剪裁已定义的剪裁区域,以维持方形像素及其宽高比。如果视频流的宽高比大于剪裁区域,则该视频流应该在垂直方向上进一步剪裁,如果视频流的宽高比小于剪裁区域,则该视频流应该在水平方向上进一步剪裁。
在所有情况下,视频流剪裁均必须位于整个剪裁区域的中心位置,并且相对于整个剪裁区域,每路视频流要么在水平方向上进行剪裁,要么在垂直方向上进行剪裁,但绝不能在这两个方向上同时进行剪裁。
例如,如果两路视频流分别定义为 640x480(宽高比为 4:3)和 1280x720(宽高比为 16:9),并假设传感器为 300 万像素级(2000 x 1500 像素阵列),则下面展示了针对几个样本剪裁区域,每路视频流的预期输出区域。
剪裁区域:(500、375、1000、750)(宽高比为 4:3)
640x480 视频流剪裁:(500、375、1000、750)(与剪裁区域相同)
1280x720 视频流剪裁:(500、469、1000、562)
图 1. 宽高比为 4:3
剪裁区域:(500、375、1333、750)(宽高比为 16:9)
640x480 视频流剪裁:(666、375、1000、750)
1280×720 视频流剪裁:(500、375、1333、750)(与剪裁区域相同)
图 2. 宽高比为 16:9
剪裁区域:(500、375、750、750)(宽高比为 1:1)
640x480 视频流剪裁:(500、469、750、562)
1280x720 视频流剪裁:(500、543、750、414)
图 3. 宽高比为 1:1
最后一个示例是宽高比为 1024×1024(方形)的视频流,而不是 480p 视频流:
剪裁区域:(500、375、1000、750)(宽高比为 4:3)
1024x1024 视频流剪裁:(625、375、750、750)
1280x720 视频流剪裁:(500、469、1000、562)
图 4. 宽高比为 4:3(方形)
重新处理
对原始图片文件提供额外的支持功能,即 RAW Bayer 数据重新处理支持功能。该支持功能允许相机管道处理之前捕获的 RAW 缓冲区和元数据(之前记录的整个帧),以生成新渲染的 YUV 或 JPEG 输出。