| 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> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| 11 #include "base/memory/ptr_util.h" |
| 11 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 12 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
| 13 #include "chromecast/media/base/media_resource_tracker.h" | 14 #include "chromecast/media/base/media_resource_tracker.h" |
| 14 #include "media/base/cdm_key_information.h" | 15 #include "media/base/cdm_key_information.h" |
| 15 #include "media/base/cdm_promise.h" | 16 #include "media/base/cdm_promise.h" |
| 16 #include "media/cdm/player_tracker_impl.h" | 17 #include "media/cdm/player_tracker_impl.h" |
| 17 | 18 |
| 18 namespace chromecast { | 19 namespace chromecast { |
| 19 namespace media { | 20 namespace media { |
| 20 | 21 |
| 21 namespace { | 22 namespace { |
| 22 | 23 |
| 23 // media::CdmPromiseTemplate implementation that wraps a promise so as to | 24 // media::CdmPromiseTemplate implementation that wraps a promise so as to |
| 24 // allow passing to other threads. | 25 // allow passing to other threads. |
| 25 template <typename... T> | 26 template <typename... T> |
| 26 class CdmPromiseInternal : public ::media::CdmPromiseTemplate<T...> { | 27 class CdmPromiseInternal : public ::media::CdmPromiseTemplate<T...> { |
| 27 public: | 28 public: |
| 28 CdmPromiseInternal(scoped_ptr<::media::CdmPromiseTemplate<T...>> promise) | 29 CdmPromiseInternal(std::unique_ptr<::media::CdmPromiseTemplate<T...>> promise) |
| 29 : task_runner_(base::ThreadTaskRunnerHandle::Get()), | 30 : task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 30 promise_(std::move(promise)) {} | 31 promise_(std::move(promise)) {} |
| 31 | 32 |
| 32 ~CdmPromiseInternal() final { | 33 ~CdmPromiseInternal() final { |
| 33 if (IsPromiseSettled()) | 34 if (IsPromiseSettled()) |
| 34 return; | 35 return; |
| 35 | 36 |
| 36 DCHECK(promise_); | 37 DCHECK(promise_); |
| 37 RejectPromiseOnDestruction(); | 38 RejectPromiseOnDestruction(); |
| 38 } | 39 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 50 base::Owned(promise_.release()), | 51 base::Owned(promise_.release()), |
| 51 exception, system_code, error_message)); | 52 exception, system_code, error_message)); |
| 52 } | 53 } |
| 53 | 54 |
| 54 private: | 55 private: |
| 55 using ::media::CdmPromiseTemplate<T...>::IsPromiseSettled; | 56 using ::media::CdmPromiseTemplate<T...>::IsPromiseSettled; |
| 56 using ::media::CdmPromiseTemplate<T...>::MarkPromiseSettled; | 57 using ::media::CdmPromiseTemplate<T...>::MarkPromiseSettled; |
| 57 using ::media::CdmPromiseTemplate<T...>::RejectPromiseOnDestruction; | 58 using ::media::CdmPromiseTemplate<T...>::RejectPromiseOnDestruction; |
| 58 | 59 |
| 59 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 60 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 60 scoped_ptr<::media::CdmPromiseTemplate<T...>> promise_; | 61 std::unique_ptr<::media::CdmPromiseTemplate<T...>> promise_; |
| 61 }; | 62 }; |
| 62 | 63 |
| 63 template <typename... T> | 64 template <typename... T> |
| 64 void CdmPromiseInternal<T...>::resolve(const T&... result) { | 65 void CdmPromiseInternal<T...>::resolve(const T&... result) { |
| 65 MarkPromiseSettled(); | 66 MarkPromiseSettled(); |
| 66 task_runner_->PostTask( | 67 task_runner_->PostTask( |
| 67 FROM_HERE, | 68 FROM_HERE, |
| 68 base::Bind(&::media::CdmPromiseTemplate<T...>::resolve, | 69 base::Bind(&::media::CdmPromiseTemplate<T...>::resolve, |
| 69 base::Owned(promise_.release()), | 70 base::Owned(promise_.release()), |
| 70 result...)); | 71 result...)); |
| 71 } | 72 } |
| 72 | 73 |
| 73 template <typename... T> | 74 template <typename... T> |
| 74 scoped_ptr<CdmPromiseInternal<T...>> BindPromiseToCurrentLoop( | 75 std::unique_ptr<CdmPromiseInternal<T...>> BindPromiseToCurrentLoop( |
| 75 scoped_ptr<::media::CdmPromiseTemplate<T...>> promise) { | 76 std::unique_ptr<::media::CdmPromiseTemplate<T...>> promise) { |
| 76 return make_scoped_ptr(new CdmPromiseInternal<T...>(std::move(promise))); | 77 return base::WrapUnique(new CdmPromiseInternal<T...>(std::move(promise))); |
| 77 } | 78 } |
| 78 | 79 |
| 79 } // namespace | 80 } // namespace |
| 80 | 81 |
| 81 BrowserCdmCast::BrowserCdmCast(MediaResourceTracker* media_resource_tracker) | 82 BrowserCdmCast::BrowserCdmCast(MediaResourceTracker* media_resource_tracker) |
| 82 : media_resource_tracker_(media_resource_tracker) { | 83 : media_resource_tracker_(media_resource_tracker) { |
| 83 DCHECK(media_resource_tracker); | 84 DCHECK(media_resource_tracker); |
| 84 thread_checker_.DetachFromThread(); | 85 thread_checker_.DetachFromThread(); |
| 85 } | 86 } |
| 86 | 87 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 | 146 |
| 146 if (newly_usable_keys) | 147 if (newly_usable_keys) |
| 147 player_tracker_impl_->NotifyNewKey(); | 148 player_tracker_impl_->NotifyNewKey(); |
| 148 } | 149 } |
| 149 | 150 |
| 150 void BrowserCdmCast::KeyIdAndKeyPairsToInfo( | 151 void BrowserCdmCast::KeyIdAndKeyPairsToInfo( |
| 151 const ::media::KeyIdAndKeyPairs& keys, | 152 const ::media::KeyIdAndKeyPairs& keys, |
| 152 ::media::CdmKeysInfo* keys_info) { | 153 ::media::CdmKeysInfo* keys_info) { |
| 153 DCHECK(keys_info); | 154 DCHECK(keys_info); |
| 154 for (const std::pair<std::string, std::string>& key : keys) { | 155 for (const std::pair<std::string, std::string>& key : keys) { |
| 155 scoped_ptr<::media::CdmKeyInformation> cdm_key_information( | 156 std::unique_ptr<::media::CdmKeyInformation> cdm_key_information( |
| 156 new ::media::CdmKeyInformation(key.first, | 157 new ::media::CdmKeyInformation(key.first, |
| 157 ::media::CdmKeyInformation::USABLE, 0)); | 158 ::media::CdmKeyInformation::USABLE, 0)); |
| 158 keys_info->push_back(cdm_key_information.release()); | 159 keys_info->push_back(cdm_key_information.release()); |
| 159 } | 160 } |
| 160 } | 161 } |
| 161 | 162 |
| 162 // A macro runs current member function on |task_runner_| thread. | 163 // A macro runs current member function on |task_runner_| thread. |
| 163 #define FORWARD_ON_CDM_THREAD(param_fn, ...) \ | 164 #define FORWARD_ON_CDM_THREAD(param_fn, ...) \ |
| 164 task_runner_->PostTask( \ | 165 task_runner_->PostTask( \ |
| 165 FROM_HERE, \ | 166 FROM_HERE, \ |
| (...skipping 13 matching lines...) Expand all Loading... |
| 179 task_runner_->ReleaseSoon(FROM_HERE, raw_cdm); | 180 task_runner_->ReleaseSoon(FROM_HERE, raw_cdm); |
| 180 } | 181 } |
| 181 | 182 |
| 182 BrowserCdmCast* BrowserCdmCastUi::browser_cdm_cast() const { | 183 BrowserCdmCast* BrowserCdmCastUi::browser_cdm_cast() const { |
| 183 DCHECK(thread_checker_.CalledOnValidThread()); | 184 DCHECK(thread_checker_.CalledOnValidThread()); |
| 184 return browser_cdm_cast_.get(); | 185 return browser_cdm_cast_.get(); |
| 185 } | 186 } |
| 186 | 187 |
| 187 void BrowserCdmCastUi::SetServerCertificate( | 188 void BrowserCdmCastUi::SetServerCertificate( |
| 188 const std::vector<uint8_t>& certificate, | 189 const std::vector<uint8_t>& certificate, |
| 189 scoped_ptr<::media::SimpleCdmPromise> promise) { | 190 std::unique_ptr<::media::SimpleCdmPromise> promise) { |
| 190 DCHECK(thread_checker_.CalledOnValidThread()); | 191 DCHECK(thread_checker_.CalledOnValidThread()); |
| 191 FORWARD_ON_CDM_THREAD( | 192 FORWARD_ON_CDM_THREAD( |
| 192 SetServerCertificate, certificate, | 193 SetServerCertificate, certificate, |
| 193 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); | 194 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
| 194 } | 195 } |
| 195 | 196 |
| 196 void BrowserCdmCastUi::CreateSessionAndGenerateRequest( | 197 void BrowserCdmCastUi::CreateSessionAndGenerateRequest( |
| 197 ::media::MediaKeys::SessionType session_type, | 198 ::media::MediaKeys::SessionType session_type, |
| 198 ::media::EmeInitDataType init_data_type, | 199 ::media::EmeInitDataType init_data_type, |
| 199 const std::vector<uint8_t>& init_data, | 200 const std::vector<uint8_t>& init_data, |
| 200 scoped_ptr<::media::NewSessionCdmPromise> promise) { | 201 std::unique_ptr<::media::NewSessionCdmPromise> promise) { |
| 201 DCHECK(thread_checker_.CalledOnValidThread()); | 202 DCHECK(thread_checker_.CalledOnValidThread()); |
| 202 FORWARD_ON_CDM_THREAD( | 203 FORWARD_ON_CDM_THREAD( |
| 203 CreateSessionAndGenerateRequest, session_type, init_data_type, init_data, | 204 CreateSessionAndGenerateRequest, session_type, init_data_type, init_data, |
| 204 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); | 205 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
| 205 } | 206 } |
| 206 | 207 |
| 207 void BrowserCdmCastUi::LoadSession( | 208 void BrowserCdmCastUi::LoadSession( |
| 208 ::media::MediaKeys::SessionType session_type, | 209 ::media::MediaKeys::SessionType session_type, |
| 209 const std::string& session_id, | 210 const std::string& session_id, |
| 210 scoped_ptr<::media::NewSessionCdmPromise> promise) { | 211 std::unique_ptr<::media::NewSessionCdmPromise> promise) { |
| 211 DCHECK(thread_checker_.CalledOnValidThread()); | 212 DCHECK(thread_checker_.CalledOnValidThread()); |
| 212 FORWARD_ON_CDM_THREAD( | 213 FORWARD_ON_CDM_THREAD( |
| 213 LoadSession, session_type, session_id, | 214 LoadSession, session_type, session_id, |
| 214 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); | 215 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
| 215 } | 216 } |
| 216 | 217 |
| 217 void BrowserCdmCastUi::UpdateSession( | 218 void BrowserCdmCastUi::UpdateSession( |
| 218 const std::string& session_id, | 219 const std::string& session_id, |
| 219 const std::vector<uint8_t>& response, | 220 const std::vector<uint8_t>& response, |
| 220 scoped_ptr<::media::SimpleCdmPromise> promise) { | 221 std::unique_ptr<::media::SimpleCdmPromise> promise) { |
| 221 DCHECK(thread_checker_.CalledOnValidThread()); | 222 DCHECK(thread_checker_.CalledOnValidThread()); |
| 222 FORWARD_ON_CDM_THREAD( | 223 FORWARD_ON_CDM_THREAD( |
| 223 UpdateSession, session_id, response, | 224 UpdateSession, session_id, response, |
| 224 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); | 225 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
| 225 } | 226 } |
| 226 | 227 |
| 227 void BrowserCdmCastUi::CloseSession( | 228 void BrowserCdmCastUi::CloseSession( |
| 228 const std::string& session_id, | 229 const std::string& session_id, |
| 229 scoped_ptr<::media::SimpleCdmPromise> promise) { | 230 std::unique_ptr<::media::SimpleCdmPromise> promise) { |
| 230 DCHECK(thread_checker_.CalledOnValidThread()); | 231 DCHECK(thread_checker_.CalledOnValidThread()); |
| 231 FORWARD_ON_CDM_THREAD( | 232 FORWARD_ON_CDM_THREAD( |
| 232 CloseSession, session_id, | 233 CloseSession, session_id, |
| 233 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); | 234 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
| 234 } | 235 } |
| 235 | 236 |
| 236 void BrowserCdmCastUi::RemoveSession( | 237 void BrowserCdmCastUi::RemoveSession( |
| 237 const std::string& session_id, | 238 const std::string& session_id, |
| 238 scoped_ptr<::media::SimpleCdmPromise> promise) { | 239 std::unique_ptr<::media::SimpleCdmPromise> promise) { |
| 239 DCHECK(thread_checker_.CalledOnValidThread()); | 240 DCHECK(thread_checker_.CalledOnValidThread()); |
| 240 FORWARD_ON_CDM_THREAD( | 241 FORWARD_ON_CDM_THREAD( |
| 241 RemoveSession, session_id, | 242 RemoveSession, session_id, |
| 242 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); | 243 base::Passed(BindPromiseToCurrentLoop(std::move(promise)))); |
| 243 } | 244 } |
| 244 | 245 |
| 245 // A default empty implementation for subclasses that don't need to provide | 246 // A default empty implementation for subclasses that don't need to provide |
| 246 // any key system specific initialization. | 247 // any key system specific initialization. |
| 247 void BrowserCdmCast::InitializeInternal() { | 248 void BrowserCdmCast::InitializeInternal() { |
| 248 } | 249 } |
| 249 | 250 |
| 250 } // namespace media | 251 } // namespace media |
| 251 } // namespace chromecast | 252 } // namespace chromecast |
| OLD | NEW |