summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/OMXCodec.cpp
diff options
context:
space:
mode:
authorRicardo Cerqueira <cyanogenmod@cerqueira.org>2012-09-23 03:36:03 +0100
committerRicardo Cerqueira <cyanogenmod@cerqueira.org>2013-01-03 15:25:10 +0000
commitd54fa82a944f1977fd7ba05e4a875e0d58437ec4 (patch)
tree04f0a45e63004b57035f96ba0de4a361eb5b5f18 /media/libstagefright/OMXCodec.cpp
parent2fa0f79025df3193bc4353a82206baf4bd3e6e9f (diff)
downloadframeworks_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.cpp72
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,