Widevine Metrics System

This change is the complete Widevine metrics system. It will
measure and record runtime information about what is happening
in the CDM - such as errors and throughput.

Bug: 33745339
Bug: 26027857
Change-Id: Ic9a82074f1e2b72c72d751b235f8ae361232787d
This commit is contained in:
Aaron Vaage
2017-01-17 18:31:25 -08:00
parent ee5aff7706
commit edb9f00df7
39 changed files with 2969 additions and 258 deletions

View File

@@ -2,11 +2,13 @@
#include "wv_content_decryption_module.h"
#include "ami_adapter.h"
#include "cdm_client_property_set.h"
#include "cdm_engine.h"
#include "initialization_data.h"
#include "license.h"
#include "log.h"
#include "metrics_front_end.h"
#include "properties.h"
#include "service_certificate.h"
#include "wv_cdm_constants.h"
@@ -20,10 +22,20 @@ namespace wvcdm {
Lock WvContentDecryptionModule::session_sharing_id_generation_lock_;
WvContentDecryptionModule::WvContentDecryptionModule() {}
WvContentDecryptionModule::WvContentDecryptionModule() {
report_root_ = new AmiAdapter();
front_end_ = new metrics::MetricsFrontEnd(report_root_);
metrics::MetricsFrontEnd::OverrideInstance(front_end_);
}
WvContentDecryptionModule::~WvContentDecryptionModule() {
DisablePolicyTimer(true);
metrics::MetricsFrontEnd::OverrideInstance(NULL);
delete front_end_;
delete report_root_;
front_end_ = NULL;
report_root_ = NULL;
}
bool WvContentDecryptionModule::IsSupported(const std::string& init_data_type) {
@@ -53,8 +65,16 @@ CdmResponseType WvContentDecryptionModule::OpenSession(
}
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
CdmResponseType sts = cdm_engine->OpenSession(key_system, property_set,
event_listener, session_id);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->OpenSession(
key_system,
property_set,
event_listener,
session_id),
cdm_engine->GetMetrics(),
cdm_engine_open_session_,
sts);
if (sts == NO_ERROR) {
cdm_by_session_id_[*session_id] = cdm_engine;
}
@@ -66,7 +86,13 @@ CdmResponseType WvContentDecryptionModule::CloseSession(
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
// TODO(rfrias): Avoid reusing the error codes from CdmEngine.
if (!cdm_engine) return SESSION_NOT_FOUND_1;
CdmResponseType sts = cdm_engine->CloseSession(session_id);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->CloseSession(
session_id),
cdm_engine->GetMetrics(),
cdm_engine_close_session_,
sts);
if (sts == NO_ERROR) {
cdm_by_session_id_.erase(session_id);
}
@@ -88,19 +114,37 @@ CdmResponseType WvContentDecryptionModule::GenerateKeyRequest(
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
CdmResponseType sts;
if (license_type == kLicenseTypeRelease) {
sts = cdm_engine->OpenKeySetSession(key_set_id, property_set, NULL);
M_TIME(
sts = cdm_engine->OpenKeySetSession(
key_set_id,
property_set,
NULL),
cdm_engine->GetMetrics(),
cdm_engine_open_key_set_session_,
sts);
if (sts != NO_ERROR) return sts;
cdm_by_session_id_[key_set_id] = cdm_engine;
}
InitializationData initialization_data(init_data_type, init_data);
sts = cdm_engine->GenerateKeyRequest(
session_id, key_set_id, initialization_data, license_type, app_parameters,
key_request);
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);
M_TIME(
cdm_engine->CloseKeySetSession(
key_set_id),
cdm_engine->GetMetrics(),
cdm_engine_close_key_set_session_);
cdm_by_session_id_.erase(key_set_id);
}
break;
@@ -119,9 +163,21 @@ CdmResponseType WvContentDecryptionModule::AddKey(
CdmEngine* cdm_engine = session_id.empty() ? GetCdmForSessionId(*key_set_id)
: GetCdmForSessionId(session_id);
if (!cdm_engine) return SESSION_NOT_FOUND_3;
CdmResponseType sts = cdm_engine->AddKey(session_id, key_data, 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);
if (sts == KEY_ADDED && session_id.empty()) { // license type release
cdm_engine->CloseKeySetSession(*key_set_id);
M_TIME(
cdm_engine->CloseKeySetSession(
*key_set_id),
cdm_engine->GetMetrics(),
cdm_engine_close_key_set_session_);
cdm_by_session_id_.erase(*key_set_id);
}
return sts;
@@ -132,7 +188,14 @@ CdmResponseType WvContentDecryptionModule::RestoreKey(
const CdmKeySetId& key_set_id) {
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
if (!cdm_engine) return SESSION_NOT_FOUND_4;
CdmResponseType sts = cdm_engine->RestoreKey(session_id, key_set_id);
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();
return sts;
@@ -142,7 +205,14 @@ CdmResponseType WvContentDecryptionModule::RemoveKeys(
const CdmSessionId& session_id) {
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
if (!cdm_engine) return SESSION_NOT_FOUND_5;
return cdm_engine->RemoveKeys(session_id);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->RemoveKeys(
session_id),
cdm_engine->GetMetrics(),
cdm_engine_remove_keys_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::QueryStatus(
@@ -150,28 +220,61 @@ CdmResponseType WvContentDecryptionModule::QueryStatus(
const std::string& key,
std::string* value) {
CdmEngine* cdm_engine = EnsureCdmForIdentifier(kDefaultCdmIdentifier);
return cdm_engine->QueryStatus(security_level, key, value);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->QueryStatus(
security_level,
key,
value),
cdm_engine->GetMetrics(),
cdm_engine_query_status_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::QuerySessionStatus(
const CdmSessionId& session_id, CdmQueryMap* key_info) {
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
if (!cdm_engine) return SESSION_NOT_FOUND_8;
return cdm_engine->QuerySessionStatus(session_id, key_info);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->QuerySessionStatus(
session_id,
key_info),
cdm_engine->GetMetrics(),
cdm_engine_query_session_status_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::QueryKeyStatus(
const CdmSessionId& session_id, CdmQueryMap* key_info) {
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
if (!cdm_engine) return SESSION_NOT_FOUND_9;
return cdm_engine->QueryKeyStatus(session_id, key_info);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->QueryKeyStatus(
session_id,
key_info),
cdm_engine->GetMetrics(),
cdm_engine_query_key_status_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::QueryOemCryptoSessionId(
const CdmSessionId& session_id, CdmQueryMap* response) {
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
if (!cdm_engine) return SESSION_NOT_FOUND_10;
return cdm_engine->QueryOemCryptoSessionId(session_id, response);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->QueryOemCryptoSessionId(
session_id,
response),
cdm_engine->GetMetrics(),
cdm_engine_query_oemcrypto_session_id_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::GetProvisioningRequest(
@@ -181,8 +284,17 @@ CdmResponseType WvContentDecryptionModule::GetProvisioningRequest(
CdmProvisioningRequest* request,
std::string* default_url) {
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
return cdm_engine->GetProvisioningRequest(cert_type, cert_authority, request,
default_url);
CdmResponseType 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(
@@ -191,19 +303,44 @@ CdmResponseType WvContentDecryptionModule::HandleProvisioningResponse(
std::string* cert,
std::string* wrapped_key) {
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
return cdm_engine->HandleProvisioningResponse(response, cert, wrapped_key);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->HandleProvisioningResponse(
response,
cert,
wrapped_key),
cdm_engine->GetMetrics(),
cdm_engine_handle_provisioning_response_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::Unprovision(
CdmSecurityLevel level, const CdmIdentifier& identifier) {
CdmEngine* cdm_engine = EnsureCdmForIdentifier(identifier);
return cdm_engine->Unprovision(level);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->Unprovision(
level),
cdm_engine->GetMetrics(),
cdm_engine_unprovision_,
sts,
level);
return sts;
}
CdmResponseType WvContentDecryptionModule::GetUsageInfo(
const std::string& app_id, CdmUsageInfo* usage_info) {
CdmEngine* cdm_engine = EnsureCdmForIdentifier(kDefaultCdmIdentifier);
return cdm_engine->GetUsageInfo(app_id, usage_info);
CdmResponseType 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(
@@ -211,19 +348,42 @@ CdmResponseType WvContentDecryptionModule::GetUsageInfo(
const CdmSecureStopId& ssid,
CdmUsageInfo* usage_info) {
CdmEngine* cdm_engine = EnsureCdmForIdentifier(kDefaultCdmIdentifier);
return cdm_engine->GetUsageInfo(app_id, ssid, usage_info);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->GetUsageInfo(
app_id,
ssid,
usage_info),
cdm_engine->GetMetrics(),
cdm_engine_get_usage_info_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::ReleaseAllUsageInfo(
const std::string& app_id) {
CdmEngine* cdm_engine = EnsureCdmForIdentifier(kDefaultCdmIdentifier);
return cdm_engine->ReleaseAllUsageInfo(app_id);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->ReleaseAllUsageInfo(
app_id),
cdm_engine->GetMetrics(),
cdm_engine_release_all_usage_info_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::ReleaseUsageInfo(
const CdmUsageInfoReleaseMessage& message) {
CdmEngine* cdm_engine = EnsureCdmForIdentifier(kDefaultCdmIdentifier);
return cdm_engine->ReleaseUsageInfo(message);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->ReleaseUsageInfo(
message),
cdm_engine->GetMetrics(),
cdm_engine_release_usage_info_,
sts);
return sts;
}
CdmResponseType WvContentDecryptionModule::Decrypt(
@@ -238,14 +398,28 @@ CdmResponseType WvContentDecryptionModule::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);
bool status;
M_TIME(
status = cdm_engine->FindSessionForKey(
*parameters.key_id,
&local_session_id),
cdm_engine->GetMetrics(),
cdm_engine_find_session_for_key_,
status);
if (!status) {
LOGE("WvContentDecryptionModule::Decrypt: unable to find session");
return SESSION_NOT_FOUND_FOR_DECRYPT;
}
}
return cdm_engine->Decrypt(local_session_id, parameters);
CdmResponseType sts;
M_TIME(
sts = cdm_engine->Decrypt(
local_session_id,
parameters),
cdm_engine->GetMetrics(),
cdm_engine_decrypt_,
sts);
return sts;
}
void WvContentDecryptionModule::NotifyResolution(const CdmSessionId& session_id,
@@ -253,7 +427,10 @@ void WvContentDecryptionModule::NotifyResolution(const CdmSessionId& session_id,
uint32_t height) {
CdmEngine* cdm_engine = GetCdmForSessionId(session_id);
if (!cdm_engine) return;
cdm_engine->NotifyResolution(session_id, width, height);
M_TIME(
cdm_engine->NotifyResolution(session_id, width, height),
cdm_engine->GetMetrics(),
cdm_engine_notify_resolution_);
}
bool WvContentDecryptionModule::IsValidServiceCertificate(