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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/metrics/histogram.h" |
9 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| 11 #include "base/trace_event/trace_event.h" |
10 #include "media/base/cdm_factory.h" | 12 #include "media/base/cdm_factory.h" |
11 #include "media/base/cdm_key_information.h" | 13 #include "media/base/cdm_key_information.h" |
12 #include "media/base/cdm_promise.h" | 14 #include "media/base/cdm_promise.h" |
13 #include "media/base/key_systems.h" | 15 #include "media/base/key_systems.h" |
14 #include "media/blink/webcontentdecryptionmodule_impl.h" | 16 #include "media/blink/webcontentdecryptionmodule_impl.h" |
15 #include "media/blink/webcontentdecryptionmodulesession_impl.h" | 17 #include "media/blink/webcontentdecryptionmodulesession_impl.h" |
16 #include "url/gurl.h" | 18 #include "url/gurl.h" |
17 | 19 |
18 namespace media { | 20 namespace media { |
19 | 21 |
20 const char kMediaEME[] = "Media.EME."; | 22 const char kMediaEME[] = "Media.EME."; |
21 const char kDot[] = "."; | 23 const char kDot[] = "."; |
| 24 const char kTimeToCreateCdmUMAName[] = "CreateCdmTime"; |
22 | 25 |
23 CdmSessionAdapter::CdmSessionAdapter() : weak_ptr_factory_(this) { | 26 CdmSessionAdapter::CdmSessionAdapter() |
24 } | 27 : trace_id_(0), weak_ptr_factory_(this) {} |
25 | 28 |
26 CdmSessionAdapter::~CdmSessionAdapter() {} | 29 CdmSessionAdapter::~CdmSessionAdapter() {} |
27 | 30 |
28 void CdmSessionAdapter::CreateCdm( | 31 void CdmSessionAdapter::CreateCdm( |
29 CdmFactory* cdm_factory, | 32 CdmFactory* cdm_factory, |
30 const std::string& key_system, | 33 const std::string& key_system, |
31 const GURL& security_origin, | 34 const GURL& security_origin, |
32 const CdmConfig& cdm_config, | 35 const CdmConfig& cdm_config, |
33 blink::WebContentDecryptionModuleResult result) { | 36 blink::WebContentDecryptionModuleResult result) { |
| 37 TRACE_EVENT_ASYNC_BEGIN0("media", "CdmSessionAdapter::CreateCdm", |
| 38 ++trace_id_); |
| 39 |
| 40 base::TimeTicks start_time = base::TimeTicks::Now(); |
| 41 |
34 // Note: WebContentDecryptionModuleImpl::Create() calls this method without | 42 // Note: WebContentDecryptionModuleImpl::Create() calls this method without |
35 // holding a reference to the CdmSessionAdapter. Bind OnCdmCreated() with | 43 // holding a reference to the CdmSessionAdapter. Bind OnCdmCreated() with |
36 // |this| instead of |weak_this| to prevent |this| from being destructed. | 44 // |this| instead of |weak_this| to prevent |this| from being destructed. |
37 base::WeakPtr<CdmSessionAdapter> weak_this = weak_ptr_factory_.GetWeakPtr(); | 45 base::WeakPtr<CdmSessionAdapter> weak_this = weak_ptr_factory_.GetWeakPtr(); |
38 cdm_factory->Create( | 46 cdm_factory->Create( |
39 key_system, security_origin, cdm_config, | 47 key_system, security_origin, cdm_config, |
40 base::Bind(&CdmSessionAdapter::OnSessionMessage, weak_this), | 48 base::Bind(&CdmSessionAdapter::OnSessionMessage, weak_this), |
41 base::Bind(&CdmSessionAdapter::OnSessionClosed, weak_this), | 49 base::Bind(&CdmSessionAdapter::OnSessionClosed, weak_this), |
42 base::Bind(&CdmSessionAdapter::OnLegacySessionError, weak_this), | 50 base::Bind(&CdmSessionAdapter::OnLegacySessionError, weak_this), |
43 base::Bind(&CdmSessionAdapter::OnSessionKeysChange, weak_this), | 51 base::Bind(&CdmSessionAdapter::OnSessionKeysChange, weak_this), |
44 base::Bind(&CdmSessionAdapter::OnSessionExpirationUpdate, weak_this), | 52 base::Bind(&CdmSessionAdapter::OnSessionExpirationUpdate, weak_this), |
45 base::Bind(&CdmSessionAdapter::OnCdmCreated, this, key_system, result)); | 53 base::Bind(&CdmSessionAdapter::OnCdmCreated, this, key_system, start_time, |
| 54 result)); |
46 } | 55 } |
47 | 56 |
48 void CdmSessionAdapter::SetServerCertificate( | 57 void CdmSessionAdapter::SetServerCertificate( |
49 const std::vector<uint8_t>& certificate, | 58 const std::vector<uint8_t>& certificate, |
50 scoped_ptr<SimpleCdmPromise> promise) { | 59 scoped_ptr<SimpleCdmPromise> promise) { |
51 cdm_->SetServerCertificate(certificate, promise.Pass()); | 60 cdm_->SetServerCertificate(certificate, promise.Pass()); |
52 } | 61 } |
53 | 62 |
54 WebContentDecryptionModuleSessionImpl* CdmSessionAdapter::CreateSession() { | 63 WebContentDecryptionModuleSessionImpl* CdmSessionAdapter::CreateSession() { |
55 return new WebContentDecryptionModuleSessionImpl(this); | 64 return new WebContentDecryptionModuleSessionImpl(this); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 | 113 |
105 CdmContext* CdmSessionAdapter::GetCdmContext() { | 114 CdmContext* CdmSessionAdapter::GetCdmContext() { |
106 return cdm_->GetCdmContext(); | 115 return cdm_->GetCdmContext(); |
107 } | 116 } |
108 | 117 |
109 const std::string& CdmSessionAdapter::GetKeySystem() const { | 118 const std::string& CdmSessionAdapter::GetKeySystem() const { |
110 return key_system_; | 119 return key_system_; |
111 } | 120 } |
112 | 121 |
113 const std::string& CdmSessionAdapter::GetKeySystemUMAPrefix() const { | 122 const std::string& CdmSessionAdapter::GetKeySystemUMAPrefix() const { |
| 123 DCHECK(!key_system_uma_prefix_.empty()); |
114 return key_system_uma_prefix_; | 124 return key_system_uma_prefix_; |
115 } | 125 } |
116 | 126 |
117 void CdmSessionAdapter::OnCdmCreated( | 127 void CdmSessionAdapter::OnCdmCreated( |
118 const std::string& key_system, | 128 const std::string& key_system, |
| 129 base::TimeTicks start_time, |
119 blink::WebContentDecryptionModuleResult result, | 130 blink::WebContentDecryptionModuleResult result, |
120 scoped_ptr<MediaKeys> cdm, | 131 scoped_ptr<MediaKeys> cdm, |
121 const std::string& error_message) { | 132 const std::string& error_message) { |
122 DVLOG(2) << __FUNCTION__; | 133 DVLOG(2) << __FUNCTION__; |
| 134 DCHECK(!cdm_); |
| 135 |
| 136 TRACE_EVENT_ASYNC_END2("media", "CdmSessionAdapter::CreateCdm", trace_id_, |
| 137 "success", (cdm ? "true" : "false"), "error_message", |
| 138 error_message); |
| 139 |
123 if (!cdm) { | 140 if (!cdm) { |
124 result.completeWithError( | 141 result.completeWithError( |
125 blink::WebContentDecryptionModuleExceptionNotSupportedError, 0, | 142 blink::WebContentDecryptionModuleExceptionNotSupportedError, 0, |
126 blink::WebString::fromUTF8(error_message)); | 143 blink::WebString::fromUTF8(error_message)); |
127 return; | 144 return; |
128 } | 145 } |
129 | 146 |
130 key_system_ = key_system; | 147 key_system_ = key_system; |
131 key_system_uma_prefix_ = | 148 key_system_uma_prefix_ = |
132 kMediaEME + GetKeySystemNameForUMA(key_system) + kDot; | 149 kMediaEME + GetKeySystemNameForUMA(key_system) + kDot; |
| 150 |
| 151 // Only report time for successful CDM creation. |
| 152 ReportTimeToCreateCdmUMA(base::TimeTicks::Now() - start_time); |
| 153 |
133 cdm_ = cdm.Pass(); | 154 cdm_ = cdm.Pass(); |
134 | 155 |
135 result.completeWithContentDecryptionModule( | 156 result.completeWithContentDecryptionModule( |
136 new WebContentDecryptionModuleImpl(this)); | 157 new WebContentDecryptionModuleImpl(this)); |
137 } | 158 } |
138 | 159 |
139 void CdmSessionAdapter::OnSessionMessage( | 160 void CdmSessionAdapter::OnSessionMessage( |
140 const std::string& session_id, | 161 const std::string& session_id, |
141 MediaKeys::MessageType message_type, | 162 MediaKeys::MessageType message_type, |
142 const std::vector<uint8_t>& message, | 163 const std::vector<uint8_t>& message, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 | 209 |
189 WebContentDecryptionModuleSessionImpl* CdmSessionAdapter::GetSession( | 210 WebContentDecryptionModuleSessionImpl* CdmSessionAdapter::GetSession( |
190 const std::string& session_id) { | 211 const std::string& session_id) { |
191 // Since session objects may get garbage collected, it is possible that there | 212 // Since session objects may get garbage collected, it is possible that there |
192 // are events coming back from the CDM and the session has been unregistered. | 213 // are events coming back from the CDM and the session has been unregistered. |
193 // We can not tell if the CDM is firing events at sessions that never existed. | 214 // We can not tell if the CDM is firing events at sessions that never existed. |
194 SessionMap::iterator session = sessions_.find(session_id); | 215 SessionMap::iterator session = sessions_.find(session_id); |
195 return (session != sessions_.end()) ? session->second.get() : NULL; | 216 return (session != sessions_.end()) ? session->second.get() : NULL; |
196 } | 217 } |
197 | 218 |
| 219 void CdmSessionAdapter::ReportTimeToCreateCdmUMA(base::TimeDelta time) const { |
| 220 // Note: This leaks memory, which is expected behavior. |
| 221 base::HistogramBase* histogram = base::Histogram::FactoryTimeGet( |
| 222 GetKeySystemUMAPrefix() + kTimeToCreateCdmUMAName, |
| 223 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromSeconds(10), |
| 224 50, base::HistogramBase::kUmaTargetedHistogramFlag); |
| 225 |
| 226 histogram->AddTime(time); |
| 227 } |
| 228 |
198 } // namespace media | 229 } // namespace media |
OLD | NEW |