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
3 // found in the LICENSE file.
5 #include "media/mojo/services/mojo_cdm_service.h"
8 #include "media/base/cdm_key_information.h"
9 #include "media/base/key_systems.h"
10 #include "media/cdm/aes_decryptor.h"
11 #include "media/mojo/services/media_type_converters.h"
12 #include "media/mojo/services/mojo_cdm_promise.h"
13 #include "mojo/common/common_type_converters.h"
17 typedef MojoCdmPromise
<> SimpleMojoCdmPromise
;
18 typedef MojoCdmPromise
<std::string
> NewSessionMojoCdmPromise
;
20 MojoCdmService::MojoCdmService(const mojo::String
& key_system
)
21 : weak_factory_(this) {
22 base::WeakPtr
<MojoCdmService
> weak_this
= weak_factory_
.GetWeakPtr();
23 if (CanUseAesDecryptor(key_system
)) {
24 cdm_
.reset(new AesDecryptor(
25 base::Bind(&MojoCdmService::OnSessionMessage
, weak_this
),
26 base::Bind(&MojoCdmService::OnSessionClosed
, weak_this
),
27 base::Bind(&MojoCdmService::OnSessionKeysChange
, weak_this
)));
30 // TODO(xhwang): Check key system support in the app.
34 MojoCdmService::~MojoCdmService() {
37 // mojo::MediaRenderer implementation.
38 void MojoCdmService::SetServerCertificate(
39 mojo::Array
<uint8_t> certificate_data
,
40 const mojo::Callback
<void(mojo::CdmPromiseResultPtr
)>& callback
) {
41 const std::vector
<uint8_t>& certificate_data_vector
=
42 certificate_data
.storage();
43 cdm_
->SetServerCertificate(
44 certificate_data_vector
.empty() ? nullptr : &certificate_data_vector
[0],
45 certificate_data_vector
.size(),
46 scoped_ptr
<SimpleCdmPromise
>(new SimpleMojoCdmPromise(callback
)));
49 void MojoCdmService::CreateSessionAndGenerateRequest(
50 mojo::ContentDecryptionModule::SessionType session_type
,
51 const mojo::String
& init_data_type
,
52 mojo::Array
<uint8_t> init_data
,
53 const mojo::Callback
<void(mojo::CdmPromiseResultPtr
, mojo::String
)>&
55 const std::vector
<uint8_t>& init_data_vector
= init_data
.storage();
56 cdm_
->CreateSessionAndGenerateRequest(
57 static_cast<MediaKeys::SessionType
>(session_type
),
58 init_data_type
.To
<std::string
>(),
59 init_data_vector
.empty() ? nullptr : &init_data_vector
[0],
60 init_data_vector
.size(),
61 scoped_ptr
<NewSessionCdmPromise
>(new NewSessionMojoCdmPromise(callback
)));
64 void MojoCdmService::LoadSession(
65 mojo::ContentDecryptionModule::SessionType session_type
,
66 const mojo::String
& session_id
,
67 const mojo::Callback
<void(mojo::CdmPromiseResultPtr
, mojo::String
)>&
70 static_cast<MediaKeys::SessionType
>(session_type
),
71 session_id
.To
<std::string
>(),
72 scoped_ptr
<NewSessionCdmPromise
>(new NewSessionMojoCdmPromise(callback
)));
75 void MojoCdmService::UpdateSession(
76 const mojo::String
& session_id
,
77 mojo::Array
<uint8_t> response
,
78 const mojo::Callback
<void(mojo::CdmPromiseResultPtr
)>& callback
) {
79 const std::vector
<uint8_t>& response_vector
= response
.storage();
81 session_id
.To
<std::string
>(),
82 response_vector
.empty() ? nullptr : &response_vector
[0],
83 response_vector
.size(),
84 scoped_ptr
<SimpleCdmPromise
>(new SimpleMojoCdmPromise(callback
)));
87 void MojoCdmService::CloseSession(
88 const mojo::String
& session_id
,
89 const mojo::Callback
<void(mojo::CdmPromiseResultPtr
)>& callback
) {
91 session_id
.To
<std::string
>(),
92 scoped_ptr
<SimpleCdmPromise
>(new SimpleMojoCdmPromise(callback
)));
95 void MojoCdmService::RemoveSession(
96 const mojo::String
& session_id
,
97 const mojo::Callback
<void(mojo::CdmPromiseResultPtr
)>& callback
) {
99 session_id
.To
<std::string
>(),
100 scoped_ptr
<SimpleCdmPromise
>(new SimpleMojoCdmPromise(callback
)));
103 void MojoCdmService::GetCdmContext(
105 mojo::InterfaceRequest
<mojo::Decryptor
> decryptor
) {
109 void MojoCdmService::OnSessionMessage(const std::string
& session_id
,
110 MediaKeys::MessageType message_type
,
111 const std::vector
<uint8_t>& message
,
112 const GURL
& legacy_destination_url
) {
113 client()->OnSessionMessage(session_id
,
114 static_cast<mojo::CdmMessageType
>(message_type
),
115 mojo::Array
<uint8_t>::From(message
),
116 mojo::String::From(legacy_destination_url
));
119 void MojoCdmService::OnSessionKeysChange(const std::string
& session_id
,
120 bool has_additional_usable_key
,
121 CdmKeysInfo keys_info
) {
122 mojo::Array
<mojo::CdmKeyInformationPtr
> keys_data
;
123 for (const auto& key
: keys_info
)
124 keys_data
.push_back(mojo::CdmKeyInformation::From(*key
));
125 client()->OnSessionKeysChange(session_id
, has_additional_usable_key
,
129 void MojoCdmService::OnSessionExpirationUpdate(
130 const std::string
& session_id
,
131 const base::Time
& new_expiry_time
) {
132 client()->OnSessionExpirationUpdate(session_id
,
133 new_expiry_time
.ToInternalValue());
136 void MojoCdmService::OnSessionClosed(const std::string
& session_id
) {
137 client()->OnSessionClosed(session_id
);
140 void MojoCdmService::OnSessionError(const std::string
& session_id
,
141 MediaKeys::Exception exception
,
142 uint32_t system_code
,
143 const std::string
& error_message
) {
144 client()->OnSessionError(session_id
,
145 static_cast<mojo::CdmException
>(exception
),
146 system_code
, error_message
);