1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_ 12*d9f75844SAndroid Build Coastguard Worker #define CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <memory> 15*d9f75844SAndroid Build Coastguard Worker #include <vector> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include "call/flexfec_receive_stream.h" 18*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_packet_sink_interface.h" 19*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h" 20*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/no_unique_address.h" 21*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h" 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 24*d9f75844SAndroid Build Coastguard Worker 25*d9f75844SAndroid Build Coastguard Worker class FlexfecReceiver; 26*d9f75844SAndroid Build Coastguard Worker class ReceiveStatistics; 27*d9f75844SAndroid Build Coastguard Worker class RecoveredPacketReceiver; 28*d9f75844SAndroid Build Coastguard Worker class RtcpRttStats; 29*d9f75844SAndroid Build Coastguard Worker class RtpPacketReceived; 30*d9f75844SAndroid Build Coastguard Worker class RtpRtcp; 31*d9f75844SAndroid Build Coastguard Worker class RtpStreamReceiverControllerInterface; 32*d9f75844SAndroid Build Coastguard Worker class RtpStreamReceiverInterface; 33*d9f75844SAndroid Build Coastguard Worker 34*d9f75844SAndroid Build Coastguard Worker class FlexfecReceiveStreamImpl : public FlexfecReceiveStream { 35*d9f75844SAndroid Build Coastguard Worker public: 36*d9f75844SAndroid Build Coastguard Worker FlexfecReceiveStreamImpl(Clock* clock, 37*d9f75844SAndroid Build Coastguard Worker Config config, 38*d9f75844SAndroid Build Coastguard Worker RecoveredPacketReceiver* recovered_packet_receiver, 39*d9f75844SAndroid Build Coastguard Worker RtcpRttStats* rtt_stats); 40*d9f75844SAndroid Build Coastguard Worker // Destruction happens on the worker thread. Prior to destruction the caller 41*d9f75844SAndroid Build Coastguard Worker // must ensure that a registration with the transport has been cleared. See 42*d9f75844SAndroid Build Coastguard Worker // `RegisterWithTransport` for details. 43*d9f75844SAndroid Build Coastguard Worker // TODO(tommi): As a further improvement to this, performing the full 44*d9f75844SAndroid Build Coastguard Worker // destruction on the network thread could be made the default. 45*d9f75844SAndroid Build Coastguard Worker ~FlexfecReceiveStreamImpl() override; 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Worker // Called on the network thread to register/unregister with the network 48*d9f75844SAndroid Build Coastguard Worker // transport. 49*d9f75844SAndroid Build Coastguard Worker void RegisterWithTransport( 50*d9f75844SAndroid Build Coastguard Worker RtpStreamReceiverControllerInterface* receiver_controller); 51*d9f75844SAndroid Build Coastguard Worker // If registration has previously been done (via `RegisterWithTransport`) then 52*d9f75844SAndroid Build Coastguard Worker // `UnregisterFromTransport` must be called prior to destruction, on the 53*d9f75844SAndroid Build Coastguard Worker // network thread. 54*d9f75844SAndroid Build Coastguard Worker void UnregisterFromTransport(); 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard Worker // RtpPacketSinkInterface. 57*d9f75844SAndroid Build Coastguard Worker void OnRtpPacket(const RtpPacketReceived& packet) override; 58*d9f75844SAndroid Build Coastguard Worker 59*d9f75844SAndroid Build Coastguard Worker void SetPayloadType(int payload_type) override; 60*d9f75844SAndroid Build Coastguard Worker int payload_type() const override; 61*d9f75844SAndroid Build Coastguard Worker 62*d9f75844SAndroid Build Coastguard Worker // ReceiveStreamInterface impl. 63*d9f75844SAndroid Build Coastguard Worker void SetRtpExtensions(std::vector<RtpExtension> extensions) override; 64*d9f75844SAndroid Build Coastguard Worker RtpHeaderExtensionMap GetRtpExtensionMap() const override; 65*d9f75844SAndroid Build Coastguard Worker 66*d9f75844SAndroid Build Coastguard Worker // Updates the `rtp_video_stream_receiver_`'s `local_ssrc` when the default 67*d9f75844SAndroid Build Coastguard Worker // sender has been created, changed or removed. 68*d9f75844SAndroid Build Coastguard Worker void SetLocalSsrc(uint32_t local_ssrc); 69*d9f75844SAndroid Build Coastguard Worker remote_ssrc()70*d9f75844SAndroid Build Coastguard Worker uint32_t remote_ssrc() const { return remote_ssrc_; } 71*d9f75844SAndroid Build Coastguard Worker transport_cc()72*d9f75844SAndroid Build Coastguard Worker bool transport_cc() const override { 73*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&packet_sequence_checker_); 74*d9f75844SAndroid Build Coastguard Worker return transport_cc_; 75*d9f75844SAndroid Build Coastguard Worker } 76*d9f75844SAndroid Build Coastguard Worker SetTransportCc(bool transport_cc)77*d9f75844SAndroid Build Coastguard Worker void SetTransportCc(bool transport_cc) override { 78*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&packet_sequence_checker_); 79*d9f75844SAndroid Build Coastguard Worker transport_cc_ = transport_cc; 80*d9f75844SAndroid Build Coastguard Worker } 81*d9f75844SAndroid Build Coastguard Worker SetRtcpMode(RtcpMode mode)82*d9f75844SAndroid Build Coastguard Worker void SetRtcpMode(RtcpMode mode) override { 83*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(&packet_sequence_checker_); 84*d9f75844SAndroid Build Coastguard Worker rtp_rtcp_->SetRTCPStatus(mode); 85*d9f75844SAndroid Build Coastguard Worker } 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker private: 88*d9f75844SAndroid Build Coastguard Worker RTC_NO_UNIQUE_ADDRESS SequenceChecker packet_sequence_checker_; 89*d9f75844SAndroid Build Coastguard Worker 90*d9f75844SAndroid Build Coastguard Worker RtpHeaderExtensionMap extension_map_; 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Worker const uint32_t remote_ssrc_; 93*d9f75844SAndroid Build Coastguard Worker bool transport_cc_ RTC_GUARDED_BY(packet_sequence_checker_); 94*d9f75844SAndroid Build Coastguard Worker 95*d9f75844SAndroid Build Coastguard Worker // `payload_type_` is initially set to -1, indicating that FlexFec is 96*d9f75844SAndroid Build Coastguard Worker // disabled. 97*d9f75844SAndroid Build Coastguard Worker int payload_type_ RTC_GUARDED_BY(packet_sequence_checker_) = -1; 98*d9f75844SAndroid Build Coastguard Worker 99*d9f75844SAndroid Build Coastguard Worker // Erasure code interfacing. 100*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<FlexfecReceiver> receiver_; 101*d9f75844SAndroid Build Coastguard Worker 102*d9f75844SAndroid Build Coastguard Worker // RTCP reporting. 103*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<ReceiveStatistics> rtp_receive_statistics_; 104*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_; 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtpStreamReceiverInterface> rtp_stream_receiver_ 107*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(packet_sequence_checker_); 108*d9f75844SAndroid Build Coastguard Worker }; 109*d9f75844SAndroid Build Coastguard Worker 110*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 111*d9f75844SAndroid Build Coastguard Worker 112*d9f75844SAndroid Build Coastguard Worker #endif // CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_ 113