Fix support for app package name.

The app package name was not being reported to the media stats. This
change adds the package name as part of the report to media stats.

This is one of two parts to this change. The other part is in
frameworks/av.

Bug: 64584568

Test: Unit tests, GTS tests, tried with Google Play Movies.
Change-Id: I1ca09db3a59d9a0950f424d977f8774dffd09c2b
This commit is contained in:
Adam Stone
2017-09-05 16:40:35 -07:00
parent 6e680854ed
commit 1b9c6ea789
9 changed files with 50 additions and 11 deletions

View File

@@ -105,6 +105,7 @@ static const std::string HLS_URI_ATTRIBUTE = "URI";
static const char EMPTY_ORIGIN[] = "";
static const char EMPTY_SPOID[] = "";
static const char EMPTY_APP_PACKAGE_NAME[] = "";
} // namespace wvcdm
#endif // WVCDM_CORE_WV_CDM_CONSTANTS_H_

View File

@@ -25,11 +25,17 @@ struct CdmIdentifier {
// The origin. May be blank if the app does not set an origin, which is
// the likely behavior of most non-web-browser apps.
std::string origin;
// The application package name provided by the application. This is used to
// provide a friendly name of the application package for the purposes of
// logging and metrics.
std::string app_package_name;
};
// Provide comparison operators
inline bool operator==(const CdmIdentifier& lhs, const CdmIdentifier& rhs) {
return lhs.spoid == rhs.spoid && lhs.origin == rhs.origin;
return lhs.spoid == rhs.spoid && lhs.origin == rhs.origin
&& lhs.app_package_name == rhs.app_package_name;
}
inline bool operator!=(const CdmIdentifier& lhs, const CdmIdentifier& rhs) {
@@ -37,8 +43,11 @@ inline bool operator!=(const CdmIdentifier& lhs, const CdmIdentifier& rhs) {
}
inline bool operator<(const CdmIdentifier& lhs, const CdmIdentifier& rhs) {
return (lhs.spoid < rhs.spoid) ||
((lhs.spoid == rhs.spoid) && lhs.origin < rhs.origin);
return (lhs.spoid < rhs.spoid)
|| ((lhs.spoid == rhs.spoid)
&& (lhs.origin < rhs.origin
|| (lhs.origin == rhs.origin
&& lhs.app_package_name < rhs.app_package_name)));
}
inline bool operator>(const CdmIdentifier& lhs, const CdmIdentifier& rhs) {
@@ -56,7 +65,8 @@ inline bool operator>=(const CdmIdentifier& lhs, const CdmIdentifier& rhs) {
// Provide default
static const CdmIdentifier kDefaultCdmIdentifier = {
EMPTY_SPOID,
EMPTY_ORIGIN
EMPTY_ORIGIN,
EMPTY_APP_PACKAGE_NAME
};
} // namespace wvcdm

View File

@@ -263,6 +263,8 @@ class EngineMetrics {
void Serialize(drm_metrics::MetricsGroup* metric_group, bool completed_only,
bool clear_serialized_sessions);
void SetAppPackageName(const std::string& app_package_name);
// Metrics recorded at the engine level.
EventMetric<CdmResponseType> cdm_engine_add_key_;
ValueMetric<std::string> cdm_engine_cdm_version_;
@@ -288,6 +290,7 @@ class EngineMetrics {
Lock session_metrics_lock_;
std::vector<metrics::SessionMetrics*> session_metrics_list_;
CryptoMetrics crypto_metrics_;
std::string app_package_name_;
void SerializeEngineMetrics(drm_metrics::MetricsGroup* out);
};

View File

@@ -33,4 +33,7 @@ message MetricsGroup {
// Allow multiple sub groups of metrics.
repeated MetricsGroup metric_sub_group = 2;
// Name of the application package associated with the metrics.
optional string app_package_name = 3;
}

View File

@@ -440,7 +440,8 @@ EngineMetrics::EngineMetrics() :
cdm_engine_unprovision_(
"/drm/widevine/cdm_engine/unprovision",
"error",
"security_level") {
"security_level"),
app_package_name_("") {
}
EngineMetrics::~EngineMetrics() {
@@ -482,14 +483,20 @@ void EngineMetrics::Serialize(drm_metrics::MetricsGroup* metric_group,
OemCryptoDynamicAdapterMetrics& adapter_metrics =
GetDynamicAdapterMetricsInstance();
adapter_metrics.Serialize(metric_group);
if (!app_package_name_.empty()) {
metric_group->set_app_package_name(app_package_name_);
}
SerializeEngineMetrics(metric_group);
std::vector<SessionMetrics*>::iterator i;
for (i = session_metrics_list_.begin(); i != session_metrics_list_.end();
/* no increment */) {
bool serialized = false;
if (!completed_only || (*i)->IsCompleted()) {
(*i)->Serialize(metric_group->add_metric_sub_group());
MetricsGroup* metric_sub_group = metric_group->add_metric_sub_group();
if (!app_package_name_.empty()) {
metric_sub_group->set_app_package_name(app_package_name_);
}
(*i)->Serialize(metric_sub_group);
serialized = true;
}
@@ -502,6 +509,10 @@ void EngineMetrics::Serialize(drm_metrics::MetricsGroup* metric_group,
}
}
void EngineMetrics::SetAppPackageName(const std::string& app_package_name) {
app_package_name_ = app_package_name;
}
void EngineMetrics::SerializeEngineMetrics(MetricsGroup* metric_group) {
ProtoMetricSerializer serializer(metric_group);
cdm_engine_add_key_.Serialize(&serializer);

View File

@@ -380,9 +380,14 @@ CdmEngine* WvContentDecryptionModule::EnsureCdmForIdentifier(
cdms_[identifier].file_system.SetOrigin(identifier.origin);
cdms_[identifier].file_system.SetIdentifier(
identifier.spoid + identifier.origin);
}
return cdms_[identifier].cdm_engine.get();
// Set the app package name for use by metrics.
cdms_[identifier].cdm_engine->GetMetrics()
->SetAppPackageName(identifier.app_package_name);
}
CdmEngine* cdm_engine = cdms_[identifier].cdm_engine.get();
return cdm_engine;
}
CdmEngine* WvContentDecryptionModule::GetCdmForSessionId(

View File

@@ -51,6 +51,7 @@ const int kHttpInternalServerError = 500;
const wvcdm::CdmIdentifier kExampleIdentifier = {
wvcdm::EMPTY_SPOID,
"com.example",
"com.example"
};

View File

@@ -106,7 +106,7 @@ TEST_F(WvContentDecryptionModuleMetricsTest, EngineAndSessionMetrics) {
TEST_F(WvContentDecryptionModuleMetricsTest, MultipleEngineMetric) {
CdmSessionId session_id;
wvcdm::CdmKeySystem key_system("com.widevine");
CdmIdentifier identifier = { "foo", "bar" };
CdmIdentifier identifier = { "foo", "bar", "baz" };
// Openning the session will fail with NEEDS_PROVISIONING error. But it will
// still create some session-level stats.
@@ -146,6 +146,9 @@ TEST_F(WvContentDecryptionModuleMetricsTest, MultipleEngineMetric) {
metrics.metric_sub_group(i).metric_sub_group(0).metric(0).name(),
StrEq("/drm/widevine/cdm_session/session_id"));
}
// Verify that the second metrics app package name is set.
EXPECT_THAT(metrics.metric_sub_group(1).app_package_name(), StrEq("baz"));
}
}

View File

@@ -1375,7 +1375,9 @@ WVDrmPlugin::CdmIdentifierBuilder::CdmIdentifierBuilder(
mIsIdentifierSealed(false),
mUseSpoid(useSpoid),
mAppPackageName(appPackageName),
mParent(parent) {}
mParent(parent) {
mCdmIdentifier.app_package_name = mAppPackageName;
}
Status WVDrmPlugin::CdmIdentifierBuilder::getCdmIdentifier(
CdmIdentifier* identifier) {