From 90862e2a8b3ea522cf1dace5e93dcec109a1aa85 Mon Sep 17 00:00:00 2001 From: James Dong Date: Thu, 26 Aug 2010 19:12:59 -0700 Subject: [PATCH] Workaround for a QCOM issue where the output buffer size advertised by the AVC encoder is occasionally too small. bug - 2882917 Change-Id: Id59d8529084c5689a26f272e0cd3b1e955fd8a30 --- include/media/stagefright/OMXCodec.h | 1 + media/libstagefright/OMXCodec.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index 010ded1d5b62c..875bc5b58e20f 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -102,6 +102,7 @@ private: kInputBufferSizesAreBogus = 512, kSupportsMultipleFramesPerInputBuffer = 1024, kAvoidMemcopyInputRecordingFrames = 2048, + kRequiresLargerEncoderOutputBuffer = 4096, }; struct BufferInfo { diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 4741b1d84e804..165cec9f8dedb 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -353,6 +353,15 @@ uint32_t OMXCodec::getComponentQuirks(const char *componentName) { quirks |= kRequiresLoadedToIdleAfterAllocation; quirks |= kRequiresAllocateBufferOnInputPorts; quirks |= kRequiresAllocateBufferOnOutputPorts; + if (!strncmp(componentName, "OMX.qcom.video.encoder.avc", 26)) { + + // The AVC encoder advertises the size of output buffers + // based on the input video resolution and assumes + // the worst/least compression ratio is 0.5. It is found that + // sometimes, the output buffer size is larger than + // size advertised by the encoder. + quirks |= kRequiresLargerEncoderOutputBuffer; + } } if (!strncmp(componentName, "OMX.qcom.7x30.video.encoder.", 28)) { } @@ -906,6 +915,10 @@ void OMXCodec::setVideoInputFormat( video_def->nBitrate = bitRate; // Q16 format video_def->eCompressionFormat = compressionFormat; video_def->eColorFormat = OMX_COLOR_FormatUnused; + if (mQuirks & kRequiresLargerEncoderOutputBuffer) { + // Increases the output buffer size + def.nBufferSize = ((def.nBufferSize * 3) >> 1); + } err = mOMX->setParameter( mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));