am 867bb7c3: Merge change 22773 into eclair

Merge commit '867bb7c3538cc66c378a695996cf8290a8774491' into eclair-plus-aosp

* commit '867bb7c3538cc66c378a695996cf8290a8774491':
  Keep up with latest changes to overlay handling on that unnamable platform.
This commit is contained in:
Andreas Huber
2009-08-26 10:32:47 -07:00
committed by Android Git Automerger
5 changed files with 57 additions and 18 deletions

View File

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

View File

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

View File

@@ -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);
}

View File

@@ -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 \

View File

@@ -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;
}
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
}