1 // Copyright (c) 2012 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/base/media_log.h"
9 #include "base/atomic_sequence_num.h"
10 #include "base/logging.h"
11 #include "base/values.h"
15 // A count of all MediaLogs created in the current process. Used to generate
17 static base::StaticAtomicSequenceNumber g_media_log_count
;
19 const char* MediaLog::EventTypeToString(MediaLogEvent::Type type
) {
21 case MediaLogEvent::WEBMEDIAPLAYER_CREATED
:
22 return "WEBMEDIAPLAYER_CREATED";
23 case MediaLogEvent::WEBMEDIAPLAYER_DESTROYED
:
24 return "WEBMEDIAPLAYER_DESTROYED";
25 case MediaLogEvent::PIPELINE_CREATED
:
26 return "PIPELINE_CREATED";
27 case MediaLogEvent::PIPELINE_DESTROYED
:
28 return "PIPELINE_DESTROYED";
29 case MediaLogEvent::LOAD
:
31 case MediaLogEvent::SEEK
:
33 case MediaLogEvent::PLAY
:
35 case MediaLogEvent::PAUSE
:
37 case MediaLogEvent::PIPELINE_STATE_CHANGED
:
38 return "PIPELINE_STATE_CHANGED";
39 case MediaLogEvent::PIPELINE_ERROR
:
40 return "PIPELINE_ERROR";
41 case MediaLogEvent::VIDEO_SIZE_SET
:
42 return "VIDEO_SIZE_SET";
43 case MediaLogEvent::DURATION_SET
:
44 return "DURATION_SET";
45 case MediaLogEvent::TOTAL_BYTES_SET
:
46 return "TOTAL_BYTES_SET";
47 case MediaLogEvent::NETWORK_ACTIVITY_SET
:
48 return "NETWORK_ACTIVITY_SET";
49 case MediaLogEvent::AUDIO_ENDED
:
51 case MediaLogEvent::VIDEO_ENDED
:
53 case MediaLogEvent::TEXT_ENDED
:
55 case MediaLogEvent::BUFFERED_EXTENTS_CHANGED
:
56 return "BUFFERED_EXTENTS_CHANGED";
57 case MediaLogEvent::MEDIA_SOURCE_ERROR
:
58 return "MEDIA_SOURCE_ERROR";
59 case MediaLogEvent::PROPERTY_CHANGE
:
60 return "PROPERTY_CHANGE";
66 const char* MediaLog::PipelineStatusToString(PipelineStatus status
) {
69 return "pipeline: ok";
70 case PIPELINE_ERROR_URL_NOT_FOUND
:
71 return "pipeline: url not found";
72 case PIPELINE_ERROR_NETWORK
:
73 return "pipeline: network error";
74 case PIPELINE_ERROR_DECODE
:
75 return "pipeline: decode error";
76 case PIPELINE_ERROR_DECRYPT
:
77 return "pipeline: decrypt error";
78 case PIPELINE_ERROR_ABORT
:
79 return "pipeline: abort";
80 case PIPELINE_ERROR_INITIALIZATION_FAILED
:
81 return "pipeline: initialization failed";
82 case PIPELINE_ERROR_COULD_NOT_RENDER
:
83 return "pipeline: could not render";
84 case PIPELINE_ERROR_READ
:
85 return "pipeline: read error";
86 case PIPELINE_ERROR_OPERATION_PENDING
:
87 return "pipeline: operation pending";
88 case PIPELINE_ERROR_INVALID_STATE
:
89 return "pipeline: invalid state";
90 case DEMUXER_ERROR_COULD_NOT_OPEN
:
91 return "demuxer: could not open";
92 case DEMUXER_ERROR_COULD_NOT_PARSE
:
93 return "dumuxer: could not parse";
94 case DEMUXER_ERROR_NO_SUPPORTED_STREAMS
:
95 return "demuxer: no supported streams";
96 case DECODER_ERROR_NOT_SUPPORTED
:
97 return "decoder: not supported";
103 LogHelper::LogHelper(const LogCB
& log_cb
) : log_cb_(log_cb
) {}
105 LogHelper::~LogHelper() {
106 if (log_cb_
.is_null())
108 log_cb_
.Run(stream_
.str());
111 MediaLog::MediaLog() : id_(g_media_log_count
.GetNext()) {}
113 MediaLog::~MediaLog() {}
115 void MediaLog::AddEvent(scoped_ptr
<MediaLogEvent
> event
) {}
117 scoped_ptr
<MediaLogEvent
> MediaLog::CreateEvent(MediaLogEvent::Type type
) {
118 scoped_ptr
<MediaLogEvent
> event(new MediaLogEvent
);
121 event
->time
= base::TimeTicks::Now();
125 scoped_ptr
<MediaLogEvent
> MediaLog::CreateBooleanEvent(
126 MediaLogEvent::Type type
, const char* property
, bool value
) {
127 scoped_ptr
<MediaLogEvent
> event(CreateEvent(type
));
128 event
->params
.SetBoolean(property
, value
);
132 scoped_ptr
<MediaLogEvent
> MediaLog::CreateStringEvent(
133 MediaLogEvent::Type type
, const char* property
, const std::string
& value
) {
134 scoped_ptr
<MediaLogEvent
> event(CreateEvent(type
));
135 event
->params
.SetString(property
, value
);
139 scoped_ptr
<MediaLogEvent
> MediaLog::CreateTimeEvent(
140 MediaLogEvent::Type type
, const char* property
, base::TimeDelta value
) {
141 scoped_ptr
<MediaLogEvent
> event(CreateEvent(type
));
143 event
->params
.SetString(property
, "unknown");
145 event
->params
.SetDouble(property
, value
.InSecondsF());
149 scoped_ptr
<MediaLogEvent
> MediaLog::CreateLoadEvent(const std::string
& url
) {
150 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::LOAD
));
151 event
->params
.SetString("url", url
);
155 scoped_ptr
<MediaLogEvent
> MediaLog::CreateSeekEvent(float seconds
) {
156 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::SEEK
));
157 event
->params
.SetDouble("seek_target", seconds
);
161 scoped_ptr
<MediaLogEvent
> MediaLog::CreatePipelineStateChangedEvent(
162 Pipeline::State state
) {
163 scoped_ptr
<MediaLogEvent
> event(
164 CreateEvent(MediaLogEvent::PIPELINE_STATE_CHANGED
));
165 event
->params
.SetString("pipeline_state", Pipeline::GetStateString(state
));
169 scoped_ptr
<MediaLogEvent
> MediaLog::CreatePipelineErrorEvent(
170 PipelineStatus error
) {
171 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::PIPELINE_ERROR
));
172 event
->params
.SetString("pipeline_error", PipelineStatusToString(error
));
176 scoped_ptr
<MediaLogEvent
> MediaLog::CreateVideoSizeSetEvent(
177 size_t width
, size_t height
) {
178 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::VIDEO_SIZE_SET
));
179 event
->params
.SetInteger("width", width
);
180 event
->params
.SetInteger("height", height
);
184 scoped_ptr
<MediaLogEvent
> MediaLog::CreateBufferedExtentsChangedEvent(
185 int64 start
, int64 current
, int64 end
) {
186 scoped_ptr
<MediaLogEvent
> event(
187 CreateEvent(MediaLogEvent::BUFFERED_EXTENTS_CHANGED
));
188 // These values are headed to JS where there is no int64 so we use a double
189 // and accept loss of precision above 2^53 bytes (8 Exabytes).
190 event
->params
.SetDouble("buffer_start", start
);
191 event
->params
.SetDouble("buffer_current", current
);
192 event
->params
.SetDouble("buffer_end", end
);
196 scoped_ptr
<MediaLogEvent
> MediaLog::CreateMediaSourceErrorEvent(
197 const std::string
& error
) {
198 scoped_ptr
<MediaLogEvent
> event(
199 CreateEvent(MediaLogEvent::MEDIA_SOURCE_ERROR
));
200 event
->params
.SetString("error", error
);
204 void MediaLog::SetStringProperty(
205 const char* key
, const std::string
& value
) {
206 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::PROPERTY_CHANGE
));
207 event
->params
.SetString(key
, value
);
208 AddEvent(event
.Pass());
211 void MediaLog::SetIntegerProperty(
212 const char* key
, int value
) {
213 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::PROPERTY_CHANGE
));
214 event
->params
.SetInteger(key
, value
);
215 AddEvent(event
.Pass());
218 void MediaLog::SetDoubleProperty(
219 const char* key
, double value
) {
220 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::PROPERTY_CHANGE
));
221 event
->params
.SetDouble(key
, value
);
222 AddEvent(event
.Pass());
225 void MediaLog::SetBooleanProperty(
226 const char* key
, bool value
) {
227 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::PROPERTY_CHANGE
));
228 event
->params
.SetBoolean(key
, value
);
229 AddEvent(event
.Pass());
232 void MediaLog::SetTimeProperty(
233 const char* key
, base::TimeDelta value
) {
234 scoped_ptr
<MediaLogEvent
> event(CreateEvent(MediaLogEvent::PROPERTY_CHANGE
));
236 event
->params
.SetString(key
, "unknown");
238 event
->params
.SetDouble(key
, value
.InSecondsF());
239 AddEvent(event
.Pass());