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:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user