OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/mojo/services/mojo_cdm_service.h" | 5 #include "media/mojo/services/mojo_cdm_service.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 namespace { | 27 namespace { |
28 | 28 |
29 // Manages all CDMs created by MojoCdmService. Can only have one instance per | 29 // Manages all CDMs created by MojoCdmService. Can only have one instance per |
30 // process so use a LazyInstance to ensure this. | 30 // process so use a LazyInstance to ensure this. |
31 class CdmManager { | 31 class CdmManager { |
32 public: | 32 public: |
33 CdmManager() {} | 33 CdmManager() {} |
34 ~CdmManager() {} | 34 ~CdmManager() {} |
35 | 35 |
36 // Returns the CDM associated with |cdm_id|. Can be called on any thread. | 36 // Returns the CDM associated with |cdm_id|. Can be called on any thread. |
37 scoped_refptr<MediaKeys> GetCdm(int cdm_id) { | 37 scoped_refptr<ContentDecryptionModule> GetCdm(int cdm_id) { |
38 base::AutoLock lock(lock_); | 38 base::AutoLock lock(lock_); |
39 auto iter = cdm_map_.find(cdm_id); | 39 auto iter = cdm_map_.find(cdm_id); |
40 return iter == cdm_map_.end() ? nullptr : iter->second; | 40 return iter == cdm_map_.end() ? nullptr : iter->second; |
41 } | 41 } |
42 | 42 |
43 // Registers the |cdm| for |cdm_id|. | 43 // Registers the |cdm| for |cdm_id|. |
44 void RegisterCdm(int cdm_id, const scoped_refptr<MediaKeys>& cdm) { | 44 void RegisterCdm(int cdm_id, |
| 45 const scoped_refptr<ContentDecryptionModule>& cdm) { |
45 base::AutoLock lock(lock_); | 46 base::AutoLock lock(lock_); |
46 DCHECK(!cdm_map_.count(cdm_id)); | 47 DCHECK(!cdm_map_.count(cdm_id)); |
47 cdm_map_[cdm_id] = cdm; | 48 cdm_map_[cdm_id] = cdm; |
48 } | 49 } |
49 | 50 |
50 // Unregisters the CDM associated with |cdm_id|. | 51 // Unregisters the CDM associated with |cdm_id|. |
51 void UnregisterCdm(int cdm_id) { | 52 void UnregisterCdm(int cdm_id) { |
52 base::AutoLock lock(lock_); | 53 base::AutoLock lock(lock_); |
53 DCHECK(cdm_map_.count(cdm_id)); | 54 DCHECK(cdm_map_.count(cdm_id)); |
54 cdm_map_.erase(cdm_id); | 55 cdm_map_.erase(cdm_id); |
55 } | 56 } |
56 | 57 |
57 private: | 58 private: |
58 // Lock to protect |cdm_map_|. | 59 // Lock to protect |cdm_map_|. |
59 base::Lock lock_; | 60 base::Lock lock_; |
60 std::map<int, scoped_refptr<MediaKeys>> cdm_map_; | 61 std::map<int, scoped_refptr<ContentDecryptionModule>> cdm_map_; |
61 | 62 |
62 DISALLOW_COPY_AND_ASSIGN(CdmManager); | 63 DISALLOW_COPY_AND_ASSIGN(CdmManager); |
63 }; | 64 }; |
64 | 65 |
65 base::LazyInstance<CdmManager>::Leaky g_cdm_manager = LAZY_INSTANCE_INITIALIZER; | 66 base::LazyInstance<CdmManager>::Leaky g_cdm_manager = LAZY_INSTANCE_INITIALIZER; |
66 | 67 |
67 } // namespace | 68 } // namespace |
68 | 69 |
69 using SimpleMojoCdmPromise = MojoCdmPromise<>; | 70 using SimpleMojoCdmPromise = MojoCdmPromise<>; |
70 using NewSessionMojoCdmPromise = MojoCdmPromise<std::string>; | 71 using NewSessionMojoCdmPromise = MojoCdmPromise<std::string>; |
71 | 72 |
72 int MojoCdmService::next_cdm_id_ = CdmContext::kInvalidCdmId + 1; | 73 int MojoCdmService::next_cdm_id_ = CdmContext::kInvalidCdmId + 1; |
73 | 74 |
74 // static | 75 // static |
75 scoped_refptr<MediaKeys> MojoCdmService::LegacyGetCdm(int cdm_id) { | 76 scoped_refptr<ContentDecryptionModule> MojoCdmService::LegacyGetCdm( |
| 77 int cdm_id) { |
76 DVLOG(1) << __func__ << ": " << cdm_id; | 78 DVLOG(1) << __func__ << ": " << cdm_id; |
77 return g_cdm_manager.Get().GetCdm(cdm_id); | 79 return g_cdm_manager.Get().GetCdm(cdm_id); |
78 } | 80 } |
79 | 81 |
80 MojoCdmService::MojoCdmService(base::WeakPtr<MojoCdmServiceContext> context, | 82 MojoCdmService::MojoCdmService(base::WeakPtr<MojoCdmServiceContext> context, |
81 CdmFactory* cdm_factory) | 83 CdmFactory* cdm_factory) |
82 : context_(context), | 84 : context_(context), |
83 cdm_factory_(cdm_factory), | 85 cdm_factory_(cdm_factory), |
84 cdm_id_(CdmContext::kInvalidCdmId), | 86 cdm_id_(CdmContext::kInvalidCdmId), |
85 weak_factory_(this) { | 87 weak_factory_(this) { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 base::MakeUnique<SimpleMojoCdmPromise>(callback)); | 163 base::MakeUnique<SimpleMojoCdmPromise>(callback)); |
162 } | 164 } |
163 | 165 |
164 void MojoCdmService::RemoveSession(const std::string& session_id, | 166 void MojoCdmService::RemoveSession(const std::string& session_id, |
165 const RemoveSessionCallback& callback) { | 167 const RemoveSessionCallback& callback) { |
166 DVLOG(2) << __func__; | 168 DVLOG(2) << __func__; |
167 cdm_->RemoveSession(session_id, | 169 cdm_->RemoveSession(session_id, |
168 base::MakeUnique<SimpleMojoCdmPromise>(callback)); | 170 base::MakeUnique<SimpleMojoCdmPromise>(callback)); |
169 } | 171 } |
170 | 172 |
171 scoped_refptr<MediaKeys> MojoCdmService::GetCdm() { | 173 scoped_refptr<ContentDecryptionModule> MojoCdmService::GetCdm() { |
172 return cdm_; | 174 return cdm_; |
173 } | 175 } |
174 | 176 |
175 void MojoCdmService::OnCdmCreated(const InitializeCallback& callback, | 177 void MojoCdmService::OnCdmCreated( |
176 const scoped_refptr<MediaKeys>& cdm, | 178 const InitializeCallback& callback, |
177 const std::string& error_message) { | 179 const scoped_refptr<::media::ContentDecryptionModule>& cdm, |
| 180 const std::string& error_message) { |
178 mojom::CdmPromiseResultPtr cdm_promise_result(mojom::CdmPromiseResult::New()); | 181 mojom::CdmPromiseResultPtr cdm_promise_result(mojom::CdmPromiseResult::New()); |
179 | 182 |
180 // TODO(xhwang): This should not happen when KeySystemInfo is properly | 183 // TODO(xhwang): This should not happen when KeySystemInfo is properly |
181 // populated. See http://crbug.com/469366 | 184 // populated. See http://crbug.com/469366 |
182 if (!cdm || !context_) { | 185 if (!cdm || !context_) { |
183 cdm_promise_result->success = false; | 186 cdm_promise_result->success = false; |
184 cdm_promise_result->exception = CdmPromise::Exception::NOT_SUPPORTED_ERROR; | 187 cdm_promise_result->exception = CdmPromise::Exception::NOT_SUPPORTED_ERROR; |
185 cdm_promise_result->system_code = 0; | 188 cdm_promise_result->system_code = 0; |
186 cdm_promise_result->error_message = error_message; | 189 cdm_promise_result->error_message = error_message; |
187 callback.Run(std::move(cdm_promise_result), 0, nullptr); | 190 callback.Run(std::move(cdm_promise_result), 0, nullptr); |
(...skipping 17 matching lines...) Expand all Loading... |
205 cdm_, GetProxy(&decryptor_service), | 208 cdm_, GetProxy(&decryptor_service), |
206 base::Bind(&MojoCdmService::OnDecryptorConnectionError, weak_this_))); | 209 base::Bind(&MojoCdmService::OnDecryptorConnectionError, weak_this_))); |
207 } | 210 } |
208 | 211 |
209 DVLOG(1) << __func__ << ": CDM successfully created with ID " << cdm_id_; | 212 DVLOG(1) << __func__ << ": CDM successfully created with ID " << cdm_id_; |
210 cdm_promise_result->success = true; | 213 cdm_promise_result->success = true; |
211 callback.Run(std::move(cdm_promise_result), cdm_id_, | 214 callback.Run(std::move(cdm_promise_result), cdm_id_, |
212 std::move(decryptor_service)); | 215 std::move(decryptor_service)); |
213 } | 216 } |
214 | 217 |
215 void MojoCdmService::OnSessionMessage(const std::string& session_id, | 218 void MojoCdmService::OnSessionMessage( |
216 MediaKeys::MessageType message_type, | 219 const std::string& session_id, |
217 const std::vector<uint8_t>& message) { | 220 ::media::ContentDecryptionModule::MessageType message_type, |
| 221 const std::vector<uint8_t>& message) { |
218 DVLOG(2) << __func__ << "(" << message_type << ")"; | 222 DVLOG(2) << __func__ << "(" << message_type << ")"; |
219 client_->OnSessionMessage(session_id, message_type, message); | 223 client_->OnSessionMessage(session_id, message_type, message); |
220 } | 224 } |
221 | 225 |
222 void MojoCdmService::OnSessionKeysChange(const std::string& session_id, | 226 void MojoCdmService::OnSessionKeysChange(const std::string& session_id, |
223 bool has_additional_usable_key, | 227 bool has_additional_usable_key, |
224 CdmKeysInfo keys_info) { | 228 CdmKeysInfo keys_info) { |
225 DVLOG(2) << __func__ | 229 DVLOG(2) << __func__ |
226 << " has_additional_usable_key=" << has_additional_usable_key; | 230 << " has_additional_usable_key=" << has_additional_usable_key; |
227 | 231 |
(...skipping 18 matching lines...) Expand all Loading... |
246 | 250 |
247 void MojoCdmService::OnDecryptorConnectionError() { | 251 void MojoCdmService::OnDecryptorConnectionError() { |
248 DVLOG(2) << __func__; | 252 DVLOG(2) << __func__; |
249 | 253 |
250 // MojoDecryptorService has lost connectivity to it's client, so it can be | 254 // MojoDecryptorService has lost connectivity to it's client, so it can be |
251 // freed. | 255 // freed. |
252 decryptor_.reset(); | 256 decryptor_.reset(); |
253 } | 257 } |
254 | 258 |
255 } // namespace media | 259 } // namespace media |
OLD | NEW |