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

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

Issue 168933002: Cast: Implemented relative RTP timestamp 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 <cstring>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "media/cast/logging/proto/proto_utils.h" 11 #include "media/cast/logging/proto/proto_utils.h"
12 12
13 using google::protobuf::RepeatedPtrField; 13 using google::protobuf::RepeatedPtrField;
14 using media::cast::proto::AggregatedFrameEvent; 14 using media::cast::proto::AggregatedFrameEvent;
15 using media::cast::proto::AggregatedGenericEvent; 15 using media::cast::proto::AggregatedGenericEvent;
16 using media::cast::proto::AggregatedPacketEvent; 16 using media::cast::proto::AggregatedPacketEvent;
17 using media::cast::proto::BasePacketEvent; 17 using media::cast::proto::BasePacketEvent;
18 18
19 namespace media { 19 namespace media {
20 namespace cast { 20 namespace cast {
21 21
22 EncodingEventSubscriber::EncodingEventSubscriber( 22 EncodingEventSubscriber::EncodingEventSubscriber(
23 EventMediaType event_media_type, size_t max_frames) 23 EventMediaType event_media_type,
24 : event_media_type_(event_media_type), max_frames_(max_frames) {} 24 size_t max_frames)
25 : event_media_type_(event_media_type),
26 max_frames_(max_frames),
27 seen_first_rtp_timestamp_(false),
28 first_rtp_timestamp_(0u) {}
25 29
26 EncodingEventSubscriber::~EncodingEventSubscriber() { 30 EncodingEventSubscriber::~EncodingEventSubscriber() {
27 DCHECK(thread_checker_.CalledOnValidThread()); 31 DCHECK(thread_checker_.CalledOnValidThread());
28 } 32 }
29 33
30 void EncodingEventSubscriber::OnReceiveFrameEvent( 34 void EncodingEventSubscriber::OnReceiveFrameEvent(
31 const FrameEvent& frame_event) { 35 const FrameEvent& frame_event) {
32 DCHECK(thread_checker_.CalledOnValidThread()); 36 DCHECK(thread_checker_.CalledOnValidThread());
33 37
34 if (ShouldProcessEvent(frame_event.type)) { 38 if (ShouldProcessEvent(frame_event.type)) {
35 FrameEventMap::iterator it = 39 RtpTimestamp relative_rtp_timestamp =
36 frame_event_map_.find(frame_event.rtp_timestamp); 40 GetRelativeRtpTimestamp(frame_event.rtp_timestamp);
41 FrameEventMap::iterator it = frame_event_map_.find(relative_rtp_timestamp);
37 linked_ptr<AggregatedFrameEvent> event_proto; 42 linked_ptr<AggregatedFrameEvent> event_proto;
38 43
39 // Look up existing entry. If not found, create a new entry and add to map. 44 // Look up existing entry. If not found, create a new entry and add to map.
40 if (it == frame_event_map_.end()) { 45 if (it == frame_event_map_.end()) {
41 event_proto.reset(new AggregatedFrameEvent); 46 event_proto.reset(new AggregatedFrameEvent);
42 event_proto->set_rtp_timestamp(frame_event.rtp_timestamp); 47 event_proto->set_rtp_timestamp(relative_rtp_timestamp);
43 frame_event_map_.insert( 48 frame_event_map_.insert(
44 std::make_pair(frame_event.rtp_timestamp, event_proto)); 49 std::make_pair(relative_rtp_timestamp, event_proto));
45 } else { 50 } else {
46 event_proto = it->second; 51 event_proto = it->second;
47 } 52 }
48 53
49 event_proto->add_event_type(ToProtoEventType(frame_event.type)); 54 event_proto->add_event_type(ToProtoEventType(frame_event.type));
50 event_proto->add_event_timestamp_micros( 55 event_proto->add_event_timestamp_micros(
51 frame_event.timestamp.ToInternalValue()); 56 frame_event.timestamp.ToInternalValue());
52 57
53 if (frame_event.type == kAudioFrameEncoded || 58 if (frame_event.type == kAudioFrameEncoded ||
54 frame_event.type == kVideoFrameEncoded) { 59 frame_event.type == kVideoFrameEncoded) {
55 event_proto->set_encoded_frame_size(frame_event.size); 60 event_proto->set_encoded_frame_size(frame_event.size);
56 } else if (frame_event.type == kAudioPlayoutDelay || 61 } else if (frame_event.type == kAudioPlayoutDelay ||
57 frame_event.type == kVideoRenderDelay) { 62 frame_event.type == kVideoRenderDelay) {
58 event_proto->set_delay_millis(frame_event.delay_delta.InMilliseconds()); 63 event_proto->set_delay_millis(frame_event.delay_delta.InMilliseconds());
59 } 64 }
60 65
61 TruncateFrameEventMapIfNeeded(); 66 TruncateFrameEventMapIfNeeded();
62 } 67 }
63 68
64 DCHECK(frame_event_map_.size() <= max_frames_); 69 DCHECK(frame_event_map_.size() <= max_frames_);
65 } 70 }
66 71
67 void EncodingEventSubscriber::OnReceivePacketEvent( 72 void EncodingEventSubscriber::OnReceivePacketEvent(
68 const PacketEvent& packet_event) { 73 const PacketEvent& packet_event) {
69 DCHECK(thread_checker_.CalledOnValidThread()); 74 DCHECK(thread_checker_.CalledOnValidThread());
70 75
71 if (ShouldProcessEvent(packet_event.type)) { 76 if (ShouldProcessEvent(packet_event.type)) {
77 RtpTimestamp relative_rtp_timestamp =
78 GetRelativeRtpTimestamp(packet_event.rtp_timestamp);
72 PacketEventMap::iterator it = 79 PacketEventMap::iterator it =
73 packet_event_map_.find(packet_event.rtp_timestamp); 80 packet_event_map_.find(relative_rtp_timestamp);
74 linked_ptr<AggregatedPacketEvent> event_proto; 81 linked_ptr<AggregatedPacketEvent> event_proto;
75 BasePacketEvent* base_packet_event_proto = NULL; 82 BasePacketEvent* base_packet_event_proto = NULL;
76 83
77 // Look up existing entry. If not found, create a new entry and add to map. 84 // Look up existing entry. If not found, create a new entry and add to map.
78 if (it == packet_event_map_.end()) { 85 if (it == packet_event_map_.end()) {
79 event_proto.reset(new AggregatedPacketEvent); 86 event_proto.reset(new AggregatedPacketEvent);
80 event_proto->set_rtp_timestamp(packet_event.rtp_timestamp); 87 event_proto->set_rtp_timestamp(relative_rtp_timestamp);
81 packet_event_map_.insert( 88 packet_event_map_.insert(
82 std::make_pair(packet_event.rtp_timestamp, event_proto)); 89 std::make_pair(relative_rtp_timestamp, event_proto));
83 base_packet_event_proto = event_proto->add_base_packet_event(); 90 base_packet_event_proto = event_proto->add_base_packet_event();
84 base_packet_event_proto->set_packet_id(packet_event.packet_id); 91 base_packet_event_proto->set_packet_id(packet_event.packet_id);
85 } else { 92 } else {
86 // Found existing entry, now look up existing BasePacketEvent using packet 93 // Found existing entry, now look up existing BasePacketEvent using packet
87 // ID. If not found, create a new entry and add to proto. 94 // ID. If not found, create a new entry and add to proto.
88 event_proto = it->second; 95 event_proto = it->second;
89 RepeatedPtrField<BasePacketEvent>* field = 96 RepeatedPtrField<BasePacketEvent>* field =
90 event_proto->mutable_base_packet_event(); 97 event_proto->mutable_base_packet_event();
91 for (RepeatedPtrField<BasePacketEvent>::pointer_iterator it = 98 for (RepeatedPtrField<BasePacketEvent>::pointer_iterator it =
92 field->pointer_begin(); 99 field->pointer_begin();
(...skipping 20 matching lines...) Expand all
113 120
114 DCHECK(packet_event_map_.size() <= max_frames_); 121 DCHECK(packet_event_map_.size() <= max_frames_);
115 } 122 }
116 123
117 void EncodingEventSubscriber::OnReceiveGenericEvent( 124 void EncodingEventSubscriber::OnReceiveGenericEvent(
118 const GenericEvent& generic_event) { 125 const GenericEvent& generic_event) {
119 DCHECK(thread_checker_.CalledOnValidThread()); 126 DCHECK(thread_checker_.CalledOnValidThread());
120 // Do nothing, there are no generic events we are interested in. 127 // Do nothing, there are no generic events we are interested in.
121 } 128 }
122 129
123 void EncodingEventSubscriber::GetFrameEventsAndReset( 130 void EncodingEventSubscriber::GetEventsAndReset(
124 FrameEventMap* frame_event_map) { 131 FrameEventMap* frame_events,
132 PacketEventMap* packet_events,
133 RtpTimestamp* first_rtp_timestamp) {
125 DCHECK(thread_checker_.CalledOnValidThread()); 134 DCHECK(thread_checker_.CalledOnValidThread());
126 frame_event_map->swap(frame_event_map_); 135
127 frame_event_map_.clear(); 136 frame_events->swap(frame_event_map_);
137 packet_events->swap(packet_event_map_);
138 *first_rtp_timestamp = first_rtp_timestamp_;
139 Reset();
128 } 140 }
129 141
130 void EncodingEventSubscriber::GetPacketEventsAndReset(
131 PacketEventMap* packet_event_map) {
132 DCHECK(thread_checker_.CalledOnValidThread());
133 packet_event_map->swap(packet_event_map_);
134 packet_event_map_.clear();
135 }
136
137
138 bool EncodingEventSubscriber::ShouldProcessEvent(CastLoggingEvent event) { 142 bool EncodingEventSubscriber::ShouldProcessEvent(CastLoggingEvent event) {
139 return GetEventMediaType(event) == event_media_type_; 143 return GetEventMediaType(event) == event_media_type_;
140 } 144 }
141 145
142 void EncodingEventSubscriber::TruncateFrameEventMapIfNeeded() { 146 void EncodingEventSubscriber::TruncateFrameEventMapIfNeeded() {
143 // This works because this is called everytime an event is inserted and 147 // This works because this is called everytime an event is inserted and
144 // we only insert events one at a time. 148 // we only insert events one at a time.
145 if (frame_event_map_.size() > max_frames_) 149 if (frame_event_map_.size() > max_frames_)
146 frame_event_map_.erase(frame_event_map_.begin()); 150 frame_event_map_.erase(frame_event_map_.begin());
147 } 151 }
148 152
149 void EncodingEventSubscriber::TruncatePacketEventMapIfNeeded() { 153 void EncodingEventSubscriber::TruncatePacketEventMapIfNeeded() {
150 // This works because this is called everytime an event is inserted and 154 // This works because this is called everytime an event is inserted and
151 // we only insert events one at a time. 155 // we only insert events one at a time.
152 if (packet_event_map_.size() > max_frames_) 156 if (packet_event_map_.size() > max_frames_)
153 packet_event_map_.erase(packet_event_map_.begin()); 157 packet_event_map_.erase(packet_event_map_.begin());
154 } 158 }
155 159
160 RtpTimestamp EncodingEventSubscriber::GetRelativeRtpTimestamp(
161 RtpTimestamp rtp_timestamp) {
162 if (!seen_first_rtp_timestamp_) {
163 seen_first_rtp_timestamp_ = true;
164 first_rtp_timestamp_ = rtp_timestamp;
165 }
166
167 return rtp_timestamp - first_rtp_timestamp_;
168 }
169
170 void EncodingEventSubscriber::Reset() {
171 frame_event_map_.clear();
172 packet_event_map_.clear();
173 seen_first_rtp_timestamp_ = false;
174 first_rtp_timestamp_ = 0u;
175 }
176
156 } // namespace cast 177 } // namespace cast
157 } // namespace media 178 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698