Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: media/mojo/services/mojo_cdm.cc

Issue 840473002: media: Support creation and SetCdm() for mojo based CDM. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_promise.h" 9 #include "media/base/cdm_promise.h"
10 #include "mojo/public/cpp/application/connect.h" 10 #include "mojo/public/cpp/application/connect.h"
(...skipping 13 matching lines...) Expand all
24 } 24 }
25 25
26 template <typename PromiseType> 26 template <typename PromiseType>
27 static void RejectPromise(scoped_ptr<PromiseType> promise, 27 static void RejectPromise(scoped_ptr<PromiseType> promise,
28 mojo::CdmPromiseResultPtr result) { 28 mojo::CdmPromiseResultPtr result) {
29 promise->reject(static_cast<MediaKeys::Exception>(result->exception), 29 promise->reject(static_cast<MediaKeys::Exception>(result->exception),
30 result->system_code, result->error_message); 30 result->system_code, result->error_message);
31 } 31 }
32 32
33 MojoCdm::MojoCdm(mojo::ContentDecryptionModulePtr remote_cdm, 33 MojoCdm::MojoCdm(mojo::ContentDecryptionModulePtr remote_cdm,
34 int32_t cdm_id,
34 const SessionMessageCB& session_message_cb, 35 const SessionMessageCB& session_message_cb,
35 const SessionClosedCB& session_closed_cb, 36 const SessionClosedCB& session_closed_cb,
36 const SessionErrorCB& session_error_cb, 37 const SessionErrorCB& session_error_cb,
37 const SessionKeysChangeCB& session_keys_change_cb, 38 const SessionKeysChangeCB& session_keys_change_cb,
38 const SessionExpirationUpdateCB& session_expiration_update_cb) 39 const SessionExpirationUpdateCB& session_expiration_update_cb)
39 : remote_cdm_(remote_cdm.Pass()), 40 : remote_cdm_(remote_cdm.Pass()),
41 cdm_id_(cdm_id),
40 session_message_cb_(session_message_cb), 42 session_message_cb_(session_message_cb),
41 session_closed_cb_(session_closed_cb), 43 session_closed_cb_(session_closed_cb),
42 session_error_cb_(session_error_cb), 44 session_error_cb_(session_error_cb),
43 session_keys_change_cb_(session_keys_change_cb), 45 session_keys_change_cb_(session_keys_change_cb),
44 session_expiration_update_cb_(session_expiration_update_cb), 46 session_expiration_update_cb_(session_expiration_update_cb),
45 weak_factory_(this) { 47 weak_factory_(this) {
46 DVLOG(1) << __FUNCTION__; 48 DVLOG(1) << __FUNCTION__;
49 DCHECK_NE(CdmContext::kInvalidCdmId, cdm_id_);
ddorwin 2015/01/06 00:57:28 Will this change if/when Mojo supports GetDecrypto
xhwang 2015/01/06 19:54:54 For simplicity, I am assigning a valid CDM ID to a
ddorwin 2015/01/07 00:37:13 Acknowledged. Thanks.
47 DCHECK(!session_message_cb_.is_null()); 50 DCHECK(!session_message_cb_.is_null());
48 DCHECK(!session_closed_cb_.is_null()); 51 DCHECK(!session_closed_cb_.is_null());
49 DCHECK(!session_error_cb_.is_null()); 52 DCHECK(!session_error_cb_.is_null());
50 DCHECK(!session_keys_change_cb_.is_null()); 53 DCHECK(!session_keys_change_cb_.is_null());
51 DCHECK(!session_expiration_update_cb_.is_null()); 54 DCHECK(!session_expiration_update_cb_.is_null());
52 55
53 remote_cdm_.set_client(this); 56 remote_cdm_.set_client(this);
54 } 57 }
55 58
56 MojoCdm::~MojoCdm() { 59 MojoCdm::~MojoCdm() {
57 DVLOG(1) << __FUNCTION__; 60 DVLOG(1) << __FUNCTION__;
58 } 61 }
59 62
60 void MojoCdm::SetServerCertificate(const uint8_t* certificate_data, 63 void MojoCdm::SetServerCertificate(const uint8_t* certificate_data,
61 int certificate_data_length, 64 int certificate_data_length,
62 scoped_ptr<SimpleCdmPromise> promise) { 65 scoped_ptr<SimpleCdmPromise> promise) {
66 DVLOG(2) << __FUNCTION__;
63 remote_cdm_->SetServerCertificate( 67 remote_cdm_->SetServerCertificate(
64 CreateMojoArray(certificate_data, certificate_data_length), 68 CreateMojoArray(certificate_data, certificate_data_length),
65 base::Bind(&MojoCdm::OnPromiseResult<>, weak_factory_.GetWeakPtr(), 69 base::Bind(&MojoCdm::OnPromiseResult<>, weak_factory_.GetWeakPtr(),
66 base::Passed(&promise))); 70 base::Passed(&promise)));
67 } 71 }
68 72
69 void MojoCdm::CreateSession(const std::string& init_data_type, 73 void MojoCdm::CreateSession(const std::string& init_data_type,
70 const uint8_t* init_data, 74 const uint8_t* init_data,
71 int init_data_length, 75 int init_data_length,
72 SessionType session_type, 76 SessionType session_type,
73 scoped_ptr<NewSessionCdmPromise> promise) { 77 scoped_ptr<NewSessionCdmPromise> promise) {
78 DVLOG(2) << __FUNCTION__;
74 remote_cdm_->CreateSession( 79 remote_cdm_->CreateSession(
75 init_data_type, CreateMojoArray(init_data, init_data_length), 80 init_data_type, CreateMojoArray(init_data, init_data_length),
76 static_cast<mojo::ContentDecryptionModule::SessionType>(session_type), 81 static_cast<mojo::ContentDecryptionModule::SessionType>(session_type),
77 base::Bind(&MojoCdm::OnPromiseResult<std::string>, 82 base::Bind(&MojoCdm::OnPromiseResult<std::string>,
78 weak_factory_.GetWeakPtr(), base::Passed(&promise))); 83 weak_factory_.GetWeakPtr(), base::Passed(&promise)));
79 } 84 }
80 85
81 void MojoCdm::LoadSession(const std::string& session_id, 86 void MojoCdm::LoadSession(const std::string& session_id,
82 scoped_ptr<NewSessionCdmPromise> promise) { 87 scoped_ptr<NewSessionCdmPromise> promise) {
88 DVLOG(2) << __FUNCTION__;
83 remote_cdm_->LoadSession( 89 remote_cdm_->LoadSession(
84 session_id, 90 session_id,
85 base::Bind(&MojoCdm::OnPromiseResult<std::string>, 91 base::Bind(&MojoCdm::OnPromiseResult<std::string>,
86 weak_factory_.GetWeakPtr(), base::Passed(&promise))); 92 weak_factory_.GetWeakPtr(), base::Passed(&promise)));
87 } 93 }
88 94
89 void MojoCdm::UpdateSession(const std::string& session_id, 95 void MojoCdm::UpdateSession(const std::string& session_id,
90 const uint8_t* response, 96 const uint8_t* response,
91 int response_length, 97 int response_length,
92 scoped_ptr<SimpleCdmPromise> promise) { 98 scoped_ptr<SimpleCdmPromise> promise) {
99 DVLOG(2) << __FUNCTION__;
93 remote_cdm_->UpdateSession( 100 remote_cdm_->UpdateSession(
94 session_id, CreateMojoArray(response, response_length), 101 session_id, CreateMojoArray(response, response_length),
95 base::Bind(&MojoCdm::OnPromiseResult<>, weak_factory_.GetWeakPtr(), 102 base::Bind(&MojoCdm::OnPromiseResult<>, weak_factory_.GetWeakPtr(),
96 base::Passed(&promise))); 103 base::Passed(&promise)));
97 } 104 }
98 105
99 void MojoCdm::CloseSession(const std::string& session_id, 106 void MojoCdm::CloseSession(const std::string& session_id,
100 scoped_ptr<SimpleCdmPromise> promise) { 107 scoped_ptr<SimpleCdmPromise> promise) {
108 DVLOG(2) << __FUNCTION__;
101 remote_cdm_->CloseSession(session_id, base::Bind(&MojoCdm::OnPromiseResult<>, 109 remote_cdm_->CloseSession(session_id, base::Bind(&MojoCdm::OnPromiseResult<>,
102 weak_factory_.GetWeakPtr(), 110 weak_factory_.GetWeakPtr(),
103 base::Passed(&promise))); 111 base::Passed(&promise)));
104 } 112 }
105 113
106 void MojoCdm::RemoveSession(const std::string& session_id, 114 void MojoCdm::RemoveSession(const std::string& session_id,
107 scoped_ptr<SimpleCdmPromise> promise) { 115 scoped_ptr<SimpleCdmPromise> promise) {
116 DVLOG(2) << __FUNCTION__;
108 remote_cdm_->RemoveSession(session_id, base::Bind(&MojoCdm::OnPromiseResult<>, 117 remote_cdm_->RemoveSession(session_id, base::Bind(&MojoCdm::OnPromiseResult<>,
109 weak_factory_.GetWeakPtr(), 118 weak_factory_.GetWeakPtr(),
110 base::Passed(&promise))); 119 base::Passed(&promise)));
111 } 120 }
112 121
113 CdmContext* MojoCdm::GetCdmContext() { 122 CdmContext* MojoCdm::GetCdmContext() {
114 NOTIMPLEMENTED(); 123 DVLOG(2) << __FUNCTION__;
124 return this;
125 }
126
127 media::Decryptor* MojoCdm::GetDecryptor() {
115 return nullptr; 128 return nullptr;
ddorwin 2015/01/06 00:57:28 Should this never be called? i.e. NOTREACHED()
xhwang 2015/01/06 19:54:54 Currently yes. When we start to support the deskto
116 } 129 }
117 130
131 int MojoCdm::GetCdmId() const {
132 DVLOG(2) << __FUNCTION__ << cdm_id_;
133 return cdm_id_;
134 }
135
118 void MojoCdm::OnSessionMessage(const mojo::String& session_id, 136 void MojoCdm::OnSessionMessage(const mojo::String& session_id,
119 mojo::Array<uint8_t> message, 137 mojo::Array<uint8_t> message,
120 const mojo::String& destination_url) { 138 const mojo::String& destination_url) {
139 DVLOG(2) << __FUNCTION__;
121 GURL verified_gurl = GURL(destination_url); 140 GURL verified_gurl = GURL(destination_url);
122 if (!verified_gurl.is_valid() && !verified_gurl.is_empty()) { 141 if (!verified_gurl.is_valid() && !verified_gurl.is_empty()) {
123 DLOG(WARNING) << "SessionMessage destination_url is invalid : " 142 DLOG(WARNING) << "SessionMessage destination_url is invalid : "
124 << verified_gurl.possibly_invalid_spec(); 143 << verified_gurl.possibly_invalid_spec();
125 verified_gurl = GURL::EmptyGURL(); // Replace invalid destination_url. 144 verified_gurl = GURL::EmptyGURL(); // Replace invalid destination_url.
126 } 145 }
127 146
128 session_message_cb_.Run(session_id, message.storage(), verified_gurl); 147 session_message_cb_.Run(session_id, 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::OnSessionError(const mojo::String& session_id, 155 void MojoCdm::OnSessionError(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 session_error_cb_.Run(session_id, 160 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(const mojo::String& session_id, 165 void MojoCdm::OnSessionKeysChange(const mojo::String& session_id,
145 bool has_additional_usable_key) { 166 bool has_additional_usable_key) {
167 DVLOG(2) << __FUNCTION__;
146 session_keys_change_cb_.Run(session_id, has_additional_usable_key); 168 session_keys_change_cb_.Run(session_id, has_additional_usable_key);
147 } 169 }
148 170
149 void MojoCdm::OnSessionExpirationUpdate(const mojo::String& session_id, 171 void MojoCdm::OnSessionExpirationUpdate(const mojo::String& session_id,
150 int64_t new_expiry_time_usec) { 172 int64_t new_expiry_time_usec) {
173 DVLOG(2) << __FUNCTION__;
151 session_expiration_update_cb_.Run( 174 session_expiration_update_cb_.Run(
152 session_id, base::Time::FromInternalValue(new_expiry_time_usec)); 175 session_id, base::Time::FromInternalValue(new_expiry_time_usec));
153 } 176 }
154 177
155 template <typename... T> 178 template <typename... T>
156 void MojoCdm::OnPromiseResult(scoped_ptr<CdmPromiseTemplate<T...>> promise, 179 void MojoCdm::OnPromiseResult(scoped_ptr<CdmPromiseTemplate<T...>> promise,
157 mojo::CdmPromiseResultPtr result, 180 mojo::CdmPromiseResultPtr result,
158 typename MojoTypeTrait<T>::MojoType... args) { 181 typename MojoTypeTrait<T>::MojoType... args) {
182 DVLOG(2) << __FUNCTION__;
159 if (result->success) 183 if (result->success)
160 promise->resolve(args.template To<T>()...); // See ISO C++03 14.2/4. 184 promise->resolve(args.template To<T>()...); // See ISO C++03 14.2/4.
161 else 185 else
162 RejectPromise(promise.Pass(), result.Pass()); 186 RejectPromise(promise.Pass(), result.Pass());
163 } 187 }
164 188
165 } // namespace media 189 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698