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 kCdmCreationTimeUMAName[] = "CreateCdm"; | |
ddorwin
2015/07/20 21:35:21
nit: CreateCdm seems very implementation-specific.
xhwang
2015/07/20 22:11:56
As discussed offline, we'll use "CreateCdmTime" in
| |
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 ReportCdmCreationTimeUMA(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::ReportCdmCreationTimeUMA( | |
220 base::TimeDelta cdm_creation_time) { | |
221 // Note: This leaks memory, which is expected behavior. | |
222 base::HistogramBase* histogram = base::Histogram::FactoryTimeGet( | |
223 GetKeySystemUMAPrefix() + kCdmCreationTimeUMAName, | |
224 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromSeconds(10), | |
225 50, base::HistogramBase::kUmaTargetedHistogramFlag); | |
226 | |
227 histogram->AddTime(cdm_creation_time); | |
228 } | |
229 | |
198 } // namespace media | 230 } // namespace media |
OLD | NEW |