在某些设备中覆盖了ImageReader格式

时间:2016-01-11 09:27:33

标签: android android-camera2

我有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

所以看起来缓冲区的格式是YV12ImageReader的格式是YUV_420_888,因为我设置了它。

这让我有两个关于这种情况的问题,与我拥有的2个选项相对应(据我所见):

  1. 为什么缓冲区的格式YV12,设置在哪里?我可以更改吗?
  2. 我可以添加YV12支持 - 但我需要知道发生了这种覆盖。但是在致电image.getFormat()时,我收到了35,这意味着YUV_420_888。有没有办法知道是否发生了这种覆盖?
  3. 欢迎任何其他想法。

0 个答案:

没有答案