From: Mathias Agopian Date: Fri, 26 Jun 2009 00:38:50 +0000 (-0700) Subject: add support for YUV formats X-Git-Tag: android-x86-2.2~56^2~1 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=8bf1f752686a228256e2f3c29a374d76f42b126b;p=android-x86%2Fhardware-libhardware.git add support for YUV formats --- diff --git a/modules/gralloc/gralloc.cpp b/modules/gralloc/gralloc.cpp index ccfe40b..3441eff 100644 --- a/modules/gralloc/gralloc.cpp +++ b/modules/gralloc/gralloc.cpp @@ -294,32 +294,52 @@ static int gralloc_alloc(alloc_device_t* dev, if (!pHandle || !pStride) return -EINVAL; - int align = 4; - int bpp = 0; - switch (format) { - case HAL_PIXEL_FORMAT_RGBA_8888: - case HAL_PIXEL_FORMAT_BGRA_8888: - bpp = 4; - break; - case HAL_PIXEL_FORMAT_RGB_565: - case HAL_PIXEL_FORMAT_RGBA_5551: - case HAL_PIXEL_FORMAT_RGBA_4444: - bpp = 2; - break; - default: - return -EINVAL; + size_t size, stride; + if (format == HAL_PIXEL_FORMAT_YCbCr_420_SP || + format == HAL_PIXEL_FORMAT_YCbCr_422_SP) + { + // FIXME: there is no way to return the vstride + int vstride; + stride = (w + 1) & ~1; + switch (format) { + case HAL_PIXEL_FORMAT_YCbCr_420_SP: + size = stride * h * 2; + break; + case HAL_PIXEL_FORMAT_YCbCr_422_SP: + vstride = (h+1) & ~1; + size = (stride * vstride) + (w/2 * h/2) * 2; + break; + default: + return -EINVAL; + } + } else { + int align = 4; + int bpp = 0; + switch (format) { + case HAL_PIXEL_FORMAT_RGBA_8888: + case HAL_PIXEL_FORMAT_BGRA_8888: + bpp = 4; + break; + case HAL_PIXEL_FORMAT_RGB_565: + case HAL_PIXEL_FORMAT_RGBA_5551: + case HAL_PIXEL_FORMAT_RGBA_4444: + bpp = 2; + break; + default: + return -EINVAL; + } + size_t bpr = (w*bpp + (align-1)) & ~(align-1); + size = bpr * h; + stride = bpr / bpp; } - size_t bpr = (w*bpp + (align-1)) & ~(align-1); - size_t size = bpr * h; - size_t stride = bpr / bpp; - int err; if (usage & GRALLOC_USAGE_HW_FB) { err = gralloc_alloc_framebuffer(dev, size, usage, pHandle); } else { err = gralloc_alloc_buffer(dev, size, usage, pHandle); } + if (err < 0) { return err; }