Merge change I36d0184e into eclair

* changes:
  fix[2228133] pixelflinger ignores the "vertical stride" leading to artifacts when playing back video
This commit is contained in:
Android (Google) Code Review
2009-11-02 21:26:54 -05:00
6 changed files with 34 additions and 9 deletions

View File

@@ -32,6 +32,8 @@
#include <GLES/gl.h>
#include <GLES/glext.h>
struct android_native_buffer_t;
namespace android {
const unsigned int OGLES_NUM_COMPRESSED_TEXTURE_FORMATS = 10;
@@ -602,7 +604,7 @@ struct copybits_context_t {
copybit_device_t* blitEngine;
int32_t minScale;
int32_t maxScale;
buffer_handle_t drawSurfaceBuffer;
android_native_buffer_t* drawSurfaceBuffer;
};
struct ogles_context_t {

View File

@@ -93,6 +93,8 @@ public:
void setIndex(int index);
int getIndex() const;
void setVerticalStride(uint32_t vstride);
uint32_t getVerticalStride() const;
protected:
GraphicBuffer(const Parcel& reply);

View File

@@ -444,6 +444,8 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const
GraphicBuffer::USAGE_HW_TEXTURE,
src.img.w, src.img.handle, false);
graphicBuffer->setVerticalStride(src.img.h);
err = mLayer.initializeEglImage(graphicBuffer, &mTexture);
}
#endif

View File

@@ -226,6 +226,14 @@ int GraphicBuffer::getIndex() const {
return mIndex;
}
void GraphicBuffer::setVerticalStride(uint32_t vstride) {
mVStride = vstride;
}
uint32_t GraphicBuffer::getVerticalStride() const {
return mVStride;
}
// ---------------------------------------------------------------------------
}; // namespace android

View File

@@ -46,13 +46,24 @@ namespace android {
static void textureToCopyBitImage(
const GGLSurface* surface, int32_t opFormat,
buffer_handle_t buffer, copybit_image_t* img)
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 = surface->height;
img->h = vstride ? vstride : surface->height;
img->format = opFormat;
img->base = surface->data;
img->handle = (native_handle_t *)buffer;
img->handle = (native_handle_t *)buffer->handle;
}
struct clipRectRegion : public copybit_region_t {
@@ -279,8 +290,8 @@ static bool copybit(GLint x, GLint y,
copybit_device_t* copybit = c->copybits.blitEngine;
copybit_image_t src;
buffer_handle_t source_hnd = textureObject->buffer->handle;
textureToCopyBitImage(&textureObject->surface, opFormat, source_hnd, &src);
textureToCopyBitImage(&textureObject->surface, opFormat,
textureObject->buffer, &src);
copybit_rect_t srect = { Ucr, Vcr + Hcr, Ucr + Wcr, Vcr };
/*
@@ -360,8 +371,8 @@ static bool copybit(GLint x, GLint y,
}
copybit_image_t dst;
buffer_handle_t target_hnd = c->copybits.drawSurfaceBuffer;
textureToCopyBitImage(&cbSurface, cbSurface.format, target_hnd, &dst);
textureToCopyBitImage(&cbSurface, cbSurface.format,
c->copybits.drawSurfaceBuffer, &dst);
copybit_rect_t drect = {x, y, x+w, y+h};

View File

@@ -651,7 +651,7 @@ EGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
if (supportedCopybitsDestinationFormat(buffer.format)) {
buffer_handle_t handle = this->buffer->handle;
if (handle != NULL) {
gl->copybits.drawSurfaceBuffer = handle;
gl->copybits.drawSurfaceBuffer = this->buffer;
}
}
}