| 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() const { | 153 FrameStatsMap LoggingImpl::GetFrameStatsData() const { |
| 153 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 154 DCHECK(thread_checker_.CalledOnValidThread()); |
| 154 return stats_.GetFrameStatsData(); | 155 return stats_.GetFrameStatsData(); |
| 155 } | 156 } |
| 156 | 157 |
| 157 PacketStatsMap LoggingImpl::GetPacketStatsData() const { | 158 PacketStatsMap LoggingImpl::GetPacketStatsData() const { |
| 158 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 159 DCHECK(thread_checker_.CalledOnValidThread()); |
| 159 return stats_.GetPacketStatsData(); | 160 return stats_.GetPacketStatsData(); |
| 160 } | 161 } |
| 161 | 162 |
| 162 GenericStatsMap LoggingImpl::GetGenericStatsData() const { | 163 GenericStatsMap LoggingImpl::GetGenericStatsData() const { |
| 163 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 164 DCHECK(thread_checker_.CalledOnValidThread()); |
| 164 return stats_.GetGenericStatsData(); | 165 return stats_.GetGenericStatsData(); |
| 165 } | 166 } |
| 166 | 167 |
| 167 void LoggingImpl::ResetStats() { | 168 void LoggingImpl::ResetStats() { |
| 168 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 169 DCHECK(thread_checker_.CalledOnValidThread()); |
| 169 stats_.Reset(); | 170 stats_.Reset(); |
| 170 } | 171 } |
| 171 | 172 |
| 172 } // namespace cast | 173 } // namespace cast |
| 173 } // namespace media | 174 } // namespace media |
| OLD | NEW |