diff options
| author | Android (Google) Code Review <android-gerrit@google.com> | 2009-08-26 10:30:31 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-08-26 10:30:31 -0700 |
| commit | 867bb7c3538cc66c378a695996cf8290a8774491 (patch) | |
| tree | dfa02ba1cf69070db6a7ea9debf532ef028c8b39 | |
| parent | ea839a72fd68e0b796e6dd2384de1447d06d9b62 (diff) | |
| parent | 446f44f61afd406e19760cd9cc5ad3a10fa11cbf (diff) | |
| download | frameworks_base-867bb7c3538cc66c378a695996cf8290a8774491.zip frameworks_base-867bb7c3538cc66c378a695996cf8290a8774491.tar.gz frameworks_base-867bb7c3538cc66c378a695996cf8290a8774491.tar.bz2 | |
Merge change 22773 into eclair
* changes:
Keep up with latest changes to overlay handling on that unnamable platform.
| -rw-r--r-- | include/media/stagefright/OMXCodec.h | 1 | ||||
| -rw-r--r-- | include/media/stagefright/TIHardwareRenderer.h | 1 | ||||
| -rw-r--r-- | media/libstagefright/OMXCodec.cpp | 4 | ||||
| -rw-r--r-- | media/libstagefright/omx/Android.mk | 2 | ||||
| -rw-r--r-- | media/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 e4f6a4e..ff94e10 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 f7fa81b..ef42648 100644 --- a/include/media/stagefright/TIHardwareRenderer.h +++ b/include/media/stagefright/TIHardwareRenderer.h @@ -46,6 +46,7 @@ private: size_t mFrameSize; sp<Overlay> mOverlay; Vector<void *> mOverlayAddresses; + bool mIsFirstFrame; size_t mIndex; TIHardwareRenderer(const TIHardwareRenderer &); diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index fec6cfb..1c68f2b 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 46affe7..77e42be 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 ba42ef4..ebade4a 100644 --- a/media/libstagefright/omx/TIHardwareRenderer.cpp +++ b/media/libstagefright/omx/TIHardwareRenderer.cpp @@ -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 < 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; + } + + if (mIsFirstFrame) { + LOGI("overlay buffer #%d: %p", i, mOverlayAddresses[i]); + } + } - memcpy(addr, data, size); + if (i == mOverlayAddresses.size()) { + LOGE("No suitable overlay buffer found."); + return; + } + + 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 } |
