Loading include/media/stagefright/OMXCodec.h +5 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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, Loading media/libmediaplayerservice/StagefrightRecorder.cpp +12 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading @@ -1067,6 +1069,10 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource) } CHECK(mFrameRate != -1); mIsMetaDataStoredInVideoBuffers = (*cameraSource)->isMetaDataStoredInVideoBuffers(); return OK; } Loading Loading @@ -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, Loading Loading @@ -1412,6 +1421,7 @@ status_t StagefrightRecorder::reset() { mCaptureAuxVideo = false; mCameraSourceSplitter = NULL; mCameraSourceTimeLapse = NULL; mIsMetaDataStoredInVideoBuffers = false; mEncoderProfiles = MediaProfiles::getInstance(); mOutputFd = -1; Loading media/libmediaplayerservice/StagefrightRecorder.h +1 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ private: String8 mParams; int mOutputFd, mOutputFdAux; bool mIsMetaDataStoredInVideoBuffers; MediaProfiles *mEncoderProfiles; status_t setupMPEG4Recording( Loading media/libstagefright/OMXCodec.cpp +32 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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); Loading Loading @@ -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()); Loading @@ -2711,8 +2738,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { offset += srcBuffer->range_length(); if (releaseBuffer) { srcBuffer->release(); srcBuffer = NULL; } ++n; Loading Loading
include/media/stagefright/OMXCodec.h +5 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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, Loading
media/libmediaplayerservice/StagefrightRecorder.cpp +12 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading @@ -1067,6 +1069,10 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource) } CHECK(mFrameRate != -1); mIsMetaDataStoredInVideoBuffers = (*cameraSource)->isMetaDataStoredInVideoBuffers(); return OK; } Loading Loading @@ -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, Loading Loading @@ -1412,6 +1421,7 @@ status_t StagefrightRecorder::reset() { mCaptureAuxVideo = false; mCameraSourceSplitter = NULL; mCameraSourceTimeLapse = NULL; mIsMetaDataStoredInVideoBuffers = false; mEncoderProfiles = MediaProfiles::getInstance(); mOutputFd = -1; Loading
media/libmediaplayerservice/StagefrightRecorder.h +1 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ private: String8 mParams; int mOutputFd, mOutputFdAux; bool mIsMetaDataStoredInVideoBuffers; MediaProfiles *mEncoderProfiles; status_t setupMPEG4Recording( Loading
media/libstagefright/OMXCodec.cpp +32 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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); Loading Loading @@ -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()); Loading @@ -2711,8 +2738,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { offset += srcBuffer->range_length(); if (releaseBuffer) { srcBuffer->release(); srcBuffer = NULL; } ++n; Loading