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 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_ 12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_ 13 14 #include <list> 15 #include <set> 16 #include <utility> 17 #include <vector> 18 19 #include "webrtc/base/scoped_ptr.h" 20 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" 21 #include "webrtc/modules/rtp_rtcp/source/packet_loss_stats.h" 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" 23 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" 25 #include "webrtc/test/testsupport/gtest_prod_util.h" 26 27 namespace webrtc { 28 29 class ModuleRtpRtcpImpl : public RtpRtcp { 30 public: 31 explicit ModuleRtpRtcpImpl(const RtpRtcp::Configuration& configuration); 32 33 // Returns the number of milliseconds until the module want a worker thread to 34 // call Process. 35 int64_t TimeUntilNextProcess() override; 36 37 // Process any pending tasks such as timeouts. 38 int32_t Process() override; 39 40 // Receiver part. 41 42 // Called when we receive an RTCP packet. 43 int32_t IncomingRtcpPacket(const uint8_t* incoming_packet, 44 size_t incoming_packet_length) override; 45 46 void SetRemoteSSRC(uint32_t ssrc) override; 47 48 // Sender part. 49 50 int32_t RegisterSendPayload(const CodecInst& voice_codec) override; 51 52 int32_t RegisterSendPayload(const VideoCodec& video_codec) override; 53 54 int32_t DeRegisterSendPayload(int8_t payload_type) override; 55 56 int8_t SendPayloadType() const; 57 58 // Register RTP header extension. 59 int32_t RegisterSendRtpHeaderExtension(RTPExtensionType type, 60 uint8_t id) override; 61 62 int32_t DeregisterSendRtpHeaderExtension(RTPExtensionType type) override; 63 64 // Get start timestamp. 65 uint32_t StartTimestamp() const override; 66 67 // Configure start timestamp, default is a random number. 68 void SetStartTimestamp(uint32_t timestamp) override; 69 70 uint16_t SequenceNumber() const override; 71 72 // Set SequenceNumber, default is a random number. 73 void SetSequenceNumber(uint16_t seq) override; 74 75 bool SetRtpStateForSsrc(uint32_t ssrc, const RtpState& rtp_state) override; 76 bool GetRtpStateForSsrc(uint32_t ssrc, RtpState* rtp_state) override; 77 78 uint32_t SSRC() const override; 79 80 // Configure SSRC, default is a random number. 81 void SetSSRC(uint32_t ssrc) override; 82 83 void SetCsrcs(const std::vector<uint32_t>& csrcs) override; 84 85 RTCPSender::FeedbackState GetFeedbackState(); 86 87 int CurrentSendFrequencyHz() const; 88 89 void SetRtxSendStatus(int mode) override; 90 int RtxSendStatus() const override; 91 92 void SetRtxSsrc(uint32_t ssrc) override; 93 94 void SetRtxSendPayloadType(int payload_type, 95 int associated_payload_type) override; 96 std::pair<int, int> RtxSendPayloadType() const override; 97 98 // Sends kRtcpByeCode when going from true to false. 99 int32_t SetSendingStatus(bool sending) override; 100 101 bool Sending() const override; 102 103 // Drops or relays media packets. 104 void SetSendingMediaStatus(bool sending) override; 105 106 bool SendingMedia() const override; 107 108 // Used by the codec module to deliver a video or audio frame for 109 // packetization. 110 int32_t SendOutgoingData(FrameType frame_type, 111 int8_t payload_type, 112 uint32_t time_stamp, 113 int64_t capture_time_ms, 114 const uint8_t* payload_data, 115 size_t payload_size, 116 const RTPFragmentationHeader* fragmentation = NULL, 117 const RTPVideoHeader* rtp_video_hdr = NULL) override; 118 119 bool TimeToSendPacket(uint32_t ssrc, 120 uint16_t sequence_number, 121 int64_t capture_time_ms, 122 bool retransmission) override; 123 124 // Returns the number of padding bytes actually sent, which can be more or 125 // less than |bytes|. 126 size_t TimeToSendPadding(size_t bytes) override; 127 128 // RTCP part. 129 130 // Get RTCP status. 131 RtcpMode RTCP() const override; 132 133 // Configure RTCP status i.e on/off. 134 void SetRTCPStatus(RtcpMode method) override; 135 136 // Set RTCP CName. 137 int32_t SetCNAME(const char* c_name) override; 138 139 // Get remote CName. 140 int32_t RemoteCNAME(uint32_t remote_ssrc, 141 char c_name[RTCP_CNAME_SIZE]) const override; 142 143 // Get remote NTP. 144 int32_t RemoteNTP(uint32_t* received_ntp_secs, 145 uint32_t* received_ntp_frac, 146 uint32_t* rtcp_arrival_time_secs, 147 uint32_t* rtcp_arrival_time_frac, 148 uint32_t* rtcp_timestamp) const override; 149 150 int32_t AddMixedCNAME(uint32_t ssrc, const char* c_name) override; 151 152 int32_t RemoveMixedCNAME(uint32_t ssrc) override; 153 154 // Get RoundTripTime. 155 int32_t RTT(uint32_t remote_ssrc, 156 int64_t* rtt, 157 int64_t* avg_rtt, 158 int64_t* min_rtt, 159 int64_t* max_rtt) const override; 160 161 // Force a send of an RTCP packet. 162 // Normal SR and RR are triggered via the process function. 163 int32_t SendRTCP(RTCPPacketType rtcpPacketType) override; 164 165 int32_t SendCompoundRTCP( 166 const std::set<RTCPPacketType>& rtcpPacketTypes) override; 167 168 // Statistics of the amount of data sent and received. 169 int32_t DataCountersRTP(size_t* bytes_sent, 170 uint32_t* packets_sent) const override; 171 172 void GetSendStreamDataCounters( 173 StreamDataCounters* rtp_counters, 174 StreamDataCounters* rtx_counters) const override; 175 176 void GetRtpPacketLossStats( 177 bool outgoing, 178 uint32_t ssrc, 179 struct RtpPacketLossStats* loss_stats) const override; 180 181 // Get received RTCP report, sender info. 182 int32_t RemoteRTCPStat(RTCPSenderInfo* sender_info) override; 183 184 // Get received RTCP report, report block. 185 int32_t RemoteRTCPStat( 186 std::vector<RTCPReportBlock>* receive_blocks) const override; 187 188 // (REMB) Receiver Estimated Max Bitrate. 189 bool REMB() const override; 190 191 void SetREMBStatus(bool enable) override; 192 193 void SetREMBData(uint32_t bitrate, 194 const std::vector<uint32_t>& ssrcs) override; 195 196 // (TMMBR) Temporary Max Media Bit Rate. 197 bool TMMBR() const override; 198 199 void SetTMMBRStatus(bool enable) override; 200 201 int32_t SetTMMBN(const TMMBRSet* bounding_set); 202 203 uint16_t MaxPayloadLength() const override; 204 205 uint16_t MaxDataPayloadLength() const override; 206 207 int32_t SetMaxTransferUnit(uint16_t size) override; 208 209 int32_t SetTransportOverhead(bool tcp, 210 bool ipv6, 211 uint8_t authentication_overhead = 0) override; 212 213 // (NACK) Negative acknowledgment part. 214 215 int SelectiveRetransmissions() const override; 216 217 int SetSelectiveRetransmissions(uint8_t settings) override; 218 219 // Send a Negative acknowledgment packet. 220 int32_t SendNACK(const uint16_t* nack_list, uint16_t size) override; 221 222 // Store the sent packets, needed to answer to a negative acknowledgment 223 // requests. 224 void SetStorePacketsStatus(bool enable, uint16_t number_to_store) override; 225 226 bool StorePackets() const override; 227 228 // Called on receipt of RTCP report block from remote side. 229 void RegisterRtcpStatisticsCallback( 230 RtcpStatisticsCallback* callback) override; 231 RtcpStatisticsCallback* GetRtcpStatisticsCallback() override; 232 233 bool SendFeedbackPacket(const rtcp::TransportFeedback& packet) override; 234 // (APP) Application specific data. 235 int32_t SetRTCPApplicationSpecificData(uint8_t sub_type, 236 uint32_t name, 237 const uint8_t* data, 238 uint16_t length) override; 239 240 // (XR) VOIP metric. 241 int32_t SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric) override; 242 243 // (XR) Receiver reference time report. 244 void SetRtcpXrRrtrStatus(bool enable) override; 245 246 bool RtcpXrRrtrStatus() const override; 247 248 // Audio part. 249 250 // Set audio packet size, used to determine when it's time to send a DTMF 251 // packet in silence (CNG). 252 int32_t SetAudioPacketSize(uint16_t packet_size_samples) override; 253 254 // Send a TelephoneEvent tone using RFC 2833 (4733). 255 int32_t SendTelephoneEventOutband(uint8_t key, 256 uint16_t time_ms, 257 uint8_t level) override; 258 259 // Set payload type for Redundant Audio Data RFC 2198. 260 int32_t SetSendREDPayloadType(int8_t payload_type) override; 261 262 // Get payload type for Redundant Audio Data RFC 2198. 263 int32_t SendREDPayloadType(int8_t* payload_type) const override; 264 265 // Store the audio level in d_bov for header-extension-for-audio-level- 266 // indication. 267 int32_t SetAudioLevel(uint8_t level_d_bov) override; 268 269 // Video part. 270 271 int32_t SendRTCPSliceLossIndication(uint8_t picture_id) override; 272 273 // Set method for requesting a new key frame. 274 int32_t SetKeyFrameRequestMethod(KeyFrameRequestMethod method) override; 275 276 // Send a request for a keyframe. 277 int32_t RequestKeyFrame() override; 278 279 void SetTargetSendBitrate(uint32_t bitrate_bps) override; 280 281 void SetGenericFECStatus(bool enable, 282 uint8_t payload_type_red, 283 uint8_t payload_type_fec) override; 284 285 void GenericFECStatus(bool* enable, 286 uint8_t* payload_type_red, 287 uint8_t* payload_type_fec) override; 288 289 int32_t SetFecParameters(const FecProtectionParams* delta_params, 290 const FecProtectionParams* key_params) override; 291 292 bool LastReceivedNTP(uint32_t* NTPsecs, 293 uint32_t* NTPfrac, 294 uint32_t* remote_sr) const; 295 296 bool LastReceivedXrReferenceTimeInfo(RtcpReceiveTimeInfo* info) const; 297 298 int32_t BoundingSet(bool* tmmbr_owner, TMMBRSet* bounding_set_rec); 299 300 void BitrateSent(uint32_t* total_rate, 301 uint32_t* video_rate, 302 uint32_t* fec_rate, 303 uint32_t* nackRate) const override; 304 305 int64_t SendTimeOfSendReport(uint32_t send_report); 306 307 bool SendTimeOfXrRrReport(uint32_t mid_ntp, int64_t* time_ms) const; 308 309 // Good state of RTP receiver inform sender. 310 int32_t SendRTCPReferencePictureSelection(uint64_t picture_id) override; 311 312 void RegisterSendChannelRtpStatisticsCallback( 313 StreamDataCountersCallback* callback) override; 314 StreamDataCountersCallback* GetSendChannelRtpStatisticsCallback() 315 const override; 316 317 void OnReceivedTMMBR(); 318 319 // Bad state of RTP receiver request a keyframe. 320 void OnRequestIntraFrame(); 321 322 // Received a request for a new SLI. 323 void OnReceivedSliceLossIndication(uint8_t picture_id); 324 325 // Received a new reference frame. 326 void OnReceivedReferencePictureSelectionIndication(uint64_t picture_id); 327 328 void OnReceivedNACK(const std::list<uint16_t>& nack_sequence_numbers); 329 330 void OnRequestSendReport(); 331 332 protected: 333 bool UpdateRTCPReceiveInformationTimers(); 334 335 uint32_t BitrateReceivedNow() const; 336 337 // Get remote SequenceNumber. 338 uint16_t RemoteSequenceNumber() const; 339 340 RTPSender rtp_sender_; 341 342 RTCPSender rtcp_sender_; 343 RTCPReceiver rtcp_receiver_; 344 345 Clock* clock_; 346 347 private: 348 FRIEND_TEST_ALL_PREFIXES(RtpRtcpImplTest, Rtt); 349 FRIEND_TEST_ALL_PREFIXES(RtpRtcpImplTest, RttForReceiverOnly); 350 int64_t RtcpReportInterval(); 351 void SetRtcpReceiverSsrcs(uint32_t main_ssrc); 352 353 void set_rtt_ms(int64_t rtt_ms); 354 int64_t rtt_ms() const; 355 356 bool TimeToSendFullNackList(int64_t now) const; 357 358 const bool audio_; 359 bool collision_detected_; 360 int64_t last_process_time_; 361 int64_t last_bitrate_process_time_; 362 int64_t last_rtt_process_time_; 363 uint16_t packet_overhead_; 364 365 size_t padding_index_; 366 367 // Send side 368 NACKMethod nack_method_; 369 int64_t nack_last_time_sent_full_; 370 uint32_t nack_last_time_sent_full_prev_; 371 uint16_t nack_last_seq_number_sent_; 372 373 VideoCodec send_video_codec_; 374 KeyFrameRequestMethod key_frame_req_method_; 375 376 RemoteBitrateEstimator* remote_bitrate_; 377 378 RtcpRttStats* rtt_stats_; 379 380 PacketLossStats send_loss_stats_; 381 PacketLossStats receive_loss_stats_; 382 383 // The processed RTT from RtcpRttStats. 384 rtc::scoped_ptr<CriticalSectionWrapper> critical_section_rtt_; 385 int64_t rtt_ms_; 386 }; 387 388 } // namespace webrtc 389 390 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_ 391