Remove dependency to libmediadrm from drm HAL

am: 07770c78e1

Change-Id: I9963fa4da5dd779af03fa97b6b008326df216a97
This commit is contained in:
Jiyong Park 2017-06-20 03:37:16 +00:00 committed by android-build-merger
commit b62ca88160
11 changed files with 187 additions and 24 deletions

View file

@ -89,3 +89,5 @@ cc_library_shared {
"libutils",
],
}
subdirs = ["default"]

View file

@ -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"]
}

View file

@ -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

View file

@ -19,7 +19,7 @@
#include <android/hardware/drm/1.0/ICryptoFactory.h>
#include <hidl/Status.h>
#include <media/hardware/CryptoAPI.h>
#include <media/PluginLoader.h>
#include <PluginLoader.h>
#include <media/SharedLibrary.h>
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<android::CryptoFactory> loader;
PluginLoader<android::CryptoFactory> loader;
CryptoFactory(const CryptoFactory &) = delete;
void operator=(const CryptoFactory &) = delete;

View file

@ -19,7 +19,7 @@
#include <android/hardware/drm/1.0/IDrmFactory.h>
#include <hidl/Status.h>
#include <media/drm/DrmAPI.h>
#include <media/PluginLoader.h>
#include <PluginLoader.h>
#include <media/SharedLibrary.h>
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<android::DrmFactory> loader;
PluginLoader<android::DrmFactory> loader;
DrmFactory(const DrmFactory &) = delete;
void operator=(const DrmFactory &) = delete;

View file

@ -14,17 +14,19 @@
* limitations under the License.
*/
#define LOG_TAG "drm-vts-shared-library"
#include "SharedLibrary.h"
#include <dlfcn.h>
#include <shared_library.h>
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

View file

@ -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 <utils/Log.h>
#include <utils/String8.h>
#include <utils/Vector.h>
namespace android {
namespace hardware {
namespace drm {
namespace V1_0 {
namespace helper {
template <class T>
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<SharedLibrary> 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<T *> factories;
Vector<sp<SharedLibrary> > libraries;
PluginLoader(const PluginLoader &) = delete;
void operator=(const PluginLoader &) = delete;
};
}
}
}
}
} // namespace android
#endif // PLUGIN_LOADER_H_

View file

@ -17,13 +17,18 @@
#ifndef SHARED_LIBRARY_H_
#define SHARED_LIBRARY_H_
#include <string>
#include <vector>
#include <utils/RefBase.h>
#include <utils/String8.h>
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_

View file

@ -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",

View file

@ -20,13 +20,16 @@
#include <dlfcn.h>
#include <log/log.h>
#include <memory>
#include <utils/String8.h>
#include <SharedLibrary.h>
#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<SharedLibrary>(path);
auto library = std::make_unique<SharedLibrary>(String8(path.c_str()));
if (!library) {
ALOGE("failed to map shared library %s", path.c_str());
return NULL;

View file

@ -18,8 +18,12 @@
#define VENDOR_MODULES_H
#include <map>
#include <vector>
#include <string>
#include "shared_library.h"
#include <SharedLibrary.h>
using ::android::hardware::drm::V1_0::helper::SharedLibrary;
class DrmHalVTSVendorModule;