Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28c2ed39 authored by Robert Shih's avatar Robert Shih
Browse files

DrmUtils: refactor IDrm/ICrypto creation

Added utilities to:
* Query config for IMediaDrmService usage
* Create remote vs local IDrm/ICrypto object based on aforementioned config

Bug: 134787536
Test: MediaDrmClearkeyTest#testClearKeyPlaybackCenc
Change-Id: I72df528c0bbd8a6dbd3c4962ac91eb89696bcaf7
parent 7f84dcf5
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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",
+3 −1
Original line number Diff line number Diff line
@@ -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();
+85 −0
Original line number Diff line number Diff line
/*
 * 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
+10 −0
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -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();

};

// ----------------------------------------------------------------------------
Loading