From b8de9578dcb672d92b407d7a24c77af13f85c353 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Mon, 22 Feb 2010 14:58:45 -0800 Subject: This hardware video decoder lies about its required input buffer sizes allocating 2.7 MB of memory instead of the required 176 KB... Added another quirk. related-to-bug: 2281327 --- include/media/stagefright/OMXCodec.h | 1 + media/libstagefright/OMXCodec.cpp | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index f8bc7ab0bfbb..974075d91e6e 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -96,6 +96,7 @@ private: kRequiresFlushBeforeShutdown = 64, kDefersOutputBufferAllocation = 128, kDecoderLiesAboutNumberOfChannels = 256, + kInputBufferSizesAreBogus = 512, }; struct BufferInfo { diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 6cf7cffd17f3..4075ec1b1377 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -298,6 +298,10 @@ uint32_t OMXCodec::getComponentQuirks(const char *componentName) { quirks |= kRequiresAllocateBufferOnOutputPorts; } + if (!strcmp(componentName, "OMX.TI.Video.Decoder")) { + quirks |= kInputBufferSizesAreBogus; + } + return quirks; } @@ -561,7 +565,8 @@ void OMXCodec::setMinBufferSize(OMX_U32 portIndex, OMX_U32 size) { mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); CHECK_EQ(err, OK); - if (def.nBufferSize < size) { + if ((portIndex == kPortIndexInput && (mQuirks & kInputBufferSizesAreBogus)) + || (def.nBufferSize < size)) { def.nBufferSize = size; } @@ -574,7 +579,12 @@ void OMXCodec::setMinBufferSize(OMX_U32 portIndex, OMX_U32 size) { CHECK_EQ(err, OK); // Make sure the setting actually stuck. - CHECK(def.nBufferSize >= size); + if (portIndex == kPortIndexInput + && (mQuirks & kInputBufferSizesAreBogus)) { + CHECK_EQ(def.nBufferSize, size); + } else { + CHECK(def.nBufferSize >= size); + } } status_t OMXCodec::setVideoPortFormatType( -- cgit v1.2.3-59-g8ed1b