diff --git a/drm/1.0/Android.bp b/drm/1.0/Android.bp index 7829de7bef..731f58fa1c 100644 --- a/drm/1.0/Android.bp +++ b/drm/1.0/Android.bp @@ -89,3 +89,5 @@ cc_library_shared { "libutils", ], } + +subdirs = ["default"] diff --git a/drm/1.0/default/Android.bp b/drm/1.0/default/Android.bp new file mode 100644 index 0000000000..6b1db56b0e --- /dev/null +++ b/drm/1.0/default/Android.bp @@ -0,0 +1,23 @@ +cc_library_static { + name: "android.hardware.drm@1.0-helper", + vendor: true, + defaults: ["hidl_defaults"], + srcs: [ + "SharedLibrary.cpp", + ], + cflags: [ + "-Werror", + "-Wextra", + "-Wall", + ], + shared_libs: [ + "liblog", + ], + header_libs: [ + "libutils_headers", + ], + export_header_lib_headers: [ + "libutils_headers", + ], + export_include_dirs : ["include"] +} diff --git a/drm/1.0/default/Android.mk b/drm/1.0/default/Android.mk index 7084d1b91a..7916fba1b2 100644 --- a/drm/1.0/default/Android.mk +++ b/drm/1.0/default/Android.mk @@ -36,6 +36,9 @@ LOCAL_SHARED_LIBRARIES := \ libutils \ libbinder \ +LOCAL_STATIC_LIBRARIES := \ + android.hardware.drm@1.0-helper \ + LOCAL_C_INCLUDES := \ hardware/interfaces/drm @@ -71,10 +74,12 @@ LOCAL_SHARED_LIBRARIES := \ libhidlmemory \ libhidltransport \ liblog \ - libmediadrm \ libstagefright_foundation_vendor \ libutils \ +LOCAL_STATIC_LIBRARIES := \ + android.hardware.drm@1.0-helper \ + LOCAL_C_INCLUDES := \ frameworks/native/include \ frameworks/av/include diff --git a/drm/1.0/default/CryptoFactory.h b/drm/1.0/default/CryptoFactory.h index 412b5576c5..6b1d1ffce8 100644 --- a/drm/1.0/default/CryptoFactory.h +++ b/drm/1.0/default/CryptoFactory.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include namespace android { @@ -28,6 +28,7 @@ namespace drm { namespace V1_0 { namespace implementation { +using ::android::hardware::drm::V1_0::helper::PluginLoader; using ::android::hardware::drm::V1_0::ICryptoFactory; using ::android::hardware::drm::V1_0::ICryptoPlugin; using ::android::hardware::hidl_array; @@ -51,7 +52,7 @@ struct CryptoFactory : public ICryptoFactory { override; private: - android::PluginLoader loader; + PluginLoader loader; CryptoFactory(const CryptoFactory &) = delete; void operator=(const CryptoFactory &) = delete; diff --git a/drm/1.0/default/DrmFactory.h b/drm/1.0/default/DrmFactory.h index a0088447f1..726bf97185 100644 --- a/drm/1.0/default/DrmFactory.h +++ b/drm/1.0/default/DrmFactory.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include namespace android { @@ -28,6 +28,7 @@ namespace drm { namespace V1_0 { namespace implementation { +using ::android::hardware::drm::V1_0::helper::PluginLoader; using ::android::hardware::drm::V1_0::IDrmFactory; using ::android::hardware::drm::V1_0::IDrmPlugin; using ::android::hardware::hidl_array; @@ -53,7 +54,7 @@ struct DrmFactory : public IDrmFactory { const hidl_string& appPackageName, createPlugin_cb _hidl_cb) override; private: - android::PluginLoader loader; + PluginLoader loader; DrmFactory(const DrmFactory &) = delete; void operator=(const DrmFactory &) = delete; diff --git a/drm/1.0/vts/functional/shared_library.cpp b/drm/1.0/default/SharedLibrary.cpp similarity index 83% rename from drm/1.0/vts/functional/shared_library.cpp rename to drm/1.0/default/SharedLibrary.cpp index 6658150fd6..0a942cddeb 100644 --- a/drm/1.0/vts/functional/shared_library.cpp +++ b/drm/1.0/default/SharedLibrary.cpp @@ -14,17 +14,19 @@ * limitations under the License. */ -#define LOG_TAG "drm-vts-shared-library" + +#include "SharedLibrary.h" #include -#include -using std::string; +namespace android { +namespace hardware { +namespace drm { +namespace V1_0 { +namespace helper { -namespace drm_vts { - -SharedLibrary::SharedLibrary(const string& path) { - mLibHandle = dlopen(path.c_str(), RTLD_NOW); +SharedLibrary::SharedLibrary(const String8& path) { + mLibHandle = dlopen(path.string(), RTLD_NOW); } SharedLibrary::~SharedLibrary() { @@ -53,4 +55,9 @@ const char* SharedLibrary::lastError() const { const char* error = dlerror(); return error ? error : "No errors or unknown error"; } -}; + +} +} +} +} +} // namespace android diff --git a/drm/1.0/default/include/PluginLoader.h b/drm/1.0/default/include/PluginLoader.h new file mode 100644 index 0000000000..f387b3cbc5 --- /dev/null +++ b/drm/1.0/default/include/PluginLoader.h @@ -0,0 +1,107 @@ +/** + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PLUGIN_LOADER_H_ +#define PLUGIN_LOADER_H_ + +#include "SharedLibrary.h" +#include +#include +#include + +namespace android { +namespace hardware { +namespace drm { +namespace V1_0 { +namespace helper { + +template +class PluginLoader { + + public: + PluginLoader(const char *dir, const char *entry) { + /** + * scan all plugins in the plugin directory and add them to the + * factories list. + */ + String8 pluginDir(dir); + + DIR* pDir = opendir(pluginDir.string()); + if (pDir == NULL) { + ALOGE("Failed to find plugin directory %s", pluginDir.string()); + } else { + struct dirent* pEntry; + while ((pEntry = readdir(pDir))) { + String8 file(pEntry->d_name); + if (file.getPathExtension() == ".so") { + String8 path = pluginDir + "/" + pEntry->d_name; + T *plugin = loadOne(path, entry); + if (plugin) { + factories.push(plugin); + } + } + } + closedir(pDir); + } + } + + ~PluginLoader() { + for (size_t i = 0; i < factories.size(); i++) { + delete factories[i]; + } + } + + T *getFactory(size_t i) const { + return factories[i]; + } + + size_t factoryCount() const {return factories.size();} + + private: + T* loadOne(const char *path, const char *entry) { + sp library = new SharedLibrary(String8(path)); + if (!library.get()) { + ALOGE("Failed to open plugin library %s: %s", path, + library->lastError()); + } else { + typedef T *(*CreateFactoryFunc)(); + CreateFactoryFunc createFactoryFunc = + (CreateFactoryFunc)library->lookup(entry); + if (createFactoryFunc) { + ALOGV("Found plugin factory entry %s in %s", entry, path); + libraries.push(library); + T* result = createFactoryFunc(); + return result; + } + } + return NULL; + } + + Vector factories; + Vector > libraries; + + PluginLoader(const PluginLoader &) = delete; + void operator=(const PluginLoader &) = delete; +}; + +} +} +} +} +} // namespace android + +#endif // PLUGIN_LOADER_H_ + diff --git a/drm/1.0/vts/functional/shared_library.h b/drm/1.0/default/include/SharedLibrary.h similarity index 79% rename from drm/1.0/vts/functional/shared_library.h rename to drm/1.0/default/include/SharedLibrary.h index 1f32243a02..8e174d0c69 100644 --- a/drm/1.0/vts/functional/shared_library.h +++ b/drm/1.0/default/include/SharedLibrary.h @@ -17,13 +17,18 @@ #ifndef SHARED_LIBRARY_H_ #define SHARED_LIBRARY_H_ -#include -#include +#include +#include -namespace drm_vts { -class SharedLibrary { +namespace android { +namespace hardware { +namespace drm { +namespace V1_0 { +namespace helper { + +class SharedLibrary : public RefBase { public: - explicit SharedLibrary(const std::string& path); + explicit SharedLibrary(const String8& path); ~SharedLibrary(); bool operator!() const; @@ -36,6 +41,11 @@ class SharedLibrary { SharedLibrary(const SharedLibrary&) = delete; void operator=(const SharedLibrary&) = delete; }; -}; + +} +} +} +} +} #endif // SHARED_LIBRARY_H_ diff --git a/drm/1.0/vts/functional/Android.bp b/drm/1.0/vts/functional/Android.bp index 43ea3727e5..b45ce848df 100644 --- a/drm/1.0/vts/functional/Android.bp +++ b/drm/1.0/vts/functional/Android.bp @@ -19,7 +19,6 @@ cc_test { srcs: [ "drm_hal_clearkey_test.cpp", "drm_hal_vendor_test.cpp", - "shared_library.cpp", "vendor_modules.cpp" ], shared_libs: [ @@ -39,7 +38,8 @@ cc_test { "libutils", ], static_libs: [ - "VtsHalHidlTargetTestBase" + "VtsHalHidlTargetTestBase", + "android.hardware.drm@1.0-helper", ], cflags: [ "-O0", diff --git a/drm/1.0/vts/functional/vendor_modules.cpp b/drm/1.0/vts/functional/vendor_modules.cpp index 2bf0b28a92..98430f550e 100644 --- a/drm/1.0/vts/functional/vendor_modules.cpp +++ b/drm/1.0/vts/functional/vendor_modules.cpp @@ -20,13 +20,16 @@ #include #include #include +#include +#include -#include "shared_library.h" #include "vendor_modules.h" using std::string; using std::vector; using std::unique_ptr; +using ::android::String8; +using ::android::hardware::drm::V1_0::helper::SharedLibrary; namespace drm_vts { void VendorModules::scanModules(const std::string &directory) { @@ -48,7 +51,7 @@ void VendorModules::scanModules(const std::string &directory) { DrmHalVTSVendorModule* VendorModules::getModule(const string& path) { if (mOpenLibraries.find(path) == mOpenLibraries.end()) { - auto library = std::make_unique(path); + auto library = std::make_unique(String8(path.c_str())); if (!library) { ALOGE("failed to map shared library %s", path.c_str()); return NULL; diff --git a/drm/1.0/vts/functional/vendor_modules.h b/drm/1.0/vts/functional/vendor_modules.h index ca538f6bac..8330b0a1ff 100644 --- a/drm/1.0/vts/functional/vendor_modules.h +++ b/drm/1.0/vts/functional/vendor_modules.h @@ -18,8 +18,12 @@ #define VENDOR_MODULES_H #include +#include +#include -#include "shared_library.h" +#include + +using ::android::hardware::drm::V1_0::helper::SharedLibrary; class DrmHalVTSVendorModule;