| /* |
| * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| #ifndef WEBRTC_CALL_RTP_DEMUXER_H_ |
| #define WEBRTC_CALL_RTP_DEMUXER_H_ |
| |
| #include <map> |
| |
| namespace webrtc { |
| |
| class RtpPacketReceived; |
| |
| // This class represents a receiver of an already parsed RTP packets. |
| class RtpPacketSinkInterface { |
| public: |
| virtual ~RtpPacketSinkInterface() {} |
| virtual void OnRtpPacket(const RtpPacketReceived& packet) = 0; |
| }; |
| |
| // This class represents the RTP demuxing, for a single RTP session (i.e., one |
| // ssrc space, see RFC 7656). It isn't thread aware, leaving responsibility of |
| // multithreading issues to the user of this class. |
| // TODO(nisse): Should be extended to also do MID-based demux and payload-type |
| // demux. |
| class RtpDemuxer { |
| public: |
| RtpDemuxer(); |
| ~RtpDemuxer(); |
| |
| // Registers a sink. The same sink can be registered for multiple ssrcs, and |
| // the same ssrc can have multiple sinks. Null pointer is not allowed. |
| void AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink); |
| // Removes a sink. Returns deletion count (a sink may be registered |
| // for multiple ssrcs). Null pointer is not allowed. |
| size_t RemoveSink(const RtpPacketSinkInterface* sink); |
| |
| // Returns true if at least one matching sink was found, otherwise false. |
| bool OnRtpPacket(const RtpPacketReceived& packet); |
| |
| private: |
| std::multimap<uint32_t, RtpPacketSinkInterface*> sinks_; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // WEBRTC_CALL_RTP_DEMUXER_H_ |