summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-06-25 17:38:50 -0700
committerMathias Agopian <mathias@google.com>2009-06-25 17:38:50 -0700
commit8bf1f752686a228256e2f3c29a374d76f42b126b (patch)
tree774a9f3efe6e5caa67543abde86217cf54fd4e0b
parent689fa73c067e1618bbdb62f32c2a34750b8ec48b (diff)
downloadlibhardware-8bf1f752686a228256e2f3c29a374d76f42b126b.tar.gz
add support for YUV formats
-rw-r--r--modules/gralloc/gralloc.cpp56
1 files changed, 38 insertions, 18 deletions
diff --git a/modules/gralloc/gralloc.cpp b/modules/gralloc/gralloc.cpp
index ccfe40b1..3441effd 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;
}