Merge change 22773 into eclair

* changes:
  Keep up with latest changes to overlay handling on that unnamable platform.
This commit is contained in:
Android (Google) Code Review
2009-08-26 10:30:31 -07:00
5 changed files with 57 additions and 18 deletions

View File

@@ -83,6 +83,7 @@ private:
kRequiresLoadedToIdleAfterAllocation = 4, kRequiresLoadedToIdleAfterAllocation = 4,
kRequiresAllocateBufferOnInputPorts = 8, kRequiresAllocateBufferOnInputPorts = 8,
kRequiresFlushCompleteEmulation = 16, kRequiresFlushCompleteEmulation = 16,
kRequiresAllocateBufferOnOutputPorts = 32,
}; };
struct BufferInfo { struct BufferInfo {

View File

@@ -46,6 +46,7 @@ private:
size_t mFrameSize; size_t mFrameSize;
sp<Overlay> mOverlay; sp<Overlay> mOverlay;
Vector<void *> mOverlayAddresses; Vector<void *> mOverlayAddresses;
bool mIsFirstFrame;
size_t mIndex; size_t mIndex;
TIHardwareRenderer(const TIHardwareRenderer &); TIHardwareRenderer(const TIHardwareRenderer &);

View File

@@ -735,6 +735,10 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
&& (mQuirks & kRequiresAllocateBufferOnInputPorts)) { && (mQuirks & kRequiresAllocateBufferOnInputPorts)) {
err = mOMX->allocate_buffer_with_backup( err = mOMX->allocate_buffer_with_backup(
mNode, portIndex, mem, &buffer); mNode, portIndex, mem, &buffer);
} else if (portIndex == kPortIndexOutput
&& (mQuirks & kRequiresAllocateBufferOnOutputPorts)) {
err = mOMX->allocate_buffer(
mNode, portIndex, def.nBufferSize, &buffer);
} else { } else {
err = mOMX->use_buffer(mNode, portIndex, mem, &buffer); err = mOMX->use_buffer(mNode, portIndex, mem, &buffer);
} }

View File

@@ -6,6 +6,8 @@ include external/opencore/Config.mk
LOCAL_C_INCLUDES := $(PV_INCLUDES) LOCAL_C_INCLUDES := $(PV_INCLUDES)
LOCAL_CFLAGS := $(PV_CFLAGS_MINUS_VISIBILITY) LOCAL_CFLAGS := $(PV_CFLAGS_MINUS_VISIBILITY)
LOCAL_C_INCLUDES += $(TOP)/hardware/ti/omap3/liboverlay
LOCAL_SRC_FILES:= \ LOCAL_SRC_FILES:= \
OMX.cpp \ OMX.cpp \
QComHardwareRenderer.cpp \ QComHardwareRenderer.cpp \

View File

@@ -17,13 +17,15 @@
#define LOG_TAG "TIHardwareRenderer" #define LOG_TAG "TIHardwareRenderer"
#include <utils/Log.h> #include <utils/Log.h>
#undef NDEBUG
#include <assert.h>
#include <media/stagefright/TIHardwareRenderer.h> #include <media/stagefright/TIHardwareRenderer.h>
#include <media/stagefright/MediaDebug.h>
#include <ui/ISurface.h> #include <ui/ISurface.h>
#include <ui/Overlay.h> #include <ui/Overlay.h>
#include "v4l2_utils.h"
#define CACHEABLE_BUFFERS 0x1
namespace android { namespace android {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -37,10 +39,12 @@ TIHardwareRenderer::TIHardwareRenderer(
mDisplayHeight(displayHeight), mDisplayHeight(displayHeight),
mDecodedWidth(decodedWidth), mDecodedWidth(decodedWidth),
mDecodedHeight(decodedHeight), mDecodedHeight(decodedHeight),
mFrameSize((mDecodedWidth * mDecodedHeight * 3) / 2) { mFrameSize(mDecodedWidth * mDecodedHeight * 2),
assert(mISurface.get() != NULL); mIsFirstFrame(true),
assert(mDecodedWidth > 0); mIndex(0) {
assert(mDecodedHeight > 0); CHECK(mISurface.get() != NULL);
CHECK(mDecodedWidth > 0);
CHECK(mDecodedHeight > 0);
sp<OverlayRef> ref = mISurface->createOverlay( sp<OverlayRef> ref = mISurface->createOverlay(
mDisplayWidth, mDisplayHeight, OVERLAY_FORMAT_CbYCrY_422_I); mDisplayWidth, mDisplayHeight, OVERLAY_FORMAT_CbYCrY_422_I);
@@ -51,11 +55,14 @@ TIHardwareRenderer::TIHardwareRenderer(
} }
mOverlay = new Overlay(ref); mOverlay = new Overlay(ref);
mOverlay->setParameter(CACHEABLE_BUFFERS, 0);
for (size_t i = 0; i < mOverlay->getBufferCount(); ++i) { for (size_t i = 0; i < (size_t)mOverlay->getBufferCount(); ++i) {
mOverlayAddresses.push(mOverlay->getBufferAddress((void *)i)); mapping_data_t *data =
(mapping_data_t *)mOverlay->getBufferAddress((void *)i);
mOverlayAddresses.push(data->ptr);
} }
mIndex = mOverlayAddresses.size() - 1;
} }
TIHardwareRenderer::~TIHardwareRenderer() { TIHardwareRenderer::~TIHardwareRenderer() {
@@ -70,27 +77,51 @@ TIHardwareRenderer::~TIHardwareRenderer() {
void TIHardwareRenderer::render( void TIHardwareRenderer::render(
const void *data, size_t size, void *platformPrivate) { const void *data, size_t size, void *platformPrivate) {
// assert(size == mFrameSize); // CHECK_EQ(size, mFrameSize);
if (mOverlay.get() == NULL) { if (mOverlay.get() == NULL) {
return; return;
} }
#if 0 #if 0
overlay_buffer_t buffer; size_t i = 0;
if (mOverlay->dequeueBuffer(&buffer) == OK) { for (; i < mOverlayAddresses.size(); ++i) {
void *addr = mOverlay->getBufferAddress(buffer); 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 #else
memcpy(mOverlayAddresses[mIndex], data, size); memcpy(mOverlayAddresses[mIndex], data, size);
mOverlay->queueBuffer((void *)mIndex); mOverlay->queueBuffer((void *)mIndex);
if (mIndex-- == 0) { if (++mIndex == mOverlayAddresses.size()) {
mIndex = mOverlayAddresses.size() - 1; mIndex = 0;
}
overlay_buffer_t overlay_buffer;
if (!mIsFirstFrame) {
CHECK_EQ(mOverlay->dequeueBuffer(&overlay_buffer), OK);
} else {
mIsFirstFrame = false;
} }
#endif #endif
} }