From f6c12c465c46f4088c4a0cb6bd183e1d8597b217 Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Thu, 25 Jan 2018 22:52:03 -0800 Subject: [PATCH] Report analog output capabilities [ Merge of http://go/wvgerrit/41840 ] Bug: 69867619 Test: WV unit/integration tests Playback using netflix and play movies on Taimen Change-Id: I49d0dd9ae12322eecc80efb8cb744419c85e8ae5 --- .../cdm/core/include/crypto_session.h | 3 +++ .../cdm/core/src/client_identification.cpp | 21 +++++++++++++++++++ .../cdm/core/src/crypto_session.cpp | 13 ++++++++++++ .../cdm/core/src/license_protocol.proto | 10 +++++++++ 4 files changed, 47 insertions(+) diff --git a/libwvdrmengine/cdm/core/include/crypto_session.h b/libwvdrmengine/cdm/core/include/crypto_session.h index 2e93135c..82619b16 100644 --- a/libwvdrmengine/cdm/core/include/crypto_session.h +++ b/libwvdrmengine/cdm/core/include/crypto_session.h @@ -207,6 +207,9 @@ class CryptoSession { const std::string& provider_session_token); virtual CdmResponseType CopyOldUsageEntry( const std::string& provider_session_token); + virtual bool GetAnalogOutputCapabilities(bool* can_support_output, + bool* can_disable_output, + bool* can_support_cgms_a); virtual metrics::CryptoMetrics* GetCryptoMetrics() { return metrics_; } virtual CdmResponseType AddSubSession(const std::string& sub_session_key_id, diff --git a/libwvdrmengine/cdm/core/src/client_identification.cpp b/libwvdrmengine/cdm/core/src/client_identification.cpp index b2b05050..73e271b5 100644 --- a/libwvdrmengine/cdm/core/src/client_identification.cpp +++ b/libwvdrmengine/cdm/core/src/client_identification.cpp @@ -232,6 +232,27 @@ CdmResponseType ClientIdentification::Prepare( if (crypto_session_->GetSrmVersion(&srm_version)) client_capabilities->set_srm_version(srm_version); } + bool can_support_output; + bool can_disable_output; + bool can_support_cgms_a; + if (crypto_session_->GetAnalogOutputCapabilities(&can_support_output, + &can_disable_output, + &can_support_cgms_a)) { + video_widevine::ClientIdentification_ClientCapabilities_AnalogOutputCapabilities + capabilities = video_widevine::ClientIdentification_ClientCapabilities_AnalogOutputCapabilities_ANALOG_OUTPUT_NONE; + + if (can_support_output) { + if (can_support_cgms_a) { + capabilities = video_widevine::ClientIdentification_ClientCapabilities_AnalogOutputCapabilities_ANALOG_OUTPUT_SUPPORTS_CGMS_A; + } else { + capabilities = video_widevine::ClientIdentification_ClientCapabilities_AnalogOutputCapabilities_ANALOG_OUTPUT_SUPPORTED; + } + } + client_capabilities->set_analog_output_capabilities(capabilities); + client_capabilities->set_can_disable_analog_output(can_disable_output); + } else { + client_capabilities->set_analog_output_capabilities(video_widevine::ClientIdentification_ClientCapabilities_AnalogOutputCapabilities_ANALOG_OUTPUT_UNKNOWN); + } return NO_ERROR; } diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 295adba1..942e201f 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -2764,6 +2764,19 @@ CdmResponseType CryptoSession::CopyOldUsageEntry( return NO_ERROR; } +bool CryptoSession::GetAnalogOutputCapabilities(bool* can_support_output, + bool* can_disable_output, + bool* can_support_cgms_a) { + LOGV("GetAnalogOutputCapabilities: id=%ld", (uint32_t)oec_session_id_); + uint32_t flags = OEMCrypto_GetAnalogOutputFlags(requested_security_level_); + + if ((flags & OEMCrypto_Unknown_Analog_Output) != 0) return false; + *can_support_cgms_a = flags & OEMCrypto_Supports_CGMS_A; + *can_support_output = flags & OEMCrypto_Supports_Analog_Output; + *can_disable_output = flags & OEMCrypto_Can_Disable_Analog_Ouptput; + return true; +} + CdmResponseType CryptoSession::AddSubSession( const std::string& sub_session_key_id, const std::string& group_master_key_id) { diff --git a/libwvdrmengine/cdm/core/src/license_protocol.proto b/libwvdrmengine/cdm/core/src/license_protocol.proto index a0893720..400814cf 100644 --- a/libwvdrmengine/cdm/core/src/license_protocol.proto +++ b/libwvdrmengine/cdm/core/src/license_protocol.proto @@ -536,6 +536,13 @@ message ClientIdentification { RSA_3072 = 1; } + enum AnalogOutputCapabilities { + ANALOG_OUTPUT_UNKNOWN = 0; + ANALOG_OUTPUT_NONE = 1; + ANALOG_OUTPUT_SUPPORTED = 2; + ANALOG_OUTPUT_SUPPORTS_CGMS_A = 3; + } + optional bool client_token = 1 [default = false]; optional bool session_token = 2 [default = false]; optional bool video_resolution_constraints = 3 [default = false]; @@ -551,6 +558,9 @@ message ClientIdentification { // of updating SRM data. optional bool can_update_srm = 8 [default = false]; repeated CertificateKeyType supported_certificate_key_type = 9; + optional AnalogOutputCapabilities analog_output_capabilities = 10 + [default = ANALOG_OUTPUT_UNKNOWN]; + optional bool can_disable_analog_output = 11 [default = false]; } // Type of factory-provisioned device root of trust. Optional.