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
3 // found in the LICENSE file.
4
5 #include "media/cast/logging/logging_raw.h"
6
7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
9 #include "base/time/time.h"
10
11 namespace media {
12 namespace cast {
13
LoggingRaw(base::TickClock * clock)14 LoggingRaw::LoggingRaw(base::TickClock* clock)
15 : clock_(clock),
16 frame_map_(),
17 packet_map_(),
18 generic_map_(),
19 weak_factory_(this) {}
20
~LoggingRaw()21 LoggingRaw::~LoggingRaw() {}
22
InsertFrameEvent(CastLoggingEvent event,uint32 rtp_timestamp,uint32 frame_id)23 void LoggingRaw::InsertFrameEvent(CastLoggingEvent event,
24 uint32 rtp_timestamp,
25 uint32 frame_id) {
26 InsertBaseFrameEvent(event, frame_id, rtp_timestamp);
27 }
28
InsertFrameEventWithSize(CastLoggingEvent event,uint32 rtp_timestamp,uint32 frame_id,int size)29 void LoggingRaw::InsertFrameEventWithSize(CastLoggingEvent event,
30 uint32 rtp_timestamp,
31 uint32 frame_id,
32 int size) {
33 InsertBaseFrameEvent(event, frame_id, rtp_timestamp);
34 // Now insert size.
35 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp);
36 DCHECK(it != frame_map_.end());
37 it->second.size = size;
38 }
39
InsertFrameEventWithDelay(CastLoggingEvent event,uint32 rtp_timestamp,uint32 frame_id,base::TimeDelta delay)40 void LoggingRaw::InsertFrameEventWithDelay(CastLoggingEvent event,
41 uint32 rtp_timestamp,
42 uint32 frame_id,
43 base::TimeDelta delay) {
44 InsertBaseFrameEvent(event, frame_id, rtp_timestamp);
45 // Now insert delay.
46 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp);
47 DCHECK(it != frame_map_.end());
48 it->second.delay_delta = delay;
49 }
50
InsertBaseFrameEvent(CastLoggingEvent event,uint32 frame_id,uint32 rtp_timestamp)51 void LoggingRaw::InsertBaseFrameEvent(CastLoggingEvent event,
52 uint32 frame_id,
53 uint32 rtp_timestamp) {
54 // Is this a new event?
55 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp);
56 if (it == frame_map_.end()) {
57 // Create a new map entry.
58 FrameEvent info;
59 info.frame_id = frame_id;
60 info.timestamp.push_back(clock_->NowTicks());
61 info.type.push_back(event);
62 frame_map_.insert(std::make_pair(rtp_timestamp, info));
63 } else {
64 // Insert to an existing entry.
65 it->second.timestamp.push_back(clock_->NowTicks());
66 it->second.type.push_back(event);
67 // Do we have a valid frame_id?
68 // Not all events have a valid frame id.
69 if (it->second.frame_id == kFrameIdUnknown && frame_id != kFrameIdUnknown)
70 it->second.frame_id = frame_id;
71 }
72 }
73
InsertPacketEvent(CastLoggingEvent event,uint32 rtp_timestamp,uint32 frame_id,uint16 packet_id,uint16 max_packet_id,size_t size)74 void LoggingRaw::InsertPacketEvent(CastLoggingEvent event,
75 uint32 rtp_timestamp,
76 uint32 frame_id,
77 uint16 packet_id,
78 uint16 max_packet_id,
79 size_t size) {
80 // Is this packet belonging to a new frame?
81 PacketRawMap::iterator it = packet_map_.find(rtp_timestamp);
82 if (it == packet_map_.end()) {
83 // Create a new entry - start with base packet map.
84 PacketEvent info;
85 info.frame_id = frame_id;
86 info.max_packet_id = max_packet_id;
87 BasePacketInfo base_info;
88 base_info.size = size;
89 base_info.timestamp.push_back(clock_->NowTicks());
90 base_info.type.push_back(event);
91 packet_map_.insert(std::make_pair(rtp_timestamp, info));
92 } else {
93 // Is this a new packet?
94 BasePacketMap::iterator packet_it = it->second.packet_map.find(packet_id);
95 if (packet_it == it->second.packet_map.end()) {
96 BasePacketInfo base_info;
97 base_info.size = size;
98 base_info.timestamp.push_back(clock_->NowTicks());
99 base_info.type.push_back(event);
100 it->second.packet_map.insert(std::make_pair(packet_id, base_info));
101 } else {
102 packet_it->second.timestamp.push_back(clock_->NowTicks());
103 packet_it->second.type.push_back(event);
104 }
105 }
106 }
107
InsertGenericEvent(CastLoggingEvent event,int value)108 void LoggingRaw::InsertGenericEvent(CastLoggingEvent event, int value) {
109 GenericEvent event_data;
110 event_data.value.push_back(value);
111 event_data.timestamp.push_back(clock_->NowTicks());
112 // Is this a new event?
113 GenericRawMap::iterator it = generic_map_.find(event);
114 if (it == generic_map_.end()) {
115 // Create new entry.
116 generic_map_.insert(std::make_pair(event, event_data));
117 } else {
118 // Insert to existing entry.
119 it->second.value.push_back(value);
120 it->second.timestamp.push_back(clock_->NowTicks());
121 }
122 }
123
GetFrameData() const124 FrameRawMap LoggingRaw::GetFrameData() const {
125 return frame_map_;
126 }
127
GetPacketData() const128 PacketRawMap LoggingRaw::GetPacketData() const {
129 return packet_map_;
130 }
131
GetGenericData() const132 GenericRawMap LoggingRaw::GetGenericData() const {
133 return generic_map_;
134 }
135
Reset()136 void LoggingRaw::Reset() {
137 frame_map_.clear();
138 packet_map_.clear();
139 generic_map_.clear();
140 }
141
142 } // namespace cast
143 } // namespace media
144