diff options
author | Andreas Huber <andih@google.com> | 2010-01-20 15:05:46 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-01-20 15:05:46 -0800 |
commit | 570a3cb7582daa030cb38eedc5eb6a06f86ecc7f (patch) | |
tree | 0c59c44899b4a3fbbe921171028fd193829affc7 /media/libstagefright/OMXCodec.cpp | |
parent | dfaddcc81f27bb9de47edec469a4a5fb2309bd6a (diff) | |
download | frameworks_av-570a3cb7582daa030cb38eedc5eb6a06f86ecc7f.zip frameworks_av-570a3cb7582daa030cb38eedc5eb6a06f86ecc7f.tar.gz frameworks_av-570a3cb7582daa030cb38eedc5eb6a06f86ecc7f.tar.bz2 |
Fix no-copy-overhead OMXCodec implementation to actually work.
Diffstat (limited to 'media/libstagefright/OMXCodec.cpp')
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 49 |
1 files changed, 35 insertions, 14 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); |