blob: 20eb179a9a21b2cac46c479ce2b74332b1fa6fda [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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 MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_
12#define MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
Yves Gerey988cc082018-10-23 12:03:01 +020014#include <stddef.h>
15#include <stdint.h>
nisse14adba72017-03-20 03:52:39 -070016#include <memory>
danilchapb8b6fbb2015-12-10 05:05:27 -080017#include <set>
Steve Anton296a0ce2018-03-22 15:17:27 -070018#include <string>
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000019#include <vector>
niklase@google.com470e71d2011-07-07 08:21:25 +000020
Danil Chapovalovd264df52018-06-14 12:59:38 +020021#include "absl/types/optional.h"
Yves Gerey988cc082018-10-23 12:03:01 +020022#include "api/rtp_headers.h"
Erik Språngeeaa8f92018-05-17 12:35:56 +020023#include "api/video/video_bitrate_allocation.h"
Yves Gerey988cc082018-10-23 12:03:01 +020024#include "common_types.h" // NOLINT(build/include)
25#include "modules/include/module_common_types.h"
26#include "modules/include/module_fec_types.h"
27#include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "modules/rtp_rtcp/include/rtp_rtcp.h"
Yves Gerey988cc082018-10-23 12:03:01 +020029#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" // RTCPPacketType
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020030#include "modules/rtp_rtcp/source/packet_loss_stats.h"
Yves Gerey988cc082018-10-23 12:03:01 +020031#include "modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "modules/rtp_rtcp/source/rtcp_receiver.h"
33#include "modules/rtp_rtcp/source/rtcp_sender.h"
34#include "modules/rtp_rtcp/source/rtp_sender.h"
Niels Möller59ab1cf2019-02-06 22:48:11 +010035#include "modules/rtp_rtcp/source/rtp_sender_audio.h"
36#include "modules/rtp_rtcp/source/rtp_sender_video.h"
Steve Anton10542f22019-01-11 09:11:00 -080037#include "rtc_base/critical_section.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020038#include "rtc_base/gtest_prod_util.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000039
niklase@google.com470e71d2011-07-07 08:21:25 +000040namespace webrtc {
41
Yves Gerey988cc082018-10-23 12:03:01 +020042class Clock;
43struct PacedPacketInfo;
44struct RTPVideoHeader;
45
danilchap59cb2bd2016-08-29 11:08:47 -070046class ModuleRtpRtcpImpl : public RtpRtcp, public RTCPReceiver::ModuleRtpRtcp {
pwestin@webrtc.org2853dde2012-05-11 11:08:54 +000047 public:
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000048 explicit ModuleRtpRtcpImpl(const RtpRtcp::Configuration& configuration);
Danil Chapovalov2a5ce2b2018-02-07 09:38:31 +010049 ~ModuleRtpRtcpImpl() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000050
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000051 // Returns the number of milliseconds until the module want a worker thread to
52 // call Process.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000053 int64_t TimeUntilNextProcess() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000054
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000055 // Process any pending tasks such as timeouts.
pbosa26ac922016-02-25 04:50:01 -080056 void Process() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000057
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000058 // Receiver part.
niklase@google.com470e71d2011-07-07 08:21:25 +000059
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +000060 // Called when we receive an RTCP packet.
nisse479d3d72017-09-13 07:53:37 -070061 void IncomingRtcpPacket(const uint8_t* incoming_packet,
62 size_t incoming_packet_length) override;
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +000063
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000064 void SetRemoteSSRC(uint32_t ssrc) override;
wu@webrtc.org822fbd82013-08-15 23:38:54 +000065
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000066 // Sender part.
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +000067
Fredrik Solenberg18f0c3c2018-12-06 11:49:35 +010068 void RegisterAudioSendPayload(int payload_type,
69 absl::string_view payload_name,
70 int frequency,
71 int channels,
72 int rate) override;
Niels Möller5fe95102019-03-04 16:49:25 +010073 void RegisterSendPayloadFrequency(int payload_type,
74 int payload_frequency) override;
Peter Boström8b79b072016-02-26 16:31:37 +010075
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000076 int32_t DeRegisterSendPayload(int8_t payload_type) override;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000077
Johannes Kron9190b822018-10-29 11:22:05 +010078 void SetExtmapAllowMixed(bool extmap_allow_mixed) override;
79
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000080 // Register RTP header extension.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000081 int32_t RegisterSendRtpHeaderExtension(RTPExtensionType type,
82 uint8_t id) override;
Danil Chapovalov585d1aa2018-09-14 18:29:32 +020083 bool RegisterRtpHeaderExtension(const std::string& uri, int id) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000084
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000085 int32_t DeregisterSendRtpHeaderExtension(RTPExtensionType type) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000086
stefan53b6cc32017-02-03 08:13:57 -080087 bool HasBweExtensions() const override;
88
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000089 // Get start timestamp.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000090 uint32_t StartTimestamp() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +000091
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000092 // Configure start timestamp, default is a random number.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000093 void SetStartTimestamp(uint32_t timestamp) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000094
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000095 uint16_t SequenceNumber() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +000096
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000097 // Set SequenceNumber, default is a random number.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000098 void SetSequenceNumber(uint16_t seq) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000099
Per83d09102016-04-15 14:59:13 +0200100 void SetRtpState(const RtpState& rtp_state) override;
101 void SetRtxState(const RtpState& rtp_state) override;
102 RtpState GetRtpState() const override;
103 RtpState GetRtxState() const override;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +0000104
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000105 uint32_t SSRC() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000106
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000107 // Configure SSRC, default is a random number.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000108 void SetSSRC(uint32_t ssrc) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000109
Amit Hilbuch77938e62018-12-21 09:23:38 -0800110 void SetRid(const std::string& rid) override;
111
Steve Anton296a0ce2018-03-22 15:17:27 -0700112 void SetMid(const std::string& mid) override;
113
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000114 void SetCsrcs(const std::vector<uint32_t>& csrcs) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000115
henrik.lundin@webrtc.org1972ff82014-09-11 06:20:28 +0000116 RTCPSender::FeedbackState GetFeedbackState();
niklase@google.com470e71d2011-07-07 08:21:25 +0000117
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000118 void SetRtxSendStatus(int mode) override;
119 int RtxSendStatus() const override;
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000120
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000121 void SetRtxSsrc(uint32_t ssrc) override;
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +0000122
Shao Changbine62202f2015-04-21 20:24:50 +0800123 void SetRtxSendPayloadType(int payload_type,
124 int associated_payload_type) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000125
Danil Chapovalovd264df52018-06-14 12:59:38 +0200126 absl::optional<uint32_t> FlexfecSsrc() const override;
brandtr9dfff292016-11-14 05:14:50 -0800127
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000128 // Sends kRtcpByeCode when going from true to false.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000129 int32_t SetSendingStatus(bool sending) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000130
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000131 bool Sending() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000132
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000133 // Drops or relays media packets.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000134 void SetSendingMediaStatus(bool sending) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000135
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000136 bool SendingMedia() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000137
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200138 void SetAsPartOfAllocation(bool part_of_allocation) override;
139
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000140 // Used by the codec module to deliver a video or audio frame for
141 // packetization.
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700142 bool SendOutgoingData(FrameType frame_type,
143 int8_t payload_type,
144 uint32_t time_stamp,
145 int64_t capture_time_ms,
146 const uint8_t* payload_data,
147 size_t payload_size,
148 const RTPFragmentationHeader* fragmentation,
149 const RTPVideoHeader* rtp_video_header,
150 uint32_t* transport_frame_id_out) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000151
Niels Möller5fe95102019-03-04 16:49:25 +0100152 bool OnSendingRtpFrame(uint32_t timestamp,
153 int64_t capture_time_ms,
154 int payload_type,
155 bool force_sender_report) override;
156
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000157 bool TimeToSendPacket(uint32_t ssrc,
158 uint16_t sequence_number,
159 int64_t capture_time_ms,
philipela1ed0b32016-06-01 06:31:17 -0700160 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -0800161 const PacedPacketInfo& pacing_info) override;
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000162
stefan@webrtc.org508a84b2013-06-17 12:53:37 +0000163 // Returns the number of padding bytes actually sent, which can be more or
164 // less than |bytes|.
philipelc7bf32a2017-02-17 03:59:43 -0800165 size_t TimeToSendPadding(size_t bytes,
166 const PacedPacketInfo& pacing_info) override;
stefan@webrtc.org0a3c1472013-12-05 14:05:07 +0000167
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000168 // RTCP part.
niklase@google.com470e71d2011-07-07 08:21:25 +0000169
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000170 // Get RTCP status.
pbosda903ea2015-10-02 02:36:56 -0700171 RtcpMode RTCP() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000172
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000173 // Configure RTCP status i.e on/off.
pbosda903ea2015-10-02 02:36:56 -0700174 void SetRTCPStatus(RtcpMode method) override;
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000175
176 // Set RTCP CName.
Peter Boström9ba52f82015-06-01 14:12:28 +0200177 int32_t SetCNAME(const char* c_name) override;
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000178
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000179 // Get remote CName.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000180 int32_t RemoteCNAME(uint32_t remote_ssrc,
181 char c_name[RTCP_CNAME_SIZE]) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000182
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000183 // Get remote NTP.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000184 int32_t RemoteNTP(uint32_t* received_ntp_secs,
185 uint32_t* received_ntp_frac,
186 uint32_t* rtcp_arrival_time_secs,
187 uint32_t* rtcp_arrival_time_frac,
188 uint32_t* rtcp_timestamp) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000189
Erik Språng0ea42d32015-06-25 14:46:16 +0200190 int32_t AddMixedCNAME(uint32_t ssrc, const char* c_name) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000191
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000192 int32_t RemoveMixedCNAME(uint32_t ssrc) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000193
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000194 // Get RoundTripTime.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000195 int32_t RTT(uint32_t remote_ssrc,
196 int64_t* rtt,
197 int64_t* avg_rtt,
198 int64_t* min_rtt,
199 int64_t* max_rtt) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000200
Niels Möller5fe95102019-03-04 16:49:25 +0100201 int64_t ExpectedRetransmissionTimeMs() const override;
202
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000203 // Force a send of an RTCP packet.
204 // Normal SR and RR are triggered via the process function.
Erik Språng242e22b2015-05-11 10:17:43 +0200205 int32_t SendRTCP(RTCPPacketType rtcpPacketType) override;
206
207 int32_t SendCompoundRTCP(
208 const std::set<RTCPPacketType>& rtcpPacketTypes) override;
mflodman@webrtc.org7c894b72012-11-26 12:40:15 +0000209
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000210 // Statistics of the amount of data sent and received.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000211 int32_t DataCountersRTP(size_t* bytes_sent,
212 uint32_t* packets_sent) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000213
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000214 void GetSendStreamDataCounters(
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000215 StreamDataCounters* rtp_counters,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000216 StreamDataCounters* rtx_counters) const override;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000217
bcornell30409b42015-07-10 18:10:05 -0700218 void GetRtpPacketLossStats(
219 bool outgoing,
220 uint32_t ssrc,
221 struct RtpPacketLossStats* loss_stats) const override;
222
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000223 // Get received RTCP report, report block.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000224 int32_t RemoteRTCPStat(
225 std::vector<RTCPReportBlock>* receive_blocks) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000226
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000227 // (REMB) Receiver Estimated Max Bitrate.
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100228 void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs) override;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200229 void UnsetRemb() override;
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000230
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000231 // (TMMBR) Temporary Max Media Bit Rate.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000232 bool TMMBR() const override;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000233
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000234 void SetTMMBRStatus(bool enable) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000235
danilchap59cb2bd2016-08-29 11:08:47 -0700236 void SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000237
nisse284542b2017-01-10 08:58:32 -0800238 size_t MaxRtpPacketSize() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000239
nisse284542b2017-01-10 08:58:32 -0800240 void SetMaxRtpPacketSize(size_t max_packet_size) override;
michaelt79e05882016-11-08 02:50:09 -0800241
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000242 // (NACK) Negative acknowledgment part.
niklase@google.com470e71d2011-07-07 08:21:25 +0000243
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000244 // Send a Negative acknowledgment packet.
philipel83f831a2016-03-12 03:30:23 -0800245 // TODO(philipel): Deprecate SendNACK and use SendNack instead.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000246 int32_t SendNACK(const uint16_t* nack_list, uint16_t size) override;
stefan@webrtc.org6a4bef42011-12-22 12:52:41 +0000247
philipel83f831a2016-03-12 03:30:23 -0800248 void SendNack(const std::vector<uint16_t>& sequence_numbers) override;
249
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000250 // Store the sent packets, needed to answer to a negative acknowledgment
251 // requests.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000252 void SetStorePacketsStatus(bool enable, uint16_t number_to_store) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000253
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000254 bool StorePackets() const override;
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000255
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000256 // Called on receipt of RTCP report block from remote side.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000257 void RegisterRtcpStatisticsCallback(
258 RtcpStatisticsCallback* callback) override;
259 RtcpStatisticsCallback* GetRtcpStatisticsCallback() override;
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000260
sprang233bd872015-09-08 13:25:16 -0700261 bool SendFeedbackPacket(const rtcp::TransportFeedback& packet) override;
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000262 // (APP) Application specific data.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000263 int32_t SetRTCPApplicationSpecificData(uint8_t sub_type,
264 uint32_t name,
265 const uint8_t* data,
266 uint16_t length) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000267
asapersson@webrtc.org7d6bd222013-10-31 12:14:34 +0000268 // (XR) Receiver reference time report.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000269 void SetRtcpXrRrtrStatus(bool enable) override;
asapersson@webrtc.org7d6bd222013-10-31 12:14:34 +0000270
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000271 bool RtcpXrRrtrStatus() const override;
asapersson@webrtc.org8d02f5d2013-11-21 08:57:04 +0000272
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000273 // Audio part.
niklase@google.com470e71d2011-07-07 08:21:25 +0000274
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000275 // Send a TelephoneEvent tone using RFC 2833 (4733).
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000276 int32_t SendTelephoneEventOutband(uint8_t key,
277 uint16_t time_ms,
278 uint8_t level) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000279
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000280 // Store the audio level in d_bov for header-extension-for-audio-level-
281 // indication.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000282 int32_t SetAudioLevel(uint8_t level_d_bov) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000283
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000284 // Video part.
niklase@google.com470e71d2011-07-07 08:21:25 +0000285
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000286 // Set method for requesting a new key frame.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000287 int32_t SetKeyFrameRequestMethod(KeyFrameRequestMethod method) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000288
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000289 // Send a request for a keyframe.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000290 int32_t RequestKeyFrame() override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000291
Elad Alon7d6a4c02019-02-25 13:00:51 +0100292 int32_t SendLossNotification(uint16_t last_decoded_seq_num,
293 uint16_t last_received_seq_num,
294 bool decodability_flag) override;
295
henrik.lundin@webrtc.org1972ff82014-09-11 06:20:28 +0000296 bool LastReceivedNTP(uint32_t* NTPsecs,
297 uint32_t* NTPfrac,
298 uint32_t* remote_sr) const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000299
danilchap2b616392016-08-18 06:17:42 -0700300 std::vector<rtcp::TmmbItem> BoundingSet(bool* tmmbr_owner);
niklase@google.com470e71d2011-07-07 08:21:25 +0000301
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000302 void BitrateSent(uint32_t* total_rate,
303 uint32_t* video_rate,
304 uint32_t* fec_rate,
305 uint32_t* nackRate) const override;
stefan@webrtc.org07b45a52012-02-02 08:37:48 +0000306
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000307 void RegisterSendChannelRtpStatisticsCallback(
308 StreamDataCountersCallback* callback) override;
309 StreamDataCountersCallback* GetSendChannelRtpStatisticsCallback()
310 const override;
sprang@webrtc.orgebad7652013-12-05 14:29:02 +0000311
danilchap59cb2bd2016-08-29 11:08:47 -0700312 void OnReceivedNack(
313 const std::vector<uint16_t>& nack_sequence_numbers) override;
314 void OnReceivedRtcpReportBlocks(
315 const ReportBlockList& report_blocks) override;
316 void OnRequestSendReport() override;
henrike@webrtc.orgf5da4da2012-02-15 23:54:59 +0000317
Erik Språng566124a2018-04-23 12:32:22 +0200318 void SetVideoBitrateAllocation(
319 const VideoBitrateAllocation& bitrate) override;
sprang5e38c962016-12-01 05:18:09 -0800320
Niels Möller5fe95102019-03-04 16:49:25 +0100321 RTPSender* RtpSender() override;
322 const RTPSender* RtpSender() const override;
323
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000324 protected:
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000325 bool UpdateRTCPReceiveInformationTimers();
niklase@google.com470e71d2011-07-07 08:21:25 +0000326
nisse14adba72017-03-20 03:52:39 -0700327 RTPSender* rtp_sender() { return rtp_sender_.get(); }
328 const RTPSender* rtp_sender() const { return rtp_sender_.get(); }
nissea33c62e2017-03-14 00:49:45 -0700329
330 RTCPSender* rtcp_sender() { return &rtcp_sender_; }
331 const RTCPSender* rtcp_sender() const { return &rtcp_sender_; }
332
333 RTCPReceiver* rtcp_receiver() { return &rtcp_receiver_; }
334 const RTCPReceiver* rtcp_receiver() const { return &rtcp_receiver_; }
335
Sebastian Janssonaa01f272019-01-30 11:28:59 +0100336 Clock* clock() const { return clock_; }
nissea33c62e2017-03-14 00:49:45 -0700337
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000338 private:
asapersson@webrtc.orge7b1e112013-12-16 14:40:36 +0000339 FRIEND_TEST_ALL_PREFIXES(RtpRtcpImplTest, Rtt);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000340 FRIEND_TEST_ALL_PREFIXES(RtpRtcpImplTest, RttForReceiverOnly);
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000341 void SetRtcpReceiverSsrcs(uint32_t main_ssrc);
niklase@google.com470e71d2011-07-07 08:21:25 +0000342
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000343 void set_rtt_ms(int64_t rtt_ms);
344 int64_t rtt_ms() const;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000345
asapersson@webrtc.orgba8138b2014-12-08 13:29:02 +0000346 bool TimeToSendFullNackList(int64_t now) const;
347
nisse14adba72017-03-20 03:52:39 -0700348 std::unique_ptr<RTPSender> rtp_sender_;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100349 std::unique_ptr<RTPSenderAudio> audio_;
nisse150708e2017-03-16 05:02:53 -0700350 RTCPSender rtcp_sender_;
351 RTCPReceiver rtcp_receiver_;
352
Sebastian Janssonaa01f272019-01-30 11:28:59 +0100353 Clock* const clock_;
nisse150708e2017-03-16 05:02:53 -0700354
sprang168794c2017-07-06 04:38:06 -0700355 const RtpKeepAliveConfig keepalive_config_;
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000356 int64_t last_bitrate_process_time_;
357 int64_t last_rtt_process_time_;
sprang168794c2017-07-06 04:38:06 -0700358 int64_t next_process_time_;
359 int64_t next_keepalive_time_;
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000360 uint16_t packet_overhead_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000361
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000362 // Send side
Danil Chapovalov9eb6ce12017-12-15 12:25:01 +0100363 int64_t nack_last_time_sent_full_ms_;
asapersson@webrtc.orgba8138b2014-12-08 13:29:02 +0000364 uint16_t nack_last_seq_number_sent_;
stefan@webrtc.org9354cc92012-06-07 08:10:14 +0000365
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000366 KeyFrameRequestMethod key_frame_req_method_;
367
Niels Möller5fe95102019-03-04 16:49:25 +0100368 RemoteBitrateEstimator* const remote_bitrate_;
369
370 RtcpAckObserver* const ack_observer_;
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000371
Tommi5f223652018-03-26 13:28:26 +0200372 RtcpRttStats* const rtt_stats_;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000373
bcornell30409b42015-07-10 18:10:05 -0700374 PacketLossStats send_loss_stats_;
375 PacketLossStats receive_loss_stats_;
376
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000377 // The processed RTT from RtcpRttStats.
danilchap7c9426c2016-04-14 03:05:31 -0700378 rtc::CriticalSection critical_section_rtt_;
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000379 int64_t rtt_ms_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000380};
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000381
382} // namespace webrtc
383
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200384#endif // MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_