Added metrics history for WV CDM for Android.
[ Merge of http://go/wvgerrit/171271 ] There is a need to maintain a short history of metrics from CDMs which have been deleted. This CL adds this ability to the Android version of the WV CDM. The history cannot yet be maintained for long, as the WV CDM instance is destroyed if unused. Further changes are required to the plugin to maintain the history beyond the life-cycle of the CDM instance, and to properly format its output. Bug: 239462891 Bug: 270166158 Test: adb shell dumpsys android.hardware.drm.IDrmFactory/widevine -m Test: atest GtsMediaTestCases Change-Id: I81c0996602722a9795fc3951030d20bb39b5816b
This commit is contained in:
@@ -5,12 +5,14 @@
|
||||
#ifndef CDM_BASE_WV_CONTENT_DECRYPTION_MODULE_H_
|
||||
#define CDM_BASE_WV_CONTENT_DECRYPTION_MODULE_H_
|
||||
|
||||
#include <utils/RefBase.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
#include "cdm_identifier.h"
|
||||
#include "disallow_copy_and_assign.h"
|
||||
#include "file_store.h"
|
||||
@@ -24,6 +26,32 @@ class CdmClientPropertySet;
|
||||
class CdmEngine;
|
||||
class WvCdmEventListener;
|
||||
|
||||
class WvMetricsSnapshot {
|
||||
public:
|
||||
WvMetricsSnapshot(const CdmIdentifier& identifier,
|
||||
drm_metrics::WvCdmMetrics&& metrics, ::time_t ts);
|
||||
|
||||
// Acts as a constructor, but uses the current time.
|
||||
static WvMetricsSnapshot MakeSnapshot(const CdmIdentifier& identifier,
|
||||
drm_metrics::WvCdmMetrics&& metrics);
|
||||
|
||||
WvMetricsSnapshot() = default;
|
||||
WvMetricsSnapshot(const WvMetricsSnapshot&) = default;
|
||||
WvMetricsSnapshot(WvMetricsSnapshot&&) = default;
|
||||
WvMetricsSnapshot& operator=(const WvMetricsSnapshot&) = default;
|
||||
WvMetricsSnapshot& operator=(WvMetricsSnapshot&&) = default;
|
||||
|
||||
const CdmIdentifier& cdm_id() const { return cdm_id_; }
|
||||
const drm_metrics::WvCdmMetrics& metrics() const { return metrics_; }
|
||||
::time_t timestamp() const { return timestamp_; }
|
||||
std::string GetFormattedTimestamp() const;
|
||||
|
||||
private:
|
||||
CdmIdentifier cdm_id_;
|
||||
drm_metrics::WvCdmMetrics metrics_;
|
||||
::time_t timestamp_ = 0;
|
||||
};
|
||||
|
||||
class WvContentDecryptionModule : public android::RefBase, public TimerHandler {
|
||||
public:
|
||||
WvContentDecryptionModule();
|
||||
@@ -142,18 +170,30 @@ class WvContentDecryptionModule : public android::RefBase, public TimerHandler {
|
||||
// Validate a passed-in service certificate
|
||||
virtual bool IsValidServiceCertificate(const std::string& certificate);
|
||||
|
||||
// Fill the metrics parameter with the metrics data for the CdmEngine
|
||||
// associated with the given CdmIdentifier. If the CdmEngine instance does
|
||||
// not exist, this will return an error.
|
||||
virtual CdmResponseType GetMetrics(const CdmIdentifier& identifier,
|
||||
drm_metrics::WvCdmMetrics* metrics);
|
||||
// Fill the |metrics| parameter with the engine metrics data for the
|
||||
// CdmEngine associated with the given CdmIdentifier.
|
||||
// If the CdmEngine instance does not exist, this will return an error.
|
||||
virtual CdmResponseType GetCurrentMetrics(const CdmIdentifier& identifier,
|
||||
drm_metrics::WvCdmMetrics* metrics);
|
||||
|
||||
// Fill the metrics parameter with the metrics data for all the CdmEngine
|
||||
// associated with the given CdmIdentifiers. If there are no CdmEngine
|
||||
// instances, this will return an error.
|
||||
virtual CdmResponseType GetMetrics(
|
||||
std::vector<drm_metrics::WvCdmMetrics>* metrics,
|
||||
bool* full_list_returned);
|
||||
// Fill the |snapshots| parameter wrapped engine metrics for all CdmEngine
|
||||
// instances that currently enabled (actively decrypting or performing
|
||||
// other engine-level operations).
|
||||
// Current metrics snapshots contain the engine identifier, metrics data
|
||||
// and time (roughly current time).
|
||||
// |full_list_returned| will indicate whether all existing enginers were
|
||||
// able to report their metrics successfully.
|
||||
virtual CdmResponseType GetAllCurrentMetricsSnapshots(
|
||||
std::vector<WvMetricsSnapshot>* snapshots, bool* full_list_returned);
|
||||
|
||||
// Fill the |snapshots| parameter wrapped engine metrics for several of
|
||||
// the most recently closed CdmEngine instances.
|
||||
// Saved metrics snapshots contain the engine identifier, metrics data
|
||||
// and time of closing.
|
||||
// The same engine identifier may appear multiple times in the list (
|
||||
// depending on how the app utilizes the MediaDrm plugin).
|
||||
virtual CdmResponseType GetAllSavedMetricsSnapshots(
|
||||
std::vector<WvMetricsSnapshot>* snapshots);
|
||||
|
||||
// Closes the CdmEngine and sessions associated with the given CdmIdentifier.
|
||||
virtual CdmResponseType CloseCdm(const CdmIdentifier& identifier);
|
||||
@@ -234,8 +274,10 @@ class WvContentDecryptionModule : public android::RefBase, public TimerHandler {
|
||||
// not exist, this will return an error.
|
||||
// This methods assumes that |metrics| is not null and that the |cdms_lock_|
|
||||
// has already been acquired.
|
||||
CdmResponseType GetMetricsInternal(const CdmIdentifier& identifier,
|
||||
drm_metrics::WvCdmMetrics* metrics);
|
||||
CdmResponseType GetCurrentMetricsInternal(const CdmIdentifier& identifier,
|
||||
drm_metrics::WvCdmMetrics* metrics);
|
||||
void SaveMetrics(const CdmIdentifier& identifier,
|
||||
drm_metrics::WvCdmMetrics&& metrics);
|
||||
|
||||
static std::mutex session_sharing_id_generation_lock_;
|
||||
std::mutex timer_lock_;
|
||||
@@ -264,6 +306,10 @@ class WvContentDecryptionModule : public android::RefBase, public TimerHandler {
|
||||
// - Hold lock when erasing, release once erased.
|
||||
std::mutex cdms_lock_;
|
||||
|
||||
// Contains a finite list of histories of different CDM engine instances.
|
||||
// When a CDM engine is closed, its metrics will be saved.
|
||||
std::deque<WvMetricsSnapshot> saved_metrics_snapshots_;
|
||||
|
||||
CORE_DISALLOW_COPY_AND_ASSIGN(WvContentDecryptionModule);
|
||||
};
|
||||
} // namespace wvcdm
|
||||
|
||||
Reference in New Issue
Block a user