android camera:输出数据流和裁剪

来源:互联网 发布:铝合金模板设计软件 编辑:程序博客网 时间:2024/06/07 19:23

1.        Output streams

不像旧的camera子系统,有34种不同的从camera获取数据的方式(基于ANativeWindow的预览,预览回调,视频回调和拍照回调);新的camera子系统只有基于ANativeWindow的流水线,针对所有的分辨率和输出格式。这些码流一旦被配置完毕,将会发送独立的一帧数据到多个目标,比如GPU,视频编码器,渲染脚本,或者app可见的bufferRAW Bayer,处理过的YUV buffer,或者JPEGbuffer)。

作为一个优化,这些输出码流必须被提前配置,只有少量的码流即时存在。这个允许预分配内存buffer和配置camera硬件,以便当含有多个或者不同输出流水线的请求被提交时,没有延迟地实现请求。

为了支持当前camera API向后兼容,至少同时支持3YUV输出,外加一路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有效像素阵列对应的坐标系中,(00)对应这个有效像素阵列的左上角。因此,宽和高不能大于静态字段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层实现视频防抖,它必须调整裁剪区域,其描述视频防抖处理之后的输出区域。通常,使用cameraapp必须能够根据裁剪区域,图像sensor的尺寸,和镜头焦距确定视角范围。

因为裁剪区域应用于所有的数据流,它们与裁剪区域可能会有不同的宽高比,所以每个数据流所用的sensor区域会比较裁剪区域小一些。特别地,每个数据流需要根据所定义的裁剪区域最低限度维持square pixel和它的宽高比。如果数据流的宽高比比裁剪区域宽,数据流需要在垂直方向再做裁剪;反之,如果窄,则在水平方小再次裁剪。

在所有case中,数据流裁剪必须位于整个裁剪区域的中心位置;每个数据流只会在整个裁剪区域的水平或者垂直某一个方向上裁剪,从不会在两个方向上都裁剪。

例如,如果两路数据流定义为640x480 (4:3)1280x720 (16:9),下面展示了每路数据流所需要的输出区域,假设sensor分辨率为3M2000x1500像素阵列)。

裁剪区域: (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

0 0