diff options
author | James Dong <jdong@google.com> | 2010-11-02 13:20:11 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2010-11-04 17:40:02 -0700 |
commit | 8480835b4bc1350646376aa7f3ae33742a7adeb1 (patch) | |
tree | 287195077d7d6e96d8a85228e2609bc8613af94b | |
parent | a3d7a3174b600a0df3cf452b708c940e93bb651a (diff) | |
download | frameworks_av-8480835b4bc1350646376aa7f3ae33742a7adeb1.zip frameworks_av-8480835b4bc1350646376aa7f3ae33742a7adeb1.tar.gz frameworks_av-8480835b4bc1350646376aa7f3ae33742a7adeb1.tar.bz2 |
Use meta data in the media recording framework
o This patch allows us to do 720p video recording
Change-Id: I2ea37e80a59630145396b08ebcdc6ee71df53333
-rw-r--r-- | include/media/stagefright/OMXCodec.h | 5 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.cpp | 14 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightRecorder.h | 1 | ||||
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 35 |
4 files changed, 50 insertions, 5 deletions
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index b2af9d7..517868c 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -44,6 +44,9 @@ struct OMXCodec : public MediaSource, // can not be fullfilled, Create() returns NULL. kSoftwareCodecsOnly = 8, kHardwareCodecsOnly = 16, + + // Store meta data in video buffers + kStoreMetaDataInVideoBuffers = 32, }; static sp<MediaSource> Create( const sp<IOMX> &omx, @@ -178,6 +181,8 @@ private: List<size_t> mFilledBuffers; Condition mBufferFilled; + bool mIsMetaDataStoredInVideoBuffers; + OMXCodec(const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks, bool isEncoder, const char *mime, const char *componentName, const sp<MediaSource> &source, diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index 913d953..6a25dc5 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -1035,7 +1035,8 @@ void StagefrightRecorder::clipVideoFrameHeight() { } } -status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource) { +status_t StagefrightRecorder::setupCameraSource( + sp<CameraSource> *cameraSource) { status_t err = OK; if ((err = checkVideoEncoderCapabilities()) != OK) { return err; @@ -1051,7 +1052,8 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource) *cameraSource = mCameraSourceTimeLapse; } else { *cameraSource = CameraSource::CreateFromCamera( - mCamera, mCameraId, videoSize, mFrameRate, mPreviewSurface); + mCamera, mCameraId, videoSize, mFrameRate, + mPreviewSurface, true /*storeMetaDataInVideoBuffers*/); } CHECK(*cameraSource != NULL); @@ -1067,6 +1069,10 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource) } CHECK(mFrameRate != -1); + + mIsMetaDataStoredInVideoBuffers = + (*cameraSource)->isMetaDataStoredInVideoBuffers(); + return OK; } @@ -1135,6 +1141,9 @@ status_t StagefrightRecorder::setupVideoEncoder( // Use software codec for time lapse uint32_t encoder_flags = (mCaptureTimeLapse) ? OMXCodec::kPreferSoftwareCodecs : 0; + if (mIsMetaDataStoredInVideoBuffers) { + encoder_flags |= OMXCodec::kStoreMetaDataInVideoBuffers; + } sp<MediaSource> encoder = OMXCodec::Create( client.interface(), enc_meta, true /* createEncoder */, cameraSource, @@ -1412,6 +1421,7 @@ status_t StagefrightRecorder::reset() { mCaptureAuxVideo = false; mCameraSourceSplitter = NULL; mCameraSourceTimeLapse = NULL; + mIsMetaDataStoredInVideoBuffers = false; mEncoderProfiles = MediaProfiles::getInstance(); mOutputFd = -1; diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h index 7d2549f..d11d7e0 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.h +++ b/media/libmediaplayerservice/StagefrightRecorder.h @@ -103,6 +103,7 @@ private: String8 mParams; int mOutputFd, mOutputFdAux; + bool mIsMetaDataStoredInVideoBuffers; MediaProfiles *mEncoderProfiles; status_t setupMPEG4Recording( 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<MediaSource> OMXCodec::Create( } status_t OMXCodec::configureCodec(const sp<MetaData> &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; |