| 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 |