Merge "DrmUtils: refactor IDrm/ICrypto creation"

gugelfrei
Robert Shih 5 years ago committed by Android (Google) Code Review
commit b1150c2023

@ -24,6 +24,7 @@ cc_library_shared {
"SharedLibrary.cpp",
"DrmHal.cpp",
"CryptoHal.cpp",
"DrmUtils.cpp",
],
local_include_dirs: [
@ -58,6 +59,12 @@ cc_library_shared {
"libhidlbase",
],
export_shared_lib_headers: [
"android.hardware.drm@1.0",
"android.hardware.drm@1.1",
"android.hardware.drm@1.2",
],
cflags: [
"-Werror",
"-Wall",

@ -25,6 +25,7 @@
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <media/MediaResource.h>
#include <mediadrm/DrmUtils.h>
#include <mediadrm/DrmSessionManager.h>
#include <unistd.h>
#include <utils/String8.h>
@ -62,7 +63,8 @@ static std::vector<MediaResourceParcel> toResourceVec(
}
static sp<IResourceManagerService> getResourceManagerService() {
if (property_get_bool("persist.device_config.media_native.mediadrmserver", 1)) {
if (DrmUtils::UseDrmService()) {
// Create ResourceManagerService object in mediadrmserver process
return new android::media::ResourceManagerService();
}
sp<IServiceManager> sm = defaultServiceManager();

@ -0,0 +1,85 @@
/*
* Copyright (C) 2019 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.
*/
//#define LOG_NDEBUG 0
#define LOG_TAG "DrmUtils"
#include <utils/String16.h>
#include <binder/IInterface.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <mediadrm/CryptoHal.h>
#include <mediadrm/DrmHal.h>
#include <mediadrm/DrmUtils.h>
#include <mediadrm/ICrypto.h>
#include <mediadrm/IDrm.h>
#include <mediadrm/IMediaDrmService.h>
namespace android {
namespace DrmUtils {
namespace {
template<typename Iface>
sp<Iface> MakeObjectWithService(status_t *pstatus) {
status_t err = OK;
status_t &status = pstatus ? *pstatus : err;
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("media.drm"));
sp<IMediaDrmService> service = interface_cast<IMediaDrmService>(binder);
if (service == NULL) {
status = UNKNOWN_ERROR;
return NULL;
}
auto obj = service->makeObject<Iface>();
if (obj == NULL) {
status = UNKNOWN_ERROR;
return NULL;
}
status = obj->initCheck();
if (status != OK && status != NO_INIT) {
return NULL;
}
return obj;
}
template<typename Iface, typename Hal>
sp<Iface> MakeObject(status_t *pstatus) {
if (UseDrmService()) {
return MakeObjectWithService<Iface>(pstatus);
} else {
return new Hal();
}
}
} // namespace
bool UseDrmService() {
return property_get_bool("persist.device_config.media_native.mediadrmserver", true);
}
sp<IDrm> MakeDrm(status_t *pstatus) {
return MakeObject<IDrm, DrmHal>(pstatus);
}
sp<ICrypto> MakeCrypto(status_t *pstatus) {
return MakeObject<ICrypto, CryptoHal>(pstatus);
}
} // namespace DrmUtils
} // namespace android

@ -85,4 +85,14 @@ status_t BnMediaDrmService::onTransact(
// ----------------------------------------------------------------------------
template<>
sp<IDrm> IMediaDrmService::makeObject<IDrm>() {
return makeDrm();
}
template<>
sp<ICrypto> IMediaDrmService::makeObject<ICrypto>() {
return makeCrypto();
}
} // namespace android

@ -33,8 +33,12 @@ class IMediaDrmService: public IInterface
public:
DECLARE_META_INTERFACE(MediaDrmService);
virtual sp<ICrypto> makeCrypto() = 0;
virtual sp<IDrm> makeDrm() = 0;
template<typename I> sp<I> makeObject();
};
// ----------------------------------------------------------------------------

@ -0,0 +1,40 @@
/*
* Copyright (C) 2019 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 ANDROID_DRMUTILS_H
#define ANDROID_DRMUTILS_H
#include <utils/Errors.h> // for status_t
#include <utils/StrongPointer.h>
namespace android {
struct ICrypto;
struct IDrm;
namespace DrmUtils {
bool UseDrmService();
sp<IDrm> MakeDrm(status_t *pstatus = nullptr);
sp<ICrypto> MakeCrypto(status_t *pstatus = nullptr);
} // namespace DrmUtils
} // namespace android
#endif // ANDROID_DRMUTILS_H

@ -19,8 +19,7 @@
#include "NuPlayerDrm.h"
#include <binder/IServiceManager.h>
#include <mediadrm/IMediaDrmService.h>
#include <mediadrm/DrmUtils.h>
#include <utils/Log.h>
@ -30,60 +29,13 @@ namespace android {
sp<IDrm> NuPlayerDrm::CreateDrm(status_t *pstatus)
{
status_t &status = *pstatus;
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("media.drm"));
ALOGV("CreateDrm binder %p", (binder != NULL ? binder.get() : 0));
sp<IMediaDrmService> service = interface_cast<IMediaDrmService>(binder);
if (service == NULL) {
ALOGE("CreateDrm failed at IMediaDrmService");
return NULL;
}
sp<IDrm> drm = service->makeDrm();
if (drm == NULL) {
ALOGE("CreateDrm failed at makeDrm");
return NULL;
}
// this is before plugin creation so NO_INIT is fine
status = drm->initCheck();
if (status != OK && status != NO_INIT) {
ALOGE("CreateDrm failed drm->initCheck(): %d", status);
return NULL;
}
return drm;
return DrmUtils::MakeDrm(pstatus);
}
sp<ICrypto> NuPlayerDrm::createCrypto(status_t *pstatus)
{
status_t &status = *pstatus;
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("media.drm"));
sp<IMediaDrmService> service = interface_cast<IMediaDrmService>(binder);
if (service == NULL) {
status = UNKNOWN_ERROR;
ALOGE("CreateCrypto failed at IMediaDrmService");
return NULL;
}
sp<ICrypto> crypto = service->makeCrypto();
if (crypto == NULL) {
status = UNKNOWN_ERROR;
ALOGE("createCrypto failed");
return NULL;
}
// this is before plugin creation so NO_INIT is fine
status = crypto->initCheck();
if (status != OK && status != NO_INIT) {
ALOGE("createCrypto failed crypto->initCheck(): %d", status);
return NULL;
}
return crypto;
return DrmUtils::MakeCrypto(pstatus);
}
Vector<DrmUUID> NuPlayerDrm::parsePSSH(const void *pssh, size_t psshsize)

@ -26,9 +26,8 @@
#include <cutils/properties.h>
#include <utils/Log.h>
#include <utils/StrongPointer.h>
#include <binder/IServiceManager.h>
#include <mediadrm/DrmUtils.h>
#include <mediadrm/ICrypto.h>
#include <mediadrm/IMediaDrmService.h>
#include <android_util_Binder.h>
#include <jni.h>
@ -36,19 +35,7 @@
using namespace android;
static sp<ICrypto> makeCrypto() {
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("media.drm"));
sp<IMediaDrmService> service = interface_cast<IMediaDrmService>(binder);
if (service == NULL) {
return NULL;
}
sp<ICrypto> crypto = service->makeCrypto();
if (crypto == NULL || (crypto->initCheck() != OK && crypto->initCheck() != NO_INIT)) {
return NULL;
}
return crypto;
return DrmUtils::MakeCrypto();
}
struct AMediaCrypto {

@ -29,6 +29,7 @@
#include <android-base/properties.h>
#include <binder/PermissionController.h>
#include <mediadrm/DrmUtils.h>
#include <mediadrm/IDrm.h>
#include <mediadrm/IDrmClient.h>
#include <media/stagefright/MediaErrors.h>
@ -268,19 +269,7 @@ static status_t GetAppPackageName(String8 *packageName) {
}
static sp<IDrm> CreateDrm() {
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("media.drm"));
sp<IMediaDrmService> service = interface_cast<IMediaDrmService>(binder);
if (service == NULL) {
return NULL;
}
sp<IDrm> drm = service->makeDrm();
if (drm == NULL || (drm->initCheck() != OK && drm->initCheck() != NO_INIT)) {
return NULL;
}
return drm;
return DrmUtils::MakeDrm();
}

Loading…
Cancel
Save