summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-08-26 10:30:31 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2009-08-26 10:30:31 -0700
commit867bb7c3538cc66c378a695996cf8290a8774491 (patch)
treedfa02ba1cf69070db6a7ea9debf532ef028c8b39
parentea839a72fd68e0b796e6dd2384de1447d06d9b62 (diff)
parent446f44f61afd406e19760cd9cc5ad3a10fa11cbf (diff)
downloadframeworks_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.h1
-rw-r--r--include/media/stagefright/TIHardwareRenderer.h1
-rw-r--r--media/libstagefright/OMXCodec.cpp4
-rw-r--r--media/libstagefright/omx/Android.mk2
-rw-r--r--media/libstagefright/omx/TIHardwareRenderer.cpp67
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
}