blob: 70edc9d334e58693733fca8e3a6971f0d3c044ac [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
11#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_
12#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_
13
nisse14adba72017-03-20 03:52:39 -070014#include <memory>
danilchapb8b6fbb2015-12-10 05:05:27 -080015#include <set>
16#include <utility>
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000017#include <vector>
niklase@google.com470e71d2011-07-07 08:21:25 +000018
kwiberg84f6a3f2017-09-05 08:43:13 -070019#include "webrtc/api/optional.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010020#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
isheriff6b4b5f32016-06-08 00:24:21 -070021#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
bcornell30409b42015-07-10 18:10:05 -070022#include "webrtc/modules/rtp_rtcp/source/packet_loss_stats.h"
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000023#include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h"
24#include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000025#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020026#include "webrtc/rtc_base/criticalsection.h"
27#include "webrtc/rtc_base/gtest_prod_util.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000028
niklase@google.com470e71d2011-07-07 08:21:25 +000029namespace webrtc {
30
danilchap59cb2bd2016-08-29 11:08:47 -070031class ModuleRtpRtcpImpl : public RtpRtcp, public RTCPReceiver::ModuleRtpRtcp {
pwestin@webrtc.org2853dde2012-05-11 11:08:54 +000032 public:
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000033 explicit ModuleRtpRtcpImpl(const RtpRtcp::Configuration& configuration);
niklase@google.com470e71d2011-07-07 08:21:25 +000034
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000035 // Returns the number of milliseconds until the module want a worker thread to
36 // call Process.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000037 int64_t TimeUntilNextProcess() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000038
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000039 // Process any pending tasks such as timeouts.
pbosa26ac922016-02-25 04:50:01 -080040 void Process() override;
niklase@google.com470e71d2011-07-07 08:21:25 +000041
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000042 // Receiver part.
niklase@google.com470e71d2011-07-07 08:21:25 +000043
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +000044 // Called when we receive an RTCP packet.
nisse479d3d72017-09-13 07:53:37 -070045 void IncomingRtcpPacket(const uint8_t* incoming_packet,
46 size_t incoming_packet_length) override;
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +000047
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000048 void SetRemoteSSRC(uint32_t ssrc) override;
wu@webrtc.org822fbd82013-08-15 23:38:54 +000049
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000050 // Sender part.
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +000051
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000052 int32_t RegisterSendPayload(const CodecInst& voice_codec) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000053
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000054 int32_t RegisterSendPayload(const VideoCodec& video_codec) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000055
Peter Boström8b79b072016-02-26 16:31:37 +010056 void RegisterVideoSendPayload(int payload_type,
57 const char* payload_name) override;
58
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000059 int32_t DeRegisterSendPayload(int8_t payload_type) override;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000060
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000061 // Register RTP header extension.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000062 int32_t RegisterSendRtpHeaderExtension(RTPExtensionType type,
63 uint8_t id) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000064
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000065 int32_t DeregisterSendRtpHeaderExtension(RTPExtensionType type) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000066
stefan53b6cc32017-02-03 08:13:57 -080067 bool HasBweExtensions() const override;
68
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000069 // Get start timestamp.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000070 uint32_t StartTimestamp() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +000071
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000072 // Configure start timestamp, default is a random number.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000073 void SetStartTimestamp(uint32_t timestamp) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000074
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000075 uint16_t SequenceNumber() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +000076
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000077 // Set SequenceNumber, default is a random number.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000078 void SetSequenceNumber(uint16_t seq) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000079
Per83d09102016-04-15 14:59:13 +020080 void SetRtpState(const RtpState& rtp_state) override;
81 void SetRtxState(const RtpState& rtp_state) override;
82 RtpState GetRtpState() const override;
83 RtpState GetRtxState() const override;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +000084
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000085 uint32_t SSRC() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +000086
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +000087 // Configure SSRC, default is a random number.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000088 void SetSSRC(uint32_t ssrc) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000089
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000090 void SetCsrcs(const std::vector<uint32_t>& csrcs) override;
niklase@google.com470e71d2011-07-07 08:21:25 +000091
henrik.lundin@webrtc.org1972ff82014-09-11 06:20:28 +000092 RTCPSender::FeedbackState GetFeedbackState();
niklase@google.com470e71d2011-07-07 08:21:25 +000093
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000094 void SetRtxSendStatus(int mode) override;
95 int RtxSendStatus() const override;
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +000096
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000097 void SetRtxSsrc(uint32_t ssrc) override;
mflodman@webrtc.org9f5ebb52013-04-12 14:55:46 +000098
Shao Changbine62202f2015-04-21 20:24:50 +080099 void SetRtxSendPayloadType(int payload_type,
100 int associated_payload_type) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000101
brandtr9dfff292016-11-14 05:14:50 -0800102 rtc::Optional<uint32_t> FlexfecSsrc() const override;
103
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000104 // Sends kRtcpByeCode when going from true to false.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000105 int32_t SetSendingStatus(bool sending) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000106
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000107 bool Sending() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000108
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000109 // Drops or relays media packets.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000110 void SetSendingMediaStatus(bool sending) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000111
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000112 bool SendingMedia() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000113
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000114 // Used by the codec module to deliver a video or audio frame for
115 // packetization.
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700116 bool SendOutgoingData(FrameType frame_type,
117 int8_t payload_type,
118 uint32_t time_stamp,
119 int64_t capture_time_ms,
120 const uint8_t* payload_data,
121 size_t payload_size,
122 const RTPFragmentationHeader* fragmentation,
123 const RTPVideoHeader* rtp_video_header,
124 uint32_t* transport_frame_id_out) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000125
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000126 bool TimeToSendPacket(uint32_t ssrc,
127 uint16_t sequence_number,
128 int64_t capture_time_ms,
philipela1ed0b32016-06-01 06:31:17 -0700129 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -0800130 const PacedPacketInfo& pacing_info) override;
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000131
stefan@webrtc.org508a84b2013-06-17 12:53:37 +0000132 // Returns the number of padding bytes actually sent, which can be more or
133 // less than |bytes|.
philipelc7bf32a2017-02-17 03:59:43 -0800134 size_t TimeToSendPadding(size_t bytes,
135 const PacedPacketInfo& pacing_info) override;
stefan@webrtc.org0a3c1472013-12-05 14:05:07 +0000136
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000137 // RTCP part.
niklase@google.com470e71d2011-07-07 08:21:25 +0000138
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000139 // Get RTCP status.
pbosda903ea2015-10-02 02:36:56 -0700140 RtcpMode RTCP() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000141
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000142 // Configure RTCP status i.e on/off.
pbosda903ea2015-10-02 02:36:56 -0700143 void SetRTCPStatus(RtcpMode method) override;
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000144
145 // Set RTCP CName.
Peter Boström9ba52f82015-06-01 14:12:28 +0200146 int32_t SetCNAME(const char* c_name) override;
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000147
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000148 // Get remote CName.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000149 int32_t RemoteCNAME(uint32_t remote_ssrc,
150 char c_name[RTCP_CNAME_SIZE]) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000151
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000152 // Get remote NTP.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000153 int32_t RemoteNTP(uint32_t* received_ntp_secs,
154 uint32_t* received_ntp_frac,
155 uint32_t* rtcp_arrival_time_secs,
156 uint32_t* rtcp_arrival_time_frac,
157 uint32_t* rtcp_timestamp) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000158
Erik SprĂ¥ng0ea42d32015-06-25 14:46:16 +0200159 int32_t AddMixedCNAME(uint32_t ssrc, const char* c_name) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000160
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000161 int32_t RemoveMixedCNAME(uint32_t ssrc) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000162
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000163 // Get RoundTripTime.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000164 int32_t RTT(uint32_t remote_ssrc,
165 int64_t* rtt,
166 int64_t* avg_rtt,
167 int64_t* min_rtt,
168 int64_t* max_rtt) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000169
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000170 // Force a send of an RTCP packet.
171 // Normal SR and RR are triggered via the process function.
Erik SprĂ¥ng242e22b2015-05-11 10:17:43 +0200172 int32_t SendRTCP(RTCPPacketType rtcpPacketType) override;
173
174 int32_t SendCompoundRTCP(
175 const std::set<RTCPPacketType>& rtcpPacketTypes) override;
mflodman@webrtc.org7c894b72012-11-26 12:40:15 +0000176
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000177 // Statistics of the amount of data sent and received.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000178 int32_t DataCountersRTP(size_t* bytes_sent,
179 uint32_t* packets_sent) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000180
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000181 void GetSendStreamDataCounters(
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000182 StreamDataCounters* rtp_counters,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000183 StreamDataCounters* rtx_counters) const override;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000184
bcornell30409b42015-07-10 18:10:05 -0700185 void GetRtpPacketLossStats(
186 bool outgoing,
187 uint32_t ssrc,
188 struct RtpPacketLossStats* loss_stats) const override;
189
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000190 // Get received RTCP report, report block.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000191 int32_t RemoteRTCPStat(
192 std::vector<RTCPReportBlock>* receive_blocks) const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000193
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000194 // (REMB) Receiver Estimated Max Bitrate.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000195 bool REMB() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000196
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000197 void SetREMBStatus(bool enable) override;
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000198
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000199 void SetREMBData(uint32_t bitrate,
200 const std::vector<uint32_t>& ssrcs) override;
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000201
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000202 // (TMMBR) Temporary Max Media Bit Rate.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000203 bool TMMBR() const override;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000204
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000205 void SetTMMBRStatus(bool enable) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000206
danilchap59cb2bd2016-08-29 11:08:47 -0700207 void SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000208
nisse284542b2017-01-10 08:58:32 -0800209 size_t MaxRtpPacketSize() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000210
nisse284542b2017-01-10 08:58:32 -0800211 void SetMaxRtpPacketSize(size_t max_packet_size) override;
michaelt79e05882016-11-08 02:50:09 -0800212
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000213 // (NACK) Negative acknowledgment part.
niklase@google.com470e71d2011-07-07 08:21:25 +0000214
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000215 int SelectiveRetransmissions() const override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000216
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000217 int SetSelectiveRetransmissions(uint8_t settings) override;
stefan@webrtc.org6a4bef42011-12-22 12:52:41 +0000218
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000219 // Send a Negative acknowledgment packet.
philipel83f831a2016-03-12 03:30:23 -0800220 // TODO(philipel): Deprecate SendNACK and use SendNack instead.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000221 int32_t SendNACK(const uint16_t* nack_list, uint16_t size) override;
stefan@webrtc.org6a4bef42011-12-22 12:52:41 +0000222
philipel83f831a2016-03-12 03:30:23 -0800223 void SendNack(const std::vector<uint16_t>& sequence_numbers) override;
224
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000225 // Store the sent packets, needed to answer to a negative acknowledgment
226 // requests.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000227 void SetStorePacketsStatus(bool enable, uint16_t number_to_store) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000228
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000229 bool StorePackets() const override;
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000230
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000231 // Called on receipt of RTCP report block from remote side.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000232 void RegisterRtcpStatisticsCallback(
233 RtcpStatisticsCallback* callback) override;
234 RtcpStatisticsCallback* GetRtcpStatisticsCallback() override;
sprang@webrtc.orga6ad6e52013-12-05 09:48:44 +0000235
sprang233bd872015-09-08 13:25:16 -0700236 bool SendFeedbackPacket(const rtcp::TransportFeedback& packet) override;
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000237 // (APP) Application specific data.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000238 int32_t SetRTCPApplicationSpecificData(uint8_t sub_type,
239 uint32_t name,
240 const uint8_t* data,
241 uint16_t length) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000242
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000243 // (XR) VOIP metric.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000244 int32_t SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000245
asapersson@webrtc.org7d6bd222013-10-31 12:14:34 +0000246 // (XR) Receiver reference time report.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000247 void SetRtcpXrRrtrStatus(bool enable) override;
asapersson@webrtc.org7d6bd222013-10-31 12:14:34 +0000248
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000249 bool RtcpXrRrtrStatus() const override;
asapersson@webrtc.org8d02f5d2013-11-21 08:57:04 +0000250
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000251 // Audio part.
niklase@google.com470e71d2011-07-07 08:21:25 +0000252
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000253 // Send a TelephoneEvent tone using RFC 2833 (4733).
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000254 int32_t SendTelephoneEventOutband(uint8_t key,
255 uint16_t time_ms,
256 uint8_t level) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000257
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000258 // Store the audio level in d_bov for header-extension-for-audio-level-
259 // indication.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000260 int32_t SetAudioLevel(uint8_t level_d_bov) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000261
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000262 // Video part.
niklase@google.com470e71d2011-07-07 08:21:25 +0000263
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000264 // Set method for requesting a new key frame.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000265 int32_t SetKeyFrameRequestMethod(KeyFrameRequestMethod method) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000266
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000267 // Send a request for a keyframe.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000268 int32_t RequestKeyFrame() override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000269
brandtrf1bb4762016-11-07 03:05:06 -0800270 void SetUlpfecConfig(int red_payload_type, int ulpfec_payload_type) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000271
brandtr1743a192016-11-07 03:36:05 -0800272 bool SetFecParameters(const FecProtectionParams& delta_params,
273 const FecProtectionParams& key_params) override;
niklase@google.com470e71d2011-07-07 08:21:25 +0000274
henrik.lundin@webrtc.org1972ff82014-09-11 06:20:28 +0000275 bool LastReceivedNTP(uint32_t* NTPsecs,
276 uint32_t* NTPfrac,
277 uint32_t* remote_sr) const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000278
danilchap2b616392016-08-18 06:17:42 -0700279 std::vector<rtcp::TmmbItem> BoundingSet(bool* tmmbr_owner);
niklase@google.com470e71d2011-07-07 08:21:25 +0000280
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000281 void BitrateSent(uint32_t* total_rate,
282 uint32_t* video_rate,
283 uint32_t* fec_rate,
284 uint32_t* nackRate) const override;
stefan@webrtc.org07b45a52012-02-02 08:37:48 +0000285
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000286 void RegisterSendChannelRtpStatisticsCallback(
287 StreamDataCountersCallback* callback) override;
288 StreamDataCountersCallback* GetSendChannelRtpStatisticsCallback()
289 const override;
sprang@webrtc.orgebad7652013-12-05 14:29:02 +0000290
danilchap59cb2bd2016-08-29 11:08:47 -0700291 void OnReceivedNack(
292 const std::vector<uint16_t>& nack_sequence_numbers) override;
293 void OnReceivedRtcpReportBlocks(
294 const ReportBlockList& report_blocks) override;
295 void OnRequestSendReport() override;
henrike@webrtc.orgf5da4da2012-02-15 23:54:59 +0000296
sprang5e38c962016-12-01 05:18:09 -0800297 void SetVideoBitrateAllocation(const BitrateAllocation& bitrate) override;
298
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000299 protected:
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000300 bool UpdateRTCPReceiveInformationTimers();
niklase@google.com470e71d2011-07-07 08:21:25 +0000301
nisse14adba72017-03-20 03:52:39 -0700302 RTPSender* rtp_sender() { return rtp_sender_.get(); }
303 const RTPSender* rtp_sender() const { return rtp_sender_.get(); }
nissea33c62e2017-03-14 00:49:45 -0700304
305 RTCPSender* rtcp_sender() { return &rtcp_sender_; }
306 const RTCPSender* rtcp_sender() const { return &rtcp_sender_; }
307
308 RTCPReceiver* rtcp_receiver() { return &rtcp_receiver_; }
309 const RTCPReceiver* rtcp_receiver() const { return &rtcp_receiver_; }
310
311 const Clock* clock() const { return clock_; }
312
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000313 private:
asapersson@webrtc.orge7b1e112013-12-16 14:40:36 +0000314 FRIEND_TEST_ALL_PREFIXES(RtpRtcpImplTest, Rtt);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000315 FRIEND_TEST_ALL_PREFIXES(RtpRtcpImplTest, RttForReceiverOnly);
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000316 int64_t RtcpReportInterval();
stefan@webrtc.org28a331e2013-09-17 07:49:56 +0000317 void SetRtcpReceiverSsrcs(uint32_t main_ssrc);
niklase@google.com470e71d2011-07-07 08:21:25 +0000318
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000319 void set_rtt_ms(int64_t rtt_ms);
320 int64_t rtt_ms() const;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000321
asapersson@webrtc.orgba8138b2014-12-08 13:29:02 +0000322 bool TimeToSendFullNackList(int64_t now) const;
323
nisse14adba72017-03-20 03:52:39 -0700324 std::unique_ptr<RTPSender> rtp_sender_;
nisse150708e2017-03-16 05:02:53 -0700325 RTCPSender rtcp_sender_;
326 RTCPReceiver rtcp_receiver_;
327
328 const Clock* const clock_;
329
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000330 const bool audio_;
sprang168794c2017-07-06 04:38:06 -0700331
332 const RtpKeepAliveConfig keepalive_config_;
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000333 int64_t last_bitrate_process_time_;
334 int64_t last_rtt_process_time_;
sprang168794c2017-07-06 04:38:06 -0700335 int64_t next_process_time_;
336 int64_t next_keepalive_time_;
asapersson@webrtc.org9ffd8fe2015-01-21 08:22:50 +0000337 uint16_t packet_overhead_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000338
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000339 // Send side
asapersson@webrtc.orgba8138b2014-12-08 13:29:02 +0000340 int64_t nack_last_time_sent_full_;
341 uint32_t nack_last_time_sent_full_prev_;
342 uint16_t nack_last_seq_number_sent_;
stefan@webrtc.org9354cc92012-06-07 08:10:14 +0000343
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000344 KeyFrameRequestMethod key_frame_req_method_;
345
346 RemoteBitrateEstimator* remote_bitrate_;
347
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000348 RtcpRttStats* rtt_stats_;
349
bcornell30409b42015-07-10 18:10:05 -0700350 PacketLossStats send_loss_stats_;
351 PacketLossStats receive_loss_stats_;
352
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000353 // The processed RTT from RtcpRttStats.
danilchap7c9426c2016-04-14 03:05:31 -0700354 rtc::CriticalSection critical_section_rtt_;
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000355 int64_t rtt_ms_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000356};
phoglund@webrtc.orgacfdd962013-01-16 10:27:33 +0000357
358} // namespace webrtc
359
360#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_