| 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/blink/cdm_session_adapter.h" | 5 #include "media/blink/cdm_session_adapter.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/logging.h" | 10 #include "base/logging.h" |
| 9 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 10 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 11 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
| 12 #include "media/base/cdm_factory.h" | 14 #include "media/base/cdm_factory.h" |
| 13 #include "media/base/cdm_key_information.h" | 15 #include "media/base/cdm_key_information.h" |
| 14 #include "media/base/cdm_promise.h" | 16 #include "media/base/cdm_promise.h" |
| 15 #include "media/base/key_systems.h" | 17 #include "media/base/key_systems.h" |
| 16 #include "media/blink/webcontentdecryptionmodule_impl.h" | 18 #include "media/blink/webcontentdecryptionmodule_impl.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 38 ++trace_id_); | 40 ++trace_id_); |
| 39 | 41 |
| 40 base::TimeTicks start_time = base::TimeTicks::Now(); | 42 base::TimeTicks start_time = base::TimeTicks::Now(); |
| 41 | 43 |
| 42 // Note: WebContentDecryptionModuleImpl::Create() calls this method without | 44 // Note: WebContentDecryptionModuleImpl::Create() calls this method without |
| 43 // holding a reference to the CdmSessionAdapter. Bind OnCdmCreated() with | 45 // holding a reference to the CdmSessionAdapter. Bind OnCdmCreated() with |
| 44 // |this| instead of |weak_this| to prevent |this| from being destructed. | 46 // |this| instead of |weak_this| to prevent |this| from being destructed. |
| 45 base::WeakPtr<CdmSessionAdapter> weak_this = weak_ptr_factory_.GetWeakPtr(); | 47 base::WeakPtr<CdmSessionAdapter> weak_this = weak_ptr_factory_.GetWeakPtr(); |
| 46 | 48 |
| 47 DCHECK(!cdm_created_result_); | 49 DCHECK(!cdm_created_result_); |
| 48 cdm_created_result_ = result.Pass(); | 50 cdm_created_result_ = std::move(result); |
| 49 | 51 |
| 50 cdm_factory->Create( | 52 cdm_factory->Create( |
| 51 key_system, security_origin, cdm_config, | 53 key_system, security_origin, cdm_config, |
| 52 base::Bind(&CdmSessionAdapter::OnSessionMessage, weak_this), | 54 base::Bind(&CdmSessionAdapter::OnSessionMessage, weak_this), |
| 53 base::Bind(&CdmSessionAdapter::OnSessionClosed, weak_this), | 55 base::Bind(&CdmSessionAdapter::OnSessionClosed, weak_this), |
| 54 base::Bind(&CdmSessionAdapter::OnLegacySessionError, weak_this), | 56 base::Bind(&CdmSessionAdapter::OnLegacySessionError, weak_this), |
| 55 base::Bind(&CdmSessionAdapter::OnSessionKeysChange, weak_this), | 57 base::Bind(&CdmSessionAdapter::OnSessionKeysChange, weak_this), |
| 56 base::Bind(&CdmSessionAdapter::OnSessionExpirationUpdate, weak_this), | 58 base::Bind(&CdmSessionAdapter::OnSessionExpirationUpdate, weak_this), |
| 57 base::Bind(&CdmSessionAdapter::OnCdmCreated, this, key_system, | 59 base::Bind(&CdmSessionAdapter::OnCdmCreated, this, key_system, |
| 58 start_time)); | 60 start_time)); |
| 59 } | 61 } |
| 60 | 62 |
| 61 void CdmSessionAdapter::SetServerCertificate( | 63 void CdmSessionAdapter::SetServerCertificate( |
| 62 const std::vector<uint8_t>& certificate, | 64 const std::vector<uint8_t>& certificate, |
| 63 scoped_ptr<SimpleCdmPromise> promise) { | 65 scoped_ptr<SimpleCdmPromise> promise) { |
| 64 cdm_->SetServerCertificate(certificate, promise.Pass()); | 66 cdm_->SetServerCertificate(certificate, std::move(promise)); |
| 65 } | 67 } |
| 66 | 68 |
| 67 WebContentDecryptionModuleSessionImpl* CdmSessionAdapter::CreateSession() { | 69 WebContentDecryptionModuleSessionImpl* CdmSessionAdapter::CreateSession() { |
| 68 return new WebContentDecryptionModuleSessionImpl(this); | 70 return new WebContentDecryptionModuleSessionImpl(this); |
| 69 } | 71 } |
| 70 | 72 |
| 71 bool CdmSessionAdapter::RegisterSession( | 73 bool CdmSessionAdapter::RegisterSession( |
| 72 const std::string& session_id, | 74 const std::string& session_id, |
| 73 base::WeakPtr<WebContentDecryptionModuleSessionImpl> session) { | 75 base::WeakPtr<WebContentDecryptionModuleSessionImpl> session) { |
| 74 // If this session ID is already registered, don't register it again. | 76 // If this session ID is already registered, don't register it again. |
| 75 if (ContainsKey(sessions_, session_id)) | 77 if (ContainsKey(sessions_, session_id)) |
| 76 return false; | 78 return false; |
| 77 | 79 |
| 78 sessions_[session_id] = session; | 80 sessions_[session_id] = session; |
| 79 return true; | 81 return true; |
| 80 } | 82 } |
| 81 | 83 |
| 82 void CdmSessionAdapter::UnregisterSession(const std::string& session_id) { | 84 void CdmSessionAdapter::UnregisterSession(const std::string& session_id) { |
| 83 DCHECK(ContainsKey(sessions_, session_id)); | 85 DCHECK(ContainsKey(sessions_, session_id)); |
| 84 sessions_.erase(session_id); | 86 sessions_.erase(session_id); |
| 85 } | 87 } |
| 86 | 88 |
| 87 void CdmSessionAdapter::InitializeNewSession( | 89 void CdmSessionAdapter::InitializeNewSession( |
| 88 EmeInitDataType init_data_type, | 90 EmeInitDataType init_data_type, |
| 89 const std::vector<uint8_t>& init_data, | 91 const std::vector<uint8_t>& init_data, |
| 90 MediaKeys::SessionType session_type, | 92 MediaKeys::SessionType session_type, |
| 91 scoped_ptr<NewSessionCdmPromise> promise) { | 93 scoped_ptr<NewSessionCdmPromise> promise) { |
| 92 cdm_->CreateSessionAndGenerateRequest(session_type, init_data_type, init_data, | 94 cdm_->CreateSessionAndGenerateRequest(session_type, init_data_type, init_data, |
| 93 promise.Pass()); | 95 std::move(promise)); |
| 94 } | 96 } |
| 95 | 97 |
| 96 void CdmSessionAdapter::LoadSession(MediaKeys::SessionType session_type, | 98 void CdmSessionAdapter::LoadSession(MediaKeys::SessionType session_type, |
| 97 const std::string& session_id, | 99 const std::string& session_id, |
| 98 scoped_ptr<NewSessionCdmPromise> promise) { | 100 scoped_ptr<NewSessionCdmPromise> promise) { |
| 99 cdm_->LoadSession(session_type, session_id, promise.Pass()); | 101 cdm_->LoadSession(session_type, session_id, std::move(promise)); |
| 100 } | 102 } |
| 101 | 103 |
| 102 void CdmSessionAdapter::UpdateSession(const std::string& session_id, | 104 void CdmSessionAdapter::UpdateSession(const std::string& session_id, |
| 103 const std::vector<uint8_t>& response, | 105 const std::vector<uint8_t>& response, |
| 104 scoped_ptr<SimpleCdmPromise> promise) { | 106 scoped_ptr<SimpleCdmPromise> promise) { |
| 105 cdm_->UpdateSession(session_id, response, promise.Pass()); | 107 cdm_->UpdateSession(session_id, response, std::move(promise)); |
| 106 } | 108 } |
| 107 | 109 |
| 108 void CdmSessionAdapter::CloseSession(const std::string& session_id, | 110 void CdmSessionAdapter::CloseSession(const std::string& session_id, |
| 109 scoped_ptr<SimpleCdmPromise> promise) { | 111 scoped_ptr<SimpleCdmPromise> promise) { |
| 110 cdm_->CloseSession(session_id, promise.Pass()); | 112 cdm_->CloseSession(session_id, std::move(promise)); |
| 111 } | 113 } |
| 112 | 114 |
| 113 void CdmSessionAdapter::RemoveSession(const std::string& session_id, | 115 void CdmSessionAdapter::RemoveSession(const std::string& session_id, |
| 114 scoped_ptr<SimpleCdmPromise> promise) { | 116 scoped_ptr<SimpleCdmPromise> promise) { |
| 115 cdm_->RemoveSession(session_id, promise.Pass()); | 117 cdm_->RemoveSession(session_id, std::move(promise)); |
| 116 } | 118 } |
| 117 | 119 |
| 118 CdmContext* CdmSessionAdapter::GetCdmContext() { | 120 CdmContext* CdmSessionAdapter::GetCdmContext() { |
| 119 return cdm_->GetCdmContext(); | 121 return cdm_->GetCdmContext(); |
| 120 } | 122 } |
| 121 | 123 |
| 122 const std::string& CdmSessionAdapter::GetKeySystem() const { | 124 const std::string& CdmSessionAdapter::GetKeySystem() const { |
| 123 return key_system_; | 125 return key_system_; |
| 124 } | 126 } |
| 125 | 127 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 } | 176 } |
| 175 | 177 |
| 176 void CdmSessionAdapter::OnSessionKeysChange(const std::string& session_id, | 178 void CdmSessionAdapter::OnSessionKeysChange(const std::string& session_id, |
| 177 bool has_additional_usable_key, | 179 bool has_additional_usable_key, |
| 178 CdmKeysInfo keys_info) { | 180 CdmKeysInfo keys_info) { |
| 179 // TODO(jrummell): Pass |keys_info| on. | 181 // TODO(jrummell): Pass |keys_info| on. |
| 180 WebContentDecryptionModuleSessionImpl* session = GetSession(session_id); | 182 WebContentDecryptionModuleSessionImpl* session = GetSession(session_id); |
| 181 DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " | 183 DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " |
| 182 << session_id; | 184 << session_id; |
| 183 if (session) | 185 if (session) |
| 184 session->OnSessionKeysChange(has_additional_usable_key, keys_info.Pass()); | 186 session->OnSessionKeysChange(has_additional_usable_key, |
| 187 std::move(keys_info)); |
| 185 } | 188 } |
| 186 | 189 |
| 187 void CdmSessionAdapter::OnSessionExpirationUpdate( | 190 void CdmSessionAdapter::OnSessionExpirationUpdate( |
| 188 const std::string& session_id, | 191 const std::string& session_id, |
| 189 const base::Time& new_expiry_time) { | 192 const base::Time& new_expiry_time) { |
| 190 WebContentDecryptionModuleSessionImpl* session = GetSession(session_id); | 193 WebContentDecryptionModuleSessionImpl* session = GetSession(session_id); |
| 191 DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " | 194 DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " |
| 192 << session_id; | 195 << session_id; |
| 193 if (session) | 196 if (session) |
| 194 session->OnSessionExpirationUpdate(new_expiry_time); | 197 session->OnSessionExpirationUpdate(new_expiry_time); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 224 // Note: This leaks memory, which is expected behavior. | 227 // Note: This leaks memory, which is expected behavior. |
| 225 base::HistogramBase* histogram = base::Histogram::FactoryTimeGet( | 228 base::HistogramBase* histogram = base::Histogram::FactoryTimeGet( |
| 226 GetKeySystemUMAPrefix() + kTimeToCreateCdmUMAName, | 229 GetKeySystemUMAPrefix() + kTimeToCreateCdmUMAName, |
| 227 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromSeconds(10), | 230 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromSeconds(10), |
| 228 50, base::HistogramBase::kUmaTargetedHistogramFlag); | 231 50, base::HistogramBase::kUmaTargetedHistogramFlag); |
| 229 | 232 |
| 230 histogram->AddTime(time); | 233 histogram->AddTime(time); |
| 231 } | 234 } |
| 232 | 235 |
| 233 } // namespace media | 236 } // namespace media |
| OLD | NEW |