diff options
author | Chong Zhang <chz@google.com> | 2015-05-19 17:30:34 -0700 |
---|---|---|
committer | Chong Zhang <chz@google.com> | 2015-05-21 18:12:21 -0700 |
commit | 79608158c2254fe1357959157f2d0c1560a8a6c6 (patch) | |
tree | 17e8aede8ce700ae9c169a23fad547eac5c6bc6a /media/libstagefright/MediaCodec.cpp | |
parent | 2232aee25e4df7d04446912e8ad9e9dc44d8ec16 (diff) | |
download | frameworks_av-79608158c2254fe1357959157f2d0c1560a8a6c6.zip frameworks_av-79608158c2254fe1357959157f2d0c1560a8a6c6.tar.gz frameworks_av-79608158c2254fe1357959157f2d0c1560a8a6c6.tar.bz2 |
stagefright: measure max encoder buffer count for persistent surface
bug: 19127604
Change-Id: I9a9b29b527d20f43a5a0188380baf2242bd31507
Diffstat (limited to 'media/libstagefright/MediaCodec.cpp')
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
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 <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <binder/MemoryDealer.h> +#include <gui/BufferQueue.h> #include <gui/Surface.h> #include <media/ICrypto.h> #include <media/IOMX.h> @@ -320,6 +321,27 @@ sp<PersistentSurface> MediaCodec::CreatePersistentInputSurface() { CHECK_EQ(client.connect(), (status_t)OK); sp<IOMX> omx = client.interface(); + const sp<IMediaCodecList> mediaCodecList = MediaCodecList::getInstance(); + if (mediaCodecList == NULL) { + ALOGE("Failed to obtain MediaCodecList!"); + return NULL; // if called from Java should raise IOException + } + + AString tmp; + sp<AMessage> 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<IGraphicBufferProducer> bufferProducer; sp<IGraphicBufferConsumer> bufferConsumer; @@ -331,6 +353,14 @@ sp<PersistentSurface> 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); } |