From 446f44f61afd406e19760cd9cc5ad3a10fa11cbf Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 25 Aug 2009 17:23:44 -0700 Subject: [PATCH] Keep up with latest changes to overlay handling on that unnamable platform. --- include/media/stagefright/OMXCodec.h | 1 + .../media/stagefright/TIHardwareRenderer.h | 1 + media/libstagefright/OMXCodec.cpp | 4 ++ media/libstagefright/omx/Android.mk | 2 + .../libstagefright/omx/TIHardwareRenderer.cpp | 67 ++++++++++++++----- 5 files changed, 57 insertions(+), 18 deletions(-) diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index e4f6a4e8d887b..ff94e1000198b 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -83,6 +83,7 @@ private: kRequiresLoadedToIdleAfterAllocation = 4, kRequiresAllocateBufferOnInputPorts = 8, kRequiresFlushCompleteEmulation = 16, + kRequiresAllocateBufferOnOutputPorts = 32, }; struct BufferInfo { diff --git a/include/media/stagefright/TIHardwareRenderer.h b/include/media/stagefright/TIHardwareRenderer.h index f7fa81b86a597..ef42648b404f4 100644 --- a/include/media/stagefright/TIHardwareRenderer.h +++ b/include/media/stagefright/TIHardwareRenderer.h @@ -46,6 +46,7 @@ private: size_t mFrameSize; sp mOverlay; Vector mOverlayAddresses; + bool mIsFirstFrame; size_t mIndex; TIHardwareRenderer(const TIHardwareRenderer &); diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index fec6cfb83d022..1c68f2b5f57bc 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -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); } diff --git a/media/libstagefright/omx/Android.mk b/media/libstagefright/omx/Android.mk index 46affe7e2296e..77e42bebedb86 100644 --- a/media/libstagefright/omx/Android.mk +++ b/media/libstagefright/omx/Android.mk @@ -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 \ diff --git a/media/libstagefright/omx/TIHardwareRenderer.cpp b/media/libstagefright/omx/TIHardwareRenderer.cpp index ba42ef4ea2d9c..ebade4a76d329 100644 --- a/media/libstagefright/omx/TIHardwareRenderer.cpp +++ b/media/libstagefright/omx/TIHardwareRenderer.cpp @@ -17,13 +17,15 @@ #define LOG_TAG "TIHardwareRenderer" #include -#undef NDEBUG -#include - #include +#include #include #include +#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 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 < mOverlay->getBufferCount(); ++i) { - mOverlayAddresses.push(mOverlay->getBufferAddress((void *)i)); + for (size_t i = 0; i < (size_t)mOverlay->getBufferCount(); ++i) { + mapping_data_t *data = + (mapping_data_t *)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; + } - memcpy(addr, data, size); + if (mIsFirstFrame) { + LOGI("overlay buffer #%d: %p", i, mOverlayAddresses[i]); + } + } - mOverlay->queueBuffer(buffer); + if (i == mOverlayAddresses.size()) { + LOGE("No suitable overlay buffer found."); + return; + } + + mOverlay->queueBuffer((void *)i); + + 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 }