From 7c0cd2582b8d259d1a8d44ef7c93859f176eeaa8 Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Mon, 14 Jan 2019 17:32:41 -0800 Subject: [PATCH] Add support for HDCP 2.3 bug:120040804 Change-Id: I51e0d173edc36d518e12b821ccb3a7b1e7e8d217 --- libwvdrmengine/include_hidl/HidlTypes.h | 1 + .../mediadrm/include_hidl/WVDrmPlugin.h | 1 + .../mediadrm/src_hidl/WVDrmPlugin.cpp | 45 ++++++++++++++++--- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/libwvdrmengine/include_hidl/HidlTypes.h b/libwvdrmengine/include_hidl/HidlTypes.h index 1802d0cb..51c27797 100644 --- a/libwvdrmengine/include_hidl/HidlTypes.h +++ b/libwvdrmengine/include_hidl/HidlTypes.h @@ -58,5 +58,6 @@ using drm::V1_2::OfflineLicenseState; typedef drm::V1_1::KeyRequestType KeyRequestType_V1_1; typedef drm::V1_2::IDrmPluginListener IDrmPluginListener_V1_2; typedef drm::V1_2::Status Status_V1_2; +typedef drm::V1_2::HdcpLevel HdcpLevel_V1_2; #endif diff --git a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h index e465b731..b3a9758e 100644 --- a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h @@ -125,6 +125,7 @@ struct WVDrmPlugin : public IDrmPlugin, IDrmPluginListener, Return removeAllSecureStops() override; Return getHdcpLevels(getHdcpLevels_cb _hidl_cb) override; + Return getHdcpLevels_1_2(getHdcpLevels_1_2_cb _hidl_cb) override; Return getNumberOfSessions(getNumberOfSessions_cb _hidl_cb) override; diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index 1b1cea13..c690d9b7 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -151,6 +151,20 @@ HdcpLevel mapHdcpLevel(const std::string level) { } } +HdcpLevel_V1_2 mapHdcpLevel_1_2(const std::string level) { + if (level == wvcdm::QUERY_VALUE_HDCP_V2_3) { + return HdcpLevel_V1_2::HDCP_V2_3; + } + return static_cast(mapHdcpLevel(level)); +} + +HdcpLevel toHdcpLevel_1_1(HdcpLevel_V1_2 level) { + if (level == HdcpLevel_V1_2::HDCP_V2_3) { + return HdcpLevel::HDCP_NONE; + } + return static_cast(level); +} + } // namespace WVDrmPlugin::WVDrmPlugin(const sp& cdm, @@ -937,29 +951,46 @@ Return WVDrmPlugin::removeAllSecureStops() { } Return WVDrmPlugin::getHdcpLevels(getHdcpLevels_cb _hidl_cb) { - HdcpLevel connectedLevel = HdcpLevel::HDCP_NONE; - HdcpLevel maxLevel = HdcpLevel::HDCP_NO_OUTPUT; + HdcpLevel connectedLevel = HdcpLevel::HDCP_NONE; + HdcpLevel maxLevel = HdcpLevel::HDCP_NO_OUTPUT; + + Return hResult = getHdcpLevels_1_2( + [&](Status_V1_2 status, const HdcpLevel_V1_2& hConnected, + const HdcpLevel_V1_2& hMax) { + if (status == Status_V1_2::OK) { + connectedLevel = toHdcpLevel_1_1(hConnected); + maxLevel = toHdcpLevel_1_1(hMax); + } + }); + + _hidl_cb(Status::OK, connectedLevel, maxLevel); + return Void(); +} + +Return WVDrmPlugin::getHdcpLevels_1_2(getHdcpLevels_1_2_cb _hidl_cb) { + HdcpLevel_V1_2 connectedLevel = HdcpLevel_V1_2::HDCP_NONE; + HdcpLevel_V1_2 maxLevel = HdcpLevel_V1_2::HDCP_NO_OUTPUT; std::string level; Status status = queryProperty(wvcdm::QUERY_KEY_CURRENT_HDCP_LEVEL, level); if (status == Status::OK) { - connectedLevel = mapHdcpLevel(level); + connectedLevel = mapHdcpLevel_1_2(level); } else { ALOGE("Failed to query current hdcp level."); - _hidl_cb(Status::ERROR_DRM_INVALID_STATE, connectedLevel, maxLevel); + _hidl_cb(Status_V1_2::ERROR_DRM_INVALID_STATE, connectedLevel, maxLevel); return Void(); } status = queryProperty(wvcdm::QUERY_KEY_MAX_HDCP_LEVEL, level); if (status == Status::OK) { - maxLevel = mapHdcpLevel(level); + maxLevel = mapHdcpLevel_1_2(level); } else { ALOGE("Failed to query maximum hdcp level."); - _hidl_cb(Status::ERROR_DRM_INVALID_STATE, connectedLevel, maxLevel); + _hidl_cb(Status_V1_2::ERROR_DRM_INVALID_STATE, connectedLevel, maxLevel); return Void(); } - _hidl_cb(Status::OK, connectedLevel, maxLevel); + _hidl_cb(Status_V1_2::OK, connectedLevel, maxLevel); return Void(); }