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

Commit ba9a9622 authored by Bo Hu's avatar Bo Hu Committed by Android (Google) Code Review
Browse files

Merge "Emulator: enable YUV format handling on emulator"

parents 1aed74f6 fa80eeac
Loading
Loading
Loading
Loading
+24 −28
Original line number Diff line number Diff line
@@ -30,10 +30,6 @@

namespace android {

static bool runningInEmulator() {
    char prop[PROPERTY_VALUE_MAX];
    return (property_get("ro.kernel.qemu", prop, NULL) > 0);
}

static int ALIGN(int x, int y) {
    // y must be a power of 2.
@@ -108,7 +104,7 @@ void SoftwareRenderer::resetFormatIfChanged(const sp<AMessage> &format) {
    size_t bufHeight = mCropHeight;

    // hardware has YUV12 and RGBA8888 support, so convert known formats
    if (!runningInEmulator()) {
    {
        switch (mColorFormat) {
            case OMX_COLOR_FormatYUV420Planar:
            case OMX_COLOR_FormatYUV420SemiPlanar:
@@ -205,7 +201,7 @@ void SoftwareRenderer::clearTracker() {
}

std::list<FrameRenderTracker::Info> SoftwareRenderer::render(
        const void *data, size_t size, int64_t mediaTimeUs, nsecs_t renderTimeNs,
        const void *data, size_t , int64_t mediaTimeUs, nsecs_t renderTimeNs,
        void* /*platformPrivate*/, const sp<AMessage>& format) {
    resetFormatIfChanged(format);
    FrameRenderTracker::Info *info = NULL;
@@ -244,14 +240,15 @@ std::list<FrameRenderTracker::Info> SoftwareRenderer::render(
                buf->stride, buf->height,
                0, 0, mCropWidth - 1, mCropHeight - 1);
    } else if (mColorFormat == OMX_COLOR_FormatYUV420Planar) {
        if ((size_t)mWidth * mHeight * 3 / 2 > size) {
            goto skip_copying;
        }
        const uint8_t *src_y = (const uint8_t *)data;
        const uint8_t *src_u =
                (const uint8_t *)data + mWidth * mHeight;
        const uint8_t *src_v = src_u + (mWidth / 2 * mHeight / 2);

        src_y +=mCropLeft + mCropTop * mWidth;
        src_u +=(mCropLeft + mCropTop * mWidth / 2)/2;
        src_v +=(mCropLeft + mCropTop * mWidth / 2)/2;

        uint8_t *dst_y = (uint8_t *)dst;
        size_t dst_y_size = buf->stride * buf->height;
        size_t dst_c_stride = ALIGN(buf->stride / 2, 16);
@@ -259,6 +256,10 @@ std::list<FrameRenderTracker::Info> SoftwareRenderer::render(
        uint8_t *dst_v = dst_y + dst_y_size;
        uint8_t *dst_u = dst_v + dst_c_size;

        dst_y += mCropTop * buf->stride + mCropLeft;
        dst_v += (mCropTop/2) * dst_c_stride + mCropLeft/2;
        dst_u += (mCropTop/2) * dst_c_stride + mCropLeft/2;

        for (int y = 0; y < mCropHeight; ++y) {
            memcpy(dst_y, src_y, mCropWidth);

@@ -277,12 +278,12 @@ std::list<FrameRenderTracker::Info> SoftwareRenderer::render(
        }
    } else if (mColorFormat == OMX_TI_COLOR_FormatYUV420PackedSemiPlanar
            || mColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) {
        if ((size_t)mWidth * mHeight * 3 / 2 > size) {
            goto skip_copying;
        }
        const uint8_t *src_y = (const uint8_t *)data;
        const uint8_t *src_uv = (const uint8_t *)data
                + mWidth * (mHeight - mCropTop / 2);
                + mWidth * mHeight;

        src_y += mCropLeft + mCropTop * mWidth;
        src_uv += (mCropLeft + mCropTop * mWidth) / 2;

        uint8_t *dst_y = (uint8_t *)dst;

@@ -292,6 +293,10 @@ std::list<FrameRenderTracker::Info> SoftwareRenderer::render(
        uint8_t *dst_v = dst_y + dst_y_size;
        uint8_t *dst_u = dst_v + dst_c_size;

        dst_y += mCropTop * buf->stride + mCropLeft;
        dst_v += (mCropTop/2) * dst_c_stride + mCropLeft/2;
        dst_u += (mCropTop/2) * dst_c_stride + mCropLeft/2;

        for (int y = 0; y < mCropHeight; ++y) {
            memcpy(dst_y, src_y, mCropWidth);

@@ -311,11 +316,8 @@ std::list<FrameRenderTracker::Info> SoftwareRenderer::render(
            dst_v += dst_c_stride;
        }
    } else if (mColorFormat == OMX_COLOR_Format24bitRGB888) {
        if ((size_t)mWidth * mHeight * 3 > size) {
            goto skip_copying;
        }
        uint8_t* srcPtr = (uint8_t*)data;
        uint8_t* dstPtr = (uint8_t*)dst;
        uint8_t* srcPtr = (uint8_t*)data + mWidth * mCropTop * 3 + mCropLeft * 3;
        uint8_t* dstPtr = (uint8_t*)dst + buf->stride * mCropTop * 3 + mCropLeft * 3;

        for (size_t y = 0; y < (size_t)mCropHeight; ++y) {
            memcpy(dstPtr, srcPtr, mCropWidth * 3);
@@ -323,14 +325,11 @@ std::list<FrameRenderTracker::Info> SoftwareRenderer::render(
            dstPtr += buf->stride * 3;
        }
    } else if (mColorFormat == OMX_COLOR_Format32bitARGB8888) {
        if ((size_t)mWidth * mHeight * 4 > size) {
            goto skip_copying;
        }
        uint8_t *srcPtr, *dstPtr;

        for (size_t y = 0; y < (size_t)mCropHeight; ++y) {
            srcPtr = (uint8_t*)data + mWidth * 4 * y;
            dstPtr = (uint8_t*)dst + buf->stride * 4 * y;
            srcPtr = (uint8_t*)data + mWidth * 4 * (y + mCropTop) + mCropLeft * 4;
            dstPtr = (uint8_t*)dst + buf->stride * 4 * (y + mCropTop) + mCropLeft * 4;
            for (size_t x = 0; x < (size_t)mCropWidth; ++x) {
                uint8_t a = *srcPtr++;
                for (size_t i = 0; i < 3; ++i) {   // copy RGB
@@ -340,11 +339,8 @@ std::list<FrameRenderTracker::Info> SoftwareRenderer::render(
            }
        }
    } else if (mColorFormat == OMX_COLOR_Format32BitRGBA8888) {
        if ((size_t)mWidth * mHeight * 4 > size) {
            goto skip_copying;
        }
        uint8_t* srcPtr = (uint8_t*)data;
        uint8_t* dstPtr = (uint8_t*)dst;
        uint8_t* srcPtr = (uint8_t*)data + mWidth * mCropTop * 4 + mCropLeft * 4;
        uint8_t* dstPtr = (uint8_t*)dst + buf->stride * mCropTop * 4 + mCropLeft * 4;

        for (size_t y = 0; y < (size_t)mCropHeight; ++y) {
            memcpy(dstPtr, srcPtr, mCropWidth * 4);