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/MediaCodecListOverrides.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/MediaCodecListOverrides.cpp')
-rw-r--r-- | media/libstagefright/MediaCodecListOverrides.cpp | 76 |
1 files changed, 72 insertions, 4 deletions
diff --git a/media/libstagefright/MediaCodecListOverrides.cpp b/media/libstagefright/MediaCodecListOverrides.cpp index 0d95676..006454d 100644 --- a/media/libstagefright/MediaCodecListOverrides.cpp +++ b/media/libstagefright/MediaCodecListOverrides.cpp @@ -25,8 +25,10 @@ #include <media/IMediaCodecList.h> #include <media/MediaCodecInfo.h> #include <media/MediaResourcePolicy.h> +#include <media/openmax/OMX_IVCommon.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/MediaCodec.h> +#include <media/stagefright/MediaCodecList.h> namespace android { @@ -86,6 +88,7 @@ static sp<AMessage> getMeasureFormat( int32_t bitrate = 0; getMeasureBitrate(caps, &bitrate); format->setInt32("bitrate", bitrate); + format->setInt32("encoder", 1); } if (mime.startsWith("video/")) { @@ -114,15 +117,67 @@ static sp<AMessage> getMeasureFormat( return format; } +static size_t doProfileEncoderInputBuffers( + AString name, AString mime, sp<MediaCodecInfo::Capabilities> caps) { + ALOGV("doProfileEncoderInputBuffers: name %s, mime %s", name.c_str(), mime.c_str()); + + sp<AMessage> format = getMeasureFormat(true /* isEncoder */, mime, caps); + if (format == NULL) { + return 0; + } + + format->setInt32("color-format", OMX_COLOR_FormatAndroidOpaque); + ALOGV("doProfileEncoderInputBuffers: format %s", format->debugString().c_str()); + + status_t err = OK; + sp<ALooper> looper = new ALooper; + looper->setName("MediaCodec_looper"); + looper->start( + false /* runOnCallingThread */, false /* canCallJava */, ANDROID_PRIORITY_AUDIO); + + sp<MediaCodec> codec = MediaCodec::CreateByComponentName(looper, name.c_str(), &err); + if (err != OK) { + ALOGE("Failed to create codec: %s", name.c_str()); + return 0; + } + + err = codec->configure(format, NULL, NULL, MediaCodec::CONFIGURE_FLAG_ENCODE); + if (err != OK) { + ALOGE("Failed to configure codec: %s with mime: %s", name.c_str(), mime.c_str()); + codec->release(); + return 0; + } + + sp<IGraphicBufferProducer> bufferProducer; + err = codec->createInputSurface(&bufferProducer); + if (err != OK) { + ALOGE("Failed to create surface: %s with mime: %s", name.c_str(), mime.c_str()); + codec->release(); + return 0; + } + + int minUndequeued = 0; + err = bufferProducer->query( + NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeued); + if (err != OK) { + ALOGE("Failed to query NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS"); + minUndequeued = 0; + } + + err = codec->release(); + if (err != OK) { + ALOGW("Failed to release codec: %s with mime: %s", name.c_str(), mime.c_str()); + } + + return minUndequeued; +} + static size_t doProfileCodecs( bool isEncoder, AString name, AString mime, sp<MediaCodecInfo::Capabilities> caps) { sp<AMessage> format = getMeasureFormat(isEncoder, mime, caps); if (format == NULL) { return 0; } - if (isEncoder) { - format->setInt32("encoder", 1); - } ALOGV("doProfileCodecs %s %s %s %s", name.c_str(), mime.c_str(), isEncoder ? "encoder" : "decoder", format->debugString().c_str()); @@ -144,7 +199,7 @@ static size_t doProfileCodecs( } const sp<Surface> nativeWindow; const sp<ICrypto> crypto; - uint32_t flags = 0; + uint32_t flags = isEncoder ? MediaCodec::CONFIGURE_FLAG_ENCODE : 0; ALOGV("doProfileCodecs configure"); err = codec->configure(format, nativeWindow, crypto, flags); if (err != OK) { @@ -211,6 +266,7 @@ void profileCodecs( bool forceToMeasure) { KeyedVector<AString, sp<MediaCodecInfo::Capabilities>> codecsNeedMeasure; AString supportMultipleSecureCodecs = "true"; + size_t maxEncoderInputBuffers = 0; for (size_t i = 0; i < infos.size(); ++i) { const sp<MediaCodecInfo> info = infos[i]; AString name = info->getCodecName(); @@ -251,9 +307,21 @@ void profileCodecs( supportMultipleSecureCodecs = "false"; } } + if (info->isEncoder() && mimes[i].startsWith("video/")) { + size_t encoderInputBuffers = + doProfileEncoderInputBuffers(name, mimes[i], caps); + if (encoderInputBuffers > maxEncoderInputBuffers) { + maxEncoderInputBuffers = encoderInputBuffers; + } + } } } } + if (maxEncoderInputBuffers > 0) { + char tmp[32]; + sprintf(tmp, "%zu", maxEncoderInputBuffers); + global_results->add(kMaxEncoderInputBuffers, tmp); + } global_results->add(kPolicySupportsMultipleSecureCodecs, supportMultipleSecureCodecs); } |