我有一个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
.有没有办法知道是否发生了这种覆盖?
欢迎任何其他想法.