From 3db21640519541141137166ce55627cf76e1974b Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 16 Feb 2010 20:43:39 -0800 Subject: [PATCH] fix a bug I introduced recently where YUV formats would crash the system --- include/ui/PixelFormat.h | 3 ++- libs/ui/PixelFormat.cpp | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/ui/PixelFormat.h b/include/ui/PixelFormat.h index 607155c32..f46f25c36 100644 --- a/include/ui/PixelFormat.h +++ b/include/ui/PixelFormat.h @@ -90,7 +90,8 @@ struct PixelFormatInfo RGB = 2, RGBA = 3, LUMINANCE = 4, - LUMINANCE_ALPHA = 5 + LUMINANCE_ALPHA = 5, + OTHER = 0xFF }; struct szinfo { diff --git a/libs/ui/PixelFormat.cpp b/libs/ui/PixelFormat.cpp index 3f76e1a76..9b41804ea 100644 --- a/libs/ui/PixelFormat.cpp +++ b/libs/ui/PixelFormat.cpp @@ -16,14 +16,17 @@ #include #include +#include namespace android { +static const int COMPONENT_YUV = 0xFF; + size_t PixelFormatInfo::getScanlineSize(unsigned int width) const { size_t size; - if ((components >= 6) && (components <= 8)) { - // YCbCr formats are differents. + if (components == COMPONENT_YUV) { + // YCbCr formats are different. size = (width * bitsPerPixel)>>3; } else { size = width * bytesPerPixel; @@ -53,14 +56,42 @@ status_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info) if (info->version != sizeof(PixelFormatInfo)) return INVALID_OPERATION; + // YUV format from the HAL are handled here + switch (format) { + case HAL_PIXEL_FORMAT_YCbCr_422_SP: + case HAL_PIXEL_FORMAT_YCrCb_422_SP: + case HAL_PIXEL_FORMAT_YCbCr_422_P: + case HAL_PIXEL_FORMAT_YCbCr_422_I: + case HAL_PIXEL_FORMAT_CbYCrY_422_I: + info->bitsPerPixel = 16; + goto done; + case HAL_PIXEL_FORMAT_YCbCr_420_SP: + case HAL_PIXEL_FORMAT_YCrCb_420_SP: + case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: + case HAL_PIXEL_FORMAT_YCrCb_420_SP_TILED: + case HAL_PIXEL_FORMAT_YCbCr_420_P: + case HAL_PIXEL_FORMAT_YCbCr_420_I: + case HAL_PIXEL_FORMAT_CbYCrY_420_I: + info->bitsPerPixel = 12; + done: + info->format = format; + info->components = COMPONENT_YUV; + info->bytesPerPixel = 1; + info->h_alpha = 0; + info->l_alpha = 0; + info->h_red = info->h_green = info->h_blue = 8; + info->l_red = info->l_green = info->l_blue = 0; + return NO_ERROR; + } + size_t numEntries; const GGLFormat *i = gglGetPixelFormatTable(&numEntries) + format; bool valid = uint32_t(format) < numEntries; if (!valid) { return BAD_INDEX; } - - #define COMPONENT(name) \ + + #define COMPONENT(name) \ case GGL_##name: info->components = PixelFormatInfo::name; break; switch (i->components) {