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 |