summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/OMXCodec.cpp
diff options
context:
space:
mode:
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,