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

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: rebase only; compiles but needs more polish... Created 5 years, 6 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
« no previous file with comments | « media/mojo/services/mojo_cdm_service.h ('k') | media/mojo/services/mojo_cdm_service_context.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "url/gurl.h" 16 #include "url/gurl.h"
16 17
17 namespace media { 18 namespace media {
18 19
19 typedef MojoCdmPromise<> SimpleMojoCdmPromise; 20 typedef MojoCdmPromise<> SimpleMojoCdmPromise;
20 typedef MojoCdmPromise<std::string> NewSessionMojoCdmPromise; 21 typedef MojoCdmPromise<std::string> NewSessionMojoCdmPromise;
21 22
23 MojoCdmService* MojoCdmService::Create(
24 MojoCdmServiceContext* context,
25 const mojo::String& key_system,
26 mojo::InterfaceRequest<mojo::ContentDecryptionModule> request) {
27 // Only AesDecryptor is supported.
28 if (!CanUseAesDecryptor(key_system))
29 return nullptr;
30
31 return new MojoCdmService(context, key_system, request.Pass());
32 }
33
22 MojoCdmService::MojoCdmService( 34 MojoCdmService::MojoCdmService(
35 MojoCdmServiceContext* context,
23 const mojo::String& key_system, 36 const mojo::String& key_system,
24 mojo::InterfaceRequest<mojo::ContentDecryptionModule> request) 37 mojo::InterfaceRequest<mojo::ContentDecryptionModule> request)
25 : binding_(this, request.Pass()), weak_factory_(this) { 38 : binding_(this, request.Pass()), context_(context), weak_factory_(this) {
39 DVLOG(1) << __FUNCTION__ << ": " << key_system;
40 DCHECK(CanUseAesDecryptor(key_system));
41
26 base::WeakPtr<MojoCdmService> weak_this = weak_factory_.GetWeakPtr(); 42 base::WeakPtr<MojoCdmService> weak_this = weak_factory_.GetWeakPtr();
27 43 // TODO(jrummell): Determine proper origin.
28 if (CanUseAesDecryptor(key_system)) { 44 cdm_.reset(new AesDecryptor(
29 // TODO(jrummell): Determine proper origin. 45 GURL::EmptyGURL(),
30 cdm_.reset(new AesDecryptor( 46 base::Bind(&MojoCdmService::OnSessionMessage, weak_this),
31 GURL::EmptyGURL(), 47 base::Bind(&MojoCdmService::OnSessionClosed, weak_this),
32 base::Bind(&MojoCdmService::OnSessionMessage, weak_this), 48 base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this)));
33 base::Bind(&MojoCdmService::OnSessionClosed, weak_this),
34 base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this)));
35 }
36
37 // TODO(xhwang): Check key system support in the app.
38 NOTREACHED();
39 } 49 }
40 50
41 MojoCdmService::~MojoCdmService() { 51 MojoCdmService::~MojoCdmService() {
42 } 52 }
43 53
44 void MojoCdmService::SetClient(mojo::ContentDecryptionModuleClientPtr client) { 54 void MojoCdmService::SetClient(mojo::ContentDecryptionModuleClientPtr client) {
45 client_ = client.Pass(); 55 client_ = client.Pass();
46 } 56 }
47 57
48 // mojo::MediaRenderer implementation. 58 // mojo::MediaRenderer implementation.
49 void MojoCdmService::SetServerCertificate( 59 void MojoCdmService::SetServerCertificate(
50 mojo::Array<uint8_t> certificate_data, 60 mojo::Array<uint8_t> certificate_data,
51 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { 61 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) {
62 DVLOG(2) << __FUNCTION__;
52 cdm_->SetServerCertificate( 63 cdm_->SetServerCertificate(
53 certificate_data.storage(), 64 certificate_data.storage(),
54 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); 65 make_scoped_ptr(new SimpleMojoCdmPromise(callback)));
55 } 66 }
56 67
57 void MojoCdmService::CreateSessionAndGenerateRequest( 68 void MojoCdmService::CreateSessionAndGenerateRequest(
58 mojo::ContentDecryptionModule::SessionType session_type, 69 mojo::ContentDecryptionModule::SessionType session_type,
59 mojo::ContentDecryptionModule::InitDataType init_data_type, 70 mojo::ContentDecryptionModule::InitDataType init_data_type,
60 mojo::Array<uint8_t> init_data, 71 mojo::Array<uint8_t> init_data,
61 const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>& 72 const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>&
62 callback) { 73 callback) {
74 DVLOG(2) << __FUNCTION__;
63 cdm_->CreateSessionAndGenerateRequest( 75 cdm_->CreateSessionAndGenerateRequest(
64 static_cast<MediaKeys::SessionType>(session_type), 76 static_cast<MediaKeys::SessionType>(session_type),
65 static_cast<EmeInitDataType>(init_data_type), init_data.storage(), 77 static_cast<EmeInitDataType>(init_data_type), init_data.storage(),
66 scoped_ptr<NewSessionCdmPromise>(new NewSessionMojoCdmPromise(callback))); 78 make_scoped_ptr(new NewSessionMojoCdmPromise(callback)));
67 } 79 }
68 80
69 void MojoCdmService::LoadSession( 81 void MojoCdmService::LoadSession(
70 mojo::ContentDecryptionModule::SessionType session_type, 82 mojo::ContentDecryptionModule::SessionType session_type,
71 const mojo::String& session_id, 83 const mojo::String& session_id,
72 const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>& 84 const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>&
73 callback) { 85 callback) {
74 cdm_->LoadSession( 86 DVLOG(2) << __FUNCTION__;
75 static_cast<MediaKeys::SessionType>(session_type), 87 cdm_->LoadSession(static_cast<MediaKeys::SessionType>(session_type),
76 session_id.To<std::string>(), 88 session_id.To<std::string>(),
77 scoped_ptr<NewSessionCdmPromise>(new NewSessionMojoCdmPromise(callback))); 89 make_scoped_ptr(new NewSessionMojoCdmPromise(callback)));
78 } 90 }
79 91
80 void MojoCdmService::UpdateSession( 92 void MojoCdmService::UpdateSession(
81 const mojo::String& session_id, 93 const mojo::String& session_id,
82 mojo::Array<uint8_t> response, 94 mojo::Array<uint8_t> response,
83 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { 95 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) {
96 DVLOG(2) << __FUNCTION__;
84 cdm_->UpdateSession( 97 cdm_->UpdateSession(
85 session_id.To<std::string>(), response.storage(), 98 session_id.To<std::string>(), response.storage(),
86 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); 99 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback)));
87 } 100 }
88 101
89 void MojoCdmService::CloseSession( 102 void MojoCdmService::CloseSession(
90 const mojo::String& session_id, 103 const mojo::String& session_id,
91 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { 104 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) {
92 cdm_->CloseSession( 105 DVLOG(2) << __FUNCTION__;
93 session_id.To<std::string>(), 106 cdm_->CloseSession(session_id.To<std::string>(),
94 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); 107 make_scoped_ptr(new SimpleMojoCdmPromise(callback)));
95 } 108 }
96 109
97 void MojoCdmService::RemoveSession( 110 void MojoCdmService::RemoveSession(
98 const mojo::String& session_id, 111 const mojo::String& session_id,
99 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { 112 const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) {
100 cdm_->RemoveSession( 113 DVLOG(2) << __FUNCTION__;
101 session_id.To<std::string>(), 114 cdm_->RemoveSession(session_id.To<std::string>(),
102 scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); 115 make_scoped_ptr(new SimpleMojoCdmPromise(callback)));
103 } 116 }
104 117
105 void MojoCdmService::GetCdmContext( 118 void MojoCdmService::GetDecryptor(
106 int32_t cdm_id,
107 mojo::InterfaceRequest<mojo::Decryptor> decryptor) { 119 mojo::InterfaceRequest<mojo::Decryptor> decryptor) {
108 NOTIMPLEMENTED(); 120 NOTIMPLEMENTED();
109 } 121 }
110 122
123 CdmContext* MojoCdmService::GetCdmContext() {
124 DVLOG(2) << __FUNCTION__;
125 return cdm_->GetCdmContext();
126 }
127
128 void MojoCdmService::OnConnectionError() {
129 DVLOG(2) << __FUNCTION__;
130 context_->ServiceHadConnectionError(this);
131
132 // The above call deleted this instance, so the only safe thing to do is
133 // return.
134 }
135
111 void MojoCdmService::OnSessionMessage(const std::string& session_id, 136 void MojoCdmService::OnSessionMessage(const std::string& session_id,
112 MediaKeys::MessageType message_type, 137 MediaKeys::MessageType message_type,
113 const std::vector<uint8_t>& message, 138 const std::vector<uint8_t>& message,
114 const GURL& legacy_destination_url) { 139 const GURL& legacy_destination_url) {
140 DVLOG(2) << __FUNCTION__;
115 client_->OnSessionMessage(session_id, 141 client_->OnSessionMessage(session_id,
116 static_cast<mojo::CdmMessageType>(message_type), 142 static_cast<mojo::CdmMessageType>(message_type),
117 mojo::Array<uint8_t>::From(message), 143 mojo::Array<uint8_t>::From(message),
118 mojo::String::From(legacy_destination_url)); 144 mojo::String::From(legacy_destination_url));
119 } 145 }
120 146
121 void MojoCdmService::OnSessionKeysChange(const std::string& session_id, 147 void MojoCdmService::OnSessionKeysChange(const std::string& session_id,
122 bool has_additional_usable_key, 148 bool has_additional_usable_key,
123 CdmKeysInfo keys_info) { 149 CdmKeysInfo keys_info) {
150 DVLOG(2) << __FUNCTION__;
124 mojo::Array<mojo::CdmKeyInformationPtr> keys_data; 151 mojo::Array<mojo::CdmKeyInformationPtr> keys_data;
125 for (const auto& key : keys_info) 152 for (const auto& key : keys_info)
126 keys_data.push_back(mojo::CdmKeyInformation::From(*key)); 153 keys_data.push_back(mojo::CdmKeyInformation::From(*key));
127 client_->OnSessionKeysChange(session_id, has_additional_usable_key, 154 client_->OnSessionKeysChange(session_id, has_additional_usable_key,
128 keys_data.Pass()); 155 keys_data.Pass());
129 } 156 }
130 157
131 void MojoCdmService::OnSessionExpirationUpdate( 158 void MojoCdmService::OnSessionExpirationUpdate(
132 const std::string& session_id, 159 const std::string& session_id,
133 const base::Time& new_expiry_time_sec) { 160 const base::Time& new_expiry_time_sec) {
161 DVLOG(2) << __FUNCTION__;
134 client_->OnSessionExpirationUpdate(session_id, 162 client_->OnSessionExpirationUpdate(session_id,
135 new_expiry_time_sec.ToDoubleT()); 163 new_expiry_time_sec.ToDoubleT());
136 } 164 }
137 165
138 void MojoCdmService::OnSessionClosed(const std::string& session_id) { 166 void MojoCdmService::OnSessionClosed(const std::string& session_id) {
167 DVLOG(2) << __FUNCTION__;
139 client_->OnSessionClosed(session_id); 168 client_->OnSessionClosed(session_id);
140 } 169 }
141 170
142 void MojoCdmService::OnLegacySessionError(const std::string& session_id, 171 void MojoCdmService::OnLegacySessionError(const std::string& session_id,
143 MediaKeys::Exception exception, 172 MediaKeys::Exception exception,
144 uint32_t system_code, 173 uint32_t system_code,
145 const std::string& error_message) { 174 const std::string& error_message) {
175 DVLOG(2) << __FUNCTION__;
146 client_->OnLegacySessionError(session_id, 176 client_->OnLegacySessionError(session_id,
147 static_cast<mojo::CdmException>(exception), 177 static_cast<mojo::CdmException>(exception),
148 system_code, error_message); 178 system_code, error_message);
149 } 179 }
150 180
151 } // namespace media 181 } // namespace media
OLDNEW
« no previous file with comments | « media/mojo/services/mojo_cdm_service.h ('k') | media/mojo/services/mojo_cdm_service_context.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698