OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/big_endian.h" | 5 #include "base/big_endian.h" |
6 #include "base/debug/trace_event.h" | 6 #include "base/debug/trace_event.h" |
7 #include "media/cast/logging/logging_impl.h" | 7 #include "media/cast/logging/logging_impl.h" |
8 | 8 |
9 namespace media { | 9 namespace media { |
10 namespace cast { | 10 namespace cast { |
11 | 11 |
12 LoggingImpl::LoggingImpl( | 12 LoggingImpl::LoggingImpl(const CastLoggingConfig& config) |
13 scoped_refptr<base::SingleThreadTaskRunner> main_thread_proxy, | 13 : config_(config), raw_(), stats_() { |
14 const CastLoggingConfig& config) | 14 // LoggingImpl can be constructed on any thread, but its methods should all be |
15 : main_thread_proxy_(main_thread_proxy), | 15 // called on the same thread. |
16 config_(config), | 16 thread_checker_.DetachFromThread(); |
17 raw_(), | 17 } |
18 stats_() {} | |
19 | 18 |
20 LoggingImpl::~LoggingImpl() {} | 19 LoggingImpl::~LoggingImpl() {} |
21 | 20 |
22 void LoggingImpl::InsertFrameEvent(const base::TimeTicks& time_of_event, | 21 void LoggingImpl::InsertFrameEvent(const base::TimeTicks& time_of_event, |
23 CastLoggingEvent event, uint32 rtp_timestamp, | 22 CastLoggingEvent event, uint32 rtp_timestamp, |
24 uint32 frame_id) { | 23 uint32 frame_id) { |
25 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 24 DCHECK(thread_checker_.CalledOnValidThread()); |
26 if (config_.enable_raw_data_collection) { | 25 if (config_.enable_raw_data_collection) { |
27 raw_.InsertFrameEvent(time_of_event, event, rtp_timestamp, frame_id); | 26 raw_.InsertFrameEvent(time_of_event, event, rtp_timestamp, frame_id); |
28 } | 27 } |
29 if (config_.enable_stats_data_collection) { | 28 if (config_.enable_stats_data_collection) { |
30 stats_.InsertFrameEvent(time_of_event, event, rtp_timestamp, frame_id); | 29 stats_.InsertFrameEvent(time_of_event, event, rtp_timestamp, frame_id); |
31 } | 30 } |
32 if (config_.enable_tracing) { | 31 if (config_.enable_tracing) { |
33 std::string event_string = CastLoggingToString(event); | 32 std::string event_string = CastLoggingToString(event); |
34 TRACE_EVENT_INSTANT2(event_string.c_str(), "FE", TRACE_EVENT_SCOPE_THREAD, | 33 TRACE_EVENT_INSTANT2(event_string.c_str(), "FE", TRACE_EVENT_SCOPE_THREAD, |
35 "rtp_timestamp", rtp_timestamp, "frame_id", frame_id); | 34 "rtp_timestamp", rtp_timestamp, "frame_id", frame_id); |
36 } | 35 } |
37 } | 36 } |
38 | 37 |
39 void LoggingImpl::InsertFrameEventWithSize(const base::TimeTicks& time_of_event, | 38 void LoggingImpl::InsertFrameEventWithSize(const base::TimeTicks& time_of_event, |
40 CastLoggingEvent event, | 39 CastLoggingEvent event, |
41 uint32 rtp_timestamp, | 40 uint32 rtp_timestamp, |
42 uint32 frame_id, int frame_size) { | 41 uint32 frame_id, int frame_size) { |
43 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 42 DCHECK(thread_checker_.CalledOnValidThread()); |
44 if (config_.enable_raw_data_collection) { | 43 if (config_.enable_raw_data_collection) { |
45 raw_.InsertFrameEventWithSize(time_of_event, event, rtp_timestamp, frame_id, | 44 raw_.InsertFrameEventWithSize(time_of_event, event, rtp_timestamp, frame_id, |
46 frame_size); | 45 frame_size); |
47 } | 46 } |
48 if (config_.enable_stats_data_collection) { | 47 if (config_.enable_stats_data_collection) { |
49 stats_.InsertFrameEventWithSize(time_of_event, event, rtp_timestamp, | 48 stats_.InsertFrameEventWithSize(time_of_event, event, rtp_timestamp, |
50 frame_id, frame_size); | 49 frame_id, frame_size); |
51 } | 50 } |
52 | 51 |
53 if (config_.enable_tracing) { | 52 if (config_.enable_tracing) { |
54 std::string event_string = CastLoggingToString(event); | 53 std::string event_string = CastLoggingToString(event); |
55 TRACE_EVENT_INSTANT2(event_string.c_str(), "FES", TRACE_EVENT_SCOPE_THREAD, | 54 TRACE_EVENT_INSTANT2(event_string.c_str(), "FES", TRACE_EVENT_SCOPE_THREAD, |
56 "rtp_timestamp", rtp_timestamp, "frame_size", | 55 "rtp_timestamp", rtp_timestamp, "frame_size", |
57 frame_size); | 56 frame_size); |
58 } | 57 } |
59 } | 58 } |
60 | 59 |
61 void LoggingImpl::InsertFrameEventWithDelay( | 60 void LoggingImpl::InsertFrameEventWithDelay( |
62 const base::TimeTicks& time_of_event, CastLoggingEvent event, | 61 const base::TimeTicks& time_of_event, CastLoggingEvent event, |
63 uint32 rtp_timestamp, uint32 frame_id, base::TimeDelta delay) { | 62 uint32 rtp_timestamp, uint32 frame_id, base::TimeDelta delay) { |
64 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 63 DCHECK(thread_checker_.CalledOnValidThread()); |
65 if (config_.enable_raw_data_collection) { | 64 if (config_.enable_raw_data_collection) { |
66 raw_.InsertFrameEventWithDelay(time_of_event, event, rtp_timestamp, | 65 raw_.InsertFrameEventWithDelay(time_of_event, event, rtp_timestamp, |
67 frame_id, delay); | 66 frame_id, delay); |
68 } | 67 } |
69 if (config_.enable_stats_data_collection) { | 68 if (config_.enable_stats_data_collection) { |
70 stats_.InsertFrameEventWithDelay(time_of_event, event, rtp_timestamp, | 69 stats_.InsertFrameEventWithDelay(time_of_event, event, rtp_timestamp, |
71 frame_id, delay); | 70 frame_id, delay); |
72 } | 71 } |
73 | 72 |
74 if (config_.enable_tracing) { | 73 if (config_.enable_tracing) { |
75 std::string event_string = CastLoggingToString(event); | 74 std::string event_string = CastLoggingToString(event); |
76 TRACE_EVENT_INSTANT2(event_string.c_str(), "FED", TRACE_EVENT_SCOPE_THREAD, | 75 TRACE_EVENT_INSTANT2(event_string.c_str(), "FED", TRACE_EVENT_SCOPE_THREAD, |
77 "rtp_timestamp", rtp_timestamp, "delay", | 76 "rtp_timestamp", rtp_timestamp, "delay", |
78 delay.InMilliseconds()); | 77 delay.InMilliseconds()); |
79 } | 78 } |
80 } | 79 } |
81 | 80 |
82 void LoggingImpl::InsertPacketListEvent(const base::TimeTicks& time_of_event, | 81 void LoggingImpl::InsertPacketListEvent(const base::TimeTicks& time_of_event, |
83 CastLoggingEvent event, | 82 CastLoggingEvent event, |
84 const PacketList& packets) { | 83 const PacketList& packets) { |
85 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 84 DCHECK(thread_checker_.CalledOnValidThread()); |
86 for (unsigned int i = 0; i < packets.size(); ++i) { | 85 for (unsigned int i = 0; i < packets.size(); ++i) { |
87 const Packet& packet = packets[i]; | 86 const Packet& packet = packets[i]; |
88 // Parse basic properties. | 87 // Parse basic properties. |
89 uint32 rtp_timestamp; | 88 uint32 rtp_timestamp; |
90 uint16 packet_id, max_packet_id; | 89 uint16 packet_id, max_packet_id; |
91 const uint8* packet_data = &packet[0]; | 90 const uint8* packet_data = &packet[0]; |
92 base::BigEndianReader big_endian_reader( | 91 base::BigEndianReader big_endian_reader( |
93 reinterpret_cast<const char*>(packet_data + 4), 4); | 92 reinterpret_cast<const char*>(packet_data + 4), 4); |
94 big_endian_reader.ReadU32(&rtp_timestamp); | 93 big_endian_reader.ReadU32(&rtp_timestamp); |
95 base::BigEndianReader cast_big_endian_reader( | 94 base::BigEndianReader cast_big_endian_reader( |
96 reinterpret_cast<const char*>(packet_data + 12 + 2), 4); | 95 reinterpret_cast<const char*>(packet_data + 12 + 2), 4); |
97 cast_big_endian_reader.ReadU16(&packet_id); | 96 cast_big_endian_reader.ReadU16(&packet_id); |
98 cast_big_endian_reader.ReadU16(&max_packet_id); | 97 cast_big_endian_reader.ReadU16(&max_packet_id); |
99 // rtp_timestamp is enough - no need for frame_id as well. | 98 // rtp_timestamp is enough - no need for frame_id as well. |
100 InsertPacketEvent(time_of_event, event, rtp_timestamp, kFrameIdUnknown, | 99 InsertPacketEvent(time_of_event, event, rtp_timestamp, kFrameIdUnknown, |
101 packet_id, max_packet_id, packet.size()); | 100 packet_id, max_packet_id, packet.size()); |
102 } | 101 } |
103 } | 102 } |
104 | 103 |
105 void LoggingImpl::InsertPacketEvent(const base::TimeTicks& time_of_event, | 104 void LoggingImpl::InsertPacketEvent(const base::TimeTicks& time_of_event, |
106 CastLoggingEvent event, | 105 CastLoggingEvent event, |
107 uint32 rtp_timestamp, uint32 frame_id, | 106 uint32 rtp_timestamp, uint32 frame_id, |
108 uint16 packet_id, uint16 max_packet_id, | 107 uint16 packet_id, uint16 max_packet_id, |
109 size_t size) { | 108 size_t size) { |
110 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 109 DCHECK(thread_checker_.CalledOnValidThread()); |
111 if (config_.enable_raw_data_collection) { | 110 if (config_.enable_raw_data_collection) { |
112 raw_.InsertPacketEvent(time_of_event, event, rtp_timestamp, frame_id, | 111 raw_.InsertPacketEvent(time_of_event, event, rtp_timestamp, frame_id, |
113 packet_id, max_packet_id, size); | 112 packet_id, max_packet_id, size); |
114 } | 113 } |
115 if (config_.enable_stats_data_collection) { | 114 if (config_.enable_stats_data_collection) { |
116 stats_.InsertPacketEvent(time_of_event, event, rtp_timestamp, frame_id, | 115 stats_.InsertPacketEvent(time_of_event, event, rtp_timestamp, frame_id, |
117 packet_id, max_packet_id, size); | 116 packet_id, max_packet_id, size); |
118 } | 117 } |
119 if (config_.enable_tracing) { | 118 if (config_.enable_tracing) { |
120 std::string event_string = CastLoggingToString(event); | 119 std::string event_string = CastLoggingToString(event); |
121 TRACE_EVENT_INSTANT2(event_string.c_str(), "PE", TRACE_EVENT_SCOPE_THREAD, | 120 TRACE_EVENT_INSTANT2(event_string.c_str(), "PE", TRACE_EVENT_SCOPE_THREAD, |
122 "rtp_timestamp", rtp_timestamp, "packet_id", | 121 "rtp_timestamp", rtp_timestamp, "packet_id", |
123 packet_id); | 122 packet_id); |
124 } | 123 } |
125 } | 124 } |
126 | 125 |
127 void LoggingImpl::InsertGenericEvent(const base::TimeTicks& time_of_event, | 126 void LoggingImpl::InsertGenericEvent(const base::TimeTicks& time_of_event, |
128 CastLoggingEvent event, int value) { | 127 CastLoggingEvent event, int value) { |
129 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 128 DCHECK(thread_checker_.CalledOnValidThread()); |
130 if (config_.enable_raw_data_collection) { | 129 if (config_.enable_raw_data_collection) { |
131 raw_.InsertGenericEvent(time_of_event, event, value); | 130 raw_.InsertGenericEvent(time_of_event, event, value); |
132 } | 131 } |
133 if (config_.enable_stats_data_collection) { | 132 if (config_.enable_stats_data_collection) { |
134 stats_.InsertGenericEvent(time_of_event, event, value); | 133 stats_.InsertGenericEvent(time_of_event, event, value); |
135 } | 134 } |
136 | 135 |
137 if (config_.enable_tracing) { | 136 if (config_.enable_tracing) { |
138 std::string event_string = CastLoggingToString(event); | 137 std::string event_string = CastLoggingToString(event); |
139 TRACE_EVENT_INSTANT1(event_string.c_str(), "GE", TRACE_EVENT_SCOPE_THREAD, | 138 TRACE_EVENT_INSTANT1(event_string.c_str(), "GE", TRACE_EVENT_SCOPE_THREAD, |
140 "value", value); | 139 "value", value); |
141 } | 140 } |
142 } | 141 } |
143 | 142 |
144 void LoggingImpl::AddRawEventSubscriber(RawEventSubscriber* subscriber) { | 143 void LoggingImpl::AddRawEventSubscriber(RawEventSubscriber* subscriber) { |
| 144 DCHECK(thread_checker_.CalledOnValidThread()); |
145 raw_.AddSubscriber(subscriber); | 145 raw_.AddSubscriber(subscriber); |
146 } | 146 } |
147 | 147 |
148 void LoggingImpl::RemoveRawEventSubscriber(RawEventSubscriber* subscriber) { | 148 void LoggingImpl::RemoveRawEventSubscriber(RawEventSubscriber* subscriber) { |
| 149 DCHECK(thread_checker_.CalledOnValidThread()); |
149 raw_.RemoveSubscriber(subscriber); | 150 raw_.RemoveSubscriber(subscriber); |
150 } | 151 } |
151 | 152 |
152 FrameStatsMap LoggingImpl::GetFrameStatsData(EventMediaType media_type) const { | 153 FrameStatsMap LoggingImpl::GetFrameStatsData(EventMediaType media_type) const { |
153 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 154 DCHECK(thread_checker_.CalledOnValidThread()); |
154 return stats_.GetFrameStatsData(media_type); | 155 return stats_.GetFrameStatsData(media_type); |
155 } | 156 } |
156 | 157 |
157 PacketStatsMap LoggingImpl::GetPacketStatsData( | 158 PacketStatsMap LoggingImpl::GetPacketStatsData( |
158 EventMediaType media_type) const { | 159 EventMediaType media_type) const { |
159 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 160 DCHECK(thread_checker_.CalledOnValidThread()); |
160 return stats_.GetPacketStatsData(media_type); | 161 return stats_.GetPacketStatsData(media_type); |
161 } | 162 } |
162 | 163 |
163 GenericStatsMap LoggingImpl::GetGenericStatsData() const { | 164 GenericStatsMap LoggingImpl::GetGenericStatsData() const { |
164 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 165 DCHECK(thread_checker_.CalledOnValidThread()); |
165 return stats_.GetGenericStatsData(); | 166 return stats_.GetGenericStatsData(); |
166 } | 167 } |
167 | 168 |
168 void LoggingImpl::ResetStats() { | 169 void LoggingImpl::ResetStats() { |
169 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 170 DCHECK(thread_checker_.CalledOnValidThread()); |
170 stats_.Reset(); | 171 stats_.Reset(); |
171 } | 172 } |
172 | 173 |
173 } // namespace cast | 174 } // namespace cast |
174 } // namespace media | 175 } // namespace media |
OLD | NEW |