Fixes widevine metrics proto serialization
Changes to a much more efficient and more reusable protobuf format for metrics. Test: Widevine tests, Google Play and MediaDrm CTS test. Bug: 73724218 Change-Id: I3299051d7a16bcd7758c8f272415ca40e10c1313
This commit is contained in:
@@ -100,18 +100,11 @@ CdmResponseType WvContentDecryptionModule::GenerateKeyRequest(
|
||||
cdm_by_session_id_[key_set_id] = cdm_engine;
|
||||
}
|
||||
InitializationData initialization_data(init_data_type, init_data);
|
||||
M_TIME(
|
||||
sts = cdm_engine->GenerateKeyRequest(
|
||||
session_id,
|
||||
key_set_id,
|
||||
initialization_data,
|
||||
license_type,
|
||||
app_parameters,
|
||||
key_request),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_generate_key_request_,
|
||||
sts);
|
||||
switch(license_type) {
|
||||
M_TIME(sts = cdm_engine->GenerateKeyRequest(session_id, key_set_id,
|
||||
initialization_data, license_type,
|
||||
app_parameters, key_request),
|
||||
cdm_engine->GetMetrics(), cdm_engine_generate_key_request_, sts);
|
||||
switch (license_type) {
|
||||
case kLicenseTypeRelease:
|
||||
if (sts != KEY_MESSAGE) {
|
||||
cdm_engine->CloseKeySetSession(key_set_id);
|
||||
@@ -119,16 +112,14 @@ CdmResponseType WvContentDecryptionModule::GenerateKeyRequest(
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (sts == KEY_MESSAGE)
|
||||
EnablePolicyTimer();
|
||||
if (sts == KEY_MESSAGE) EnablePolicyTimer();
|
||||
break;
|
||||
}
|
||||
return sts;
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::AddKey(
|
||||
const CdmSessionId& session_id,
|
||||
const CdmKeyResponse& key_data,
|
||||
const CdmSessionId& session_id, const CdmKeyResponse& key_data,
|
||||
CdmKeySetId* key_set_id) {
|
||||
CdmEngine* cdm_engine = session_id.empty() ? GetCdmForSessionId(*key_set_id)
|
||||
: GetCdmForSessionId(session_id);
|
||||
@@ -139,14 +130,8 @@ CdmResponseType WvContentDecryptionModule::AddKey(
|
||||
release_key_set_id = *key_set_id;
|
||||
}
|
||||
CdmResponseType sts;
|
||||
M_TIME(
|
||||
sts = cdm_engine->AddKey(
|
||||
session_id,
|
||||
key_data,
|
||||
key_set_id),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_add_key_,
|
||||
sts);
|
||||
M_TIME(sts = cdm_engine->AddKey(session_id, key_data, key_set_id),
|
||||
cdm_engine->GetMetrics(), cdm_engine_add_key_, sts);
|
||||
if (sts == KEY_ADDED && session_id.empty()) { // license type release
|
||||
cdm_engine->CloseKeySetSession(release_key_set_id);
|
||||
cdm_by_session_id_.erase(release_key_set_id);
|
||||
@@ -155,20 +140,13 @@ CdmResponseType WvContentDecryptionModule::AddKey(
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::RestoreKey(
|
||||
const CdmSessionId& session_id,
|
||||
const CdmKeySetId& key_set_id) {
|
||||
const CdmSessionId& session_id, const CdmKeySetId& key_set_id) {
|
||||
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
|
||||
if (!cdm_engine) return SESSION_NOT_FOUND_4;
|
||||
CdmResponseType sts;
|
||||
M_TIME(
|
||||
sts = cdm_engine->RestoreKey(
|
||||
session_id,
|
||||
key_set_id),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_restore_key_,
|
||||
sts);
|
||||
if (sts == KEY_ADDED)
|
||||
EnablePolicyTimer();
|
||||
M_TIME(sts = cdm_engine->RestoreKey(session_id, key_set_id),
|
||||
cdm_engine->GetMetrics(), cdm_engine_restore_key_, sts);
|
||||
if (sts == KEY_ADDED) EnablePolicyTimer();
|
||||
return sts;
|
||||
}
|
||||
|
||||
@@ -182,9 +160,7 @@ CdmResponseType WvContentDecryptionModule::RemoveKeys(
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::QueryStatus(
|
||||
SecurityLevel security_level,
|
||||
const std::string& key,
|
||||
std::string* value) {
|
||||
SecurityLevel security_level, const std::string& key, std::string* value) {
|
||||
CdmEngine* cdm_engine = EnsureCdmForIdentifier(kDefaultCdmIdentifier);
|
||||
return cdm_engine->QueryStatus(security_level, key, value);
|
||||
}
|
||||
@@ -201,13 +177,8 @@ CdmResponseType WvContentDecryptionModule::QueryKeyStatus(
|
||||
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
|
||||
if (!cdm_engine) return SESSION_NOT_FOUND_9;
|
||||
CdmResponseType sts;
|
||||
M_TIME(
|
||||
sts = cdm_engine->QueryKeyStatus(
|
||||
session_id,
|
||||
key_info),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_query_key_status_,
|
||||
sts);
|
||||
M_TIME(sts = cdm_engine->QueryKeyStatus(session_id, key_info),
|
||||
cdm_engine->GetMetrics(), cdm_engine_query_key_status_, sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
@@ -219,40 +190,25 @@ CdmResponseType WvContentDecryptionModule::QueryOemCryptoSessionId(
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::GetProvisioningRequest(
|
||||
CdmCertificateType cert_type,
|
||||
const std::string& cert_authority,
|
||||
const CdmIdentifier& identifier,
|
||||
CdmProvisioningRequest* request,
|
||||
CdmCertificateType cert_type, const std::string& cert_authority,
|
||||
const CdmIdentifier& identifier, CdmProvisioningRequest* request,
|
||||
std::string* default_url) {
|
||||
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
|
||||
CdmResponseType sts;
|
||||
M_TIME(
|
||||
sts = cdm_engine->GetProvisioningRequest(
|
||||
cert_type,
|
||||
cert_authority,
|
||||
request,
|
||||
default_url),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_get_provisioning_request_,
|
||||
sts);
|
||||
M_TIME(sts = cdm_engine->GetProvisioningRequest(cert_type, cert_authority,
|
||||
request, default_url),
|
||||
cdm_engine->GetMetrics(), cdm_engine_get_provisioning_request_, sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::HandleProvisioningResponse(
|
||||
const CdmIdentifier& identifier,
|
||||
CdmProvisioningResponse& response,
|
||||
std::string* cert,
|
||||
std::string* wrapped_key) {
|
||||
const CdmIdentifier& identifier, CdmProvisioningResponse& response,
|
||||
std::string* cert, std::string* wrapped_key) {
|
||||
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
|
||||
CdmResponseType sts;
|
||||
M_TIME(
|
||||
sts = cdm_engine->HandleProvisioningResponse(
|
||||
response,
|
||||
cert,
|
||||
wrapped_key),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_handle_provisioning_response_,
|
||||
sts);
|
||||
sts = cdm_engine->HandleProvisioningResponse(response, cert, wrapped_key),
|
||||
cdm_engine->GetMetrics(), cdm_engine_handle_provisioning_response_, sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
@@ -269,31 +225,18 @@ CdmResponseType WvContentDecryptionModule::GetUsageInfo(
|
||||
CdmUsageInfo* usage_info) {
|
||||
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
|
||||
CdmResponseType sts;
|
||||
M_TIME(
|
||||
sts = cdm_engine->GetUsageInfo(
|
||||
app_id,
|
||||
usage_info),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_get_usage_info_,
|
||||
sts);
|
||||
M_TIME(sts = cdm_engine->GetUsageInfo(app_id, usage_info),
|
||||
cdm_engine->GetMetrics(), cdm_engine_get_usage_info_, sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::GetUsageInfo(
|
||||
const std::string& app_id,
|
||||
const CdmSecureStopId& ssid,
|
||||
const CdmIdentifier& identifier,
|
||||
CdmUsageInfo* usage_info) {
|
||||
const std::string& app_id, const CdmSecureStopId& ssid,
|
||||
const CdmIdentifier& identifier, CdmUsageInfo* usage_info) {
|
||||
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
|
||||
CdmResponseType sts;
|
||||
M_TIME(
|
||||
sts = cdm_engine->GetUsageInfo(
|
||||
app_id,
|
||||
ssid,
|
||||
usage_info),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_get_usage_info_,
|
||||
sts);
|
||||
M_TIME(sts = cdm_engine->GetUsageInfo(app_id, ssid, usage_info),
|
||||
cdm_engine->GetMetrics(), cdm_engine_get_usage_info_, sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
@@ -346,8 +289,7 @@ CdmResponseType WvContentDecryptionModule::GetSecureStopIds(
|
||||
}
|
||||
|
||||
CdmResponseType WvContentDecryptionModule::Decrypt(
|
||||
const CdmSessionId& session_id,
|
||||
bool validate_key_id,
|
||||
const CdmSessionId& session_id, bool validate_key_id,
|
||||
const CdmDecryptionParameters& parameters) {
|
||||
// First find the CdmEngine that has the given session_id. If we are using
|
||||
// key sharing, the shared session will still be in the same CdmEngine.
|
||||
@@ -355,26 +297,20 @@ CdmResponseType WvContentDecryptionModule::Decrypt(
|
||||
if (!cdm_engine) return SESSION_NOT_FOUND_FOR_DECRYPT;
|
||||
|
||||
CdmSessionId local_session_id = session_id;
|
||||
if (validate_key_id &&
|
||||
Properties::GetSessionSharingId(session_id) != 0) {
|
||||
bool status = cdm_engine->FindSessionForKey(
|
||||
*parameters.key_id, &local_session_id);
|
||||
cdm_engine->GetMetrics()->cdm_engine_find_session_for_key_
|
||||
.Increment(status);
|
||||
if (validate_key_id && Properties::GetSessionSharingId(session_id) != 0) {
|
||||
bool status =
|
||||
cdm_engine->FindSessionForKey(*parameters.key_id, &local_session_id);
|
||||
cdm_engine->GetMetrics()->cdm_engine_find_session_for_key_.Increment(
|
||||
status);
|
||||
if (!status && parameters.is_encrypted) {
|
||||
LOGE("WvContentDecryptionModule::Decrypt: unable to find session");
|
||||
return KEY_NOT_FOUND_IN_SESSION;
|
||||
}
|
||||
}
|
||||
CdmResponseType sts;
|
||||
M_TIME(
|
||||
sts = cdm_engine->Decrypt(
|
||||
local_session_id,
|
||||
parameters),
|
||||
cdm_engine->GetMetrics(),
|
||||
cdm_engine_decrypt_,
|
||||
sts,
|
||||
metrics::Pow2Bucket(parameters.encrypt_length));
|
||||
M_TIME(sts = cdm_engine->Decrypt(local_session_id, parameters),
|
||||
cdm_engine->GetMetrics(), cdm_engine_decrypt_, sts,
|
||||
metrics::Pow2Bucket(parameters.encrypt_length));
|
||||
return sts;
|
||||
}
|
||||
|
||||
@@ -398,12 +334,12 @@ void WvContentDecryptionModule::GetSerializedMetrics(
|
||||
std::string* serialized_metrics) {
|
||||
AutoLock auto_lock(cdms_lock_);
|
||||
CloseCdmsWithoutSessions();
|
||||
metrics_.SerializeToString(serialized_metrics);
|
||||
metrics_.Clear();
|
||||
metrics_group_.SerializeToString(serialized_metrics);
|
||||
metrics_group_.Clear();
|
||||
}
|
||||
|
||||
WvContentDecryptionModule::CdmInfo::CdmInfo()
|
||||
: cdm_engine(new CdmEngine(&file_system)) {}
|
||||
: cdm_engine(new CdmEngine(&file_system)) {}
|
||||
|
||||
CdmEngine* WvContentDecryptionModule::EnsureCdmForIdentifier(
|
||||
const CdmIdentifier& identifier) {
|
||||
@@ -415,12 +351,12 @@ CdmEngine* WvContentDecryptionModule::EnsureCdmForIdentifier(
|
||||
// this CDM. We concatenate all pieces of the CdmIdentifier in order to
|
||||
// create an ID that is unique to that identifier.
|
||||
cdms_[identifier].file_system.SetOrigin(identifier.origin);
|
||||
cdms_[identifier].file_system.SetIdentifier(
|
||||
identifier.spoid + identifier.origin);
|
||||
cdms_[identifier].file_system.SetIdentifier(identifier.spoid +
|
||||
identifier.origin);
|
||||
|
||||
// Set the app package name for use by metrics.
|
||||
cdms_[identifier].cdm_engine->GetMetrics()
|
||||
->SetAppPackageName(identifier.app_package_name);
|
||||
cdms_[identifier].cdm_engine->GetMetrics()->SetAppPackageName(
|
||||
identifier.app_package_name);
|
||||
}
|
||||
CdmEngine* cdm_engine = cdms_[identifier].cdm_engine.get();
|
||||
|
||||
@@ -447,14 +383,12 @@ void WvContentDecryptionModule::CloseCdmsWithoutSessions() {
|
||||
it->second.cdm_engine->GetMetrics();
|
||||
// engine_metrics should never be null.
|
||||
if (engine_metrics != NULL) {
|
||||
engine_metrics->Serialize(
|
||||
metrics_.add_metric_sub_group(),
|
||||
false, // Report complete AND incomplete sessions.
|
||||
true); // Clear session metrics after reporting.
|
||||
engine_metrics->Serialize(metrics_group_.add_metrics());
|
||||
} else {
|
||||
// Engine metrics should never be null.
|
||||
LOGI("WvContentDecryptionModule::CloseCdmsWithoutSessions."
|
||||
"engine_metrics was unexpectedly NULL.");
|
||||
LOGI(
|
||||
"WvContentDecryptionModule::CloseCdmsWithoutSessions."
|
||||
"engine_metrics was unexpectedly NULL.");
|
||||
}
|
||||
|
||||
// The CDM is no longer used for this identifier, delete it.
|
||||
@@ -478,7 +412,7 @@ void WvContentDecryptionModule::DisablePolicyTimer() {
|
||||
}
|
||||
|
||||
AutoLock auto_lock(policy_timer_lock_);
|
||||
if(cdms_is_empty) {
|
||||
if (cdms_is_empty) {
|
||||
if (policy_timer_.IsRunning()) {
|
||||
policy_timer_.Stop();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user