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/rtcp/sender_rtcp_event_subscriber.h" | |
6 | |
7 #include <utility> | |
8 | |
9 #include "base/logging.h" | |
10 #include "media/cast/rtcp/rtcp_defines.h" | |
11 | |
12 namespace media { | |
13 namespace cast { | |
14 | |
15 SenderRtcpEventSubscriber::SenderRtcpEventSubscriber( | |
16 const size_t max_size_to_retain) | |
17 : max_size_to_retain_(max_size_to_retain) { | |
18 DCHECK(max_size_to_retain_ > 0u); | |
19 } | |
20 | |
21 SenderRtcpEventSubscriber::~SenderRtcpEventSubscriber() { | |
22 DCHECK(thread_checker_.CalledOnValidThread()); | |
23 } | |
24 | |
25 void SenderRtcpEventSubscriber::OnReceiveFrameEvent( | |
26 const FrameEvent& frame_event) { | |
27 DCHECK(thread_checker_.CalledOnValidThread()); | |
28 if (frame_event.media_type != VIDEO_EVENT) | |
29 return; | |
30 if (frame_event.type != FRAME_CAPTURE_BEGIN && | |
31 frame_event.type != FRAME_ENCODED) { | |
32 // Not interested in other events. | |
33 return; | |
34 } | |
35 | |
36 RtcpEventMap::iterator it = rtcp_events_.find(frame_event.rtp_timestamp); | |
37 if (it == rtcp_events_.end()) { | |
38 // We have not stored this frame (RTP timestamp) in our map. | |
39 RtcpEvent rtcp_event; | |
40 rtcp_event.type = frame_event.type; | |
41 rtcp_event.timestamp = frame_event.timestamp; | |
42 | |
43 // Do not need to fill out rtcp_event.delay_delta or rtcp_event.packet_id | |
44 // as they are not set in frame events we are interested in. | |
45 rtcp_events_.insert(std::make_pair(frame_event.rtp_timestamp, rtcp_event)); | |
46 | |
47 TruncateMapIfNeeded(); | |
48 } else { | |
49 // We already have this frame (RTP timestamp) in our map. | |
50 // Only update events that are later in the chain. | |
51 // This is due to that events can be reordered on the wire. | |
52 if (frame_event.type == FRAME_CAPTURE_BEGIN) { | |
53 return; // First event in chain can not be late by definition. | |
54 } | |
55 | |
56 if (it->second.type == FRAME_ENCODED) { | |
57 return; // Last event in chain should not be updated. | |
58 } | |
59 | |
60 // Update existing entry. | |
61 it->second.type = frame_event.type; | |
62 } | |
63 | |
64 DCHECK(rtcp_events_.size() <= max_size_to_retain_); | |
65 } | |
66 | |
67 void SenderRtcpEventSubscriber::OnReceivePacketEvent( | |
68 const PacketEvent& packet_event) { | |
69 DCHECK(thread_checker_.CalledOnValidThread()); | |
70 // Do nothing as RTP sender is not interested in packet events for RTCP. | |
71 } | |
72 | |
73 void SenderRtcpEventSubscriber::GetRtcpEventsAndReset( | |
74 RtcpEventMap* rtcp_events) { | |
75 DCHECK(thread_checker_.CalledOnValidThread()); | |
76 rtcp_events->swap(rtcp_events_); | |
77 rtcp_events_.clear(); | |
78 } | |
79 | |
80 void SenderRtcpEventSubscriber::TruncateMapIfNeeded() { | |
81 // If map size has exceeded |max_size_to_retain_|, remove entry with | |
82 // the smallest RTP timestamp. | |
83 if (rtcp_events_.size() > max_size_to_retain_) { | |
84 DVLOG(2) << "RTCP event map exceeded size limit; " | |
85 << "removing oldest entry"; | |
86 // This is fine since we only insert elements one at a time. | |
87 rtcp_events_.erase(rtcp_events_.begin()); | |
88 } | |
89 } | |
90 | |
91 } // namespace cast | |
92 } // namespace media | |
OLD | NEW |