diff options
author | Ricardo Cerqueira <cyanogenmod@cerqueira.org> | 2012-09-23 03:36:03 +0100 |
---|---|---|
committer | Ricardo Cerqueira <cyanogenmod@cerqueira.org> | 2013-01-03 15:25:10 +0000 |
commit | d54fa82a944f1977fd7ba05e4a875e0d58437ec4 (patch) | |
tree | 04f0a45e63004b57035f96ba0de4a361eb5b5f18 /media/libstagefright/OMXCodec.cpp | |
parent | 2fa0f79025df3193bc4353a82206baf4bd3e6e9f (diff) | |
download | frameworks_av-d54fa82a944f1977fd7ba05e4a875e0d58437ec4.zip frameworks_av-d54fa82a944f1977fd7ba05e4a875e0d58437ec4.tar.gz frameworks_av-d54fa82a944f1977fd7ba05e4a875e0d58437ec4.tar.bz2 |
stagefright: OMXCodec: Re-enable OMX.TI.Video.encoder's quirks
These have been around since early stagefright, and were dropped for
JB. Unfortunately, they're still necessary with for this encoder to
work.
Change-Id: I8a251bf195a24b166db7464a90a822d6e69b644d
libstagefright: Add support for the 720P OMAP3 encoders
Bring back some more OMAP code that was removed by Google in JB,
and a couple of omapzoom patches.
This may stop being necessary if TI publishes JB-specific OMAP3
code, but as long as we're using the ICS domx, these need to
be here
Change-Id: Ia29f8c9f9ed769ba07b09c07260486f6502841d6
libstagefright: Unbreak OMAP4 encoders
The "manual" construction of the h264 codec data is only needed
on OMAP3. Execution of this code on OMAP4 breaks the mpeg4 header
generation
Change-Id: I3ae52f2e685e2d9097796685c98dffa93cfa6430
Diffstat (limited to 'media/libstagefright/OMXCodec.cpp')
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 1992533..1135143 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -301,6 +301,16 @@ uint32_t OMXCodec::getComponentQuirks( quirks |= QCOMXCodec::getQCComponentQuirks(list,index); #endif +#ifdef OMAP_ENHANCEMENT + if (list->codecHasQuirk( + index, "avoid-memcopy-input-recording-frames")) { + quirks |= kAvoidMemcopyInputRecordingFrames; + } + if (list->codecHasQuirk( + index, "input-buffer-sizes-are-bogus")) { + quirks |= kInputBufferSizesAreBogus; + } +#endif return quirks; } @@ -822,6 +832,22 @@ status_t OMXCodec::setVideoPortFormatType( index, format.eCompressionFormat, format.eColorFormat); #endif + if (!strcmp("OMX.TI.Video.encoder", mComponentName) || + !strcmp("OMX.TI.720P.Encoder", mComponentName)) { + if (portIndex == kPortIndexInput + && colorFormat == format.eColorFormat) { + // eCompressionFormat does not seem right. + found = true; + break; + } + if (portIndex == kPortIndexOutput + && compressionFormat == format.eCompressionFormat) { + // eColorFormat does not seem right. + found = true; + break; + } + } + if (format.eCompressionFormat == compressionFormat && format.eColorFormat == colorFormat) { found = true; @@ -2369,6 +2395,14 @@ void OMXCodec::on_message(const omx_message &msg) { // Buffer could not be released until empty buffer done is called. if (info->mMediaBuffer != NULL) { +#ifdef OMAP_ENHANCEMENT + if (mIsEncoder && + (mQuirks & kAvoidMemcopyInputRecordingFrames)) { + // If zero-copy mode is enabled this will send the + // input buffer back to the upstream source. + restorePatchedDataPointer(info); + } +#endif info->mMediaBuffer->release(); info->mMediaBuffer = NULL; } @@ -3372,6 +3406,23 @@ bool OMXCodec::drainInputBuffer(BufferInfo *info) { } bool releaseBuffer = true; +#ifdef OMAP_ENHANCEMENT + if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) { + CHECK(mOMXLivesLocally && offset == 0); + + OMX_BUFFERHEADERTYPE *header = + (OMX_BUFFERHEADERTYPE *)info->mBuffer; + + CHECK(header->pBuffer == info->mData); + + header->pBuffer = + (OMX_U8 *)srcBuffer->data() + srcBuffer->range_offset(); + + releaseBuffer = false; + info->mMediaBuffer = srcBuffer; + } else { +#endif + if (mFlags & kStoreMetaDataInVideoBuffers) { releaseBuffer = false; info->mMediaBuffer = srcBuffer; @@ -3428,6 +3479,10 @@ bool OMXCodec::drainInputBuffer(BufferInfo *info) { #endif // USE_SAMSUNG_COLORFORMAT } +#ifdef OMAP_ENHANCEMENT + } +#endif + int64_t lastBufferTimeUs; CHECK(srcBuffer->meta_data()->findInt64(kKeyTime, &lastBufferTimeUs)); CHECK(lastBufferTimeUs >= 0); @@ -3527,6 +3582,14 @@ bool OMXCodec::drainInputBuffer(BufferInfo *info) { return false; } + // This component does not ever signal the EOS flag on output buffers, + // Thanks for nothing. + if (mSignalledEOS && (!strcmp(mComponentName, "OMX.TI.Video.encoder") || + !strcmp(mComponentName, "OMX.TI.720P.Encoder"))) { + mNoMoreOutputData = true; + mBufferFilled.signal(); + } + info->mStatus = OWNED_BY_COMPONENT; return true; @@ -5128,6 +5191,15 @@ status_t OMXCodec::pause() { //////////////////////////////////////////////////////////////////////////////// +#ifdef OMAP_ENHANCEMENT +void OMXCodec::restorePatchedDataPointer(BufferInfo *info) { + CHECK(mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)); + CHECK(mOMXLivesLocally); + + OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)info->mBuffer; + header->pBuffer = (OMX_U8 *)info->mData; +} +#endif status_t QueryCodecs( const sp<IOMX> &omx, const char *mime, bool queryDecoders, bool hwCodecOnly, |