blob: ffc0c1a59d3bc8f86ecea77aed4ac05d6ebe139d [file] [log] [blame]
Stefan Holmere5904162015-03-26 11:11:06 +01001/*
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
Henrik Kjellander0b9e29c2015-11-16 11:12:24 +010011#ifndef WEBRTC_MODULES_PACING_PACKET_ROUTER_H_
12#define WEBRTC_MODULES_PACING_PACKET_ROUTER_H_
Stefan Holmere5904162015-03-26 11:11:06 +010013
14#include <list>
nissefdbfdc92017-03-31 05:44:52 -070015#include <vector>
Stefan Holmere5904162015-03-26 11:11:06 +010016
17#include "webrtc/base/constructormagic.h"
sprang867fb522015-08-03 04:38:41 -070018#include "webrtc/base/criticalsection.h"
Stefan Holmere5904162015-03-26 11:11:06 +010019#include "webrtc/base/thread_annotations.h"
stefanbba9dec2016-02-01 04:39:55 -080020#include "webrtc/base/thread_checker.h"
Stefan Holmere5904162015-03-26 11:11:06 +010021#include "webrtc/common_types.h"
Henrik Kjellander0b9e29c2015-11-16 11:12:24 +010022#include "webrtc/modules/pacing/paced_sender.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010023#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
Stefan Holmere5904162015-03-26 11:11:06 +010024
25namespace webrtc {
26
Stefan Holmere5904162015-03-26 11:11:06 +010027class RtpRtcp;
sprangebbf8a82015-09-21 15:11:14 -070028namespace rtcp {
29class TransportFeedback;
30} // namespace rtcp
Stefan Holmere5904162015-03-26 11:11:06 +010031
nissefdbfdc92017-03-31 05:44:52 -070032// PacketRouter keeps track of rtp send modules to support the pacer.
33// In addition, it handles feedback messages, which are sent on a send
34// module if possible (sender report), otherwise on receive module
35// (receiver report). For the latter case, we also keep track of the
36// receive modules.
perkjec81bcd2016-05-11 06:01:13 -070037class PacketRouter : public PacedSender::PacketSender,
sprangebbf8a82015-09-21 15:11:14 -070038 public TransportSequenceNumberAllocator {
Stefan Holmere5904162015-03-26 11:11:06 +010039 public:
40 PacketRouter();
41 virtual ~PacketRouter();
42
nissefdbfdc92017-03-31 05:44:52 -070043 // TODO(nisse): Delete, as soon as downstream app is updated.
44 RTC_DEPRECATED void AddRtpModule(RtpRtcp* rtp_module) {
45 AddReceiveRtpModule(rtp_module);
46 }
47 RTC_DEPRECATED void RemoveRtpModule(RtpRtcp* rtp_module) {
48 RemoveReceiveRtpModule(rtp_module);
49 }
50 void AddSendRtpModule(RtpRtcp* rtp_module);
51 void RemoveSendRtpModule(RtpRtcp* rtp_module);
52
53 void AddReceiveRtpModule(RtpRtcp* rtp_module);
54 void RemoveReceiveRtpModule(RtpRtcp* rtp_module);
Stefan Holmere5904162015-03-26 11:11:06 +010055
56 // Implements PacedSender::Callback.
57 bool TimeToSendPacket(uint32_t ssrc,
58 uint16_t sequence_number,
59 int64_t capture_timestamp,
philipel29dca2c2016-05-13 11:13:05 +020060 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -080061 const PacedPacketInfo& packet_info) override;
Stefan Holmere5904162015-03-26 11:11:06 +010062
philipelc7bf32a2017-02-17 03:59:43 -080063 size_t TimeToSendPadding(size_t bytes,
64 const PacedPacketInfo& packet_info) override;
Stefan Holmere5904162015-03-26 11:11:06 +010065
sprang867fb522015-08-03 04:38:41 -070066 void SetTransportWideSequenceNumber(uint16_t sequence_number);
sprangebbf8a82015-09-21 15:11:14 -070067 uint16_t AllocateSequenceNumber() override;
Stefan Holmere5904162015-03-26 11:11:06 +010068
sprang233bd872015-09-08 13:25:16 -070069 // Send transport feedback packet to send-side.
70 virtual bool SendFeedback(rtcp::TransportFeedback* packet);
71
sprang867fb522015-08-03 04:38:41 -070072 private:
stefanbba9dec2016-02-01 04:39:55 -080073 rtc::ThreadChecker pacer_thread_checker_;
74 rtc::CriticalSection modules_crit_;
nissefdbfdc92017-03-31 05:44:52 -070075 std::list<RtpRtcp*> rtp_send_modules_ GUARDED_BY(modules_crit_);
76 std::vector<RtpRtcp*> rtp_receive_modules_ GUARDED_BY(modules_crit_);
sprang867fb522015-08-03 04:38:41 -070077
pbos46ad5422015-12-07 14:29:14 -080078 volatile int transport_seq_;
Stefan Holmere5904162015-03-26 11:11:06 +010079
henrikg3c089d72015-09-16 05:37:44 -070080 RTC_DISALLOW_COPY_AND_ASSIGN(PacketRouter);
Stefan Holmere5904162015-03-26 11:11:06 +010081};
82} // namespace webrtc
Henrik Kjellander0b9e29c2015-11-16 11:12:24 +010083#endif // WEBRTC_MODULES_PACING_PACKET_ROUTER_H_