diff --git a/media/libstagefright/MediaExtractorFactory.cpp b/media/libstagefright/MediaExtractorFactory.cpp index a938d514b5..a309ee4dae 100644 --- a/media/libstagefright/MediaExtractorFactory.cpp +++ b/media/libstagefright/MediaExtractorFactory.cpp @@ -23,8 +23,6 @@ #include #include #include -#include -#include #include #include #include @@ -34,7 +32,6 @@ #include #include #include -#include #include #include @@ -130,13 +127,6 @@ Mutex MediaExtractorFactory::gPluginMutex; std::shared_ptr>> MediaExtractorFactory::gPlugins; bool MediaExtractorFactory::gPluginsRegistered = false; bool MediaExtractorFactory::gIgnoreVersion = false; -std::string MediaExtractorFactory::gLinkedLibraries; - -// static -void MediaExtractorFactory::SetLinkedLibraries(const std::string& linkedLibraries) { - Mutex::Autolock autoLock(gPluginMutex); - gLinkedLibraries = linkedLibraries; -} // static void *MediaExtractorFactory::sniff( @@ -235,71 +225,12 @@ void MediaExtractorFactory::RegisterExtractor(const sp &plugin, } //static -void MediaExtractorFactory::RegisterExtractorsInSystem( - const char *libDirPath, std::list> &pluginList) { - ALOGV("search for plugins at %s", libDirPath); - DIR *libDir = opendir(libDirPath); - if (libDir) { - struct dirent* libEntry; - while ((libEntry = readdir(libDir))) { - if (libEntry->d_name[0] == '.') { - continue; - } - String8 libPath = String8(libDirPath) + "/" + libEntry->d_name; - void *libHandle = dlopen(libPath.string(), RTLD_NOW | RTLD_LOCAL); - if (libHandle) { - GetExtractorDef getDef = - (GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF"); - if (getDef) { - ALOGV("registering sniffer for %s", libPath.string()); - RegisterExtractor( - new ExtractorPlugin(getDef(), libHandle, libPath), pluginList); - } else { - ALOGW("%s does not contain sniffer", libPath.string()); - dlclose(libHandle); - } - } else { - ALOGW("couldn't dlopen(%s) %s", libPath.string(), strerror(errno)); - } - } - - closedir(libDir); - } else { - ALOGE("couldn't opendir(%s)", libDirPath); - } -} - -//static -void MediaExtractorFactory::RegisterExtractorsInApex( - const char *libDirPath, std::list> &pluginList) { +void MediaExtractorFactory::RegisterExtractors( + const char *libDirPath, const android_dlextinfo* dlextinfo, + std::list> &pluginList) { ALOGV("search for plugins at %s", libDirPath); - ALOGV("linked libs %s", gLinkedLibraries.c_str()); - - std::string libDirPathEx = libDirPath; - libDirPathEx += "/extractors"; - android_namespace_t *extractorNs = android_create_namespace("extractor", - nullptr, // ld_library_path - libDirPath, // default_library_path - ANDROID_NAMESPACE_TYPE_ISOLATED, - libDirPathEx.c_str(), // permitted_when_isolated_path - nullptr); // parent - if (!android_link_namespaces(extractorNs, nullptr, gLinkedLibraries.c_str())) { - ALOGE("Failed to link namespace. Failed to load extractor plug-ins in apex."); - return; - } - const android_dlextinfo dlextinfo = { - .flags = ANDROID_DLEXT_USE_NAMESPACE, - .library_namespace = extractorNs, - }; - // try extractors subfolder first - DIR *libDir = opendir(libDirPathEx.c_str()); - - if (libDir) { - libDirPath = libDirPathEx.c_str(); - } else { - libDir = opendir(libDirPath); - } + DIR *libDir = opendir(libDirPath); if (libDir) { struct dirent* libEntry; while ((libEntry = readdir(libDir))) { @@ -312,7 +243,7 @@ void MediaExtractorFactory::RegisterExtractorsInApex( } void *libHandle = android_dlopen_ext( libPath.string(), - RTLD_NOW | RTLD_LOCAL, &dlextinfo); + RTLD_NOW | RTLD_LOCAL, dlextinfo); if (libHandle) { GetExtractorDef getDef = (GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF"); @@ -352,17 +283,27 @@ void MediaExtractorFactory::UpdateExtractors() { std::shared_ptr>> newList(new std::list>()); - RegisterExtractorsInApex("/apex/com.android.media/lib" + android_namespace_t *mediaNs = android_get_exported_namespace("media"); + if (mediaNs != NULL) { + const android_dlextinfo dlextinfo = { + .flags = ANDROID_DLEXT_USE_NAMESPACE, + .library_namespace = mediaNs, + }; + RegisterExtractors("/apex/com.android.media/lib" #ifdef __LP64__ - "64" + "64" #endif - , *newList); + "/extractors", &dlextinfo, *newList); + + } else { + ALOGE("couldn't find media namespace."); + } - RegisterExtractorsInSystem("/system/lib" + RegisterExtractors("/system/lib" #ifdef __LP64__ "64" #endif - "/extractors", *newList); + "/extractors", NULL, *newList); newList->sort(compareFunc); gPlugins = newList; diff --git a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h index 4358aac9a7..ea87948d61 100644 --- a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h +++ b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h @@ -21,6 +21,7 @@ #include #include +#include #include namespace android { @@ -36,19 +37,16 @@ public: const sp &source, const char *mime = NULL); static status_t dump(int fd, const Vector& args); static std::unordered_set getSupportedTypes(); - static void SetLinkedLibraries(const std::string& linkedLibraries); private: static Mutex gPluginMutex; static std::shared_ptr>> gPlugins; static bool gPluginsRegistered; static bool gIgnoreVersion; - static std::string gLinkedLibraries; - static void RegisterExtractorsInSystem( - const char *libDirPath, std::list> &pluginList); - static void RegisterExtractorsInApex( - const char *libDirPath, std::list> &pluginList); + static void RegisterExtractors( + const char *libDirPath, const android_dlextinfo* dlextinfo, + std::list> &pluginList); static void RegisterExtractor( const sp &plugin, std::list> &pluginList); diff --git a/services/mediaextractor/Android.mk b/services/mediaextractor/Android.mk index 7654982f49..65fcf40e7a 100644 --- a/services/mediaextractor/Android.mk +++ b/services/mediaextractor/Android.mk @@ -8,24 +8,6 @@ LOCAL_SRC_FILES := \ LOCAL_SHARED_LIBRARIES := libmedia libstagefright libbinder libutils liblog LOCAL_MODULE:= libmediaextractorservice - -sanitizer_runtime_libraries := $(call normalize-path-list,$(addsuffix .so,\ - $(ADDRESS_SANITIZER_RUNTIME_LIBRARY) \ - $(UBSAN_RUNTIME_LIBRARY) \ - $(TSAN_RUNTIME_LIBRARY))) - -# $(info Sanitizer: $(sanitizer_runtime_libraries)) - -ndk_libraries := $(call normalize-path-list,$(addprefix lib,$(addsuffix .so,\ - $(NDK_PREBUILT_SHARED_LIBRARIES)))) - -# $(info NDK: $(ndk_libraries)) - -LOCAL_CFLAGS += -DLINKED_LIBRARIES='"$(sanitizer_runtime_libraries):$(ndk_libraries)"' - -sanitizer_runtime_libraries := -ndk_libraries := - include $(BUILD_SHARED_LIBRARY) diff --git a/services/mediaextractor/MediaExtractorService.cpp b/services/mediaextractor/MediaExtractorService.cpp index 0665930394..de5c3e4fef 100644 --- a/services/mediaextractor/MediaExtractorService.cpp +++ b/services/mediaextractor/MediaExtractorService.cpp @@ -30,9 +30,7 @@ namespace android { MediaExtractorService::MediaExtractorService() - : BnMediaExtractorService() { - MediaExtractorFactory::SetLinkedLibraries(std::string(LINKED_LIBRARIES)); -} + : BnMediaExtractorService() { } sp MediaExtractorService::makeExtractor( const sp &remoteSource, const char *mime) {