From 79608158c2254fe1357959157f2d0c1560a8a6c6 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Tue, 19 May 2015 17:30:34 -0700 Subject: stagefright: measure max encoder buffer count for persistent surface bug: 19127604 Change-Id: I9a9b29b527d20f43a5a0188380baf2242bd31507 --- media/libstagefright/MediaCodec.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'media/libstagefright/MediaCodec.cpp') diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index 46c154d..6f22e26 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -320,6 +321,27 @@ sp MediaCodec::CreatePersistentInputSurface() { CHECK_EQ(client.connect(), (status_t)OK); sp omx = client.interface(); + const sp mediaCodecList = MediaCodecList::getInstance(); + if (mediaCodecList == NULL) { + ALOGE("Failed to obtain MediaCodecList!"); + return NULL; // if called from Java should raise IOException + } + + AString tmp; + sp globalSettings = mediaCodecList->getGlobalSettings(); + if (globalSettings == NULL || !globalSettings->findString( + kMaxEncoderInputBuffers, &tmp)) { + ALOGE("Failed to get encoder input buffer count!"); + return NULL; + } + + int32_t bufferCount = strtol(tmp.c_str(), NULL, 10); + if (bufferCount <= 0 + || bufferCount > BufferQueue::MAX_MAX_ACQUIRED_BUFFERS) { + ALOGE("Encoder input buffer count is invalid!"); + return NULL; + } + sp bufferProducer; sp bufferConsumer; @@ -331,6 +353,14 @@ sp MediaCodec::CreatePersistentInputSurface() { return NULL; } + err = bufferConsumer->setMaxAcquiredBufferCount(bufferCount); + + if (err != NO_ERROR) { + ALOGE("Unable to set BQ max acquired buffer count to %u: %d", + bufferCount, err); + return NULL; + } + return new PersistentSurface(bufferProducer, bufferConsumer); } -- cgit v1.1