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

Commit ea7d1562 authored by Andreas Huber's avatar Andreas Huber
Browse files

Keep up with latest changes to overlay handling on that unnamable platform.

parent 4e3d2484
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
}