OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "media/cast/logging/encoding_event_subscriber.h" | |
6 | |
7 #include <functional> | |
miu
2014/02/13 02:02:12
Is <functional> needed?
imcheng
2014/02/13 02:38:08
It is not needed. What I do need here is <utility>
| |
8 #include <map> | |
miu
2014/02/13 02:02:12
You can remove <map>, and "linked_ptr.h" since the
imcheng
2014/02/13 02:38:08
Done.
| |
9 | |
10 #include "base/logging.h" | |
11 #include "base/memory/linked_ptr.h" | |
12 #include "media/cast/logging/proto/proto_utils.h" | |
13 | |
14 using google::protobuf::RepeatedPtrField; | |
15 using media::cast::proto::AggregatedFrameEvent; | |
16 using media::cast::proto::AggregatedGenericEvent; | |
17 using media::cast::proto::AggregatedPacketEvent; | |
18 using media::cast::proto::BasePacketEvent; | |
19 | |
20 namespace media { | |
21 namespace cast { | |
22 | |
23 EncodingEventSubscriber::EncodingEventSubscriber() {} | |
24 | |
25 EncodingEventSubscriber::~EncodingEventSubscriber() { | |
26 DCHECK(thread_checker_.CalledOnValidThread()); | |
27 } | |
28 | |
29 void EncodingEventSubscriber::OnReceiveFrameEvent( | |
30 const FrameEvent& frame_event) { | |
31 DCHECK(thread_checker_.CalledOnValidThread()); | |
32 | |
33 FrameEventMap::iterator it = frame_event_map_.find(frame_event.rtp_timestamp); | |
34 linked_ptr<AggregatedFrameEvent> event_proto; | |
35 | |
36 // Look up existing entry. If not found, create a new entry and add to map. | |
37 if (it == frame_event_map_.end()) { | |
38 event_proto.reset(new AggregatedFrameEvent); | |
39 event_proto->set_rtp_timestamp(frame_event.rtp_timestamp); | |
40 frame_event_map_.insert( | |
41 std::make_pair(frame_event.rtp_timestamp, event_proto)); | |
42 } else { | |
43 event_proto = it->second; | |
44 } | |
45 | |
46 event_proto->add_event_type(ToProtoEventType(frame_event.type)); | |
47 event_proto->add_event_timestamp_micros( | |
48 frame_event.timestamp.ToInternalValue()); | |
49 | |
50 if (frame_event.type == kAudioFrameEncoded || | |
51 frame_event.type == kVideoFrameEncoded) { | |
52 event_proto->set_encoded_frame_size(frame_event.size); | |
53 } else if (frame_event.type == kAudioPlayoutDelay || | |
54 frame_event.type == kVideoRenderDelay) { | |
55 event_proto->set_delay_millis(frame_event.delay_delta.InMilliseconds()); | |
56 } | |
57 } | |
58 | |
59 void EncodingEventSubscriber::OnReceivePacketEvent( | |
60 const PacketEvent& packet_event) { | |
61 DCHECK(thread_checker_.CalledOnValidThread()); | |
62 | |
63 PacketEventMap::iterator it = | |
64 packet_event_map_.find(packet_event.rtp_timestamp); | |
65 linked_ptr<AggregatedPacketEvent> event_proto; | |
66 BasePacketEvent* base_packet_event_proto = NULL; | |
67 | |
68 // Look up existing entry. If not found, create a new entry and add to map. | |
69 if (it == packet_event_map_.end()) { | |
70 event_proto.reset(new AggregatedPacketEvent); | |
71 event_proto->set_rtp_timestamp(packet_event.rtp_timestamp); | |
72 packet_event_map_.insert( | |
73 std::make_pair(packet_event.rtp_timestamp, event_proto)); | |
74 base_packet_event_proto = event_proto->add_base_packet_event(); | |
75 base_packet_event_proto->set_packet_id(packet_event.packet_id); | |
76 } else { | |
77 // Found existing entry, now look up existing BasePacketEvent using packet | |
78 // ID. If not found, create a new entry and add to proto. | |
79 event_proto = it->second; | |
80 RepeatedPtrField<BasePacketEvent>* field = | |
81 event_proto->mutable_base_packet_event(); | |
82 for (RepeatedPtrField<BasePacketEvent>::pointer_iterator it = | |
83 field->pointer_begin(); | |
84 it != field->pointer_end(); ++it) { | |
85 if ((*it)->packet_id() == packet_event.packet_id) { | |
86 base_packet_event_proto = *it; | |
87 break; | |
88 } | |
89 } | |
90 if (!base_packet_event_proto) { | |
91 base_packet_event_proto = event_proto->add_base_packet_event(); | |
92 base_packet_event_proto->set_packet_id(packet_event.packet_id); | |
93 } | |
94 } | |
95 | |
96 base_packet_event_proto->add_event_type(ToProtoEventType(packet_event.type)); | |
97 base_packet_event_proto->add_event_timestamp_micros( | |
98 packet_event.timestamp.ToInternalValue()); | |
99 } | |
100 | |
101 void EncodingEventSubscriber::OnReceiveGenericEvent( | |
102 const GenericEvent& generic_event) { | |
103 DCHECK(thread_checker_.CalledOnValidThread()); | |
104 | |
105 GenericEventMap::iterator it = generic_event_map_.find(generic_event.type); | |
106 linked_ptr<AggregatedGenericEvent> event_proto; | |
107 if (it == generic_event_map_.end()) { | |
108 event_proto.reset(new AggregatedGenericEvent); | |
109 event_proto->set_event_type(ToProtoEventType(generic_event.type)); | |
110 generic_event_map_.insert(std::make_pair(generic_event.type, event_proto)); | |
111 } else { | |
112 event_proto = it->second; | |
113 } | |
114 | |
115 event_proto->add_event_timestamp_micros( | |
116 generic_event.timestamp.ToInternalValue()); | |
117 event_proto->add_value(generic_event.value); | |
118 } | |
119 | |
120 void EncodingEventSubscriber::GetFrameEventsAndReset( | |
121 FrameEventMap* frame_event_map) { | |
122 DCHECK(thread_checker_.CalledOnValidThread()); | |
123 frame_event_map->swap(frame_event_map_); | |
124 frame_event_map_.clear(); | |
125 } | |
126 | |
127 void EncodingEventSubscriber::GetPacketEventsAndReset( | |
128 PacketEventMap* packet_event_map) { | |
129 DCHECK(thread_checker_.CalledOnValidThread()); | |
130 packet_event_map->swap(packet_event_map_); | |
131 packet_event_map_.clear(); | |
132 } | |
133 | |
134 void EncodingEventSubscriber::GetGenericEventsAndReset( | |
135 GenericEventMap* generic_event_map) { | |
136 DCHECK(thread_checker_.CalledOnValidThread()); | |
137 generic_event_map->swap(generic_event_map_); | |
138 generic_event_map_.clear(); | |
139 } | |
140 | |
141 } // namespace cast | |
142 } // namespace media | |
OLD | NEW |