Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 368ad53c authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change I36d0184e into eclair

* changes:
  fix[2228133] pixelflinger ignores the "vertical stride" leading to artifacts when playing back video
parents 5a23afee 6fee0648
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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 {
+2 −0
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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
+18 −7
Original line number Diff line number Diff line
@@ -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};


Loading