Chromium Code Reviews| 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..23c040dc4ed2a40cfb1ab91a2000621796352f6d 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,58 @@ |
| 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(cdm_map_lock_); |
| + return cdm_map_.count(cdm_id) ? cdm_map_[cdm_id] : nullptr; |
|
DaleCurtis
2015/11/18 01:00:21
General question: Why count instead of find? For a
xhwang
2015/11/18 18:45:39
Done.
|
| + } |
| + |
| + // Registers the |cdm| for |cdm_id|. |
| + void RegisterCdm(int cdm_id, const scoped_refptr<MediaKeys>& cdm) { |
| + base::AutoLock lock(cdm_map_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(cdm_map_lock_); |
| + DCHECK(cdm_map_.count(cdm_id)); |
| + cdm_map_.erase(cdm_id); |
| + } |
| + |
| + private: |
| + base::Lock cdm_map_lock_; |
|
Tima Vaisburd
2015/11/18 01:24:20
nit: I would rename |cdm_map_lock_| into |lock_| b
xhwang
2015/11/18 18:45:39
Done.
|
| + std::map<int, scoped_refptr<MediaKeys>> cdm_map_; |
|
DaleCurtis
2015/11/18 01:00:21
Map is fine, but if you only ever expect 1 or 2 of
xhwang
2015/11/18 18:45:39
I don't really see performance difference here and
|
| + |
| + 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 +90,8 @@ MojoCdmService::MojoCdmService( |
| } |
| MojoCdmService::~MojoCdmService() { |
| + g_cdm_manager.Get().UnregisterCdm(cdm_id_); |
| + |
| if (cdm_id_ != CdmContext::kInvalidCdmId && context_) |
| context_->UnregisterCdm(cdm_id_); |
| } |
| @@ -151,7 +203,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_); |
| } |