Show list of loaded extractors in dumpsys

Bug: 67908547
Test: build, boot, dumpsys
Change-Id: Ib398dd000979b6b5d85db5e446946c0c8ded1793
diff --git a/media/libstagefright/MediaExtractorFactory.cpp b/media/libstagefright/MediaExtractorFactory.cpp
index a777663..bbf87f0 100644
--- a/media/libstagefright/MediaExtractorFactory.cpp
+++ b/media/libstagefright/MediaExtractorFactory.cpp
@@ -146,9 +146,14 @@
     MediaExtractor::ExtractorDef def;
     void *libHandle;
     String8 libPath;
+    String8 uuidString;
 
     ExtractorPlugin(MediaExtractor::ExtractorDef definition, void *handle, String8 &path)
-        : def(definition), libHandle(handle), libPath(path) { }
+        : def(definition), libHandle(handle), libPath(path) {
+        for (size_t i = 0; i < sizeof MediaExtractor::ExtractorDef::extractor_uuid; i++) {
+            uuidString.appendFormat("%02x", def.extractor_uuid.b[i]);
+        }
+    }
     ~ExtractorPlugin() {
         if (libHandle != nullptr) {
             ALOGV("closing handle for %s %d", libPath.c_str(), def.extractor_version);
@@ -307,4 +312,20 @@
     gPluginsRegistered = true;
 }
 
+status_t MediaExtractorFactory::dump(int fd, const Vector<String16>&) {
+    Mutex::Autolock autoLock(gPluginMutex);
+    String8 out;
+    out.append("Available extractors:\n");
+    for (auto it = gPlugins->begin(); it != gPlugins->end(); ++it) {
+        out.appendFormat("  %25s: uuid(%s), version(%u), path(%s)\n",
+                (*it)->def.extractor_name,
+                (*it)->uuidString.c_str(),
+                (*it)->def.extractor_version,
+                (*it)->libPath.c_str());
+    }
+    write(fd, out.string(), out.size());
+    return OK;
+}
+
+
 }  // namespace android
diff --git a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
index 7fddf80..55654f1 100644
--- a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
+++ b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
@@ -41,6 +41,7 @@
     static sp<IMediaExtractor> CreateFromService(
             const sp<DataSource> &source, const char *mime = NULL);
     static void LoadPlugins(const ::std::string& apkPath);
+    static status_t dump(int fd, const Vector<String16>& args);
 
 private:
     static Mutex gPluginMutex;
diff --git a/services/mediaextractor/MediaExtractorService.cpp b/services/mediaextractor/MediaExtractorService.cpp
index 0dc1fce..f0f44f5 100644
--- a/services/mediaextractor/MediaExtractorService.cpp
+++ b/services/mediaextractor/MediaExtractorService.cpp
@@ -56,7 +56,7 @@
 }
 
 status_t MediaExtractorService::dump(int fd, const Vector<String16>& args) {
-    return dumpExtractors(fd, args);
+    return MediaExtractorFactory::dump(fd, args) || dumpExtractors(fd, args);
 }
 
 status_t MediaExtractorService::onTransact(uint32_t code, const Parcel& data, Parcel* reply,