1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef CAST_STREAMING_RECEIVER_PACKET_ROUTER_H_ 6*3f982cf4SFabien Sanglard #define CAST_STREAMING_RECEIVER_PACKET_ROUTER_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <stdint.h> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #include <utility> 11*3f982cf4SFabien Sanglard #include <vector> 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard #include "absl/types/span.h" 14*3f982cf4SFabien Sanglard #include "cast/streaming/environment.h" 15*3f982cf4SFabien Sanglard #include "cast/streaming/ssrc.h" 16*3f982cf4SFabien Sanglard #include "util/flat_map.h" 17*3f982cf4SFabien Sanglard 18*3f982cf4SFabien Sanglard namespace openscreen { 19*3f982cf4SFabien Sanglard namespace cast { 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard class Receiver; 22*3f982cf4SFabien Sanglard 23*3f982cf4SFabien Sanglard // Handles all network I/O among multiple Receivers meant for synchronized 24*3f982cf4SFabien Sanglard // play-out (e.g., one Receiver for audio, one Receiver for video). Incoming 25*3f982cf4SFabien Sanglard // traffic is dispatched to the appropriate Receiver, based on its corresponding 26*3f982cf4SFabien Sanglard // sender's SSRC. Also, all traffic not coming from the same source is 27*3f982cf4SFabien Sanglard // filtered-out. 28*3f982cf4SFabien Sanglard class ReceiverPacketRouter final : public Environment::PacketConsumer { 29*3f982cf4SFabien Sanglard public: 30*3f982cf4SFabien Sanglard explicit ReceiverPacketRouter(Environment* environment); 31*3f982cf4SFabien Sanglard ~ReceiverPacketRouter() final; 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglard protected: 34*3f982cf4SFabien Sanglard friend class Receiver; 35*3f982cf4SFabien Sanglard 36*3f982cf4SFabien Sanglard // Called from a Receiver constructor/destructor to register/deregister a 37*3f982cf4SFabien Sanglard // Receiver instance that processes RTP/RTCP packets from a Sender having the 38*3f982cf4SFabien Sanglard // given SSRC. 39*3f982cf4SFabien Sanglard void OnReceiverCreated(Ssrc sender_ssrc, Receiver* receiver); 40*3f982cf4SFabien Sanglard void OnReceiverDestroyed(Ssrc sender_ssrc); 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglard // Called by a Receiver to send a RTCP packet back to the source from which 43*3f982cf4SFabien Sanglard // earlier packets were received, or does nothing if OnReceivedPacket() has 44*3f982cf4SFabien Sanglard // not been called yet. 45*3f982cf4SFabien Sanglard void SendRtcpPacket(absl::Span<const uint8_t> packet); 46*3f982cf4SFabien Sanglard 47*3f982cf4SFabien Sanglard private: 48*3f982cf4SFabien Sanglard // Environment::PacketConsumer implementation. 49*3f982cf4SFabien Sanglard void OnReceivedPacket(const IPEndpoint& source, 50*3f982cf4SFabien Sanglard Clock::time_point arrival_time, 51*3f982cf4SFabien Sanglard std::vector<uint8_t> packet) final; 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglard Environment* const environment_; 54*3f982cf4SFabien Sanglard 55*3f982cf4SFabien Sanglard FlatMap<Ssrc, Receiver*> receivers_; 56*3f982cf4SFabien Sanglard }; 57*3f982cf4SFabien Sanglard 58*3f982cf4SFabien Sanglard } // namespace cast 59*3f982cf4SFabien Sanglard } // namespace openscreen 60*3f982cf4SFabien Sanglard 61*3f982cf4SFabien Sanglard #endif // CAST_STREAMING_RECEIVER_PACKET_ROUTER_H_ 62