diff options
| author | James Dong <jdong@google.com> | 2010-11-03 09:25:08 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2010-11-03 09:25:08 -0700 |
| commit | a3f5b615d7adc5a644cbedd55100deba562ec0ac (patch) | |
| tree | 2f3cce676494fbdb8eb56e561881873f8f9ce4b9 | |
| parent | 0ce0f72c1eb92cf654667c15477f19b4a7e84cd1 (diff) | |
| parent | f3847e875eb1c58094a2d159a2a6f3f0b381d77a (diff) | |
| download | frameworks_base-a3f5b615d7adc5a644cbedd55100deba562ec0ac.zip frameworks_base-a3f5b615d7adc5a644cbedd55100deba562ec0ac.tar.gz frameworks_base-a3f5b615d7adc5a644cbedd55100deba562ec0ac.tar.bz2 | |
am f3847e87: Merge "DO NOT MERGE" into gingerbread
* commit 'f3847e875eb1c58094a2d159a2a6f3f0b381d77a':
DO NOT MERGE
| -rw-r--r-- | include/media/stagefright/OMXCodec.h | 1 | ||||
| -rw-r--r-- | media/libstagefright/OMXCodec.cpp | 32 |
2 files changed, 30 insertions, 3 deletions
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index 1d94160..fed6761 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -109,6 +109,7 @@ private: kAvoidMemcopyInputRecordingFrames = 2048, kRequiresLargerEncoderOutputBuffer = 4096, kOutputBuffersAreUnreadable = 8192, + kStoreMetaDataInInputVideoBuffers = 16384, }; struct BufferInfo { diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 9a49a9b..980da77 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -412,6 +412,13 @@ uint32_t OMXCodec::getComponentQuirks( quirks |= kOutputBuffersAreUnreadable; } + if (!strncmp(componentName, "OMX.SEC.", 8) && isEncoder) { + // These input buffers contain meta data (for instance, + // information helps locate the actual YUV data, or + // the physical address of the YUV data). + quirks |= kStoreMetaDataInInputVideoBuffers; + } + return quirks; } @@ -1695,7 +1702,15 @@ void OMXCodec::on_message(const omx_message &msg) { "an EMPTY_BUFFER_DONE.", buffer); } - buffers->editItemAt(i).mOwnedByComponent = false; + { + BufferInfo *info = &buffers->editItemAt(i); + info->mOwnedByComponent = false; + if (info->mMediaBuffer != NULL) { + // It is time to release the media buffers storing meta data + info->mMediaBuffer->release(); + info->mMediaBuffer = NULL; + } + } if (mPortStatus[kPortIndexInput] == DISABLING) { CODEC_LOGV("Port is disabled, freeing buffer %p", buffer); @@ -2202,6 +2217,7 @@ status_t OMXCodec::freeBuffersOnPort( CHECK_EQ(info->mMediaBuffer->refcount(), 0); info->mMediaBuffer->release(); + info->mMediaBuffer = NULL; } buffers->removeAt(i); @@ -2434,11 +2450,19 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { break; } + // Do not release the media buffer if it stores meta data + // instead of YUV data. The release is delayed until + // EMPTY_BUFFER_DONE callback is received. + bool releaseBuffer = true; if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) { CHECK(mOMXLivesLocally && offset == 0); OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer; header->pBuffer = (OMX_U8 *) srcBuffer->data() + srcBuffer->range_offset(); } else { + if (mQuirks & kStoreMetaDataInInputVideoBuffers) { + releaseBuffer = false; + info->mMediaBuffer = srcBuffer; + } memcpy((uint8_t *)info->mData + offset, (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(), srcBuffer->range_length()); @@ -2454,8 +2478,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { offset += srcBuffer->range_length(); - srcBuffer->release(); - srcBuffer = NULL; + if (releaseBuffer) { + srcBuffer->release(); + srcBuffer = NULL; + } ++n; |
