Bug 797671: Import Webrtc.org code from stable branch 3.12 (rev 2820) rs=jesup
[gecko.git] / media / webrtc / trunk / src / modules / rtp_rtcp / source / rtcp_sender.h
blob14719587ce8d6aaa1fe56b7b0ad9aee2e57a471e
1 /*
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.
9 */
11 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
14 #include <map>
16 #include "typedefs.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"
25 namespace webrtc {
27 class ModuleRtpRtcpImpl;
29 class RTCPSender
31 public:
32 RTCPSender(const WebRtc_Word32 id, const bool audio,
33 RtpRtcpClock* clock, ModuleRtpRtcpImpl* owner);
34 virtual ~RTCPSender();
36 void ChangeUniqueId(const WebRtc_Word32 id);
38 WebRtc_Word32 Init();
40 WebRtc_Word32 RegisterSendTransport(Transport* outgoingTransport);
42 RTCPMethod Status() const;
43 WebRtc_Word32 SetRTCPStatus(const RTCPMethod method);
45 bool Sending() const;
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);
82 * REMB
84 bool REMB() const;
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);
93 * TMMBR
95 bool TMMBR() const;
97 WebRtc_Word32 SetTMMBRStatus(const bool enable);
99 WebRtc_Word32 SetTMMBN(const TMMBRSet* boundingSet,
100 const WebRtc_UWord32 maxBitrateKbit);
103 * Extended jitter report
105 bool IJ() const;
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);
127 private:
128 WebRtc_Word32 SendToNetwork(const WebRtc_UWord8* dataBuffer,
129 const WebRtc_UWord16 length);
131 void UpdatePacketRate();
133 WebRtc_Word32 AddReportBlocks(WebRtc_UWord8* rtcpbuffer,
134 WebRtc_UWord32& pos,
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,
141 WebRtc_UWord32& pos,
142 const WebRtc_UWord32 NTPsec,
143 const WebRtc_UWord32 NTPfrac,
144 const RTCPReportBlock* received = NULL);
146 WebRtc_Word32 BuildRR(WebRtc_UWord8* rtcpbuffer,
147 WebRtc_UWord32& pos,
148 const WebRtc_UWord32 NTPsec,
149 const WebRtc_UWord32 NTPfrac,
150 const RTCPReportBlock* received = NULL);
152 WebRtc_Word32 BuildExtendedJitterReport(
153 WebRtc_UWord8* rtcpbuffer,
154 WebRtc_UWord32& pos,
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,
166 WebRtc_UWord32& pos,
167 bool repeat);
168 WebRtc_Word32 BuildSLI(WebRtc_UWord8* rtcpbuffer,
169 WebRtc_UWord32& pos,
170 const WebRtc_UWord8 pictureID);
171 WebRtc_Word32 BuildRPSI(WebRtc_UWord8* rtcpbuffer,
172 WebRtc_UWord32& pos,
173 const WebRtc_UWord64 pictureID,
174 const WebRtc_UWord8 payloadType);
176 WebRtc_Word32 BuildNACK(WebRtc_UWord8* rtcpbuffer,
177 WebRtc_UWord32& pos,
178 const WebRtc_Word32 nackSize,
179 const WebRtc_UWord16* nackList);
181 private:
182 WebRtc_Word32 _id;
183 const bool _audio;
184 RtpRtcpClock& _clock;
185 RTCPMethod _method;
187 ModuleRtpRtcpImpl& _rtpRtcp;
189 CriticalSectionWrapper* _criticalSectionTransport;
190 Transport* _cbTransport;
192 CriticalSectionWrapper* _criticalSectionRTCPSender;
193 bool _usingNack;
194 bool _sending;
195 bool _sendTMMBN;
196 bool _REMB;
197 bool _sendREMB;
198 bool _TMMBR;
199 bool _IJ;
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;
212 // Sent
213 WebRtc_UWord32 _lastSendReport[RTCP_NUMBER_OF_SR]; // allow packet loss and RTT above 1 sec
214 WebRtc_UWord32 _lastRTCPTime[RTCP_NUMBER_OF_SR];
216 // send CSRCs
217 WebRtc_UWord8 _CSRCs;
218 WebRtc_UWord32 _CSRC[kRtpCsrcSize];
219 bool _includeCSRCs;
221 // Full intra request
222 WebRtc_UWord8 _sequenceNumberFIR;
224 // REMB
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;
234 // APP
235 bool _appSend;
236 WebRtc_UWord8 _appSubType;
237 WebRtc_UWord32 _appName;
238 WebRtc_UWord8* _appData;
239 WebRtc_UWord16 _appLength;
241 // XR VoIP metric
242 bool _xrSendVoIPMetric;
243 RTCPVoIPMetric _xrVoIPMetric;
245 } // namespace webrtc
247 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_