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

Commit 867bb7c3 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 22773 into eclair

* changes:
  Keep up with latest changes to overlay handling on that unnamable platform.
parents ea839a72 446f44f6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ private:
        kRequiresLoadedToIdleAfterAllocation = 4,
        kRequiresAllocateBufferOnInputPorts  = 8,
        kRequiresFlushCompleteEmulation      = 16,
        kRequiresAllocateBufferOnOutputPorts = 32,
    };

    struct BufferInfo {
+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ private:
    size_t mFrameSize;
    sp<Overlay> mOverlay;
    Vector<void *> mOverlayAddresses;
    bool mIsFirstFrame;
    size_t mIndex;

    TIHardwareRenderer(const TIHardwareRenderer &);
+4 −0
Original line number Diff line number Diff line
@@ -735,6 +735,10 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
                && (mQuirks & kRequiresAllocateBufferOnInputPorts)) {
            err = mOMX->allocate_buffer_with_backup(
                    mNode, portIndex, mem, &buffer);
        } else if (portIndex == kPortIndexOutput
                && (mQuirks & kRequiresAllocateBufferOnOutputPorts)) {
            err = mOMX->allocate_buffer(
                    mNode, portIndex, def.nBufferSize, &buffer);
        } else {
            err = mOMX->use_buffer(mNode, portIndex, mem, &buffer);
        }
+2 −0
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@ include external/opencore/Config.mk
LOCAL_C_INCLUDES := $(PV_INCLUDES)
LOCAL_CFLAGS := $(PV_CFLAGS_MINUS_VISIBILITY)

LOCAL_C_INCLUDES += $(TOP)/hardware/ti/omap3/liboverlay

LOCAL_SRC_FILES:=                 \
	OMX.cpp                   \
        QComHardwareRenderer.cpp  \
+49 −18
Original line number Diff line number Diff line
@@ -17,13 +17,15 @@
#define LOG_TAG "TIHardwareRenderer"
#include <utils/Log.h>

#undef NDEBUG
#include <assert.h>

#include <media/stagefright/TIHardwareRenderer.h>
#include <media/stagefright/MediaDebug.h>
#include <ui/ISurface.h>
#include <ui/Overlay.h>

#include "v4l2_utils.h"

#define CACHEABLE_BUFFERS 0x1

namespace android {

////////////////////////////////////////////////////////////////////////////////
@@ -37,10 +39,12 @@ TIHardwareRenderer::TIHardwareRenderer(
      mDisplayHeight(displayHeight),
      mDecodedWidth(decodedWidth),
      mDecodedHeight(decodedHeight),
      mFrameSize((mDecodedWidth * mDecodedHeight * 3) / 2) {
    assert(mISurface.get() != NULL);
    assert(mDecodedWidth > 0);
    assert(mDecodedHeight > 0);
      mFrameSize(mDecodedWidth * mDecodedHeight * 2),
      mIsFirstFrame(true),
      mIndex(0) {
    CHECK(mISurface.get() != NULL);
    CHECK(mDecodedWidth > 0);
    CHECK(mDecodedHeight > 0);

    sp<OverlayRef> ref = mISurface->createOverlay(
            mDisplayWidth, mDisplayHeight, OVERLAY_FORMAT_CbYCrY_422_I);
@@ -51,11 +55,14 @@ TIHardwareRenderer::TIHardwareRenderer(
    }

    mOverlay = new Overlay(ref);
    mOverlay->setParameter(CACHEABLE_BUFFERS, 0);

    for (size_t i = 0; i < (size_t)mOverlay->getBufferCount(); ++i) {
        mapping_data_t *data =
            (mapping_data_t *)mOverlay->getBufferAddress((void *)i);

    for (size_t i = 0; i < mOverlay->getBufferCount(); ++i) {
        mOverlayAddresses.push(mOverlay->getBufferAddress((void *)i));
        mOverlayAddresses.push(data->ptr);
    }
    mIndex = mOverlayAddresses.size() - 1;
}

TIHardwareRenderer::~TIHardwareRenderer() {
@@ -70,27 +77,51 @@ TIHardwareRenderer::~TIHardwareRenderer() {

void TIHardwareRenderer::render(
        const void *data, size_t size, void *platformPrivate) {
    // assert(size == mFrameSize);
    // CHECK_EQ(size, mFrameSize);

    if (mOverlay.get() == NULL) {
        return;
    }

#if 0
    overlay_buffer_t buffer;
    if (mOverlay->dequeueBuffer(&buffer) == OK) {
        void *addr = mOverlay->getBufferAddress(buffer);
    size_t i = 0;
    for (; i < mOverlayAddresses.size(); ++i) {
        if (mOverlayAddresses[i] == data) {
            break;
        }

        if (mIsFirstFrame) {
            LOGI("overlay buffer #%d: %p", i, mOverlayAddresses[i]);
        }
    }

    if (i == mOverlayAddresses.size()) {
        LOGE("No suitable overlay buffer found.");
        return;
    }

        memcpy(addr, data, size);
    mOverlay->queueBuffer((void *)i);

        mOverlay->queueBuffer(buffer);
    overlay_buffer_t overlay_buffer;
    if (!mIsFirstFrame) {
        CHECK_EQ(mOverlay->dequeueBuffer(&overlay_buffer), OK);
    } else {
        mIsFirstFrame = false;
    }
#else
    memcpy(mOverlayAddresses[mIndex], data, size);

    mOverlay->queueBuffer((void *)mIndex);

    if (mIndex-- == 0) {
        mIndex = mOverlayAddresses.size() - 1;
    if (++mIndex == mOverlayAddresses.size()) {
        mIndex = 0;
    }

    overlay_buffer_t overlay_buffer;
    if (!mIsFirstFrame) {
        CHECK_EQ(mOverlay->dequeueBuffer(&overlay_buffer), OK);
    } else {
        mIsFirstFrame = false;
    }
#endif
}