| 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.h" | 5 #include "media/mojo/services/mojo_cdm.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "media/base/cdm_key_information.h" | 9 #include "media/base/cdm_key_information.h" |
| 10 #include "media/base/cdm_promise.h" | 10 #include "media/base/cdm_promise.h" |
| 11 #include "media/mojo/services/media_type_converters.h" | 11 #include "media/mojo/services/media_type_converters.h" |
| 12 #include "mojo/application/public/cpp/connect.h" | 12 #include "mojo/application/public/cpp/connect.h" |
| 13 #include "mojo/application/public/interfaces/service_provider.mojom.h" | 13 #include "mojo/application/public/interfaces/service_provider.mojom.h" |
| 14 #include "third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h" | 14 #include "third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h" |
| 15 #include "url/gurl.h" | 15 #include "url/gurl.h" |
| 16 | 16 |
| 17 namespace media { | 17 namespace media { |
| 18 | 18 |
| 19 template <typename PromiseType> | 19 template <typename PromiseType> |
| 20 static void RejectPromise(scoped_ptr<PromiseType> promise, | 20 static void RejectPromise(scoped_ptr<PromiseType> promise, |
| 21 mojo::CdmPromiseResultPtr result) { | 21 mojo::CdmPromiseResultPtr result) { |
| 22 promise->reject(static_cast<MediaKeys::Exception>(result->exception), | 22 promise->reject(static_cast<MediaKeys::Exception>(result->exception), |
| 23 result->system_code, result->error_message); | 23 result->system_code, result->error_message); |
| 24 } | 24 } |
| 25 | 25 |
| 26 MojoCdm::MojoCdm(mojo::ContentDecryptionModulePtr remote_cdm, | 26 MojoCdm::MojoCdm(mojo::ContentDecryptionModulePtr remote_cdm, |
| 27 int32_t cdm_id, |
| 27 const SessionMessageCB& session_message_cb, | 28 const SessionMessageCB& session_message_cb, |
| 28 const SessionClosedCB& session_closed_cb, | 29 const SessionClosedCB& session_closed_cb, |
| 29 const LegacySessionErrorCB& legacy_session_error_cb, | 30 const LegacySessionErrorCB& legacy_session_error_cb, |
| 30 const SessionKeysChangeCB& session_keys_change_cb, | 31 const SessionKeysChangeCB& session_keys_change_cb, |
| 31 const SessionExpirationUpdateCB& session_expiration_update_cb) | 32 const SessionExpirationUpdateCB& session_expiration_update_cb) |
| 32 : remote_cdm_(remote_cdm.Pass()), | 33 : remote_cdm_(remote_cdm.Pass()), |
| 33 binding_(this), | 34 binding_(this), |
| 35 cdm_id_(cdm_id), |
| 34 session_message_cb_(session_message_cb), | 36 session_message_cb_(session_message_cb), |
| 35 session_closed_cb_(session_closed_cb), | 37 session_closed_cb_(session_closed_cb), |
| 36 legacy_session_error_cb_(legacy_session_error_cb), | 38 legacy_session_error_cb_(legacy_session_error_cb), |
| 37 session_keys_change_cb_(session_keys_change_cb), | 39 session_keys_change_cb_(session_keys_change_cb), |
| 38 session_expiration_update_cb_(session_expiration_update_cb), | 40 session_expiration_update_cb_(session_expiration_update_cb), |
| 39 weak_factory_(this) { | 41 weak_factory_(this) { |
| 40 DVLOG(1) << __FUNCTION__; | 42 DVLOG(1) << __FUNCTION__; |
| 41 DCHECK(!session_message_cb_.is_null()); | 43 DCHECK(!session_message_cb_.is_null()); |
| 42 DCHECK(!session_closed_cb_.is_null()); | 44 DCHECK(!session_closed_cb_.is_null()); |
| 43 DCHECK(!legacy_session_error_cb_.is_null()); | 45 DCHECK(!legacy_session_error_cb_.is_null()); |
| 44 DCHECK(!session_keys_change_cb_.is_null()); | 46 DCHECK(!session_keys_change_cb_.is_null()); |
| 45 DCHECK(!session_expiration_update_cb_.is_null()); | 47 DCHECK(!session_expiration_update_cb_.is_null()); |
| 46 | 48 |
| 47 mojo::ContentDecryptionModuleClientPtr client_ptr; | 49 mojo::ContentDecryptionModuleClientPtr client_ptr; |
| 48 binding_.Bind(GetProxy(&client_ptr)); | 50 binding_.Bind(GetProxy(&client_ptr)); |
| 49 remote_cdm_->SetClient(client_ptr.Pass()); | 51 remote_cdm_->SetClient(client_ptr.Pass()); |
| 50 } | 52 } |
| 51 | 53 |
| 52 MojoCdm::~MojoCdm() { | 54 MojoCdm::~MojoCdm() { |
| 53 DVLOG(1) << __FUNCTION__; | 55 DVLOG(1) << __FUNCTION__; |
| 54 } | 56 } |
| 55 | 57 |
| 56 void MojoCdm::SetServerCertificate(const std::vector<uint8_t>& certificate, | 58 void MojoCdm::SetServerCertificate(const std::vector<uint8_t>& certificate, |
| 57 scoped_ptr<SimpleCdmPromise> promise) { | 59 scoped_ptr<SimpleCdmPromise> promise) { |
| 60 DVLOG(2) << __FUNCTION__; |
| 58 remote_cdm_->SetServerCertificate( | 61 remote_cdm_->SetServerCertificate( |
| 59 mojo::Array<uint8_t>::From(certificate), | 62 mojo::Array<uint8_t>::From(certificate), |
| 60 base::Bind(&MojoCdm::OnPromiseResult<>, weak_factory_.GetWeakPtr(), | 63 base::Bind(&MojoCdm::OnPromiseResult<>, weak_factory_.GetWeakPtr(), |
| 61 base::Passed(&promise))); | 64 base::Passed(&promise))); |
| 62 } | 65 } |
| 63 | 66 |
| 64 void MojoCdm::CreateSessionAndGenerateRequest( | 67 void MojoCdm::CreateSessionAndGenerateRequest( |
| 65 SessionType session_type, | 68 SessionType session_type, |
| 66 EmeInitDataType init_data_type, | 69 EmeInitDataType init_data_type, |
| 67 const std::vector<uint8_t>& init_data, | 70 const std::vector<uint8_t>& init_data, |
| 68 scoped_ptr<NewSessionCdmPromise> promise) { | 71 scoped_ptr<NewSessionCdmPromise> promise) { |
| 72 DVLOG(2) << __FUNCTION__; |
| 69 remote_cdm_->CreateSessionAndGenerateRequest( | 73 remote_cdm_->CreateSessionAndGenerateRequest( |
| 70 static_cast<mojo::ContentDecryptionModule::SessionType>(session_type), | 74 static_cast<mojo::ContentDecryptionModule::SessionType>(session_type), |
| 71 static_cast<mojo::ContentDecryptionModule::InitDataType>(init_data_type), | 75 static_cast<mojo::ContentDecryptionModule::InitDataType>(init_data_type), |
| 72 mojo::Array<uint8_t>::From(init_data), | 76 mojo::Array<uint8_t>::From(init_data), |
| 73 base::Bind(&MojoCdm::OnPromiseResult<std::string>, | 77 base::Bind(&MojoCdm::OnPromiseResult<std::string>, |
| 74 weak_factory_.GetWeakPtr(), base::Passed(&promise))); | 78 weak_factory_.GetWeakPtr(), base::Passed(&promise))); |
| 75 } | 79 } |
| 76 | 80 |
| 77 void MojoCdm::LoadSession(SessionType session_type, | 81 void MojoCdm::LoadSession(SessionType session_type, |
| 78 const std::string& session_id, | 82 const std::string& session_id, |
| 79 scoped_ptr<NewSessionCdmPromise> promise) { | 83 scoped_ptr<NewSessionCdmPromise> promise) { |
| 84 DVLOG(2) << __FUNCTION__; |
| 80 remote_cdm_->LoadSession( | 85 remote_cdm_->LoadSession( |
| 81 static_cast<mojo::ContentDecryptionModule::SessionType>(session_type), | 86 static_cast<mojo::ContentDecryptionModule::SessionType>(session_type), |
| 82 session_id, | 87 session_id, |
| 83 base::Bind(&MojoCdm::OnPromiseResult<std::string>, | 88 base::Bind(&MojoCdm::OnPromiseResult<std::string>, |
| 84 weak_factory_.GetWeakPtr(), base::Passed(&promise))); | 89 weak_factory_.GetWeakPtr(), base::Passed(&promise))); |
| 85 } | 90 } |
| 86 | 91 |
| 87 void MojoCdm::UpdateSession(const std::string& session_id, | 92 void MojoCdm::UpdateSession(const std::string& session_id, |
| 88 const std::vector<uint8_t>& response, | 93 const std::vector<uint8_t>& response, |
| 89 scoped_ptr<SimpleCdmPromise> promise) { | 94 scoped_ptr<SimpleCdmPromise> promise) { |
| 95 DVLOG(2) << __FUNCTION__; |
| 90 remote_cdm_->UpdateSession( | 96 remote_cdm_->UpdateSession( |
| 91 session_id, mojo::Array<uint8_t>::From(response), | 97 session_id, mojo::Array<uint8_t>::From(response), |
| 92 base::Bind(&MojoCdm::OnPromiseResult<>, weak_factory_.GetWeakPtr(), | 98 base::Bind(&MojoCdm::OnPromiseResult<>, weak_factory_.GetWeakPtr(), |
| 93 base::Passed(&promise))); | 99 base::Passed(&promise))); |
| 94 } | 100 } |
| 95 | 101 |
| 96 void MojoCdm::CloseSession(const std::string& session_id, | 102 void MojoCdm::CloseSession(const std::string& session_id, |
| 97 scoped_ptr<SimpleCdmPromise> promise) { | 103 scoped_ptr<SimpleCdmPromise> promise) { |
| 104 DVLOG(2) << __FUNCTION__; |
| 98 remote_cdm_->CloseSession(session_id, base::Bind(&MojoCdm::OnPromiseResult<>, | 105 remote_cdm_->CloseSession(session_id, base::Bind(&MojoCdm::OnPromiseResult<>, |
| 99 weak_factory_.GetWeakPtr(), | 106 weak_factory_.GetWeakPtr(), |
| 100 base::Passed(&promise))); | 107 base::Passed(&promise))); |
| 101 } | 108 } |
| 102 | 109 |
| 103 void MojoCdm::RemoveSession(const std::string& session_id, | 110 void MojoCdm::RemoveSession(const std::string& session_id, |
| 104 scoped_ptr<SimpleCdmPromise> promise) { | 111 scoped_ptr<SimpleCdmPromise> promise) { |
| 112 DVLOG(2) << __FUNCTION__; |
| 105 remote_cdm_->RemoveSession(session_id, base::Bind(&MojoCdm::OnPromiseResult<>, | 113 remote_cdm_->RemoveSession(session_id, base::Bind(&MojoCdm::OnPromiseResult<>, |
| 106 weak_factory_.GetWeakPtr(), | 114 weak_factory_.GetWeakPtr(), |
| 107 base::Passed(&promise))); | 115 base::Passed(&promise))); |
| 108 } | 116 } |
| 109 | 117 |
| 110 CdmContext* MojoCdm::GetCdmContext() { | 118 CdmContext* MojoCdm::GetCdmContext() { |
| 119 DVLOG(2) << __FUNCTION__; |
| 120 return this; |
| 121 } |
| 122 |
| 123 media::Decryptor* MojoCdm::GetDecryptor() { |
| 111 NOTIMPLEMENTED(); | 124 NOTIMPLEMENTED(); |
| 112 return nullptr; | 125 return nullptr; |
| 113 } | 126 } |
| 114 | 127 |
| 128 int MojoCdm::GetCdmId() const { |
| 129 DVLOG(2) << __FUNCTION__ << cdm_id_; |
| 130 return cdm_id_; |
| 131 } |
| 132 |
| 115 void MojoCdm::OnSessionMessage(const mojo::String& session_id, | 133 void MojoCdm::OnSessionMessage(const mojo::String& session_id, |
| 116 mojo::CdmMessageType message_type, | 134 mojo::CdmMessageType message_type, |
| 117 mojo::Array<uint8_t> message, | 135 mojo::Array<uint8_t> message, |
| 118 const mojo::String& legacy_destination_url) { | 136 const mojo::String& legacy_destination_url) { |
| 137 DVLOG(2) << __FUNCTION__; |
| 119 GURL verified_gurl = GURL(legacy_destination_url); | 138 GURL verified_gurl = GURL(legacy_destination_url); |
| 120 if (!verified_gurl.is_valid() && !verified_gurl.is_empty()) { | 139 if (!verified_gurl.is_valid() && !verified_gurl.is_empty()) { |
| 121 DLOG(WARNING) << "SessionMessage destination_url is invalid : " | 140 DLOG(WARNING) << "SessionMessage destination_url is invalid : " |
| 122 << verified_gurl.possibly_invalid_spec(); | 141 << verified_gurl.possibly_invalid_spec(); |
| 123 verified_gurl = GURL::EmptyGURL(); // Replace invalid destination_url. | 142 verified_gurl = GURL::EmptyGURL(); // Replace invalid destination_url. |
| 124 } | 143 } |
| 125 | 144 |
| 126 session_message_cb_.Run(session_id, | 145 session_message_cb_.Run(session_id, |
| 127 static_cast<MediaKeys::MessageType>(message_type), | 146 static_cast<MediaKeys::MessageType>(message_type), |
| 128 message.storage(), verified_gurl); | 147 message.storage(), verified_gurl); |
| 129 } | 148 } |
| 130 | 149 |
| 131 void MojoCdm::OnSessionClosed(const mojo::String& session_id) { | 150 void MojoCdm::OnSessionClosed(const mojo::String& session_id) { |
| 151 DVLOG(2) << __FUNCTION__; |
| 132 session_closed_cb_.Run(session_id); | 152 session_closed_cb_.Run(session_id); |
| 133 } | 153 } |
| 134 | 154 |
| 135 void MojoCdm::OnLegacySessionError(const mojo::String& session_id, | 155 void MojoCdm::OnLegacySessionError(const mojo::String& session_id, |
| 136 mojo::CdmException exception, | 156 mojo::CdmException exception, |
| 137 uint32_t system_code, | 157 uint32_t system_code, |
| 138 const mojo::String& error_message) { | 158 const mojo::String& error_message) { |
| 159 DVLOG(2) << __FUNCTION__; |
| 139 legacy_session_error_cb_.Run(session_id, | 160 legacy_session_error_cb_.Run(session_id, |
| 140 static_cast<MediaKeys::Exception>(exception), | 161 static_cast<MediaKeys::Exception>(exception), |
| 141 system_code, error_message); | 162 system_code, error_message); |
| 142 } | 163 } |
| 143 | 164 |
| 144 void MojoCdm::OnSessionKeysChange( | 165 void MojoCdm::OnSessionKeysChange( |
| 145 const mojo::String& session_id, | 166 const mojo::String& session_id, |
| 146 bool has_additional_usable_key, | 167 bool has_additional_usable_key, |
| 147 mojo::Array<mojo::CdmKeyInformationPtr> keys_info) { | 168 mojo::Array<mojo::CdmKeyInformationPtr> keys_info) { |
| 169 DVLOG(2) << __FUNCTION__; |
| 148 media::CdmKeysInfo key_data; | 170 media::CdmKeysInfo key_data; |
| 149 key_data.reserve(keys_info.size()); | 171 key_data.reserve(keys_info.size()); |
| 150 for (size_t i = 0; i < keys_info.size(); ++i) { | 172 for (size_t i = 0; i < keys_info.size(); ++i) { |
| 151 key_data.push_back( | 173 key_data.push_back( |
| 152 keys_info[i].To<scoped_ptr<media::CdmKeyInformation>>().release()); | 174 keys_info[i].To<scoped_ptr<media::CdmKeyInformation>>().release()); |
| 153 } | 175 } |
| 154 session_keys_change_cb_.Run(session_id, has_additional_usable_key, | 176 session_keys_change_cb_.Run(session_id, has_additional_usable_key, |
| 155 key_data.Pass()); | 177 key_data.Pass()); |
| 156 } | 178 } |
| 157 | 179 |
| 158 void MojoCdm::OnSessionExpirationUpdate(const mojo::String& session_id, | 180 void MojoCdm::OnSessionExpirationUpdate(const mojo::String& session_id, |
| 159 double new_expiry_time_sec) { | 181 double new_expiry_time_sec) { |
| 182 DVLOG(2) << __FUNCTION__; |
| 160 session_expiration_update_cb_.Run( | 183 session_expiration_update_cb_.Run( |
| 161 session_id, base::Time::FromDoubleT(new_expiry_time_sec)); | 184 session_id, base::Time::FromDoubleT(new_expiry_time_sec)); |
| 162 } | 185 } |
| 163 | 186 |
| 164 } // namespace media | 187 } // namespace media |
| OLD | NEW |