From e0a1e459a2ad021d5e7abf623783a69edaec7016 Mon Sep 17 00:00:00 2001 From: Robert Shih Date: Mon, 18 Jan 2021 00:10:54 -0800 Subject: [PATCH] libwvhidl: implement setPlaybackId Bug: 159337195 Bug: 168341163 Test: GtsMediaTestCases MediaDrmTest#testSetPlaybackId Change-Id: I4fc687892c9dd3b8077b3ecdfd9bbc355b298571 --- libwvdrmengine/cdm/core/include/cdm_engine.h | 3 +++ libwvdrmengine/cdm/core/include/wv_cdm_types.h | 1 + libwvdrmengine/cdm/core/src/cdm_engine.cpp | 13 +++++++++++++ libwvdrmengine/cdm/core/test/test_printers.cpp | 3 +++ .../cdm/include/wv_content_decryption_module.h | 4 ++++ .../cdm/metrics/include/metrics_collections.h | 1 + .../cdm/metrics/src/metrics_collections.cpp | 2 ++ libwvdrmengine/cdm/metrics/src/wv_metrics.proto | 1 + .../cdm/src/wv_content_decryption_module.cpp | 9 +++++++++ libwvdrmengine/include/mapErrors-inl.h | 1 + libwvdrmengine/include_hidl/mapErrors-inl.h | 1 + libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h | 4 ++++ libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp | 10 ++++++++++ .../mediadrm/src_hidl/hidl_metrics_adapter.cpp | 5 +++++ 14 files changed, 58 insertions(+) diff --git a/libwvdrmengine/cdm/core/include/cdm_engine.h b/libwvdrmengine/cdm/core/include/cdm_engine.h index 9f840933..ba46985e 100644 --- a/libwvdrmengine/cdm/core/include/cdm_engine.h +++ b/libwvdrmengine/cdm/core/include/cdm_engine.h @@ -348,6 +348,9 @@ class CdmEngine { } virtual const std::string& GetAppPackageName() { return app_package_name_; } virtual void SetSpoid(const std::string& spoid) { spoid_ = spoid; } + virtual CdmResponseType SetPlaybackId( + const CdmSessionId& session_id, + const std::string& playback_id); protected: friend class CdmEngineFactory; diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index a4075304..7154ee7e 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -416,6 +416,7 @@ enum CdmResponseType : int32_t { LOAD_USAGE_ENTRY_INVALID_SESSION = 361, RESTORE_OFFLINE_LICENSE_ERROR_3 = 362, NO_SRM_VERSION = 363, + SESSION_NOT_FOUND_23 = 364, // Don't forget to add new values to // * core/test/test_printers.cpp. // * android/include/mapErrors-inl.h diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index 4af23b18..0bd5420a 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -1922,6 +1922,19 @@ CdmResponseType CdmEngine::ValidateServiceCertificate(const std::string& cert) { return certificate.Init(cert); } +CdmResponseType CdmEngine::SetPlaybackId( + const CdmSessionId& session_id, const std::string& playback_id) { + LOGI("Setting session_id = %s playback_id = %s", + session_id.c_str(), playback_id.c_str()); + std::shared_ptr session; + if (!session_map_.FindSession(session_id, &session)) { + LOGE("Session ID not found: %s", session_id.c_str()); + return SESSION_NOT_FOUND_23; + } + session->GetMetrics()->playback_id_.Record(playback_id); + return NO_ERROR; +} + std::string CdmEngine::MapHdcpVersion(CryptoSession::HdcpCapability version) { switch (version) { case HDCP_NONE: diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index 5cb8db6e..74a3d6c2 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -812,6 +812,9 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { case SESSION_NOT_FOUND_22: *os << "SESSION_NOT_FOUND_22"; break; + case SESSION_NOT_FOUND_23: + *os << "SESSION_NOT_FOUND_23"; + break; case SESSION_NOT_FOUND_FOR_DECRYPT: *os << "SESSION_NOT_FOUND_FOR_DECRYPT"; break; diff --git a/libwvdrmengine/cdm/include/wv_content_decryption_module.h b/libwvdrmengine/cdm/include/wv_content_decryption_module.h index 289182e7..ca375027 100644 --- a/libwvdrmengine/cdm/include/wv_content_decryption_module.h +++ b/libwvdrmengine/cdm/include/wv_content_decryption_module.h @@ -180,6 +180,10 @@ class WvContentDecryptionModule : public android::RefBase, public TimerHandler { CdmSecurityLevel security_level, const CdmIdentifier& identifier); + virtual CdmResponseType SetPlaybackId( + const CdmSessionId& session_id, + const std::string& playback_id); + private: struct CdmInfo { CdmInfo(); diff --git a/libwvdrmengine/cdm/metrics/include/metrics_collections.h b/libwvdrmengine/cdm/metrics/include/metrics_collections.h index 593be501..ffa8a591 100644 --- a/libwvdrmengine/cdm/metrics/include/metrics_collections.h +++ b/libwvdrmengine/cdm/metrics/include/metrics_collections.h @@ -337,6 +337,7 @@ class SessionMetrics { ValueMetric oemcrypto_build_info_; ValueMetric license_sdk_version_; ValueMetric license_service_version_; + ValueMetric playback_id_; // Serialize the session metrics to the provided |metric_group|. // |metric_group| is owned by the caller and must not be null. diff --git a/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp b/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp index 5abc5d37..f799910c 100644 --- a/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp +++ b/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp @@ -246,6 +246,8 @@ void SessionMetrics::SerializeSessionMetrics( license_sdk_version_.ToProto()); session_metrics->set_allocated_license_service_version( license_service_version_.ToProto()); + session_metrics->set_allocated_playback_id( + playback_id_.ToProto()); } OemCryptoDynamicAdapterMetrics::OemCryptoDynamicAdapterMetrics() diff --git a/libwvdrmengine/cdm/metrics/src/wv_metrics.proto b/libwvdrmengine/cdm/metrics/src/wv_metrics.proto index b579b87c..ea97fdcc 100644 --- a/libwvdrmengine/cdm/metrics/src/wv_metrics.proto +++ b/libwvdrmengine/cdm/metrics/src/wv_metrics.proto @@ -211,6 +211,7 @@ message WvCdmMetrics { optional ValueMetric oemcrypto_build_info = 8; optional ValueMetric license_sdk_version = 9; optional ValueMetric license_service_version = 10; + optional ValueMetric playback_id = 11; } // These are metrics recorded at the Engine level. This includes CryptoSession diff --git a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp index fd832821..8e7b30ae 100644 --- a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp +++ b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp @@ -609,4 +609,13 @@ CdmResponseType WvContentDecryptionModule::RemoveOfflineLicense( return cdm_engine->RemoveOfflineLicense(key_set_id, security_level); } +CdmResponseType WvContentDecryptionModule::SetPlaybackId( + const CdmSessionId& session_id, + const std::string& playback_id) { + LOGV("Setting session ID %s playback ID %s", + session_id.c_str(), playback_id.c_str()); + CdmEngine* cdm_engine = GetCdmForSessionId(session_id); + if (!cdm_engine) return SESSION_NOT_FOUND_23; + return cdm_engine->SetPlaybackId(session_id, playback_id); +} } // namespace wvcdm diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index 29b98e66..ba0a92b6 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -64,6 +64,7 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::SESSION_NOT_FOUND_20: case wvcdm::SESSION_NOT_FOUND_21: case wvcdm::SESSION_NOT_FOUND_22: + case wvcdm::SESSION_NOT_FOUND_23: case wvcdm::SESSION_NOT_FOUND_FOR_DECRYPT: return android::ERROR_DRM_SESSION_NOT_OPENED; case wvcdm::UNKNOWN_ERROR: diff --git a/libwvdrmengine/include_hidl/mapErrors-inl.h b/libwvdrmengine/include_hidl/mapErrors-inl.h index 06473f94..90057c2b 100644 --- a/libwvdrmengine/include_hidl/mapErrors-inl.h +++ b/libwvdrmengine/include_hidl/mapErrors-inl.h @@ -65,6 +65,7 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::SESSION_NOT_FOUND_20: case wvcdm::SESSION_NOT_FOUND_21: case wvcdm::SESSION_NOT_FOUND_22: + case wvcdm::SESSION_NOT_FOUND_23: return Status::ERROR_DRM_SESSION_NOT_OPENED; case wvcdm::DECRYPT_ERROR: diff --git a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h index 03226317..ac17d411 100644 --- a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h @@ -225,6 +225,10 @@ struct WVDrmPlugin : public ::drm::V1_4::IDrmPlugin, IDrmPluginListener, Return requiresSecureDecoderDefault(const hidl_string& mime) override; + Return<::drm::V1_0::Status> setPlaybackId( + const hidl_vec& sessionId, + const hidl_string& playbackId) override; + // The following methods do not use hidl interface, it is used internally. virtual Status unprovisionDevice(); diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index 18795dfd..f3e87b85 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -1955,6 +1955,16 @@ Return WVDrmPlugin::requiresSecureDecoderDefault(const hidl_string& mime) } } +Return<::drm::V1_0::Status> WVDrmPlugin::setPlaybackId( + const hidl_vec& sessionId, + const hidl_string& playbackId) { + const std::vector sId = toVector(sessionId); + CdmSessionId cdmSessionId(sId.begin(), sId.end()); + std::string cdmPlaybackId = playbackId; + CdmResponseType res = mCDM->SetPlaybackId(cdmSessionId, cdmPlaybackId); + return mapCdmResponseType(res); +} + void WVDrmPlugin::OnSessionRenewalNeeded(const CdmSessionId& cdmSessionId) { const std::vector sessionId = StrToVector(cdmSessionId); const hidl_vec data; // data is ignored diff --git a/libwvdrmengine/mediadrm/src_hidl/hidl_metrics_adapter.cpp b/libwvdrmengine/mediadrm/src_hidl/hidl_metrics_adapter.cpp index b92d740e..2e7dbe47 100644 --- a/libwvdrmengine/mediadrm/src_hidl/hidl_metrics_adapter.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/hidl_metrics_adapter.cpp @@ -412,6 +412,11 @@ void HidlMetricsAdapter::AddSessionMetrics( "license_service_version", proto_metrics.license_service_version()); } + if (proto_metrics.has_playback_id()) { + group_builder.AddValue( + "playback_id", + proto_metrics.playback_id()); + } group_vector_.emplace_back(group_builder.Build()); }