1. Output streams
不像旧的camera子系统,有3、4种不同的从camera获取数据的方式(基于ANativeWindow的预览,预览回调,视频回调和拍照回调);新的camera子系统只有基于ANativeWindow的流水线,针对所有的分辨率和输出格式。这些码流一旦被配置完毕,将会发送独立的一帧数据到多个目标,比如GPU,视频编码器,渲染脚本,或者app可见的buffer(RAW Bayer,处理过的YUV buffer,或者JPEGbuffer)。
作为一个优化,这些输出码流必须被提前配置,只有少量的码流即时存在。这个允许预分配内存buffer和配置camera硬件,以便当含有多个或者不同输出流水线的请求被提交时,没有延迟地实现请求。
为了支持当前camera API向后兼容,至少同时支持3路YUV输出,外加一路JPEG流。这是video snapshot的需求,app也可以接受YUV buffer:
· 一路数据流给GPU/SurfaceView (不透明的YUV 格式)做预览
· 一路数据流给视频编码器 (不透明的YUV 格式)做录制
· 一路数据流给app (已知的YUV 格式)做预览帧的回调,供app使用
· 一路数据流给app(JPEG)做video snapshot
更精确地需求还在定义中,因为对应的API还没有完全实现。
2. Cropping
像素阵列的裁剪(用于数字变焦和其他需要小视角的情况)是通过ANDROID_SCALER_CROP_REGION来配置的。这个在每个请求中都可以设置或者改变,这对实现平滑的数字变焦是很苛刻的。
使用矩形(x, y, width, height)定义一个区域,(x, y)描述矩形的左上角。这个矩形定义在sensor有效像素阵列对应的坐标系中,(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层必须完成必要的rounding,向输出结果的元数据写入最后的裁剪区域。同样的,如果HAL层实现视频防抖,它必须调整裁剪区域,其描述视频防抖处理之后的输出区域。通常,使用camera的app必须能够根据裁剪区域,图像sensor的尺寸,和镜头焦距确定视角范围。
因为裁剪区域应用于所有的数据流,它们与裁剪区域可能会有不同的宽高比,所以每个数据流所用的sensor区域会比较裁剪区域小一些。特别地,每个数据流需要根据所定义的裁剪区域最低限度维持square pixel和它的宽高比。如果数据流的宽高比比裁剪区域宽,数据流需要在垂直方向再做裁剪;反之,如果窄,则在水平方小再次裁剪。
在所有case中,数据流裁剪必须位于整个裁剪区域的中心位置;每个数据流只会在整个裁剪区域的水平或者垂直某一个方向上裁剪,从不会在两个方向上都裁剪。
例如,如果两路数据流定义为640x480 (4:3)和1280x720 (16:9),下面展示了每路数据流所需要的输出区域,假设sensor分辨率为3M(2000x1500像素阵列)。
裁剪区域: (500, 375, 1000, 750) (4:3)
640x480数据流裁剪区域: (500, 375, 1000, 750) (与裁剪区域相同)
1280x720数据流裁剪区域: (500, 469, 1000, 562)
Figure 1. 4:3 aspect ratio
裁剪区域: (500, 375, 1333, 750) (16:9 aspect ratio)
640x480数据流裁剪: (666, 375, 1000, 750)
1280x720数据流裁剪: (500, 375, 1333, 750) (与裁剪区域相同)
Figure 2. 16:9 aspect ratio
裁剪区域: (500, 375, 750, 750) (1:1)
640x480数据流裁剪: (500, 469, 750, 562)
1280x720数据流裁剪: (500, 543, 750, 414)
Figure 3. 1:1 aspect ratio
最后一个例子,一个1024x1024正方形比例的数据流代替480p数据流:
裁剪区域:(500, 375, 1000, 750) (4:3)
1024x1024数据流裁剪区域: (625, 375, 750, 750)
1280x720数据流裁剪区域: (500, 469, 1000, 562)
Figure 4. 4:3 aspect ratio, square
3. Reprocessing
对RAW图像文件的支持,可以对RAW bayer数据进行再次处理。这个允许camera流水线处理之前抓取的RAW buffer和元数据(之前记录的一个整帧数据),产生一个新的YUV或者JPEG输出。
https://source.android.com/devices/camera/camera3_crop_reprocess.html