Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(916)

Unified Diff: media/mojo/services/mojo_cdm_service.cc

Issue 1448303002: media: Add static MojoCdmService::GetCdm(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments addressed Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/mojo/services/mojo_cdm_service.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/mojo/services/mojo_cdm_service.cc
diff --git a/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc
index 4a163872305d5572e6c6abd2a1fb8716976c321f..3eea8079f9f0362b9f8a22789fa3690130736712 100644
--- a/media/mojo/services/mojo_cdm_service.cc
+++ b/media/mojo/services/mojo_cdm_service.cc
@@ -4,7 +4,11 @@
#include "media/mojo/services/mojo_cdm_service.h"
+#include <map>
+
#include "base/bind.h"
+#include "base/lazy_instance.h"
+#include "base/synchronization/lock.h"
#include "media/base/cdm_config.h"
#include "media/base/cdm_context.h"
#include "media/base/cdm_factory.h"
@@ -18,12 +22,60 @@
namespace media {
+namespace {
+
+// Manages all CDMs created by MojoCdmService. Can only have one instance per
+// process so use a LazyInstance to ensure this.
+class CdmManager {
+ public:
+ CdmManager() {}
+ ~CdmManager() {}
+
+ // Returns the CDM associated with |cdm_id|. Can be called on any thread.
+ scoped_refptr<MediaKeys> GetCdm(int cdm_id) {
+ base::AutoLock lock(lock_);
+ auto iter = cdm_map_.find(cdm_id);
+ return iter == cdm_map_.end() ? nullptr : iter->second;
+ }
+
+ // Registers the |cdm| for |cdm_id|.
+ void RegisterCdm(int cdm_id, const scoped_refptr<MediaKeys>& cdm) {
+ base::AutoLock lock(lock_);
+ DCHECK(!cdm_map_.count(cdm_id));
+ cdm_map_[cdm_id] = cdm;
+ }
+
+ // Unregisters the CDM associated with |cdm_id|.
+ void UnregisterCdm(int cdm_id) {
+ base::AutoLock lock(lock_);
+ DCHECK(cdm_map_.count(cdm_id));
+ cdm_map_.erase(cdm_id);
+ }
+
+ private:
+ // Lock to protect |cdm_map_|.
+ base::Lock lock_;
+ std::map<int, scoped_refptr<MediaKeys>> cdm_map_;
+
+ DISALLOW_COPY_AND_ASSIGN(CdmManager);
+};
+
+base::LazyInstance<CdmManager>::Leaky g_cdm_manager = LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
using SimpleMojoCdmPromise = MojoCdmPromise<>;
using CdmIdMojoCdmPromise = MojoCdmPromise<int>;
using NewSessionMojoCdmPromise = MojoCdmPromise<std::string>;
int MojoCdmService::next_cdm_id_ = CdmContext::kInvalidCdmId + 1;
+// static
+scoped_refptr<MediaKeys> MojoCdmService::GetCdm(int cdm_id) {
+ DVLOG(1) << __FUNCTION__ << ": " << cdm_id;
+ return g_cdm_manager.Get().GetCdm(cdm_id);
+}
+
MojoCdmService::MojoCdmService(
base::WeakPtr<MojoCdmServiceContext> context,
mojo::ServiceProvider* service_provider,
@@ -40,6 +92,8 @@ MojoCdmService::MojoCdmService(
}
MojoCdmService::~MojoCdmService() {
+ g_cdm_manager.Get().UnregisterCdm(cdm_id_);
+
if (cdm_id_ != CdmContext::kInvalidCdmId && context_)
context_->UnregisterCdm(cdm_id_);
}
@@ -151,7 +205,11 @@ void MojoCdmService::OnCdmCreated(scoped_ptr<CdmIdMojoCdmPromise> promise,
cdm_ = cdm;
cdm_id_ = next_cdm_id_++;
+
context_->RegisterCdm(cdm_id_, this);
+ g_cdm_manager.Get().RegisterCdm(cdm_id_, cdm);
+
+ DVLOG(1) << __FUNCTION__ << ": CDM successfully created with ID " << cdm_id_;
promise->resolve(cdm_id_);
}
« no previous file with comments | « media/mojo/services/mojo_cdm_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698