diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h index fd5eb6a7..959f17a1 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h @@ -67,6 +67,7 @@ static const std::string QUERY_KEY_OEMCRYPTO_API_VERSION = static const std::string QUERY_KEY_CURRENT_SRM_VERSION = "CurrentSRMVersion"; static const std::string QUERY_KEY_SRM_UPDATE_SUPPORT = "SRMUpdateSupport"; // whether OEM supports SRM update +static const std::string QUERY_KEY_WVCDM_VERSION = "WidevineCdmVersion"; static const std::string QUERY_VALUE_TRUE = "True"; static const std::string QUERY_VALUE_FALSE = "False"; diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index 4f99b273..1d7cd471 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -654,6 +654,14 @@ CdmResponseType CdmEngine::QueryStatus(SecurityLevel security_level, bool is_srm_update_supported = crypto_session.IsSrmUpdateSupported(); *query_response = is_srm_update_supported ? QUERY_VALUE_TRUE : QUERY_VALUE_FALSE; + } else if (query_token == QUERY_KEY_WVCDM_VERSION) { + std::string cdm_version; + if (!Properties::GetWVCdmVersion(&cdm_version)) { + LOGW("CdmEngine::QueryStatus: GetWVCdmVersion failed"); + return UNKNOWN_ERROR; + } + + *query_response = cdm_version; } else { LOGW("CdmEngine::QueryStatus: Unknown status requested, token = %s", query_token.c_str()); diff --git a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp index 8d2bcf63..aea51dcf 100644 --- a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp @@ -476,7 +476,7 @@ status_t WVDrmPlugin::getPropertyString(const String8& name, if (name == "vendor") { value = "Google"; } else if (name == "version") { - value = "1.0"; + return queryProperty(QUERY_KEY_WVCDM_VERSION, value); } else if (name == "description") { value = "Widevine CDM"; } else if (name == "algorithms") { diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index 9d9a2680..505ef377 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -640,7 +640,7 @@ Return WVDrmPlugin::getPropertyString(const hidl_string& propertyName, if (name == "vendor") { value = "Google"; } else if (name == "version") { - value = "1.0"; + status = queryProperty(wvcdm::QUERY_KEY_WVCDM_VERSION, value); } else if (name == "description") { value = "Widevine CDM"; } else if (name == "algorithms") { diff --git a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp index ef5a0df6..48c4f3e9 100644 --- a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp @@ -104,6 +104,7 @@ using wvcdm::QUERY_KEY_PROVISIONING_ID; using wvcdm::QUERY_KEY_SECURITY_LEVEL; using wvcdm::QUERY_KEY_SRM_UPDATE_SUPPORT; using wvcdm::QUERY_KEY_SYSTEM_ID; +using wvcdm::QUERY_KEY_WVCDM_VERSION; using wvcdm::QUERY_VALUE_SECURITY_LEVEL_L1; using wvcdm::QUERY_VALUE_SECURITY_LEVEL_L3; using wvcdm::SecurityLevel; @@ -1080,6 +1081,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { static const std::string maxSessions = "54"; static const std::string oemCryptoApiVersion = "13"; static const std::string currentSRMVersion = "1"; + static const std::string cdmVersion = "Infinity Minus 1"; std::string serializedMetrics( kSerializedMetrics, kSerializedMetrics + sizeof(kSerializedMetrics)); @@ -1121,6 +1123,10 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { .WillOnce(DoAll(SetArgPointee<2>(currentSRMVersion), testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_WVCDM_VERSION, _)) + .WillOnce(DoAll(SetArgPointee<2>(cdmVersion), + testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, GetSerializedMetrics(_)) .WillOnce(SetArgPointee<0>(serializedMetrics)); @@ -1137,7 +1143,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { plugin.getPropertyString( hidl_string("version"), [&](Status status, hidl_string stringResult) { ASSERT_EQ(Status::OK, status); - EXPECT_STREQ("1.0", stringResult.c_str()); + EXPECT_STREQ(cdmVersion.c_str(), stringResult.c_str()); }); plugin.getPropertyString( diff --git a/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp index 6798ea73..9130cbc6 100644 --- a/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp @@ -849,6 +849,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { static const string maxSessions = "18"; static const string oemCryptoApiVersion = "10"; static const string currentSRMVersion = "1"; + static const string cdmVersion = "Infinity Minus 1"; string serializedMetrics(kSerializedMetrics, kSerializedMetrics + sizeof(kSerializedMetrics)); @@ -890,6 +891,10 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { .WillOnce(DoAll(SetArgPointee<2>(currentSRMVersion), testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_WVCDM_VERSION, _)) + .WillOnce(DoAll(SetArgPointee<2>(cdmVersion), + Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, GetSerializedMetrics(_)) .WillOnce(SetArgPointee<0>(serializedMetrics)); @@ -902,7 +907,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { res = plugin.getPropertyString(String8("version"), stringResult); ASSERT_EQ(OK, res); - EXPECT_STREQ("1.0", stringResult.string()); + EXPECT_STREQ(cdmVersion.c_str(), stringResult.string()); res = plugin.getPropertyString(String8("description"), stringResult); ASSERT_EQ(OK, res);