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

Side by Side Diff: media/mojo/services/mojo_cdm_service.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: Fix TODO. Created 5 years, 9 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_service.h" 5 #include "media/mojo/services/mojo_cdm_service.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "media/base/cdm_key_information.h" 8 #include "media/base/cdm_key_information.h"
9 #include "media/base/key_systems.h" 9 #include "media/base/key_systems.h"
10 #include "media/cdm/aes_decryptor.h" 10 #include "media/cdm/aes_decryptor.h"
11 #include "media/mojo/services/media_type_converters.h" 11 #include "media/mojo/services/media_type_converters.h"
12 #include "media/mojo/services/mojo_cdm_promise.h" 12 #include "media/mojo/services/mojo_cdm_promise.h"
13 #include "media/mojo/services/mojo_cdm_service_context.h"
13 #include "mojo/common/common_type_converters.h" 14 #include "mojo/common/common_type_converters.h"
14 #include "mojo/common/url_type_converters.h" 15 #include "mojo/common/url_type_converters.h"
15 16
16 namespace media { 17 namespace media {
17 18
18 typedef MojoCdmPromise<> SimpleMojoCdmPromise; 19 typedef MojoCdmPromise<> SimpleMojoCdmPromise;
19 typedef MojoCdmPromise<std::string> NewSessionMojoCdmPromise; 20 typedef MojoCdmPromise<std::string> NewSessionMojoCdmPromise;
20 21
21 MojoCdmService::MojoCdmService(const mojo::String& key_system) 22 MojoCdmService* MojoCdmService::Create(MojoCdmServiceContext* context,
22 : weak_factory_(this) { 23 const mojo::String& key_system) {
24 // Only AesDecryptor is supported.
ddorwin 2015/05/15 19:10:07 TODO with bug?
xhwang 2015/06/01 21:21:24 Done.
25 if (!CanUseAesDecryptor(key_system))
26 return nullptr;
27
28 return new MojoCdmService(context, key_system);
29 }
30
31 MojoCdmService::MojoCdmService(MojoCdmServiceContext* context,
32 const mojo::String& key_system)
33 : context_(context), weak_factory_(this) {
34 DVLOG(1) << __FUNCTION__ << ": " << key_system;
35 DCHECK(CanUseAesDecryptor(key_system));
36
23 base::WeakPtr<MojoCdmService> weak_this = weak_factory_.GetWeakPtr(); 37 base::WeakPtr<MojoCdmService> weak_this = weak_factory_.GetWeakPtr();
24 38 cdm_.reset(new AesDecryptor(
25 if (CanUseAesDecryptor(key_system)) { 39 base::Bind(&MojoCdmService::OnSessionMessage, weak_this),
26 cdm_.reset(new AesDecryptor( 40 base::Bind(&MojoCdmService::OnSessionClosed, weak_this),
27 base::Bind(&MojoCdmService::OnSessionMessage, weak_this), 41 base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this)));
28 base::Bind(&MojoCdmService::OnSessionClosed, weak_this),
29 base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this)));
30 }
31
32 // TODO(xhwang): Check key system support in the app.
33 NOTREACHED();
34 } 42 }
35 43
36 MojoCdmService::~MojoCdmService() { 44 MojoCdmService::~MojoCdmService() {
37 } 45 }
38 46
39 void MojoCdmService::SetClient(mojo::ContentDecryptionModuleClientPtr client) { 47 void MojoCdmService::SetClient(mojo::ContentDecryptionModuleClientPtr client) {
40 client_ = client.Pass(); 48 client_ = client.Pass();
41 } 49 }
42 50
43 // mojo::MediaRenderer implementation. 51 // mojo::MediaRenderer implementation.
44 void MojoCdmService::SetServerCertificate( 52 void MojoCdmService::SetServerCertificate(
45 mojo::Array<uint8_t> certificate_data, 53 mojo::Array<uint8_t> certificate_data,
46 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { 54 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) {
55 DVLOG(2) << __FUNCTION__;
47 const std::vector<uint8_t>& certificate_data_vector = 56 const std::vector<uint8_t>& certificate_data_vector =
48 certificate_data.storage(); 57 certificate_data.storage();
49 cdm_->SetServerCertificate( 58 cdm_->SetServerCertificate(
50 certificate_data_vector.empty() ? nullptr : &certificate_data_vector[0], 59 certificate_data_vector.empty() ? nullptr : &certificate_data_vector[0],
51 certificate_data_vector.size(), 60 certificate_data_vector.size(),
52 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); 61 make_scoped_ptr(new SimpleMojoCdmPromise(callback)));
53 } 62 }
54 63
55 void MojoCdmService::CreateSessionAndGenerateRequest( 64 void MojoCdmService::CreateSessionAndGenerateRequest(
56 mojo::ContentDecryptionModule::SessionType session_type, 65 mojo::ContentDecryptionModule::SessionType session_type,
57 const mojo::String& init_data_type, 66 const mojo::String& init_data_type,
58 mojo::Array<uint8_t> init_data, 67 mojo::Array<uint8_t> init_data,
59 const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>& 68 const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>&
60 callback) { 69 callback) {
70 DVLOG(2) << __FUNCTION__;
61 const std::vector<uint8_t>& init_data_vector = init_data.storage(); 71 const std::vector<uint8_t>& init_data_vector = init_data.storage();
62 cdm_->CreateSessionAndGenerateRequest( 72 cdm_->CreateSessionAndGenerateRequest(
63 static_cast<MediaKeys::SessionType>(session_type), 73 static_cast<MediaKeys::SessionType>(session_type),
64 init_data_type.To<std::string>(), 74 init_data_type.To<std::string>(),
65 init_data_vector.empty() ? nullptr : &init_data_vector[0], 75 init_data_vector.empty() ? nullptr : &init_data_vector[0],
66 init_data_vector.size(), 76 init_data_vector.size(),
67 scoped_ptr<NewSessionCdmPromise>(new NewSessionMojoCdmPromise(callback))); 77 make_scoped_ptr(new NewSessionMojoCdmPromise(callback)));
68 } 78 }
69 79
70 void MojoCdmService::LoadSession( 80 void MojoCdmService::LoadSession(
71 mojo::ContentDecryptionModule::SessionType session_type, 81 mojo::ContentDecryptionModule::SessionType session_type,
72 const mojo::String& session_id, 82 const mojo::String& session_id,
73 const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>& 83 const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>&
74 callback) { 84 callback) {
75 cdm_->LoadSession( 85 DVLOG(2) << __FUNCTION__;
76 static_cast<MediaKeys::SessionType>(session_type), 86 cdm_->LoadSession(static_cast<MediaKeys::SessionType>(session_type),
77 session_id.To<std::string>(), 87 session_id.To<std::string>(),
78 scoped_ptr<NewSessionCdmPromise>(new NewSessionMojoCdmPromise(callback))); 88 make_scoped_ptr(new NewSessionMojoCdmPromise(callback)));
79 } 89 }
80 90
81 void MojoCdmService::UpdateSession( 91 void MojoCdmService::UpdateSession(
82 const mojo::String& session_id, 92 const mojo::String& session_id,
83 mojo::Array<uint8_t> response, 93 mojo::Array<uint8_t> response,
84 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { 94 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) {
95 DVLOG(2) << __FUNCTION__;
85 const std::vector<uint8_t>& response_vector = response.storage(); 96 const std::vector<uint8_t>& response_vector = response.storage();
86 cdm_->UpdateSession( 97 cdm_->UpdateSession(session_id.To<std::string>(),
87 session_id.To<std::string>(), 98 response_vector.empty() ? nullptr : &response_vector[0],
88 response_vector.empty() ? nullptr : &response_vector[0], 99 response_vector.size(),
89 response_vector.size(), 100 make_scoped_ptr(new SimpleMojoCdmPromise(callback)));
90 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback)));
91 } 101 }
92 102
93 void MojoCdmService::CloseSession( 103 void MojoCdmService::CloseSession(
94 const mojo::String& session_id, 104 const mojo::String& session_id,
95 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { 105 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) {
96 cdm_->CloseSession( 106 DVLOG(2) << __FUNCTION__;
97 session_id.To<std::string>(), 107 cdm_->CloseSession(session_id.To<std::string>(),
98 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); 108 make_scoped_ptr(new SimpleMojoCdmPromise(callback)));
99 } 109 }
100 110
101 void MojoCdmService::RemoveSession( 111 void MojoCdmService::RemoveSession(
102 const mojo::String& session_id, 112 const mojo::String& session_id,
103 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { 113 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) {
104 cdm_->RemoveSession( 114 DVLOG(2) << __FUNCTION__;
105 session_id.To<std::string>(), 115 cdm_->RemoveSession(session_id.To<std::string>(),
106 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); 116 make_scoped_ptr(new SimpleMojoCdmPromise(callback)));
107 } 117 }
108 118
109 void MojoCdmService::GetCdmContext( 119 void MojoCdmService::GetDecryptor(
110 int32_t cdm_id,
111 mojo::InterfaceRequest<mojo::Decryptor> decryptor) { 120 mojo::InterfaceRequest<mojo::Decryptor> decryptor) {
112 NOTIMPLEMENTED(); 121 NOTIMPLEMENTED();
113 } 122 }
114 123
124 CdmContext* MojoCdmService::GetCdmContext() {
125 DVLOG(2) << __FUNCTION__;
126 return cdm_->GetCdmContext();
127 }
128
129 void MojoCdmService::OnConnectionError() {
130 DVLOG(2) << __FUNCTION__;
ddorwin 2015/05/15 19:10:07 Should this be a DLOG(ERROR)?
xhwang 2015/06/01 21:21:24 This will happen when the client (MojoCdm) is dest
131 context_->ServiceHadConnectionError(this);
132
133 // The above call deleted this instance, so the only safe thing to do is
134 // return.
135 }
136
115 void MojoCdmService::OnSessionMessage(const std::string& session_id, 137 void MojoCdmService::OnSessionMessage(const std::string& session_id,
116 MediaKeys::MessageType message_type, 138 MediaKeys::MessageType message_type,
117 const std::vector<uint8_t>& message, 139 const std::vector<uint8_t>& message,
118 const GURL& legacy_destination_url) { 140 const GURL& legacy_destination_url) {
141 DVLOG(2) << __FUNCTION__;
119 client_->OnSessionMessage(session_id, 142 client_->OnSessionMessage(session_id,
120 static_cast<mojo::CdmMessageType>(message_type), 143 static_cast<mojo::CdmMessageType>(message_type),
121 mojo::Array<uint8_t>::From(message), 144 mojo::Array<uint8_t>::From(message),
122 mojo::String::From(legacy_destination_url)); 145 mojo::String::From(legacy_destination_url));
123 } 146 }
124 147
125 void MojoCdmService::OnSessionKeysChange(const std::string& session_id, 148 void MojoCdmService::OnSessionKeysChange(const std::string& session_id,
126 bool has_additional_usable_key, 149 bool has_additional_usable_key,
127 CdmKeysInfo keys_info) { 150 CdmKeysInfo keys_info) {
151 DVLOG(2) << __FUNCTION__;
128 mojo::Array<mojo::CdmKeyInformationPtr> keys_data; 152 mojo::Array<mojo::CdmKeyInformationPtr> keys_data;
129 for (const auto& key : keys_info) 153 for (const auto& key : keys_info)
130 keys_data.push_back(mojo::CdmKeyInformation::From(*key)); 154 keys_data.push_back(mojo::CdmKeyInformation::From(*key));
131 client_->OnSessionKeysChange(session_id, has_additional_usable_key, 155 client_->OnSessionKeysChange(session_id, has_additional_usable_key,
132 keys_data.Pass()); 156 keys_data.Pass());
133 } 157 }
134 158
135 void MojoCdmService::OnSessionExpirationUpdate( 159 void MojoCdmService::OnSessionExpirationUpdate(
136 const std::string& session_id, 160 const std::string& session_id,
137 const base::Time& new_expiry_time) { 161 const base::Time& new_expiry_time) {
162 DVLOG(2) << __FUNCTION__;
138 client_->OnSessionExpirationUpdate(session_id, 163 client_->OnSessionExpirationUpdate(session_id,
139 new_expiry_time.ToInternalValue()); 164 new_expiry_time.ToInternalValue());
140 } 165 }
141 166
142 void MojoCdmService::OnSessionClosed(const std::string& session_id) { 167 void MojoCdmService::OnSessionClosed(const std::string& session_id) {
168 DVLOG(2) << __FUNCTION__;
143 client_->OnSessionClosed(session_id); 169 client_->OnSessionClosed(session_id);
144 } 170 }
145 171
146 void MojoCdmService::OnSessionError(const std::string& session_id, 172 void MojoCdmService::OnSessionError(const std::string& session_id,
147 MediaKeys::Exception exception, 173 MediaKeys::Exception exception,
148 uint32_t system_code, 174 uint32_t system_code,
149 const std::string& error_message) { 175 const std::string& error_message) {
176 DVLOG(2) << __FUNCTION__;
150 client_->OnSessionError(session_id, 177 client_->OnSessionError(session_id,
151 static_cast<mojo::CdmException>(exception), 178 static_cast<mojo::CdmException>(exception),
152 system_code, error_message); 179 system_code, error_message);
153 } 180 }
154 181
155 } // namespace media 182 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698