From 3a171a764298f7667655231055d3d0f1905fdf73 Mon Sep 17 00:00:00 2001 From: Zhijun He Date: Wed, 17 Feb 2016 17:24:04 -0800 Subject: [PATCH] ImageReader: override the flexible YUV compatible formats For gralloc HAL v0.1 devices, if the producer buffer format is NV21 or YV12, the returned flexFormat will be NV21 or YV12, which causes CTS failure for ImageReader decoder test. This change overrides the NV21 or YV12 image formats to HAL_PIXEL_FORMAT_YCbCr_420_888 for such case. With this, the ImageReader will work for the devices with older gralloc HAL implementations for HAL_PIXEL_FORMAT_YCbCr_420_888 compatible formats. Bug: 27136665 Change-Id: Ib4722f1f8dc20ad6561088755e4ab9d2e68f1b47 --- media/jni/android_media_ImageReader.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp index 3ffdb17f4ec0f..52e4b0946c319 100644 --- a/media/jni/android_media_ImageReader.cpp +++ b/media/jni/android_media_ImageReader.cpp @@ -1243,6 +1243,14 @@ static jint Image_getFormat(JNIEnv* env, jobject thiz, jint readerFormat) int readerHalFormat = android_view_Surface_mapPublicFormatToHalFormat( static_cast(readerFormat)); int32_t fmt = applyFormatOverrides(buffer->flexFormat, readerHalFormat); + // Override the image format to HAL_PIXEL_FORMAT_YCbCr_420_888 if the actual format is + // NV21 or YV12. This could only happen when the Gralloc HAL version is v0.1 thus doesn't + // support lockycbcr(), the CpuConsumer need to use the lock() method in the + // lockNextBuffer() call. For Gralloc HAL v0.2 or newer, this format should already be + // overridden to HAL_PIXEL_FORMAT_YCbCr_420_888 for the flexible YUV compatible formats. + if (fmt == HAL_PIXEL_FORMAT_YCrCb_420_SP || fmt == HAL_PIXEL_FORMAT_YV12) { + fmt = HAL_PIXEL_FORMAT_YCbCr_420_888; + } PublicFormat publicFmt = android_view_Surface_mapHalFormatDataspaceToPublicFormat( fmt, buffer->dataSpace); return static_cast(publicFmt);