From 65c8fbcf91f0f0b5f60a45d2777c36d396c4ba16 Mon Sep 17 00:00:00 2001 From: Ronghua Wu Date: Tue, 21 Apr 2015 11:52:58 -0700 Subject: libstagefright: export profiling results directly to xml. Bug: 19620911 Change-Id: Icdeb1c30816d6de120ea0acd0880b3a9614bea8f --- media/libstagefright/MediaCodecListOverrides.cpp | 208 ++++++++--------------- 1 file changed, 67 insertions(+), 141 deletions(-) (limited to 'media/libstagefright/MediaCodecListOverrides.cpp') diff --git a/media/libstagefright/MediaCodecListOverrides.cpp b/media/libstagefright/MediaCodecListOverrides.cpp index 265b1ea..535db09 100644 --- a/media/libstagefright/MediaCodecListOverrides.cpp +++ b/media/libstagefright/MediaCodecListOverrides.cpp @@ -30,6 +30,8 @@ namespace android { +const char *kProfilingResults = "/data/misc/media/media_codecs_profiling_results.xml"; + // a limit to avoid allocating unreasonable number of codec instances in the measurement. // this should be in sync with the MAX_SUPPORTED_INSTANCES defined in MediaCodecInfo.java. static const int kMaxInstances = 32; @@ -171,20 +173,6 @@ static size_t doProfileCodecs( return codecs.size(); } -static void printLongString(const char *buf, size_t size) { - AString print; - const char *start = buf; - size_t len; - size_t totalLen = size; - while (totalLen > 0) { - len = (totalLen > 500) ? 500 : totalLen; - print.setTo(start, len); - ALOGV("%s", print.c_str()); - totalLen -= len; - start += len; - } -} - bool splitString(const AString &s, const AString &delimiter, AString *s1, AString *s2) { ssize_t pos = s.find(delimiter.c_str()); if (pos < 0) { @@ -207,9 +195,18 @@ bool splitString( return true; } +void profileCodecs(const Vector> &infos) { + CodecSettings global_results; // TODO: add global results. + KeyedVector encoder_results; + KeyedVector decoder_results; + profileCodecs(infos, &encoder_results, &decoder_results); + exportResultsToXML(kProfilingResults, global_results, encoder_results, decoder_results); +} + void profileCodecs( const Vector> &infos, - KeyedVector *results, + KeyedVector *encoder_results, + KeyedVector *decoder_results, bool forceToMeasure) { KeyedVector> codecsNeedMeasure; for (size_t i = 0; i < infos.size(); ++i) { @@ -240,157 +237,86 @@ void profileCodecs( AString key = name; key.append(" "); key.append(mimes[i]); - key.append(" "); - key.append(info->isEncoder() ? "encoder" : "decoder"); - results->add(key, settings); - } - } - } -} -void applyCodecSettings( - const AString& codecInfo, - const CodecSettings &settings, - Vector> *infos) { - AString name; - AString mime; - AString type; - if (!splitString(codecInfo, " ", &name, &mime, &type)) { - return; - } - - for (size_t i = 0; i < infos->size(); ++i) { - const sp &info = infos->itemAt(i); - if (name != info->getCodecName()) { - continue; - } - - Vector mimes; - info->getSupportedMimes(&mimes); - for (size_t j = 0; j < mimes.size(); ++j) { - if (mimes[j] != mime) { - continue; - } - const sp &caps = info->getCapabilitiesFor(mime.c_str()); - for (size_t k = 0; k < settings.size(); ++k) { - caps->getDetails()->setString( - settings.keyAt(k).c_str(), settings.valueAt(k).c_str()); + if (info->isEncoder()) { + encoder_results->add(key, settings); + } else { + decoder_results->add(key, settings); + } } } } } -void exportResultsToXML(const char *fileName, const KeyedVector& results) { -#if LOG_NDEBUG == 0 - ALOGE("measurement results"); +static AString globalResultsToXml(const CodecSettings& results) { + AString ret; for (size_t i = 0; i < results.size(); ++i) { - ALOGE("key %s", results.keyAt(i).c_str()); - const CodecSettings &settings = results.valueAt(i); - for (size_t j = 0; j < settings.size(); ++j) { - ALOGE("name %s value %s", settings.keyAt(j).c_str(), settings.valueAt(j).c_str()); - } - } -#endif - - AString overrides; - FILE *f = fopen(fileName, "rb"); - if (f != NULL) { - fseek(f, 0, SEEK_END); - long size = ftell(f); - rewind(f); - - char *buf = (char *)malloc(size); - if (fread(buf, size, 1, f) == 1) { - overrides.setTo(buf, size); - if (!LOG_NDEBUG) { - ALOGV("Existing overrides:"); - printLongString(buf, size); - } - } else { - ALOGE("Failed to read %s", fileName); - } - fclose(f); - free(buf); + AString setting = AStringPrintf( + " \n", + results.keyAt(i).c_str(), + results.valueAt(i).c_str()); + ret.append(setting); } + return ret; +} +static AString codecResultsToXml(const KeyedVector& results) { + AString ret; for (size_t i = 0; i < results.size(); ++i) { AString name; AString mime; - AString type; - if (!splitString(results.keyAt(i), " ", &name, &mime, &type)) { + if (!splitString(results.keyAt(i), " ", &name, &mime)) { continue; } - name = AStringPrintf("\"%s\"", name.c_str()); - mime = AStringPrintf("\"%s\"", mime.c_str()); - ALOGV("name(%s) mime(%s) type(%s)", name.c_str(), mime.c_str(), type.c_str()); - ssize_t posCodec = overrides.find(name.c_str()); - size_t posInsert = 0; - if (posCodec < 0) { - AString encodersDecoders = (type == "encoder") ? "" : ""; - AString encodersDecodersEnd = (type == "encoder") ? "" : ""; - ssize_t posEncodersDecoders = overrides.find(encodersDecoders.c_str()); - if (posEncodersDecoders < 0) { - AString mediaCodecs = ""; - ssize_t posMediaCodec = overrides.find(mediaCodecs.c_str()); - if (posMediaCodec < 0) { - posMediaCodec = overrides.size(); - overrides.insert("\n\n\n", posMediaCodec); - posMediaCodec = overrides.find(mediaCodecs.c_str(), posMediaCodec); - } - posEncodersDecoders = posMediaCodec + mediaCodecs.size(); - AString codecs = AStringPrintf( - "\n %s\n %s", encodersDecoders.c_str(), encodersDecodersEnd.c_str()); - overrides.insert(codecs.c_str(), posEncodersDecoders); - posEncodersDecoders = overrides.find(encodersDecoders.c_str(), posEncodersDecoders); - } - posCodec = posEncodersDecoders + encodersDecoders.size(); - AString codec = AStringPrintf( - "\n \n ", - name.c_str(), - mime.c_str()); - overrides.insert(codec.c_str(), posCodec); - posCodec = overrides.find(name.c_str()); - } - - // insert to existing entry - ssize_t posMime = overrides.find(mime.c_str(), posCodec); - ssize_t posEnd = overrides.find(">", posCodec); - if (posEnd < 0) { - ALOGE("Format error in overrides file."); - return; - } - if (posMime < 0 || posMime > posEnd) { - // new mime for an existing component - AString codecEnd = ""; - posInsert = overrides.find(codecEnd.c_str(), posCodec) + codecEnd.size(); - AString codec = AStringPrintf( - "\n \n ", - name.c_str(), - mime.c_str()); - overrides.insert(codec.c_str(), posInsert); - posInsert = overrides.find(">", posInsert) + 1; - } else { - posInsert = posEnd + 1; - } - + AString codec = + AStringPrintf(" \n", + name.c_str(), + mime.c_str()); + ret.append(codec); CodecSettings settings = results.valueAt(i); for (size_t i = 0; i < settings.size(); ++i) { // WARNING: we assume all the settings are "Limit". Currently we have only one type // of setting in this case, which is "max-supported-instances". - AString strInsert = AStringPrintf( - "\n ", + AString setting = AStringPrintf( + " \n", settings.keyAt(i).c_str(), settings.valueAt(i).c_str()); - overrides.insert(strInsert, posInsert); + ret.append(setting); } + ret.append(" \n"); + } + return ret; +} + +void exportResultsToXML( + const char *fileName, + const CodecSettings& global_results, + const KeyedVector& encoder_results, + const KeyedVector& decoder_results) { + if (global_results.size() == 0 && encoder_results.size() == 0 && decoder_results.size() == 0) { + return; } - if (!LOG_NDEBUG) { - ALOGV("New overrides:"); - printLongString(overrides.c_str(), overrides.size()); + AString overrides; + overrides.append("\n"); + if (global_results.size() > 0) { + overrides.append(" \n"); + overrides.append(globalResultsToXml(global_results)); + overrides.append(" \n"); + } + if (encoder_results.size() > 0) { + overrides.append(" \n"); + overrides.append(codecResultsToXml(encoder_results)); + overrides.append(" \n"); + } + if (decoder_results.size() > 0) { + overrides.append(" \n"); + overrides.append(codecResultsToXml(decoder_results)); + overrides.append(" \n"); } + overrides.append("\n"); - f = fopen(fileName, "wb"); + FILE *f = fopen(fileName, "wb"); if (f == NULL) { ALOGE("Failed to open %s for writing.", fileName); return; -- cgit v1.1