From 54ed4f6282bdea251455f39b978626026affdbef Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 16 Feb 2010 17:33:37 -0800 Subject: [PATCH] get rid off the YUV formats at the libui layer --- camera/libcameraservice/CameraService.cpp | 7 +++-- include/ui/PixelFormat.h | 27 ++++++----------- libs/surfaceflinger/Layer.cpp | 18 +++++------ libs/surfaceflinger/LayerBase.cpp | 37 +++++++++++++++-------- libs/surfaceflinger/LayerBase.h | 1 + libs/ui/PixelFormat.cpp | 3 -- opengl/libagl/copybit.cpp | 15 +-------- 7 files changed, 50 insertions(+), 58 deletions(-) diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index 86a6fac27..f66a2d3c5 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -29,6 +29,8 @@ #include #include +#include + #include #include #include "CameraService.h" @@ -606,7 +608,7 @@ status_t CameraService::Client::registerPreviewBuffers() params.getPreviewSize(&w, &h); ISurface::BufferHeap buffers(w, h, w, h, - PIXEL_FORMAT_YCbCr_420_SP, + HAL_PIXEL_FORMAT_YCbCr_420_SP, mOrientation, 0, mHardware->getPreviewHeap()); @@ -927,7 +929,8 @@ void CameraService::Client::handleShutter( LOGV("Snapshot image width=%d, height=%d", w, h); } ISurface::BufferHeap buffers(w, h, w, h, - PIXEL_FORMAT_YCbCr_420_SP, mOrientation, 0, mHardware->getRawHeap()); + HAL_PIXEL_FORMAT_YCbCr_420_SP, mOrientation, 0, + mHardware->getRawHeap()); mSurface->registerBuffers(buffers); } diff --git a/include/ui/PixelFormat.h b/include/ui/PixelFormat.h index 6d87321bb..607155c32 100644 --- a/include/ui/PixelFormat.h +++ b/include/ui/PixelFormat.h @@ -30,6 +30,7 @@ #include #include #include +#include namespace android { @@ -57,25 +58,18 @@ enum { // real pixel formats supported for rendering ----------------------------- - PIXEL_FORMAT_RGBA_8888 = GGL_PIXEL_FORMAT_RGBA_8888, // 4x8-bit RGBA - PIXEL_FORMAT_RGBX_8888 = GGL_PIXEL_FORMAT_RGBX_8888, // 4x8-bit RGB0 - PIXEL_FORMAT_RGB_888 = GGL_PIXEL_FORMAT_RGB_888, // 3x8-bit RGB - PIXEL_FORMAT_RGB_565 = GGL_PIXEL_FORMAT_RGB_565, // 16-bit RGB - PIXEL_FORMAT_BGRA_8888 = GGL_PIXEL_FORMAT_BGRA_8888, // 4x8-bit BGRA - PIXEL_FORMAT_RGBA_5551 = GGL_PIXEL_FORMAT_RGBA_5551, // 16-bit ARGB - PIXEL_FORMAT_RGBA_4444 = GGL_PIXEL_FORMAT_RGBA_4444, // 16-bit ARGB + PIXEL_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888, // 4x8-bit RGBA + PIXEL_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888, // 4x8-bit RGB0 + PIXEL_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888, // 3x8-bit RGB + PIXEL_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565, // 16-bit RGB + PIXEL_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, // 4x8-bit BGRA + PIXEL_FORMAT_RGBA_5551 = HAL_PIXEL_FORMAT_RGBA_5551, // 16-bit ARGB + PIXEL_FORMAT_RGBA_4444 = HAL_PIXEL_FORMAT_RGBA_4444, // 16-bit ARGB PIXEL_FORMAT_A_8 = GGL_PIXEL_FORMAT_A_8, // 8-bit A PIXEL_FORMAT_L_8 = GGL_PIXEL_FORMAT_L_8, // 8-bit L (R=G=B=L) PIXEL_FORMAT_LA_88 = GGL_PIXEL_FORMAT_LA_88, // 16-bit LA PIXEL_FORMAT_RGB_332 = GGL_PIXEL_FORMAT_RGB_332, // 8-bit RGB - PIXEL_FORMAT_YCbCr_422_SP= GGL_PIXEL_FORMAT_YCbCr_422_SP, - PIXEL_FORMAT_YCbCr_420_SP= GGL_PIXEL_FORMAT_YCbCr_420_SP, - PIXEL_FORMAT_YCbCr_422_P = GGL_PIXEL_FORMAT_YCbCr_422_P, - PIXEL_FORMAT_YCbCr_420_P = GGL_PIXEL_FORMAT_YCbCr_420_P, - PIXEL_FORMAT_YCbCr_422_I = GGL_PIXEL_FORMAT_YCbCr_422_I, - PIXEL_FORMAT_YCbCr_420_I = GGL_PIXEL_FORMAT_YCbCr_420_I, - // New formats can be added if they're also defined in // pixelflinger/format.h }; @@ -96,10 +90,7 @@ struct PixelFormatInfo RGB = 2, RGBA = 3, LUMINANCE = 4, - LUMINANCE_ALPHA = 5, - Y_CB_CR_SP = 6, - Y_CB_CR_P = 7, - Y_CB_CR_I = 8, + LUMINANCE_ALPHA = 5 }; struct szinfo { diff --git a/libs/surfaceflinger/Layer.cpp b/libs/surfaceflinger/Layer.cpp index f38efab3d..c0805137f 100644 --- a/libs/surfaceflinger/Layer.cpp +++ b/libs/surfaceflinger/Layer.cpp @@ -185,20 +185,20 @@ void Layer::reloadTexture(const Region& dirty) if (res == NO_ERROR) { int bpp = 0; switch (t.format) { - case GGL_PIXEL_FORMAT_RGB_565: - case GGL_PIXEL_FORMAT_RGBA_4444: + case HAL_PIXEL_FORMAT_RGB_565: + case HAL_PIXEL_FORMAT_RGBA_4444: bpp = 2; break; - case GGL_PIXEL_FORMAT_RGBA_8888: - case GGL_PIXEL_FORMAT_RGBX_8888: + case HAL_PIXEL_FORMAT_RGBA_8888: + case HAL_PIXEL_FORMAT_RGBX_8888: bpp = 4; break; - case GGL_PIXEL_FORMAT_YCbCr_422_SP: - case GGL_PIXEL_FORMAT_YCbCr_420_SP: - // just show the Y plane of YUV buffers - bpp = 1; - break; default: + if (isSupportedYuvFormat(t.format)) { + // just show the Y plane of YUV buffers + bpp = 1; + break; + } // oops, we don't handle this format! LOGE("layer %p, texture=%d, using format %d, which is not " "supported by the GL", this, texture->name, t.format); diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp index 4d7bef8da..5b96e9dc8 100644 --- a/libs/surfaceflinger/LayerBase.cpp +++ b/libs/surfaceflinger/LayerBase.cpp @@ -509,6 +509,21 @@ void LayerBase::validateTexture(GLint textureName) const } } +bool LayerBase::isSupportedYuvFormat(int format) const +{ + switch (format) { + case HAL_PIXEL_FORMAT_YCbCr_422_SP: + case HAL_PIXEL_FORMAT_YCbCr_420_SP: + case HAL_PIXEL_FORMAT_YCbCr_422_P: + case HAL_PIXEL_FORMAT_YCbCr_420_P: + case HAL_PIXEL_FORMAT_YCbCr_422_I: + case HAL_PIXEL_FORMAT_YCbCr_420_I: + case HAL_PIXEL_FORMAT_YCrCb_420_SP: + return true; + } + return false; +} + void LayerBase::loadTexture(Texture* texture, const Region& dirty, const GGLSurface& t) const { @@ -573,21 +588,20 @@ void LayerBase::loadTexture(Texture* texture, data = t.data; } - if (t.format == GGL_PIXEL_FORMAT_RGB_565) { + if (t.format == HAL_PIXEL_FORMAT_RGB_565) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texture->potWidth, texture->potHeight, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data); - } else if (t.format == GGL_PIXEL_FORMAT_RGBA_4444) { + } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->potWidth, texture->potHeight, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, data); - } else if (t.format == GGL_PIXEL_FORMAT_RGBA_8888 || - t.format == GGL_PIXEL_FORMAT_RGBX_8888) { + } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 || + t.format == HAL_PIXEL_FORMAT_RGBX_8888) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->potWidth, texture->potHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - } else if ( t.format == GGL_PIXEL_FORMAT_YCbCr_422_SP || - t.format == GGL_PIXEL_FORMAT_YCbCr_420_SP) { + } else if (isSupportedYuvFormat(t.format)) { // just show the Y plane of YUV buffers glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, texture->potWidth, texture->potHeight, 0, @@ -599,24 +613,23 @@ void LayerBase::loadTexture(Texture* texture, } } if (!data) { - if (t.format == GGL_PIXEL_FORMAT_RGB_565) { + if (t.format == HAL_PIXEL_FORMAT_RGB_565) { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, bounds.top, t.width, bounds.height(), GL_RGB, GL_UNSIGNED_SHORT_5_6_5, t.data + bounds.top*t.stride*2); - } else if (t.format == GGL_PIXEL_FORMAT_RGBA_4444) { + } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, bounds.top, t.width, bounds.height(), GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, t.data + bounds.top*t.stride*2); - } else if (t.format == GGL_PIXEL_FORMAT_RGBA_8888 || - t.format == GGL_PIXEL_FORMAT_RGBX_8888) { + } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 || + t.format == HAL_PIXEL_FORMAT_RGBX_8888) { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, bounds.top, t.width, bounds.height(), GL_RGBA, GL_UNSIGNED_BYTE, t.data + bounds.top*t.stride*4); - } else if ( t.format == GGL_PIXEL_FORMAT_YCbCr_422_SP || - t.format == GGL_PIXEL_FORMAT_YCbCr_420_SP) { + } else if (isSupportedYuvFormat(t.format)) { // just show the Y plane of YUV buffers glTexSubImage2D(GL_TEXTURE_2D, 0, 0, bounds.top, t.width, bounds.height(), diff --git a/libs/surfaceflinger/LayerBase.h b/libs/surfaceflinger/LayerBase.h index a49faf766..d1bbd0468 100644 --- a/libs/surfaceflinger/LayerBase.h +++ b/libs/surfaceflinger/LayerBase.h @@ -265,6 +265,7 @@ protected: status_t initializeEglImage( const sp& buffer, Texture* texture); + bool isSupportedYuvFormat(int format) const; sp mFlinger; uint32_t mFlags; diff --git a/libs/ui/PixelFormat.cpp b/libs/ui/PixelFormat.cpp index b65ed9736..3f76e1a76 100644 --- a/libs/ui/PixelFormat.cpp +++ b/libs/ui/PixelFormat.cpp @@ -69,9 +69,6 @@ status_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info) COMPONENT(RGBA) COMPONENT(LUMINANCE) COMPONENT(LUMINANCE_ALPHA) - COMPONENT(Y_CB_CR_SP) - COMPONENT(Y_CB_CR_P) - COMPONENT(Y_CB_CR_I) default: return BAD_INDEX; } diff --git a/opengl/libagl/copybit.cpp b/opengl/libagl/copybit.cpp index 4cacc1125..67d1ce70b 100644 --- a/opengl/libagl/copybit.cpp +++ b/opengl/libagl/copybit.cpp @@ -48,19 +48,8 @@ static void textureToCopyBitImage( const GGLSurface* surface, int32_t opFormat, android_native_buffer_t* buffer, copybit_image_t* img) { - uint32_t vstride = 0; - if (opFormat == COPYBIT_FORMAT_YCbCr_422_SP || - opFormat == COPYBIT_FORMAT_YCbCr_420_SP) { - // NOTE: this static_cast is really not safe b/c we can't know for - // sure the buffer passed is of the right type. - // However, since we do this only for YUV formats, we should be safe - // since only SurfaceFlinger makes use of them. - GraphicBuffer* graphicBuffer = static_cast(buffer); - vstride = graphicBuffer->getVerticalStride(); - } - img->w = surface->stride; - img->h = vstride ? vstride : surface->height; + img->h = surface->height; img->format = opFormat; img->base = surface->data; img->handle = (native_handle_t *)buffer->handle; @@ -98,8 +87,6 @@ static bool supportedCopybitsFormat(int format) { case COPYBIT_FORMAT_BGRA_8888: case COPYBIT_FORMAT_RGBA_5551: case COPYBIT_FORMAT_RGBA_4444: - case COPYBIT_FORMAT_YCbCr_422_SP: - case COPYBIT_FORMAT_YCbCr_420_SP: return true; default: return false;