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