blob: a5ba889a039b83a85a496acae20edf068fac23ed [file] [log] [blame]
nissee4bcd6d2017-05-16 04:47:04 -07001/*
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 */
eladalond0244c22017-06-08 04:19:13 -070010
nissee4bcd6d2017-05-16 04:47:04 -070011#ifndef WEBRTC_CALL_RTP_DEMUXER_H_
12#define WEBRTC_CALL_RTP_DEMUXER_H_
13
14#include <map>
eladalond0244c22017-06-08 04:19:13 -070015#include <set>
16#include <string>
nissee4bcd6d2017-05-16 04:47:04 -070017
18namespace webrtc {
19
20class RtpPacketReceived;
nissed76b7b22017-06-01 04:02:35 -070021class RtpPacketSinkInterface;
nissee4bcd6d2017-05-16 04:47:04 -070022
23// This class represents the RTP demuxing, for a single RTP session (i.e., one
24// ssrc space, see RFC 7656). It isn't thread aware, leaving responsibility of
25// multithreading issues to the user of this class.
26// TODO(nisse): Should be extended to also do MID-based demux and payload-type
27// demux.
28class RtpDemuxer {
29 public:
30 RtpDemuxer();
31 ~RtpDemuxer();
32
33 // Registers a sink. The same sink can be registered for multiple ssrcs, and
34 // the same ssrc can have multiple sinks. Null pointer is not allowed.
35 void AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink);
eladalond0244c22017-06-08 04:19:13 -070036
37 // Registers a sink's association to an RSID. Null pointer is not allowed.
38 void AddSink(const std::string& rsid, RtpPacketSinkInterface* sink);
39
40 // Removes a sink. Return value reports if anything was actually removed.
41 // Null pointer is not allowed.
42 bool RemoveSink(const RtpPacketSinkInterface* sink);
nissee4bcd6d2017-05-16 04:47:04 -070043
44 // Returns true if at least one matching sink was found, otherwise false.
45 bool OnRtpPacket(const RtpPacketReceived& packet);
46
47 private:
eladalond0244c22017-06-08 04:19:13 -070048 // Records a sink<->SSRC association. This can happen by explicit
49 // configuration by AddSink(ssrc...), or by inferred configuration from an
50 // RSID-based configuration which is resolved to an SSRC upon
51 // packet reception.
52 void RecordSsrcToSinkAssociation(uint32_t ssrc, RtpPacketSinkInterface* sink);
53
54 // When a new packet arrives, we attempt to resolve extra associations,
55 // such as which RSIDs are associated with which SSRCs.
56 void FindSsrcAssociations(const RtpPacketReceived& packet);
57
58 // This records the association SSRCs to sinks. Other associations, such
59 // as by RSID, also end up here once the RSID, etc., is resolved to an SSRC.
nissee4bcd6d2017-05-16 04:47:04 -070060 std::multimap<uint32_t, RtpPacketSinkInterface*> sinks_;
eladalond0244c22017-06-08 04:19:13 -070061
62 // A sink may be associated with an RSID - RTP Stream ID. This tag has a
63 // one-to-one association with an SSRC, but that SSRC is not yet known.
64 // When it becomes known, the association of the sink to the RSID is deleted
65 // from this container, and moved into |sinks_|.
66 std::multimap<std::string, RtpPacketSinkInterface*> rsid_sinks_;
67
68 // Iterating over |rsid_sinks_| for each incoming and performing multiple
69 // string comparisons is of non-trivial cost. To avoid this cost, we only
70 // check RSIDs for the first packet on each incoming SSRC stream.
71 // (If RSID associations are added later, we check again.)
72 std::set<uint32_t> processed_ssrcs_;
nissee4bcd6d2017-05-16 04:47:04 -070073};
74
75} // namespace webrtc
76
77#endif // WEBRTC_CALL_RTP_DEMUXER_H_