From 8480835b4bc1350646376aa7f3ae33742a7adeb1 Mon Sep 17 00:00:00 2001 From: James Dong Date: Tue, 2 Nov 2010 13:20:11 -0700 Subject: Use meta data in the media recording framework o This patch allows us to do 720p video recording Change-Id: I2ea37e80a59630145396b08ebcdc6ee71df53333 --- media/libstagefright/OMXCodec.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'media/libstagefright/OMXCodec.cpp') diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index e1c06a6..9f9c83a 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -548,6 +548,10 @@ sp OMXCodec::Create( } status_t OMXCodec::configureCodec(const sp &meta, uint32_t flags) { + mIsMetaDataStoredInVideoBuffers = false; + if (flags & kStoreMetaDataInVideoBuffers) { + mIsMetaDataStoredInVideoBuffers = true; + } if (!(flags & kIgnoreCodecSpecificData)) { uint32_t type; const void *data; @@ -1616,6 +1620,14 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) { return err; } + if (mIsMetaDataStoredInVideoBuffers && portIndex == kPortIndexInput) { + err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE); + if (err != OK) { + LOGE("Storing meta data in video buffers is not supported"); + return err; + } + } + CODEC_LOGI("allocating %lu buffers of size %lu on %s port", def.nBufferCountActual, def.nBufferSize, portIndex == kPortIndexInput ? "input" : "output"); @@ -1896,7 +1908,14 @@ 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; + + // Buffer could not be released until empty buffer done is called. + if (info->mMediaBuffer != NULL) { + info->mMediaBuffer->release(); + info->mMediaBuffer = NULL; + } if (mPortStatus[kPortIndexInput] == DISABLING) { CODEC_LOGV("Port is disabled, freeing buffer %p", buffer); @@ -2691,11 +2710,19 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { break; } + 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(); + releaseBuffer = false; + info->mMediaBuffer = srcBuffer; + // FIXME: we are leaking memory } else { + if (mIsMetaDataStoredInVideoBuffers) { + releaseBuffer = false; + info->mMediaBuffer = srcBuffer; + } memcpy((uint8_t *)info->mData + offset, (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(), srcBuffer->range_length()); @@ -2711,8 +2738,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { offset += srcBuffer->range_length(); - srcBuffer->release(); - srcBuffer = NULL; + if (releaseBuffer) { + srcBuffer->release(); + srcBuffer = NULL; + } ++n; -- cgit v1.1