1 /* 2 * Copyright (c) 2015 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_MODULES_PACING_PACKET_ROUTER_H_ 12 #define WEBRTC_MODULES_PACING_PACKET_ROUTER_H_ 13 14 #include <list> 15 16 #include "webrtc/base/constructormagic.h" 17 #include "webrtc/base/criticalsection.h" 18 #include "webrtc/base/scoped_ptr.h" 19 #include "webrtc/base/thread_annotations.h" 20 #include "webrtc/common_types.h" 21 #include "webrtc/modules/pacing/paced_sender.h" 22 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 23 24 namespace webrtc { 25 26 class RtpRtcp; 27 namespace rtcp { 28 class TransportFeedback; 29 } // namespace rtcp 30 31 // PacketRouter routes outgoing data to the correct sending RTP module, based 32 // on the simulcast layer in RTPVideoHeader. 33 class PacketRouter : public PacedSender::Callback, 34 public TransportSequenceNumberAllocator { 35 public: 36 PacketRouter(); 37 virtual ~PacketRouter(); 38 39 void AddRtpModule(RtpRtcp* rtp_module); 40 void RemoveRtpModule(RtpRtcp* rtp_module); 41 42 // Implements PacedSender::Callback. 43 bool TimeToSendPacket(uint32_t ssrc, 44 uint16_t sequence_number, 45 int64_t capture_timestamp, 46 bool retransmission) override; 47 48 size_t TimeToSendPadding(size_t bytes) override; 49 50 void SetTransportWideSequenceNumber(uint16_t sequence_number); 51 uint16_t AllocateSequenceNumber() override; 52 53 // Send transport feedback packet to send-side. 54 virtual bool SendFeedback(rtcp::TransportFeedback* packet); 55 56 private: 57 rtc::CriticalSection modules_lock_; 58 // Map from ssrc to sending rtp module. 59 std::list<RtpRtcp*> rtp_modules_ GUARDED_BY(modules_lock_); 60 61 volatile int transport_seq_; 62 63 RTC_DISALLOW_COPY_AND_ASSIGN(PacketRouter); 64 }; 65 } // namespace webrtc 66 #endif // WEBRTC_MODULES_PACING_PACKET_ROUTER_H_ 67