我有一个ImageReader
用于获取预览帧的数据(字节数组)。它配置了推荐的图像格式,YUV_420_888
如下所示:
mPreviewImageReader = ImageReader.newInstance(width,
height, ImageFormat.YUV_420_888, 2);
当我设置的监听mPreviewImageReader.setOnImageAvailableListener();
器被调用时,我检索一个图像:
Image image = reader.acquireLatestImage();
在某些手机中,我在日志中看到以下带有ImageReader_JNI
标签的打印输出:
ImageReader_imageSetup:覆盖缓冲区格式 YUV_420_888 到 32315659。
我搜索了一下,似乎格式被覆盖为YV12
. 我尝试查看 ImageReader 的 c++ 代码并发现发生这种情况的位置:
int bufFmt = buffer->format;
if (imgReaderFmt == HAL_PIXEL_FORMAT_YCbCr_420_888) {
bufFmt = buffer->flexFormat;
}
if (imgReaderFmt != bufFmt) {
if (imgReaderFmt == HAL_PIXEL_FORMAT_YCbCr_420_888 && (bufFmt ==
HAL_PIXEL_FORMAT_YCrCb_420_SP || bufFmt == HAL_PIXEL_FORMAT_YV12)) {
// Special casing for when producer switches to a format compatible with flexible YUV
// (HAL_PIXEL_FORMAT_YCbCr_420_888).
ctx->setBufferFormat(bufFmt);
ALOGD("%s: Overriding buffer format YUV_420_888 to %x.", __FUNCTION__, bufFmt);
}
// ... rest of the code
所以看起来缓冲区的格式是YV12
我设置ImageReader
的格式。YUV_420_888
这给我带来了关于这种情况的 2 个问题,这些问题与我所拥有的 2 个选项相对应(据我所知):
- 为什么缓冲区的格式
YV12
,它在哪里设置,我可以改变它吗? - 我可以添加
YV12
支持 - 但我需要知道发生了这种覆盖。但是当我打电话时image.getFormat()
收到 35 这意味着YUV_420_888
。有没有办法知道是否发生了这种覆盖?
欢迎任何其他想法。