Create unique cdm engines per WVDrmPlugin instance
This change creates a unique id in the cdm identifier in order to force a one-to-one mapping between WVDrmPlugin instances and CDM Engines. This change simplifies some assumptions. This includes ensuring that the metrics for a given MediaDrm instance map to a given CdmEngine instance. This change contains the original change go/ag/3819203 and a fix to the deadlock that was seen on Marlin and Taimen. Bug: 73724453 Test: Updated unit tests. GTS test pass. Shaka Player, Netflix and Google Play test. Change-Id: Ib208204a1b794df9f306fa11d13a8bb6cd6889f7
This commit is contained in:
@@ -129,9 +129,14 @@ class WvContentDecryptionModule : public android::RefBase, public TimerHandler {
|
||||
// Validate a passed-in service certificate
|
||||
virtual bool IsValidServiceCertificate(const std::string& certificate);
|
||||
|
||||
// Retrieve the serialized metrics from CdmEngine and CdmSession instances
|
||||
// that have been closed.
|
||||
virtual void GetSerializedMetrics(std::string* serialized_metrics);
|
||||
// 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);
|
||||
|
||||
// Closes the CdmEngine and sessions associated with the given CdmIdentifier.
|
||||
virtual CdmResponseType CloseCdm(const CdmIdentifier& identifier);
|
||||
|
||||
private:
|
||||
struct CdmInfo {
|
||||
@@ -147,17 +152,16 @@ class WvContentDecryptionModule : public android::RefBase, public TimerHandler {
|
||||
// Finds the CdmEngine instance for the given session id, returning NULL if
|
||||
// not found.
|
||||
CdmEngine* GetCdmForSessionId(const std::string& session_id);
|
||||
// Closes CdmEngine instances that don't have any open sessions. Also stores
|
||||
// metrics data for closed CdmEngine instances.
|
||||
// Callers must acquire the cdms_lock_ before calling this method.
|
||||
void CloseCdmsWithoutSessions();
|
||||
|
||||
// Close all of the open CdmEngine instances. This is used when ready to close
|
||||
// the WvContentDecryptionModule instance.
|
||||
void CloseAllCdms();
|
||||
|
||||
uint32_t GenerateSessionSharingId();
|
||||
|
||||
// timer related methods to drive policy decisions
|
||||
void EnablePolicyTimer();
|
||||
void DisablePolicyTimer(); // Disable if all cdm engines are closed.
|
||||
void ForceDisablePolicyTimer(); // Force disable the policy timer.
|
||||
void DisablePolicyTimer();
|
||||
void OnTimerEvent();
|
||||
|
||||
static Lock session_sharing_id_generation_lock_;
|
||||
@@ -172,9 +176,6 @@ class WvContentDecryptionModule : public android::RefBase, public TimerHandler {
|
||||
// This contains weak pointers to the CDM instances contained in |cdms_|.
|
||||
std::map<std::string, CdmEngine*> cdm_by_session_id_;
|
||||
|
||||
// The metrics for cdm engines and sessions that have been closed.
|
||||
drm_metrics::WvCdmMetricsGroup metrics_group_;
|
||||
|
||||
CORE_DISALLOW_COPY_AND_ASSIGN(WvContentDecryptionModule);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user