get rid off the YUV formats at the libui layer
This commit is contained in:
parent
39696474d7
commit
54ed4f6282
|
@ -29,6 +29,8 @@
|
|||
#include <surfaceflinger/ISurface.h>
|
||||
#include <ui/Overlay.h>
|
||||
|
||||
#include <hardware/hardware.h>
|
||||
|
||||
#include <media/mediaplayer.h>
|
||||
#include <media/AudioSystem.h>
|
||||
#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);
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <sys/types.h>
|
||||
#include <utils/Errors.h>
|
||||
#include <pixelflinger/format.h>
|
||||
#include <hardware/hardware.h>
|
||||
|
||||
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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -265,6 +265,7 @@ protected:
|
|||
status_t initializeEglImage(
|
||||
const sp<GraphicBuffer>& buffer, Texture* texture);
|
||||
|
||||
bool isSupportedYuvFormat(int format) const;
|
||||
|
||||
sp<SurfaceFlinger> mFlinger;
|
||||
uint32_t mFlags;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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<GraphicBuffer*>(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;
|
||||
|
|
Loading…
Reference in New Issue