2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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.
11 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
17 #include "rtcp_utility.h"
18 #include "rtp_utility.h"
19 #include "rtp_rtcp_defines.h"
20 #include "scoped_ptr.h"
21 #include "tmmbr_help.h"
22 #include "modules/remote_bitrate_estimator/include/bwe_defines.h"
23 #include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
27 class ModuleRtpRtcpImpl
;
32 RTCPSender(const WebRtc_Word32 id
, const bool audio
,
33 RtpRtcpClock
* clock
, ModuleRtpRtcpImpl
* owner
);
34 virtual ~RTCPSender();
36 void ChangeUniqueId(const WebRtc_Word32 id
);
40 WebRtc_Word32
RegisterSendTransport(Transport
* outgoingTransport
);
42 RTCPMethod
Status() const;
43 WebRtc_Word32
SetRTCPStatus(const RTCPMethod method
);
46 WebRtc_Word32
SetSendingStatus(const bool enabled
); // combine the functions
48 WebRtc_Word32
SetNackStatus(const bool enable
);
50 void SetSSRC( const WebRtc_UWord32 ssrc
);
52 WebRtc_Word32
SetRemoteSSRC( const WebRtc_UWord32 ssrc
);
54 WebRtc_Word32
SetCameraDelay(const WebRtc_Word32 delayMS
);
56 WebRtc_Word32
CNAME(char cName
[RTCP_CNAME_SIZE
]);
57 WebRtc_Word32
SetCNAME(const char cName
[RTCP_CNAME_SIZE
]);
59 WebRtc_Word32
AddMixedCNAME(const WebRtc_UWord32 SSRC
,
60 const char cName
[RTCP_CNAME_SIZE
]);
62 WebRtc_Word32
RemoveMixedCNAME(const WebRtc_UWord32 SSRC
);
64 WebRtc_UWord32
SendTimeOfSendReport(const WebRtc_UWord32 sendReport
);
66 bool TimeToSendRTCPReport(const bool sendKeyframeBeforeRTP
= false) const;
68 WebRtc_UWord32
LastSendReport(WebRtc_UWord32
& lastRTCPTime
);
70 WebRtc_Word32
SendRTCP(const WebRtc_UWord32 rtcpPacketTypeFlags
,
71 const WebRtc_Word32 nackSize
= 0,
72 const WebRtc_UWord16
* nackList
= 0,
73 const bool repeat
= false,
74 const WebRtc_UWord64 pictureID
= 0);
76 WebRtc_Word32
AddReportBlock(const WebRtc_UWord32 SSRC
,
77 const RTCPReportBlock
* receiveBlock
);
79 WebRtc_Word32
RemoveReportBlock(const WebRtc_UWord32 SSRC
);
86 WebRtc_Word32
SetREMBStatus(const bool enable
);
88 WebRtc_Word32
SetREMBData(const WebRtc_UWord32 bitrate
,
89 const WebRtc_UWord8 numberOfSSRC
,
90 const WebRtc_UWord32
* SSRC
);
97 WebRtc_Word32
SetTMMBRStatus(const bool enable
);
99 WebRtc_Word32
SetTMMBN(const TMMBRSet
* boundingSet
,
100 const WebRtc_UWord32 maxBitrateKbit
);
103 * Extended jitter report
107 WebRtc_Word32
SetIJStatus(const bool enable
);
113 WebRtc_Word32
SetApplicationSpecificData(const WebRtc_UWord8 subType
,
114 const WebRtc_UWord32 name
,
115 const WebRtc_UWord8
* data
,
116 const WebRtc_UWord16 length
);
118 WebRtc_Word32
SetRTCPVoIPMetrics(const RTCPVoIPMetric
* VoIPMetric
);
120 WebRtc_Word32
SetCSRCs(const WebRtc_UWord32 arrOfCSRC
[kRtpCsrcSize
],
121 const WebRtc_UWord8 arrLength
);
123 WebRtc_Word32
SetCSRCStatus(const bool include
);
125 void SetTargetBitrate(unsigned int target_bitrate
);
128 WebRtc_Word32
SendToNetwork(const WebRtc_UWord8
* dataBuffer
,
129 const WebRtc_UWord16 length
);
131 void UpdatePacketRate();
133 WebRtc_Word32
AddReportBlocks(WebRtc_UWord8
* rtcpbuffer
,
135 WebRtc_UWord8
& numberOfReportBlocks
,
136 const RTCPReportBlock
* received
,
137 const WebRtc_UWord32 NTPsec
,
138 const WebRtc_UWord32 NTPfrac
);
140 WebRtc_Word32
BuildSR(WebRtc_UWord8
* rtcpbuffer
,
142 const WebRtc_UWord32 NTPsec
,
143 const WebRtc_UWord32 NTPfrac
,
144 const RTCPReportBlock
* received
= NULL
);
146 WebRtc_Word32
BuildRR(WebRtc_UWord8
* rtcpbuffer
,
148 const WebRtc_UWord32 NTPsec
,
149 const WebRtc_UWord32 NTPfrac
,
150 const RTCPReportBlock
* received
= NULL
);
152 WebRtc_Word32
BuildExtendedJitterReport(
153 WebRtc_UWord8
* rtcpbuffer
,
155 const WebRtc_UWord32 jitterTransmissionTimeOffset
);
157 WebRtc_Word32
BuildSDEC(WebRtc_UWord8
* rtcpbuffer
, WebRtc_UWord32
& pos
);
158 WebRtc_Word32
BuildPLI(WebRtc_UWord8
* rtcpbuffer
, WebRtc_UWord32
& pos
);
159 WebRtc_Word32
BuildREMB(WebRtc_UWord8
* rtcpbuffer
, WebRtc_UWord32
& pos
);
160 WebRtc_Word32
BuildTMMBR(WebRtc_UWord8
* rtcpbuffer
, WebRtc_UWord32
& pos
);
161 WebRtc_Word32
BuildTMMBN(WebRtc_UWord8
* rtcpbuffer
, WebRtc_UWord32
& pos
);
162 WebRtc_Word32
BuildAPP(WebRtc_UWord8
* rtcpbuffer
, WebRtc_UWord32
& pos
);
163 WebRtc_Word32
BuildVoIPMetric(WebRtc_UWord8
* rtcpbuffer
, WebRtc_UWord32
& pos
);
164 WebRtc_Word32
BuildBYE(WebRtc_UWord8
* rtcpbuffer
, WebRtc_UWord32
& pos
);
165 WebRtc_Word32
BuildFIR(WebRtc_UWord8
* rtcpbuffer
,
168 WebRtc_Word32
BuildSLI(WebRtc_UWord8
* rtcpbuffer
,
170 const WebRtc_UWord8 pictureID
);
171 WebRtc_Word32
BuildRPSI(WebRtc_UWord8
* rtcpbuffer
,
173 const WebRtc_UWord64 pictureID
,
174 const WebRtc_UWord8 payloadType
);
176 WebRtc_Word32
BuildNACK(WebRtc_UWord8
* rtcpbuffer
,
178 const WebRtc_Word32 nackSize
,
179 const WebRtc_UWord16
* nackList
);
184 RtpRtcpClock
& _clock
;
187 ModuleRtpRtcpImpl
& _rtpRtcp
;
189 CriticalSectionWrapper
* _criticalSectionTransport
;
190 Transport
* _cbTransport
;
192 CriticalSectionWrapper
* _criticalSectionRTCPSender
;
201 WebRtc_Word64 _nextTimeToSendRTCP
;
203 WebRtc_UWord32 _SSRC
;
204 WebRtc_UWord32 _remoteSSRC
; // SSRC that we receive on our RTP channel
205 char _CNAME
[RTCP_CNAME_SIZE
];
207 std::map
<WebRtc_UWord32
, RTCPReportBlock
*> _reportBlocks
;
208 std::map
<WebRtc_UWord32
, RTCPUtility::RTCPCnameInformation
*> _csrcCNAMEs
;
210 WebRtc_Word32 _cameraDelayMS
;
213 WebRtc_UWord32 _lastSendReport
[RTCP_NUMBER_OF_SR
]; // allow packet loss and RTT above 1 sec
214 WebRtc_UWord32 _lastRTCPTime
[RTCP_NUMBER_OF_SR
];
217 WebRtc_UWord8 _CSRCs
;
218 WebRtc_UWord32 _CSRC
[kRtpCsrcSize
];
221 // Full intra request
222 WebRtc_UWord8 _sequenceNumberFIR
;
225 WebRtc_UWord8 _lengthRembSSRC
;
226 WebRtc_UWord8 _sizeRembSSRC
;
227 WebRtc_UWord32
* _rembSSRC
;
228 WebRtc_UWord32 _rembBitrate
;
230 TMMBRHelp _tmmbrHelp
;
231 WebRtc_UWord32 _tmmbr_Send
;
232 WebRtc_UWord32 _packetOH_Send
;
236 WebRtc_UWord8 _appSubType
;
237 WebRtc_UWord32 _appName
;
238 WebRtc_UWord8
* _appData
;
239 WebRtc_UWord16 _appLength
;
242 bool _xrSendVoIPMetric
;
243 RTCPVoIPMetric _xrVoIPMetric
;
245 } // namespace webrtc
247 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_