Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(614)

Side by Side Diff: media/cast/logging/encoding_event_subscriber.cc

Issue 165723002: Cast: Implemented size limiting and event filtering in EncodingEventSubscriber. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/cast/logging/encoding_event_subscriber.h" 5 #include "media/cast/logging/encoding_event_subscriber.h"
6 6
7 #include <cstring>
7 #include <utility> 8 #include <utility>
8 9
9 #include "base/logging.h" 10 #include "base/logging.h"
10 #include "media/cast/logging/proto/proto_utils.h" 11 #include "media/cast/logging/proto/proto_utils.h"
11 12
12 using google::protobuf::RepeatedPtrField; 13 using google::protobuf::RepeatedPtrField;
13 using media::cast::proto::AggregatedFrameEvent; 14 using media::cast::proto::AggregatedFrameEvent;
14 using media::cast::proto::AggregatedGenericEvent; 15 using media::cast::proto::AggregatedGenericEvent;
15 using media::cast::proto::AggregatedPacketEvent; 16 using media::cast::proto::AggregatedPacketEvent;
16 using media::cast::proto::BasePacketEvent; 17 using media::cast::proto::BasePacketEvent;
17 18
18 namespace media { 19 namespace media {
19 namespace cast { 20 namespace cast {
20 21
21 EncodingEventSubscriber::EncodingEventSubscriber() {} 22 EncodingEventSubscriber::EncodingEventSubscriber(
23 EncodingEventSubscriberConfig config)
24 : config_(config) {
25 DCHECK_GT(config_.max_generic_event_values, 0);
26 memset(next_write_index_, 0, sizeof(next_write_index_));
27 }
22 28
23 EncodingEventSubscriber::~EncodingEventSubscriber() { 29 EncodingEventSubscriber::~EncodingEventSubscriber() {
24 DCHECK(thread_checker_.CalledOnValidThread()); 30 DCHECK(thread_checker_.CalledOnValidThread());
25 } 31 }
26 32
27 void EncodingEventSubscriber::OnReceiveFrameEvent( 33 void EncodingEventSubscriber::OnReceiveFrameEvent(
28 const FrameEvent& frame_event) { 34 const FrameEvent& frame_event) {
29 DCHECK(thread_checker_.CalledOnValidThread()); 35 DCHECK(thread_checker_.CalledOnValidThread());
30 36
31 FrameEventMap::iterator it = frame_event_map_.find(frame_event.rtp_timestamp); 37 if (ShouldProcessEvent(frame_event.type)) {
32 linked_ptr<AggregatedFrameEvent> event_proto; 38 FrameEventMap::iterator it =
39 frame_event_map_.find(frame_event.rtp_timestamp);
40 linked_ptr<AggregatedFrameEvent> event_proto;
33 41
34 // Look up existing entry. If not found, create a new entry and add to map. 42 // Look up existing entry. If not found, create a new entry and add to map.
35 if (it == frame_event_map_.end()) { 43 if (it == frame_event_map_.end()) {
36 event_proto.reset(new AggregatedFrameEvent); 44 event_proto.reset(new AggregatedFrameEvent);
37 event_proto->set_rtp_timestamp(frame_event.rtp_timestamp); 45 event_proto->set_rtp_timestamp(frame_event.rtp_timestamp);
38 frame_event_map_.insert( 46 frame_event_map_.insert(
39 std::make_pair(frame_event.rtp_timestamp, event_proto)); 47 std::make_pair(frame_event.rtp_timestamp, event_proto));
40 } else { 48 } else {
41 event_proto = it->second; 49 event_proto = it->second;
50 }
51
52 event_proto->add_event_type(ToProtoEventType(frame_event.type));
53 event_proto->add_event_timestamp_micros(
54 frame_event.timestamp.ToInternalValue());
55
56 if (frame_event.type == kAudioFrameEncoded ||
57 frame_event.type == kVideoFrameEncoded) {
58 event_proto->set_encoded_frame_size(frame_event.size);
59 } else if (frame_event.type == kAudioPlayoutDelay ||
60 frame_event.type == kVideoRenderDelay) {
61 event_proto->set_delay_millis(frame_event.delay_delta.InMilliseconds());
62 }
63
64 TruncateFrameEventMapIfNeeded();
42 } 65 }
43 66
44 event_proto->add_event_type(ToProtoEventType(frame_event.type)); 67 DCHECK(frame_event_map_.size() <= config_.max_frames);
45 event_proto->add_event_timestamp_micros(
46 frame_event.timestamp.ToInternalValue());
47
48 if (frame_event.type == kAudioFrameEncoded ||
49 frame_event.type == kVideoFrameEncoded) {
50 event_proto->set_encoded_frame_size(frame_event.size);
51 } else if (frame_event.type == kAudioPlayoutDelay ||
52 frame_event.type == kVideoRenderDelay) {
53 event_proto->set_delay_millis(frame_event.delay_delta.InMilliseconds());
54 }
55 } 68 }
56 69
57 void EncodingEventSubscriber::OnReceivePacketEvent( 70 void EncodingEventSubscriber::OnReceivePacketEvent(
58 const PacketEvent& packet_event) { 71 const PacketEvent& packet_event) {
59 DCHECK(thread_checker_.CalledOnValidThread()); 72 DCHECK(thread_checker_.CalledOnValidThread());
60 73
61 PacketEventMap::iterator it = 74 if (ShouldProcessEvent(packet_event.type)) {
62 packet_event_map_.find(packet_event.rtp_timestamp); 75 PacketEventMap::iterator it =
63 linked_ptr<AggregatedPacketEvent> event_proto; 76 packet_event_map_.find(packet_event.rtp_timestamp);
64 BasePacketEvent* base_packet_event_proto = NULL; 77 linked_ptr<AggregatedPacketEvent> event_proto;
78 BasePacketEvent* base_packet_event_proto = NULL;
65 79
66 // Look up existing entry. If not found, create a new entry and add to map. 80 // Look up existing entry. If not found, create a new entry and add to map.
67 if (it == packet_event_map_.end()) { 81 if (it == packet_event_map_.end()) {
68 event_proto.reset(new AggregatedPacketEvent); 82 event_proto.reset(new AggregatedPacketEvent);
69 event_proto->set_rtp_timestamp(packet_event.rtp_timestamp); 83 event_proto->set_rtp_timestamp(packet_event.rtp_timestamp);
70 packet_event_map_.insert( 84 packet_event_map_.insert(
71 std::make_pair(packet_event.rtp_timestamp, event_proto)); 85 std::make_pair(packet_event.rtp_timestamp, event_proto));
72 base_packet_event_proto = event_proto->add_base_packet_event(); 86 base_packet_event_proto = event_proto->add_base_packet_event();
73 base_packet_event_proto->set_packet_id(packet_event.packet_id); 87 base_packet_event_proto->set_packet_id(packet_event.packet_id);
74 } else { 88 } else {
75 // Found existing entry, now look up existing BasePacketEvent using packet 89 // Found existing entry, now look up existing BasePacketEvent using packet
76 // ID. If not found, create a new entry and add to proto. 90 // ID. If not found, create a new entry and add to proto.
77 event_proto = it->second; 91 event_proto = it->second;
78 RepeatedPtrField<BasePacketEvent>* field = 92 RepeatedPtrField<BasePacketEvent>* field =
79 event_proto->mutable_base_packet_event(); 93 event_proto->mutable_base_packet_event();
80 for (RepeatedPtrField<BasePacketEvent>::pointer_iterator it = 94 for (RepeatedPtrField<BasePacketEvent>::pointer_iterator it =
81 field->pointer_begin(); 95 field->pointer_begin();
82 it != field->pointer_end(); ++it) { 96 it != field->pointer_end();
83 if ((*it)->packet_id() == packet_event.packet_id) { 97 ++it) {
84 base_packet_event_proto = *it; 98 if ((*it)->packet_id() == packet_event.packet_id) {
85 break; 99 base_packet_event_proto = *it;
100 break;
101 }
102 }
103 if (!base_packet_event_proto) {
104 base_packet_event_proto = event_proto->add_base_packet_event();
105 base_packet_event_proto->set_packet_id(packet_event.packet_id);
86 } 106 }
87 } 107 }
88 if (!base_packet_event_proto) { 108
89 base_packet_event_proto = event_proto->add_base_packet_event(); 109 base_packet_event_proto->add_event_type(
90 base_packet_event_proto->set_packet_id(packet_event.packet_id); 110 ToProtoEventType(packet_event.type));
91 } 111 base_packet_event_proto->add_event_timestamp_micros(
112 packet_event.timestamp.ToInternalValue());
113
114 TruncatePacketEventMapIfNeeded();
92 } 115 }
93 116
94 base_packet_event_proto->add_event_type(ToProtoEventType(packet_event.type)); 117 DCHECK(packet_event_map_.size() <= config_.max_frames);
95 base_packet_event_proto->add_event_timestamp_micros(
96 packet_event.timestamp.ToInternalValue());
97 } 118 }
98 119
99 void EncodingEventSubscriber::OnReceiveGenericEvent( 120 void EncodingEventSubscriber::OnReceiveGenericEvent(
Alpha Left Google 2014/02/14 18:42:39 What are the generic events that we capture? I'm n
imcheng 2014/02/14 20:24:17 As mentioned in the other file, there are 7 generi
100 const GenericEvent& generic_event) { 121 const GenericEvent& generic_event) {
101 DCHECK(thread_checker_.CalledOnValidThread()); 122 DCHECK(thread_checker_.CalledOnValidThread());
102 123
103 GenericEventMap::iterator it = generic_event_map_.find(generic_event.type); 124 if (ShouldProcessEvent(generic_event.type)) {
104 linked_ptr<AggregatedGenericEvent> event_proto; 125 GenericEventMap::iterator it = generic_event_map_.find(generic_event.type);
105 if (it == generic_event_map_.end()) { 126 linked_ptr<AggregatedGenericEvent> event_proto;
106 event_proto.reset(new AggregatedGenericEvent); 127 if (it == generic_event_map_.end()) {
107 event_proto->set_event_type(ToProtoEventType(generic_event.type)); 128 event_proto.reset(new AggregatedGenericEvent);
108 generic_event_map_.insert(std::make_pair(generic_event.type, event_proto)); 129 event_proto->set_event_type(ToProtoEventType(generic_event.type));
109 } else { 130 generic_event_map_.insert(
110 event_proto = it->second; 131 std::make_pair(generic_event.type, event_proto));
132 } else {
133 event_proto = it->second;
134 }
135
136 if (event_proto->value_size() < config_.max_generic_event_values) {
137 event_proto->add_event_timestamp_micros(
138 generic_event.timestamp.ToInternalValue());
139 event_proto->add_value(generic_event.value);
140 } else {
141 // Reached maximum size, treat the repeated fields as circular buffer and
142 // rewrite oldest value.
143 int index = next_write_index_[generic_event.type];
144 event_proto->set_event_timestamp_micros(
145 index, generic_event.timestamp.ToInternalValue());
146 event_proto->set_value(index, generic_event.value);
147 next_write_index_[generic_event.type] =
148 (index + 1) % config_.max_generic_event_values;
149 }
111 } 150 }
112
113 event_proto->add_event_timestamp_micros(
114 generic_event.timestamp.ToInternalValue());
115 event_proto->add_value(generic_event.value);
116 } 151 }
117 152
118 void EncodingEventSubscriber::GetFrameEventsAndReset( 153 void EncodingEventSubscriber::GetFrameEventsAndReset(
119 FrameEventMap* frame_event_map) { 154 FrameEventMap* frame_event_map) {
120 DCHECK(thread_checker_.CalledOnValidThread()); 155 DCHECK(thread_checker_.CalledOnValidThread());
121 frame_event_map->swap(frame_event_map_); 156 frame_event_map->swap(frame_event_map_);
122 frame_event_map_.clear(); 157 frame_event_map_.clear();
123 } 158 }
124 159
125 void EncodingEventSubscriber::GetPacketEventsAndReset( 160 void EncodingEventSubscriber::GetPacketEventsAndReset(
126 PacketEventMap* packet_event_map) { 161 PacketEventMap* packet_event_map) {
127 DCHECK(thread_checker_.CalledOnValidThread()); 162 DCHECK(thread_checker_.CalledOnValidThread());
128 packet_event_map->swap(packet_event_map_); 163 packet_event_map->swap(packet_event_map_);
129 packet_event_map_.clear(); 164 packet_event_map_.clear();
130 } 165 }
131 166
132 void EncodingEventSubscriber::GetGenericEventsAndReset( 167 void EncodingEventSubscriber::GetGenericEventsAndReset(
133 GenericEventMap* generic_event_map) { 168 GenericEventMap* generic_event_map) {
134 DCHECK(thread_checker_.CalledOnValidThread()); 169 DCHECK(thread_checker_.CalledOnValidThread());
135 generic_event_map->swap(generic_event_map_); 170 generic_event_map->swap(generic_event_map_);
136 generic_event_map_.clear(); 171 generic_event_map_.clear();
172 memset(next_write_index_, 0, sizeof(next_write_index_));
173 }
174
175 bool EncodingEventSubscriber::ShouldProcessEvent(CastLoggingEvent event) {
176 return GetEventMediaType(event) == config_.event_media_type;
177 }
178
179 void EncodingEventSubscriber::TruncateFrameEventMapIfNeeded() {
180 // This works because this is called everytime an event is inserted and
181 // we only insert events one at a time.
182 if (frame_event_map_.size() > config_.max_frames)
183 frame_event_map_.erase(frame_event_map_.begin());
184 }
185
186 void EncodingEventSubscriber::TruncatePacketEventMapIfNeeded() {
187 // This works because this is called everytime an event is inserted and
188 // we only insert events one at a time.
189 if (packet_event_map_.size() > config_.max_frames)
190 packet_event_map_.erase(packet_event_map_.begin());
137 } 191 }
138 192
139 } // namespace cast 193 } // namespace cast
140 } // namespace media 194 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698