|
YUV数据对齐(stride/scanline)
由于芯片硬件特性, 做硬件JPEG编码时, 图片宽高如果都是处理器位数(32或者64, 也有可能是其他数值, 取决于芯片平台)的整数倍, 能得到更好的性能, 所以如果预览或者拍照的图片宽高相不是关数值的整数倍, 比如msm8953平台是64位对齐, 拍照设置的图片尺寸为2592x1944,在HAL层获取的yuv数据实际宽高为2624x1984,如果用相关工具看这个yuv图片, 图片右边和下边有无效像素(绿边或者黑边或者对应像素的延伸). 对齐后的宽在QCOM平台宽称为stride(步长),即相邻两行图像数据之间的间隔, 高称之为scanline,即有多少行数据可以进行读取.
一个简单计算对齐后宽高的函数(只针对2幂次方对齐, 2,4,8,16...)
int align(int target, int align){ return (target + align -1) & (~(align - 1));}//示例:align(2592, 64);// 得到 2624
当然一般平台返回的yuv数据都有相关信息记录stride和scanline, 高通平台获取方式请看:高通(QCOM)平台HAL层获取预览/拍照/录像YUV数据 ,MTK平台相关信息都在IImageBuffer这个类中, 详细信息可以看下这个类的相关定义, 由于我这里没有源码(博客要及时写, 不然后面再写想验证东西或者看代码, 发现没有相关环境了......), 就不说明了.
YUV数据格式
由于平台的差异QCOM/MTK, 使用的yuv数据格式也有差异, QCOM平台预览格式为yuv420sp,即NV21, 拍照HAL层格式也是NV21.
MTK平台预览默认为yuv420p, 即YV21, 拍照HAL层默认情况为yuv422的一种格式, 但MTK平台提供了接口用于申请不同格式的YUV数据, 我自己尝试过在MT6750T平台申请拍照的YV12数据, 能正常得到相关数据.
预览格式可以通过dumpsys media.camera来查看, 一般支持多种格式, 可以通过设置参数的方式控制预览格式, 拍照也一样:
//查看支持的预览格式, adb方式, 当然也可以通过Camera的APIadb shell dumpsys media.camera |grep preview-format-values // linuxadb shell dumpsys media.camera |findstr preview-format-values //windows
注意:QCOM平台更改预览格式会导致exif中的缩略图出现异常色块, 这个问题很多QCOM平台都有, 原因是缩略图是根据预览的数据进行JPEG编码生成的, 但编码时默认用的NV21格式, 我们的预览不是NV21格式就会有问题, 是个bug.
|
|