blob: 8826aedad92c9d877c6631e3547a64c263bd22e4 [file] [log] [blame]
brandtr7250b392016-12-19 01:13:46 -08001/*
2 * Copyright (c) 2016 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_
12#define CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_
brandtr7250b392016-12-19 01:13:46 -080013
14#include <memory>
brandtr7250b392016-12-19 01:13:46 -080015
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "call/flexfec_receive_stream.h"
17#include "call/rtp_packet_sink_interface.h"
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +020018#include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
Tommi0377bab2021-05-31 14:26:05 +020019#include "rtc_base/system/no_unique_address.h"
Sebastian Jansson8026d602019-03-04 19:39:01 +010020#include "system_wrappers/include/clock.h"
brandtr7250b392016-12-19 01:13:46 -080021
22namespace webrtc {
23
brandtrfa5a3682017-01-17 01:33:54 -080024class FlexfecReceiver;
25class ProcessThread;
26class ReceiveStatistics;
27class RecoveredPacketReceiver;
28class RtcpRttStats;
29class RtpPacketReceived;
30class RtpRtcp;
nisse0f15f922017-06-21 01:05:22 -070031class RtpStreamReceiverControllerInterface;
32class RtpStreamReceiverInterface;
brandtrfa5a3682017-01-17 01:33:54 -080033
eladalonc0d481a2017-08-02 07:39:07 -070034class FlexfecReceiveStreamImpl : public FlexfecReceiveStream {
brandtr7250b392016-12-19 01:13:46 -080035 public:
nisse0f15f922017-06-21 01:05:22 -070036 FlexfecReceiveStreamImpl(
Sebastian Jansson8026d602019-03-04 19:39:01 +010037 Clock* clock,
nisse0f15f922017-06-21 01:05:22 -070038 const Config& config,
39 RecoveredPacketReceiver* recovered_packet_receiver,
40 RtcpRttStats* rtt_stats,
41 ProcessThread* process_thread);
Tommi0377bab2021-05-31 14:26:05 +020042 // Destruction happens on the worker thread. Prior to destruction the caller
43 // must ensure that a registration with the transport has been cleared. See
44 // `RegisterWithTransport` for details.
45 // TODO(tommi): As a further improvement to this, performing the full
46 // destruction on the network thread could be made the default.
brandtr7250b392016-12-19 01:13:46 -080047 ~FlexfecReceiveStreamImpl() override;
48
Tommi0377bab2021-05-31 14:26:05 +020049 // Called on the network thread to register/unregister with the network
50 // transport.
51 void RegisterWithTransport(
52 RtpStreamReceiverControllerInterface* receiver_controller);
53 // If registration has previously been done (via `RegisterWithTransport`) then
54 // `UnregisterFromTransport` must be called prior to destruction, on the
55 // network thread.
56 void UnregisterFromTransport();
57
nissee4bcd6d2017-05-16 04:47:04 -070058 // RtpPacketSinkInterface.
59 void OnRtpPacket(const RtpPacketReceived& packet) override;
brandtr7250b392016-12-19 01:13:46 -080060
brandtr7250b392016-12-19 01:13:46 -080061 Stats GetStats() const override;
eladalon42f44f92017-07-25 06:40:06 -070062 const Config& GetConfig() const override;
brandtr7250b392016-12-19 01:13:46 -080063
64 private:
Tommi90738dd2021-05-31 17:36:47 +020065 RTC_NO_UNIQUE_ADDRESS SequenceChecker packet_sequence_checker_;
Tommi0377bab2021-05-31 14:26:05 +020066
brandtrfa5a3682017-01-17 01:33:54 -080067 // Config.
brandtr7250b392016-12-19 01:13:46 -080068 const Config config_;
brandtrfa5a3682017-01-17 01:33:54 -080069
70 // Erasure code interfacing.
brandtr7250b392016-12-19 01:13:46 -080071 const std::unique_ptr<FlexfecReceiver> receiver_;
brandtrfa5a3682017-01-17 01:33:54 -080072
73 // RTCP reporting.
74 const std::unique_ptr<ReceiveStatistics> rtp_receive_statistics_;
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +020075 const std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_;
Tommi0377bab2021-05-31 14:26:05 +020076 ProcessThread* const process_thread_;
nisse0f15f922017-06-21 01:05:22 -070077
Tommi0377bab2021-05-31 14:26:05 +020078 std::unique_ptr<RtpStreamReceiverInterface> rtp_stream_receiver_
Tommi90738dd2021-05-31 17:36:47 +020079 RTC_GUARDED_BY(packet_sequence_checker_);
brandtr7250b392016-12-19 01:13:46 -080080};
81
82} // namespace webrtc
83
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020084#endif // CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_