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
24namespace webrtc {
25
26class RtpRtcp;
27namespace rtcp {
28class TransportFeedback;
29}  // namespace rtcp
30
31// PacketRouter routes outgoing data to the correct sending RTP module, based
32// on the simulcast layer in RTPVideoHeader.
33class 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