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 | 26490f71a5a50b2200d60de28ad0ea6b1d0a1847 (patch) | |
tree | 5bda6ee67deb1d40786012aa4540ce6037724d15 /media/libstagefright | |
parent | 3041096d137144d9d1ebdd6df88ebe8e85133c05 (diff) | |
parent | 63a0a11e8b3292253b3d3bf3a7f7dc733cf6762f (diff) | |
download | frameworks_av-26490f71a5a50b2200d60de28ad0ea6b1d0a1847.zip frameworks_av-26490f71a5a50b2200d60de28ad0ea6b1d0a1847.tar.gz frameworks_av-26490f71a5a50b2200d60de28ad0ea6b1d0a1847.tar.bz2 |
am f3847e87: Merge "DO NOT MERGE" into gingerbread
* commit 'f3847e875eb1c58094a2d159a2a6f3f0b381d77a':
DO NOT MERGE
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
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; |