OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #ifndef WEBRTC_CALL_RTCP_DEMUXER_H_ | |
12 #define WEBRTC_CALL_RTCP_DEMUXER_H_ | |
13 | |
14 #include <map> | |
15 #include <string> | |
16 #include <vector> | |
17 | |
18 #include "webrtc/base/array_view.h" | |
19 #include "webrtc/base/basictypes.h" | |
20 #include "webrtc/call/rsid_resolution_observer.h" | |
21 | |
22 namespace webrtc { | |
23 | |
24 class RtcpPacketSinkInterface; | |
25 | |
26 // This class represents the RTCP demuxing, for a single RTP session (i.e., one | |
27 // SSRC space, see RFC 7656). It isn't thread aware, leaving responsibility of | |
28 // multithreading issues to the user of this class. | |
29 class RtcpDemuxer : public RsidResolutionObserver { | |
30 public: | |
31 RtcpDemuxer(); | |
32 ~RtcpDemuxer() override; | |
33 | |
34 // Registers a sink. The sink will be notified of incoming RTCP packets with | |
35 // that sender-SSRC. The same sink can be registered for multiple SSRCs, and | |
36 // the same SSRC can have multiple sinks. Null pointer is not allowed. | |
37 // Sinks may be associated with both an SSRC and an RSID. | |
38 // Sinks may be registered as SSRC/RSID-specific or broadcast, but not both. | |
39 void AddSink(uint32_t sender_ssrc, RtcpPacketSinkInterface* sink); | |
40 | |
41 // Registers a sink. Once the RSID is resolved to an SSRC, the sink will be | |
42 // notified of all RTCP packets with that sender-SSRC. | |
43 // The same sink can be registered for multiple RSIDs, and | |
44 // the same RSID can have multiple sinks. Null pointer is not allowed. | |
45 // Sinks may be associated with both an SSRC and an RSID. | |
46 // Sinks may be registered as SSRC/RSID-specific or broadcast, but not both. | |
47 void AddSink(const std::string& rsid, RtcpPacketSinkInterface* sink); | |
48 | |
49 // Registers a sink. The sink will be notified of any incoming RTCP packet. | |
50 // Null pointer is not allowed. | |
51 // Sinks may be registered as SSRC/RSID-specific or broadcast, but not both. | |
52 void AddBroadcastSink(RtcpPacketSinkInterface* sink); | |
53 | |
54 // Undo previous AddSink() calls with the given sink. | |
55 void RemoveSink(const RtcpPacketSinkInterface* sink); | |
56 | |
57 // Undo AddBroadcastSink(). | |
58 void RemoveBroadcastSink(const RtcpPacketSinkInterface* sink); | |
59 | |
60 // Process a new RTCP packet and forward it to the appropriate sinks. | |
61 void OnRtcpPacket(rtc::ArrayView<const uint8_t> packet); | |
62 | |
63 // Implement RsidResolutionObserver - become notified whenever RSIDs resolve | |
64 // to an SSRC. | |
65 void OnRsidResolved(const std::string& rsid, uint32_t ssrc) override; | |
66 | |
67 // TODO(eladalon): Add the ability to resolve RSIDs and inform observers, | |
68 // like in the RtpDemuxer case, once the relevant standard is finalized. | |
69 | |
70 private: | |
71 // Records the association SSRCs to sinks. | |
72 std::multimap<uint32_t, RtcpPacketSinkInterface*> ssrc_sinks_; | |
73 | |
74 // Records the association RSIDs to sinks. | |
75 std::multimap<std::string, RtcpPacketSinkInterface*> rsid_sinks_; | |
76 | |
77 // Sinks which will receive notifications of all incoming RTCP packets. | |
78 // Additional/removal of sinks is expected to be significantly less frequent | |
79 // than RTCP message reception; container chosen for iteration performance. | |
80 std::vector<RtcpPacketSinkInterface*> broadcast_sinks_; | |
81 }; | |
82 | |
83 } // namespace webrtc | |
84 | |
85 #endif // WEBRTC_CALL_RTCP_DEMUXER_H_ | |
OLD | NEW |