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 "chromecast/media/cdm/browser_cdm_cast.h" | 5 #include "chromecast/media/cdm/browser_cdm_cast.h" |
6 | 6 |
| 7 #include <utility> |
| 8 |
7 #include "base/bind.h" | 9 #include "base/bind.h" |
8 #include "base/location.h" | 10 #include "base/location.h" |
9 #include "base/single_thread_task_runner.h" | 11 #include "base/single_thread_task_runner.h" |
10 #include "base/thread_task_runner_handle.h" | 12 #include "base/thread_task_runner_handle.h" |
11 #include "media/base/cdm_key_information.h" | 13 #include "media/base/cdm_key_information.h" |
12 #include "media/base/cdm_promise.h" | 14 #include "media/base/cdm_promise.h" |
13 #include "media/cdm/player_tracker_impl.h" | 15 #include "media/cdm/player_tracker_impl.h" |
14 | 16 |
15 namespace chromecast { | 17 namespace chromecast { |
16 namespace media { | 18 namespace media { |
17 | 19 |
18 namespace { | 20 namespace { |
19 | 21 |
20 // media::CdmPromiseTemplate implementation that wraps a promise so as to | 22 // media::CdmPromiseTemplate implementation that wraps a promise so as to |
21 // allow passing to other threads. | 23 // allow passing to other threads. |
22 template <typename... T> | 24 template <typename... T> |
23 class CdmPromiseInternal : public ::media::CdmPromiseTemplate<T...> { | 25 class CdmPromiseInternal : public ::media::CdmPromiseTemplate<T...> { |
24 public: | 26 public: |
25 CdmPromiseInternal(scoped_ptr<::media::CdmPromiseTemplate<T...>> promise) | 27 CdmPromiseInternal(scoped_ptr<::media::CdmPromiseTemplate<T...>> promise) |
26 : task_runner_(base::ThreadTaskRunnerHandle::Get()), | 28 : task_runner_(base::ThreadTaskRunnerHandle::Get()), |
27 promise_(promise.Pass()) { | 29 promise_(std::move(promise)) {} |
28 } | |
29 | 30 |
30 ~CdmPromiseInternal() final { | 31 ~CdmPromiseInternal() final { |
31 // Promise must be resolved or rejected before destruction. | 32 // Promise must be resolved or rejected before destruction. |
32 DCHECK(!promise_); | 33 DCHECK(!promise_); |
33 } | 34 } |
34 | 35 |
35 // CdmPromiseTemplate<> implementation. | 36 // CdmPromiseTemplate<> implementation. |
36 void resolve(const T&... result) final; | 37 void resolve(const T&... result) final; |
37 | 38 |
38 void reject(::media::MediaKeys::Exception exception, | 39 void reject(::media::MediaKeys::Exception exception, |
(...skipping 20 matching lines...) Expand all Loading... |
59 task_runner_->PostTask( | 60 task_runner_->PostTask( |
60 FROM_HERE, | 61 FROM_HERE, |
61 base::Bind(&::media::CdmPromiseTemplate<T...>::resolve, | 62 base::Bind(&::media::CdmPromiseTemplate<T...>::resolve, |
62 base::Owned(promise_.release()), | 63 base::Owned(promise_.release()), |
63 result...)); | 64 result...)); |
64 } | 65 } |
65 | 66 |
66 template <typename... T> | 67 template <typename... T> |
67 scoped_ptr<CdmPromiseInternal<T...>> BindPromiseToCurrentLoop( | 68 scoped_ptr<CdmPromiseInternal<T...>> BindPromiseToCurrentLoop( |
68 scoped_ptr<::media::CdmPromiseTemplate<T...>> promise) { | 69 scoped_ptr<::media::CdmPromiseTemplate<T...>> promise) { |
69 return make_scoped_ptr(new CdmPromiseInternal<T...>(promise.Pass())); | 70 return make_scoped_ptr(new CdmPromiseInternal<T...>(std::move(promise))); |
70 } | 71 } |
71 | 72 |
72 } // namespace | 73 } // namespace |
73 | 74 |
74 BrowserCdmCast::BrowserCdmCast() { | 75 BrowserCdmCast::BrowserCdmCast() { |
75 thread_checker_.DetachFromThread(); | 76 thread_checker_.DetachFromThread(); |
76 } | 77 } |
77 | 78 |
78 BrowserCdmCast::~BrowserCdmCast() { | 79 BrowserCdmCast::~BrowserCdmCast() { |
79 DCHECK(thread_checker_.CalledOnValidThread()); | 80 DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 destination_url); | 123 destination_url); |
123 } | 124 } |
124 | 125 |
125 void BrowserCdmCast::OnSessionClosed(const std::string& session_id) { | 126 void BrowserCdmCast::OnSessionClosed(const std::string& session_id) { |
126 session_closed_cb_.Run(session_id); | 127 session_closed_cb_.Run(session_id); |
127 } | 128 } |
128 | 129 |
129 void BrowserCdmCast::OnSessionKeysChange(const std::string& session_id, | 130 void BrowserCdmCast::OnSessionKeysChange(const std::string& session_id, |
130 bool newly_usable_keys, | 131 bool newly_usable_keys, |
131 ::media::CdmKeysInfo keys_info) { | 132 ::media::CdmKeysInfo keys_info) { |
132 session_keys_change_cb_.Run(session_id, newly_usable_keys, keys_info.Pass()); | 133 session_keys_change_cb_.Run(session_id, newly_usable_keys, |
| 134 std::move(keys_info)); |
133 | 135 |
134 if (newly_usable_keys) | 136 if (newly_usable_keys) |
135 player_tracker_impl_->NotifyNewKey(); | 137 player_tracker_impl_->NotifyNewKey(); |
136 } | 138 } |
137 | 139 |
138 void BrowserCdmCast::KeyIdAndKeyPairsToInfo( | 140 void BrowserCdmCast::KeyIdAndKeyPairsToInfo( |
139 const ::media::KeyIdAndKeyPairs& keys, | 141 const ::media::KeyIdAndKeyPairs& keys, |
140 ::media::CdmKeysInfo* keys_info) { | 142 ::media::CdmKeysInfo* keys_info) { |
141 DCHECK(keys_info); | 143 DCHECK(keys_info); |
142 for (const std::pair<std::string, std::string>& key : keys) { | 144 for (const std::pair<std::string, std::string>& key : keys) { |
(...skipping 27 matching lines...) Expand all Loading... |
170 BrowserCdmCast* BrowserCdmCastUi::browser_cdm_cast() const { | 172 BrowserCdmCast* BrowserCdmCastUi::browser_cdm_cast() const { |
171 DCHECK(thread_checker_.CalledOnValidThread()); | 173 DCHECK(thread_checker_.CalledOnValidThread()); |
172 return browser_cdm_cast_.get(); | 174 return browser_cdm_cast_.get(); |
173 } | 175 } |
174 | 176 |
175 void BrowserCdmCastUi::SetServerCertificate( | 177 void BrowserCdmCastUi::SetServerCertificate( |
176 const std::vector<uint8_t>& certificate, | 178 const std::vector<uint8_t>& certificate, |
177 scoped_ptr<::media::SimpleCdmPromise> promise) { | 179 scoped_ptr<::media::SimpleCdmPromise> promise) { |
178 DCHECK(thread_checker_.CalledOnValidThread()); | 180 DCHECK(thread_checker_.CalledOnValidThread()); |
179 FORWARD_ON_CDM_THREAD( | 181 FORWARD_ON_CDM_THREAD( |
180 SetServerCertificate, | 182 SetServerCertificate, certificate, |
181 certificate, | 183 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
182 base::Passed(BindPromiseToCurrentLoop(promise.Pass()))); | |
183 } | 184 } |
184 | 185 |
185 void BrowserCdmCastUi::CreateSessionAndGenerateRequest( | 186 void BrowserCdmCastUi::CreateSessionAndGenerateRequest( |
186 ::media::MediaKeys::SessionType session_type, | 187 ::media::MediaKeys::SessionType session_type, |
187 ::media::EmeInitDataType init_data_type, | 188 ::media::EmeInitDataType init_data_type, |
188 const std::vector<uint8_t>& init_data, | 189 const std::vector<uint8_t>& init_data, |
189 scoped_ptr<::media::NewSessionCdmPromise> promise) { | 190 scoped_ptr<::media::NewSessionCdmPromise> promise) { |
190 DCHECK(thread_checker_.CalledOnValidThread()); | 191 DCHECK(thread_checker_.CalledOnValidThread()); |
191 FORWARD_ON_CDM_THREAD( | 192 FORWARD_ON_CDM_THREAD( |
192 CreateSessionAndGenerateRequest, | 193 CreateSessionAndGenerateRequest, session_type, init_data_type, init_data, |
193 session_type, | 194 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
194 init_data_type, | |
195 init_data, | |
196 base::Passed(BindPromiseToCurrentLoop(promise.Pass()))); | |
197 } | 195 } |
198 | 196 |
199 void BrowserCdmCastUi::LoadSession( | 197 void BrowserCdmCastUi::LoadSession( |
200 ::media::MediaKeys::SessionType session_type, | 198 ::media::MediaKeys::SessionType session_type, |
201 const std::string& session_id, | 199 const std::string& session_id, |
202 scoped_ptr<::media::NewSessionCdmPromise> promise) { | 200 scoped_ptr<::media::NewSessionCdmPromise> promise) { |
203 DCHECK(thread_checker_.CalledOnValidThread()); | 201 DCHECK(thread_checker_.CalledOnValidThread()); |
204 FORWARD_ON_CDM_THREAD( | 202 FORWARD_ON_CDM_THREAD( |
205 LoadSession, session_type, session_id, | 203 LoadSession, session_type, session_id, |
206 base::Passed(BindPromiseToCurrentLoop(promise.Pass()))); | 204 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
207 } | 205 } |
208 | 206 |
209 void BrowserCdmCastUi::UpdateSession( | 207 void BrowserCdmCastUi::UpdateSession( |
210 const std::string& session_id, | 208 const std::string& session_id, |
211 const std::vector<uint8_t>& response, | 209 const std::vector<uint8_t>& response, |
212 scoped_ptr<::media::SimpleCdmPromise> promise) { | 210 scoped_ptr<::media::SimpleCdmPromise> promise) { |
213 DCHECK(thread_checker_.CalledOnValidThread()); | 211 DCHECK(thread_checker_.CalledOnValidThread()); |
214 FORWARD_ON_CDM_THREAD( | 212 FORWARD_ON_CDM_THREAD( |
215 UpdateSession, | 213 UpdateSession, session_id, response, |
216 session_id, | 214 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
217 response, | |
218 base::Passed(BindPromiseToCurrentLoop(promise.Pass()))); | |
219 } | 215 } |
220 | 216 |
221 void BrowserCdmCastUi::CloseSession( | 217 void BrowserCdmCastUi::CloseSession( |
222 const std::string& session_id, | 218 const std::string& session_id, |
223 scoped_ptr<::media::SimpleCdmPromise> promise) { | 219 scoped_ptr<::media::SimpleCdmPromise> promise) { |
224 DCHECK(thread_checker_.CalledOnValidThread()); | 220 DCHECK(thread_checker_.CalledOnValidThread()); |
225 FORWARD_ON_CDM_THREAD(CloseSession, session_id, | 221 FORWARD_ON_CDM_THREAD( |
226 base::Passed(BindPromiseToCurrentLoop(promise.Pass()))); | 222 CloseSession, session_id, |
| 223 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
227 } | 224 } |
228 | 225 |
229 void BrowserCdmCastUi::RemoveSession( | 226 void BrowserCdmCastUi::RemoveSession( |
230 const std::string& session_id, | 227 const std::string& session_id, |
231 scoped_ptr<::media::SimpleCdmPromise> promise) { | 228 scoped_ptr<::media::SimpleCdmPromise> promise) { |
232 DCHECK(thread_checker_.CalledOnValidThread()); | 229 DCHECK(thread_checker_.CalledOnValidThread()); |
233 FORWARD_ON_CDM_THREAD(RemoveSession, session_id, | 230 FORWARD_ON_CDM_THREAD( |
234 base::Passed(BindPromiseToCurrentLoop(promise.Pass()))); | 231 RemoveSession, session_id, |
| 232 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
235 } | 233 } |
236 | 234 |
237 // A default empty implementation for subclasses that don't need to provide | 235 // A default empty implementation for subclasses that don't need to provide |
238 // any key system specific initialization. | 236 // any key system specific initialization. |
239 void BrowserCdmCast::InitializeInternal() { | 237 void BrowserCdmCast::InitializeInternal() { |
240 } | 238 } |
241 | 239 |
242 } // namespace media | 240 } // namespace media |
243 } // namespace chromecast | 241 } // namespace chromecast |
OLD | NEW |