From 34a4d2d51993f4886d0975c59933c577a372b599 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Fri, 17 Aug 2012 09:48:15 -0700 Subject: [PATCH] Emulator gralloc: Support YV12 Bug: 6243944 Change-Id: I5f416ab0ae15143df422c0f79d91841984b4fabe --- .../emulator/opengl/system/gralloc/gralloc.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tools/emulator/opengl/system/gralloc/gralloc.cpp b/tools/emulator/opengl/system/gralloc/gralloc.cpp index dd5e5156d..515a879b2 100644 --- a/tools/emulator/opengl/system/gralloc/gralloc.cpp +++ b/tools/emulator/opengl/system/gralloc/gralloc.cpp @@ -236,7 +236,14 @@ static int gralloc_alloc(alloc_device_t* dev, glType = GL_UNSIGNED_BYTE; break; case HAL_PIXEL_FORMAT_YCrCb_420_SP: - bpp = 0; // Chroma-subsampled format has fractional bpp + align = 1; + bpp = 1; // per-channel bpp + yuv_format = true; + // Not expecting to actually create any GL surfaces for this + break; + case HAL_PIXEL_FORMAT_YV12: + align = 16; + bpp = 1; // per-channel bpp yuv_format = true; // Not expecting to actually create any GL surfaces for this break; @@ -254,9 +261,11 @@ static int gralloc_alloc(alloc_device_t* dev, // keep space for image on guest memory if SW access is needed // or if the camera is doing writing if (yuv_format) { - // For NV21 - ashmem_size += w * h * 3 / 2; - stride = w; + size_t yStride = (w*bpp + (align - 1)) & ~(align-1); + size_t uvStride = (yStride / 2 + (align - 1)) & ~(align-1); + size_t uvHeight = h / 2; + ashmem_size += yStride * h + 2 * (uvHeight * uvStride); + stride = yStride / bpp; } else { size_t bpr = (w*bpp + (align-1)) & ~(align-1); ashmem_size += (bpr * h);