summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-01-20 15:05:46 -0800
committerAndreas Huber <andih@google.com>2010-01-20 15:05:46 -0800
commitc712b9fe2859435ce142b90ddcb46c5bed33eea8 (patch)
tree945f8e980662cc7bbad93e603d3c038d5d04ede1 /media/libstagefright
parent918007b75539f5eabfd173a369c2da628c607ba7 (diff)
downloadframeworks_base-c712b9fe2859435ce142b90ddcb46c5bed33eea8.zip
frameworks_base-c712b9fe2859435ce142b90ddcb46c5bed33eea8.tar.gz
frameworks_base-c712b9fe2859435ce142b90ddcb46c5bed33eea8.tar.bz2
Fix no-copy-overhead OMXCodec implementation to actually work.
Diffstat (limited to 'media/libstagefright')
-rw-r--r--media/libstagefright/OMXCodec.cpp49
-rw-r--r--media/libstagefright/include/OMX.h2
-rw-r--r--media/libstagefright/include/OMXNodeInstance.h3
-rw-r--r--media/libstagefright/omx/OMX.cpp4
-rw-r--r--media/libstagefright/omx/OMXNodeInstance.cpp4
5 files changed, 43 insertions, 19 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index c583b93..2686489 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -1189,12 +1189,19 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize);
CHECK(mem.get() != NULL);
+ BufferInfo info;
+ info.mData = NULL;
+ info.mSize = def.nBufferSize;
+
IOMX::buffer_id buffer;
if (portIndex == kPortIndexInput
&& (mQuirks & kRequiresAllocateBufferOnInputPorts)) {
if (mOMXLivesLocally) {
+ mem.clear();
+
err = mOMX->allocateBuffer(
- mNode, portIndex, def.nBufferSize, &buffer);
+ mNode, portIndex, def.nBufferSize, &buffer,
+ &info.mData);
} else {
err = mOMX->allocateBufferWithBackup(
mNode, portIndex, mem, &buffer);
@@ -1202,8 +1209,11 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
} else if (portIndex == kPortIndexOutput
&& (mQuirks & kRequiresAllocateBufferOnOutputPorts)) {
if (mOMXLivesLocally) {
+ mem.clear();
+
err = mOMX->allocateBuffer(
- mNode, portIndex, def.nBufferSize, &buffer);
+ mNode, portIndex, def.nBufferSize, &buffer,
+ &info.mData);
} else {
err = mOMX->allocateBufferWithBackup(
mNode, portIndex, mem, &buffer);
@@ -1217,14 +1227,17 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
return err;
}
- BufferInfo info;
+ if (mem != NULL) {
+ info.mData = mem->pointer();
+ }
+
info.mBuffer = buffer;
info.mOwnedByComponent = false;
info.mMem = mem;
info.mMediaBuffer = NULL;
if (portIndex == kPortIndexOutput) {
- info.mMediaBuffer = new MediaBuffer(mem->pointer(), mem->size());
+ info.mMediaBuffer = new MediaBuffer(info.mData, info.mSize);
info.mMediaBuffer->setObserver(this);
}
@@ -1599,6 +1612,8 @@ void OMXCodec::onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data) {
}
void OMXCodec::onStateChange(OMX_STATETYPE newState) {
+ CODEC_LOGV("onStateChange %d", newState);
+
switch (newState) {
case OMX_StateIdle:
{
@@ -1666,6 +1681,12 @@ void OMXCodec::onStateChange(OMX_STATETYPE newState) {
break;
}
+ case OMX_StateInvalid:
+ {
+ setState(ERROR);
+ break;
+ }
+
default:
{
CHECK(!"should not be here.");
@@ -1845,16 +1866,16 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
static const uint8_t kNALStartCode[4] =
{ 0x00, 0x00, 0x00, 0x01 };
- CHECK(info->mMem->size() >= specific->mSize + 4);
+ CHECK(info->mSize >= specific->mSize + 4);
size += 4;
- memcpy(info->mMem->pointer(), kNALStartCode, 4);
- memcpy((uint8_t *)info->mMem->pointer() + 4,
+ memcpy(info->mData, kNALStartCode, 4);
+ memcpy((uint8_t *)info->mData + 4,
specific->mData, specific->mSize);
} else {
- CHECK(info->mMem->size() >= specific->mSize);
- memcpy(info->mMem->pointer(), specific->mData, specific->mSize);
+ CHECK(info->mSize >= specific->mSize);
+ memcpy(info->mData, specific->mData, specific->mSize);
}
mNoMoreOutputData = false;
@@ -1901,12 +1922,12 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
srcLength = srcBuffer->range_length();
- if (info->mMem->size() < srcLength) {
- LOGE("info->mMem->size() = %d, srcLength = %d",
- info->mMem->size(), srcLength);
+ if (info->mSize < srcLength) {
+ LOGE("info->mSize = %d, srcLength = %d",
+ info->mSize, srcLength);
}
- CHECK(info->mMem->size() >= srcLength);
- memcpy(info->mMem->pointer(),
+ CHECK(info->mSize >= srcLength);
+ memcpy(info->mData,
(const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
srcLength);
diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h
index b559101..ea131e8 100644
--- a/media/libstagefright/include/OMX.h
+++ b/media/libstagefright/include/OMX.h
@@ -65,7 +65,7 @@ public:
virtual status_t allocateBuffer(
node_id node, OMX_U32 port_index, size_t size,
- buffer_id *buffer);
+ buffer_id *buffer, void **buffer_data);
virtual status_t allocateBufferWithBackup(
node_id node, OMX_U32 port_index, const sp<IMemory> &params,
diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h
index 923b801..b5b31ac 100644
--- a/media/libstagefright/include/OMXNodeInstance.h
+++ b/media/libstagefright/include/OMXNodeInstance.h
@@ -54,7 +54,8 @@ struct OMXNodeInstance {
OMX::buffer_id *buffer);
status_t allocateBuffer(
- OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer);
+ OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
+ void **buffer_data);
status_t allocateBufferWithBackup(
OMX_U32 portIndex, const sp<IMemory> &params,
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 2121321..918d055 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -280,9 +280,9 @@ status_t OMX::useBuffer(
status_t OMX::allocateBuffer(
node_id node, OMX_U32 port_index, size_t size,
- buffer_id *buffer) {
+ buffer_id *buffer, void **buffer_data) {
return findInstance(node)->allocateBuffer(
- port_index, size, buffer);
+ port_index, size, buffer, buffer_data);
}
status_t OMX::allocateBufferWithBackup(
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 4eb6417..70c6a58 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -258,7 +258,8 @@ status_t OMXNodeInstance::useBuffer(
}
status_t OMXNodeInstance::allocateBuffer(
- OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer) {
+ OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
+ void **buffer_data) {
Mutex::Autolock autoLock(mLock);
BufferMeta *buffer_meta = new BufferMeta(size);
@@ -280,6 +281,7 @@ status_t OMXNodeInstance::allocateBuffer(
}
*buffer = header;
+ *buffer_data = header->pBuffer;
addActiveBuffer(portIndex, *buffer);