summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MediaCodecListOverrides.cpp
diff options
context:
space:
mode:
authorRonghua Wu <ronghuawu@google.com>2015-04-21 11:52:58 -0700
committerRonghua Wu <ronghuawu@google.com>2015-05-05 14:45:29 -0700
commit65c8fbcf91f0f0b5f60a45d2777c36d396c4ba16 (patch)
treeb22419f78ab6f243b7ab7027482e5c5fda9db09f /media/libstagefright/MediaCodecListOverrides.cpp
parent5e95559255d1abd62c78b308731ebe3991186e94 (diff)
downloadframeworks_av-65c8fbcf91f0f0b5f60a45d2777c36d396c4ba16.zip
frameworks_av-65c8fbcf91f0f0b5f60a45d2777c36d396c4ba16.tar.gz
frameworks_av-65c8fbcf91f0f0b5f60a45d2777c36d396c4ba16.tar.bz2
libstagefright: export profiling results directly to xml.
Bug: 19620911 Change-Id: Icdeb1c30816d6de120ea0acd0880b3a9614bea8f
Diffstat (limited to 'media/libstagefright/MediaCodecListOverrides.cpp')
-rw-r--r--media/libstagefright/MediaCodecListOverrides.cpp208
1 files changed, 67 insertions, 141 deletions
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<sp<MediaCodecInfo>> &infos) {
+ CodecSettings global_results; // TODO: add global results.
+ KeyedVector<AString, CodecSettings> encoder_results;
+ KeyedVector<AString, CodecSettings> decoder_results;
+ profileCodecs(infos, &encoder_results, &decoder_results);
+ exportResultsToXML(kProfilingResults, global_results, encoder_results, decoder_results);
+}
+
void profileCodecs(
const Vector<sp<MediaCodecInfo>> &infos,
- KeyedVector<AString, CodecSettings> *results,
+ KeyedVector<AString, CodecSettings> *encoder_results,
+ KeyedVector<AString, CodecSettings> *decoder_results,
bool forceToMeasure) {
KeyedVector<AString, sp<MediaCodecInfo::Capabilities>> 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<sp<MediaCodecInfo>> *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<MediaCodecInfo> &info = infos->itemAt(i);
- if (name != info->getCodecName()) {
- continue;
- }
-
- Vector<AString> mimes;
- info->getSupportedMimes(&mimes);
- for (size_t j = 0; j < mimes.size(); ++j) {
- if (mimes[j] != mime) {
- continue;
- }
- const sp<MediaCodecInfo::Capabilities> &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<AString, CodecSettings>& 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(
+ " <Setting name=\"%s\" value=\"%s\" />\n",
+ results.keyAt(i).c_str(),
+ results.valueAt(i).c_str());
+ ret.append(setting);
}
+ return ret;
+}
+static AString codecResultsToXml(const KeyedVector<AString, CodecSettings>& 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") ? "<Encoders>" : "<Decoders>";
- AString encodersDecodersEnd = (type == "encoder") ? "</Encoders>" : "</Decoders>";
- ssize_t posEncodersDecoders = overrides.find(encodersDecoders.c_str());
- if (posEncodersDecoders < 0) {
- AString mediaCodecs = "<MediaCodecs>";
- ssize_t posMediaCodec = overrides.find(mediaCodecs.c_str());
- if (posMediaCodec < 0) {
- posMediaCodec = overrides.size();
- overrides.insert("\n<MediaCodecs>\n</MediaCodecs>\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 <MediaCodec name=%s type=%s update=\"true\" >\n </MediaCodec>",
- 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 = "</MediaCodec>";
- posInsert = overrides.find(codecEnd.c_str(), posCodec) + codecEnd.size();
- AString codec = AStringPrintf(
- "\n <MediaCodec name=%s type=%s update=\"true\" >\n </MediaCodec>",
- name.c_str(),
- mime.c_str());
- overrides.insert(codec.c_str(), posInsert);
- posInsert = overrides.find(">", posInsert) + 1;
- } else {
- posInsert = posEnd + 1;
- }
-
+ AString codec =
+ AStringPrintf(" <MediaCodec name=\"%s\" type=\"%s\" update=\"true\" >\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 <Limit name=\"%s\" value=\"%s\" />",
+ AString setting = AStringPrintf(
+ " <Limit name=\"%s\" value=\"%s\" />\n",
settings.keyAt(i).c_str(),
settings.valueAt(i).c_str());
- overrides.insert(strInsert, posInsert);
+ ret.append(setting);
}
+ ret.append(" </MediaCodec>\n");
+ }
+ return ret;
+}
+
+void exportResultsToXML(
+ const char *fileName,
+ const CodecSettings& global_results,
+ const KeyedVector<AString, CodecSettings>& encoder_results,
+ const KeyedVector<AString, CodecSettings>& 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("<MediaCodecs>\n");
+ if (global_results.size() > 0) {
+ overrides.append(" <Settings>\n");
+ overrides.append(globalResultsToXml(global_results));
+ overrides.append(" </Settings>\n");
+ }
+ if (encoder_results.size() > 0) {
+ overrides.append(" <Encoders>\n");
+ overrides.append(codecResultsToXml(encoder_results));
+ overrides.append(" </Encoders>\n");
+ }
+ if (decoder_results.size() > 0) {
+ overrides.append(" <Decoders>\n");
+ overrides.append(codecResultsToXml(decoder_results));
+ overrides.append(" </Decoders>\n");
}
+ overrides.append("</MediaCodecs>\n");
- f = fopen(fileName, "wb");
+ FILE *f = fopen(fileName, "wb");
if (f == NULL) {
ALOGE("Failed to open %s for writing.", fileName);
return;