• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
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 // This sub-API supports the following functionalities:
12 //  - Callbacks for RTP and RTCP events such as modified SSRC or CSRC.
13 //  - SSRC handling.
14 //  - Transmission of RTCP reports.
15 //  - Obtaining RTCP data from incoming RTCP sender reports.
16 //  - RTP and RTCP statistics (jitter, packet loss, RTT etc.).
17 //  - Forward Error Correction (FEC).
18 //  - Writing RTP and RTCP packets to binary files for off‐line analysis of the
19 //    call quality.
20 //  - Inserting extra RTP packets into active audio stream.
21 
22 #ifndef WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_RTP_RTCP_H_
23 #define WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_RTP_RTCP_H_
24 
25 #include "webrtc/common_types.h"
26 
27 namespace webrtc {
28 
29 class VideoEngine;
30 struct ReceiveBandwidthEstimatorStats;
31 
32 // This enumerator sets the RTCP mode.
33 enum ViERTCPMode {
34   kRtcpNone = 0,
35   kRtcpCompound_RFC4585 = 1,
36   kRtcpNonCompound_RFC5506 = 2
37 };
38 
39 // This enumerator describes the key frame request mode.
40 enum ViEKeyFrameRequestMethod {
41   kViEKeyFrameRequestNone = 0,
42   kViEKeyFrameRequestPliRtcp = 1,
43   kViEKeyFrameRequestFirRtp = 2,
44   kViEKeyFrameRequestFirRtcp = 3
45 };
46 
47 enum StreamType {
48   kViEStreamTypeNormal = 0,  // Normal media stream
49   kViEStreamTypeRtx = 1  // Retransmission media stream
50 };
51 
52 // This class declares an abstract interface for a user defined observer. It is
53 // up to the VideoEngine user to implement a derived class which implements the
54 // observer class. The observer is registered using RegisterRTPObserver() and
55 // deregistered using DeregisterRTPObserver().
56 class WEBRTC_DLLEXPORT ViERTPObserver {
57  public:
58   // This method is called if SSRC of the incoming stream is changed.
59   virtual void IncomingSSRCChanged(const int video_channel,
60                                    const unsigned int SSRC) = 0;
61 
62   // This method is called if a field in CSRC changes or if the number of
63   // CSRCs changes.
64   virtual void IncomingCSRCChanged(const int video_channel,
65                                    const unsigned int CSRC,
66                                    const bool added) = 0;
67  protected:
~ViERTPObserver()68   virtual ~ViERTPObserver() {}
69 };
70 
71 // This class declares an abstract interface for a user defined observer. It is
72 // up to the VideoEngine user to implement a derived class which implements the
73 // observer class. The observer is registered using RegisterRTCPObserver() and
74 // deregistered using DeregisterRTCPObserver().
75 
76 class WEBRTC_DLLEXPORT ViERTCPObserver {
77  public:
78   // This method is called if a application-defined RTCP packet has been
79   // received.
80   virtual void OnApplicationDataReceived(
81       const int video_channel,
82       const unsigned char sub_type,
83       const unsigned int name,
84       const char* data,
85       const unsigned short data_length_in_bytes) = 0;
86  protected:
~ViERTCPObserver()87   virtual ~ViERTCPObserver() {}
88 };
89 
90 class WEBRTC_DLLEXPORT ViERTP_RTCP {
91  public:
92   enum { KDefaultDeltaTransmitTimeSeconds = 15 };
93   enum { KMaxRTCPCNameLength = 256 };
94 
95   // Factory for the ViERTP_RTCP sub‐API and increases an internal reference
96   // counter if successful. Returns NULL if the API is not supported or if
97   // construction fails.
98   static ViERTP_RTCP* GetInterface(VideoEngine* video_engine);
99 
100   // Releases the ViERTP_RTCP sub-API and decreases an internal reference
101   // counter. Returns the new reference count. This value should be zero
102   // for all sub-API:s before the VideoEngine object can be safely deleted.
103   virtual int Release() = 0;
104 
105   // This function enables you to specify the RTP synchronization source
106   // identifier (SSRC) explicitly.
107   virtual int SetLocalSSRC(const int video_channel,
108                            const unsigned int SSRC,
109                            const StreamType usage = kViEStreamTypeNormal,
110                            const unsigned char simulcast_idx = 0) = 0;
111 
112   // This function gets the SSRC for the outgoing RTP stream for the specified
113   // channel.
114   virtual int GetLocalSSRC(const int video_channel,
115                            unsigned int& SSRC) const = 0;
116 
117   // This function map a incoming SSRC to a StreamType so that the engine
118   // can know which is the normal stream and which is the RTX
119   virtual int SetRemoteSSRCType(const int video_channel,
120                                 const StreamType usage,
121                                 const unsigned int SSRC) const = 0;
122 
123   // This function gets the SSRC for the incoming RTP stream for the specified
124   // channel.
125   virtual int GetRemoteSSRC(const int video_channel,
126                             unsigned int& SSRC) const = 0;
127 
128   // This function returns the CSRCs of the incoming RTP packets.
129   virtual int GetRemoteCSRCs(const int video_channel,
130                              unsigned int CSRCs[kRtpCsrcSize]) const = 0;
131 
132   // This sets a specific payload type for the RTX stream. Note that this
133   // doesn't enable RTX, SetLocalSSRC must still be called to enable RTX.
134   virtual int SetRtxSendPayloadType(const int video_channel,
135                                     const uint8_t payload_type) = 0;
136 
137   // This enables sending redundant payloads when padding up the bitrate instead
138   // of sending dummy padding packets. This feature is off by default and will
139   // only have an effect if RTX is also enabled.
140   // TODO(holmer): Remove default implementation once this has been implemented
141   // in libjingle.
SetPadWithRedundantPayloads(int video_channel,bool enable)142   virtual int SetPadWithRedundantPayloads(int video_channel, bool enable) {
143     return 0;
144   }
145 
146   virtual int SetRtxReceivePayloadType(const int video_channel,
147                                        const uint8_t payload_type) = 0;
148 
149   // This function enables manual initialization of the sequence number. The
150   // start sequence number is normally a random number.
151   virtual int SetStartSequenceNumber(const int video_channel,
152                                      unsigned short sequence_number) = 0;
153 
154   // This function sets the RTCP status for the specified channel.
155   // Default mode is kRtcpCompound_RFC4585.
156   virtual int SetRTCPStatus(const int video_channel,
157                             const ViERTCPMode rtcp_mode) = 0;
158 
159   // This function gets the RTCP status for the specified channel.
160   virtual int GetRTCPStatus(const int video_channel,
161                             ViERTCPMode& rtcp_mode) const = 0;
162 
163   // This function sets the RTCP canonical name (CNAME) for the RTCP reports
164   // on a specific channel.
165   virtual int SetRTCPCName(const int video_channel,
166                            const char rtcp_cname[KMaxRTCPCNameLength]) = 0;
167 
168   // This function gets the RTCP canonical name (CNAME) for the RTCP reports
169   // sent the specified channel.
170   virtual int GetRTCPCName(const int video_channel,
171                            char rtcp_cname[KMaxRTCPCNameLength]) const = 0;
172 
173   // This function gets the RTCP canonical name (CNAME) for the RTCP reports
174   // received on the specified channel.
175   virtual int GetRemoteRTCPCName(
176       const int video_channel,
177       char rtcp_cname[KMaxRTCPCNameLength]) const = 0;
178 
179   // This function sends an RTCP APP packet on a specific channel.
180   virtual int SendApplicationDefinedRTCPPacket(
181       const int video_channel,
182       const unsigned char sub_type,
183       unsigned int name,
184       const char* data,
185       unsigned short data_length_in_bytes) = 0;
186 
187   // This function enables Negative Acknowledgment (NACK) using RTCP,
188   // implemented based on RFC 4585. NACK retransmits RTP packets if lost on
189   // the network. This creates a lossless transport at the expense of delay.
190   // If using NACK, NACK should be enabled on both endpoints in a call.
191   virtual int SetNACKStatus(const int video_channel, const bool enable) = 0;
192 
193   // This function enables Forward Error Correction (FEC) using RTCP,
194   // implemented based on RFC 5109, to improve packet loss robustness. Extra
195   // FEC packets are sent together with the usual media packets, hence
196   // part of the bitrate will be used for FEC packets.
197   virtual int SetFECStatus(const int video_channel,
198                            const bool enable,
199                            const unsigned char payload_typeRED,
200                            const unsigned char payload_typeFEC) = 0;
201 
202   // This function enables hybrid Negative Acknowledgment using RTCP
203   // and Forward Error Correction (FEC) implemented based on RFC 5109,
204   // to improve packet loss robustness. Extra
205   // FEC packets are sent together with the usual media packets, hence will
206   // part of the bitrate be used for FEC packets.
207   // The hybrid mode will choose between nack only, fec only and both based on
208   // network conditions. When both are applied, only packets that were not
209   // recovered by the FEC will be nacked.
210   virtual int SetHybridNACKFECStatus(const int video_channel,
211                                      const bool enable,
212                                      const unsigned char payload_typeRED,
213                                      const unsigned char payload_typeFEC) = 0;
214 
215   // Sets send side support for delayed video buffering (actual delay will
216   // be exhibited on the receiver side).
217   // Target delay should be set to zero for real-time mode.
218   virtual int SetSenderBufferingMode(int video_channel,
219                                      int target_delay_ms) = 0;
220   // Sets receive side support for delayed video buffering. Target delay should
221   // be set to zero for real-time mode.
222   virtual int SetReceiverBufferingMode(int video_channel,
223                                        int target_delay_ms) = 0;
224 
225   // This function enables RTCP key frame requests.
226   virtual int SetKeyFrameRequestMethod(
227     const int video_channel, const ViEKeyFrameRequestMethod method) = 0;
228 
229   // This function enables signaling of temporary bitrate constraints using
230   // RTCP, implemented based on RFC4585.
231   virtual int SetTMMBRStatus(const int video_channel, const bool enable) = 0;
232 
233   // Enables and disables REMB packets for this channel. |sender| indicates
234   // this channel is encoding, |receiver| tells the bitrate estimate for
235   // this channel should be included in the REMB packet.
236   virtual int SetRembStatus(int video_channel,
237                             bool sender,
238                             bool receiver) = 0;
239 
240   // Enables RTP timestamp extension offset described in RFC 5450. This call
241   // must be done before ViECodec::SetSendCodec is called.
242   virtual int SetSendTimestampOffsetStatus(int video_channel,
243                                            bool enable,
244                                            int id) = 0;
245 
246   virtual int SetReceiveTimestampOffsetStatus(int video_channel,
247                                               bool enable,
248                                               int id) = 0;
249 
250   // Enables RTP absolute send time header extension. This call must be done
251   // before ViECodec::SetSendCodec is called.
252   virtual int SetSendAbsoluteSendTimeStatus(int video_channel,
253                                             bool enable,
254                                             int id) = 0;
255 
256   // When enabled for a channel, *all* channels on the same transport will be
257   // expected to include the absolute send time header extension.
258   virtual int SetReceiveAbsoluteSendTimeStatus(int video_channel,
259                                                bool enable,
260                                                int id) = 0;
261 
262   // Enables/disables RTCP Receiver Reference Time Report Block extension/
263   // DLRR Report Block extension (RFC 3611).
264   // TODO(asapersson): Remove default implementation.
SetRtcpXrRrtrStatus(int video_channel,bool enable)265   virtual int SetRtcpXrRrtrStatus(int video_channel, bool enable) { return -1; }
266 
267   // Enables transmission smoothening, i.e. packets belonging to the same frame
268   // will be sent over a longer period of time instead of sending them
269   // back-to-back.
270   virtual int SetTransmissionSmoothingStatus(int video_channel,
271                                              bool enable) = 0;
272 
273   // Sets a minimal bitrate which will be padded to when the encoder doesn't
274   // produce enough bitrate.
275   // TODO(pbos): Remove default implementation when libjingle's
276   // FakeWebRtcVideoEngine is updated.
SetMinTransmitBitrate(int video_channel,int min_transmit_bitrate_kbps)277   virtual int SetMinTransmitBitrate(int video_channel,
278                                     int min_transmit_bitrate_kbps) {
279     return -1;
280   };
281 
282   // Set a constant amount to deduct from received bitrate estimates before
283   // using it to allocate capacity among outgoing video streams.
SetReservedTransmitBitrate(int video_channel,unsigned int reserved_transmit_bitrate_bps)284   virtual int SetReservedTransmitBitrate(
285       int video_channel, unsigned int reserved_transmit_bitrate_bps) {
286     return 0;
287   }
288 
289   // This function returns our locally created statistics of the received RTP
290   // stream.
291   virtual int GetReceiveChannelRtcpStatistics(const int video_channel,
292                                               RtcpStatistics& basic_stats,
293                                               int& rtt_ms) const = 0;
294 
295   // This function returns statistics reported by the remote client in a RTCP
296   // packet.
297   virtual int GetSendChannelRtcpStatistics(const int video_channel,
298                                            RtcpStatistics& basic_stats,
299                                            int& rtt_ms) const = 0;
300 
301   // TODO(sprang): Temporary hacks to prevent libjingle build from failing,
302   // remove when libjingle has been lifted to support webrtc issue 2589
GetReceivedRTCPStatistics(const int video_channel,unsigned short & fraction_lost,unsigned int & cumulative_lost,unsigned int & extended_max,unsigned int & jitter,int & rtt_ms)303   virtual int GetReceivedRTCPStatistics(const int video_channel,
304                                 unsigned short& fraction_lost,
305                                 unsigned int& cumulative_lost,
306                                 unsigned int& extended_max,
307                                 unsigned int& jitter,
308                                 int& rtt_ms) const {
309     RtcpStatistics stats;
310     int ret_code = GetReceiveChannelRtcpStatistics(video_channel,
311                                              stats,
312                                              rtt_ms);
313     fraction_lost = stats.fraction_lost;
314     cumulative_lost = stats.cumulative_lost;
315     extended_max = stats.extended_max_sequence_number;
316     jitter = stats.jitter;
317     return ret_code;
318   }
GetSentRTCPStatistics(const int video_channel,unsigned short & fraction_lost,unsigned int & cumulative_lost,unsigned int & extended_max,unsigned int & jitter,int & rtt_ms)319   virtual int GetSentRTCPStatistics(const int video_channel,
320                             unsigned short& fraction_lost,
321                             unsigned int& cumulative_lost,
322                             unsigned int& extended_max,
323                             unsigned int& jitter,
324                             int& rtt_ms) const {
325     RtcpStatistics stats;
326     int ret_code = GetSendChannelRtcpStatistics(video_channel,
327                                                 stats,
328                                                 rtt_ms);
329     fraction_lost = stats.fraction_lost;
330     cumulative_lost = stats.cumulative_lost;
331     extended_max = stats.extended_max_sequence_number;
332     jitter = stats.jitter;
333     return ret_code;
334   }
335 
336 
337   virtual int RegisterSendChannelRtcpStatisticsCallback(
338       int video_channel, RtcpStatisticsCallback* callback) = 0;
339 
340   virtual int DeregisterSendChannelRtcpStatisticsCallback(
341       int video_channel, RtcpStatisticsCallback* callback) = 0;
342 
343   virtual int RegisterReceiveChannelRtcpStatisticsCallback(
344       int video_channel, RtcpStatisticsCallback* callback) = 0;
345 
346   virtual int DeregisterReceiveChannelRtcpStatisticsCallback(
347       int video_channel, RtcpStatisticsCallback* callback) = 0;
348 
349   // The function gets statistics from the sent and received RTP streams.
350   virtual int GetRtpStatistics(const int video_channel,
351                                StreamDataCounters& sent,
352                                StreamDataCounters& received) const = 0;
353 
354   // TODO(sprang): Temporary hacks to prevent libjingle build from failing,
355   // remove when libjingle has been lifted to support webrtc issue 2589
GetRTPStatistics(const int video_channel,unsigned int & bytes_sent,unsigned int & packets_sent,unsigned int & bytes_received,unsigned int & packets_received)356   virtual int GetRTPStatistics(const int video_channel,
357                        unsigned int& bytes_sent,
358                        unsigned int& packets_sent,
359                        unsigned int& bytes_received,
360                        unsigned int& packets_received) const {
361     StreamDataCounters sent;
362     StreamDataCounters received;
363     int ret_code = GetRtpStatistics(video_channel, sent, received);
364     bytes_sent = sent.bytes;
365     packets_sent = sent.packets;
366     bytes_received = received.bytes;
367     packets_received = received.packets;
368     return ret_code;
369   }
370 
371   virtual int RegisterSendChannelRtpStatisticsCallback(
372       int video_channel, StreamDataCountersCallback* callback) = 0;
373 
374   virtual int DeregisterSendChannelRtpStatisticsCallback(
375       int video_channel, StreamDataCountersCallback* callback) = 0;
376 
377   virtual int RegisterReceiveChannelRtpStatisticsCallback(
378       int video_channel, StreamDataCountersCallback* callback) = 0;
379 
380   virtual int DeregisterReceiveChannelRtpStatisticsCallback(
381       int video_channel, StreamDataCountersCallback* callback) = 0;
382 
383 
384   // Gets sent and received RTCP packet types.
385   // TODO(asapersson): Remove default implementation.
GetRtcpPacketTypeCounters(int video_channel,RtcpPacketTypeCounter * packets_sent,RtcpPacketTypeCounter * packets_received)386   virtual int GetRtcpPacketTypeCounters(
387       int video_channel,
388       RtcpPacketTypeCounter* packets_sent,
389       RtcpPacketTypeCounter* packets_received) const { return -1; }
390 
391   // The function gets bandwidth usage statistics from the sent RTP streams in
392   // bits/s.
393   virtual int GetBandwidthUsage(const int video_channel,
394                                 unsigned int& total_bitrate_sent,
395                                 unsigned int& video_bitrate_sent,
396                                 unsigned int& fec_bitrate_sent,
397                                 unsigned int& nackBitrateSent) const = 0;
398 
399   // (De)Register an observer, called whenever the send bitrate is updated
400   virtual int RegisterSendBitrateObserver(
401       int video_channel,
402       BitrateStatisticsObserver* observer) = 0;
403 
404   virtual int DeregisterSendBitrateObserver(
405       int video_channel,
406       BitrateStatisticsObserver* observer) = 0;
407 
408   // This function gets the send-side estimated bandwidth available for video,
409   // including overhead, in bits/s.
410   virtual int GetEstimatedSendBandwidth(
411       const int video_channel,
412       unsigned int* estimated_bandwidth) const = 0;
413 
414   // This function gets the receive-side estimated bandwidth available for
415   // video, including overhead, in bits/s. |estimated_bandwidth| is 0 if there
416   // is no valid estimate.
417   virtual int GetEstimatedReceiveBandwidth(
418       const int video_channel,
419       unsigned int* estimated_bandwidth) const = 0;
420 
421   // This function gets the receive-side bandwidth esitmator statistics.
422   // TODO(jiayl): remove the default impl when libjingle's FakeWebRtcVideoEngine
423   // is updated.
GetReceiveBandwidthEstimatorStats(const int video_channel,ReceiveBandwidthEstimatorStats * output)424   virtual int GetReceiveBandwidthEstimatorStats(
425       const int video_channel,
426       ReceiveBandwidthEstimatorStats* output) const { return -1; }
427 
428   // This function gets the PacedSender queuing delay for the last sent frame.
429   // TODO(jiayl): remove the default impl when libjingle is updated.
GetPacerQueuingDelayMs(const int video_channel,int * delay_ms)430   virtual int GetPacerQueuingDelayMs(
431       const int video_channel, int* delay_ms) const {
432     return -1;
433   }
434 
435   // This function enables capturing of RTP packets to a binary file on a
436   // specific channel and for a given direction. The file can later be
437   // replayed using e.g. RTP Tools rtpplay since the binary file format is
438   // compatible with the rtpdump format.
439   virtual int StartRTPDump(const int video_channel,
440                            const char file_nameUTF8[1024],
441                            RTPDirections direction) = 0;
442 
443   // This function disables capturing of RTP packets to a binary file on a
444   // specific channel and for a given direction.
445   virtual int StopRTPDump(const int video_channel,
446                           RTPDirections direction) = 0;
447 
448   // Registers an instance of a user implementation of the ViERTPObserver.
449   virtual int RegisterRTPObserver(const int video_channel,
450                                   ViERTPObserver& observer) = 0;
451 
452   // Removes a registered instance of ViERTPObserver.
453   virtual int DeregisterRTPObserver(const int video_channel) = 0;
454 
455   // Registers an instance of a user implementation of the ViERTCPObserver.
456   virtual int RegisterRTCPObserver(const int video_channel,
457                                    ViERTCPObserver& observer) = 0;
458 
459   // Removes a registered instance of ViERTCPObserver.
460   virtual int DeregisterRTCPObserver(const int video_channel) = 0;
461 
462   // Registers and instance of a user implementation of ViEFrameCountObserver
463   virtual int RegisterSendFrameCountObserver(
464       int video_channel, FrameCountObserver* observer) = 0;
465 
466   // Removes a registered instance of a ViEFrameCountObserver
467   virtual int DeregisterSendFrameCountObserver(
468       int video_channel, FrameCountObserver* observer) = 0;
469 
470  protected:
~ViERTP_RTCP()471   virtual ~ViERTP_RTCP() {}
472 };
473 
474 }  // namespace webrtc
475 
476 #endif  // WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_RTP_RTCP_H_
477