• 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 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
12 
13 #include <assert.h>
14 #include <string.h>
15 
16 #include "webrtc/common_types.h"
17 #include "webrtc/system_wrappers/interface/logging.h"
18 #include "webrtc/system_wrappers/interface/trace.h"
19 
20 #ifdef _WIN32
21 // Disable warning C4355: 'this' : used in base member initializer list.
22 #pragma warning(disable : 4355)
23 #endif
24 
25 namespace webrtc {
26 
Configuration()27 RtpRtcp::Configuration::Configuration()
28     : id(-1),
29       audio(false),
30       clock(NULL),
31       default_module(NULL),
32       receive_statistics(NullObjectReceiveStatistics()),
33       outgoing_transport(NULL),
34       rtcp_feedback(NULL),
35       intra_frame_callback(NULL),
36       bandwidth_callback(NULL),
37       rtt_stats(NULL),
38       audio_messages(NullObjectRtpAudioFeedback()),
39       remote_bitrate_estimator(NULL),
40       paced_sender(NULL),
41       send_bitrate_observer(NULL),
42       send_frame_count_observer(NULL),
43       send_side_delay_observer(NULL) {
44 }
45 
CreateRtpRtcp(const RtpRtcp::Configuration & configuration)46 RtpRtcp* RtpRtcp::CreateRtpRtcp(const RtpRtcp::Configuration& configuration) {
47   if (configuration.clock) {
48     return new ModuleRtpRtcpImpl(configuration);
49   } else {
50     // No clock implementation provided, use default clock.
51     RtpRtcp::Configuration configuration_copy;
52     memcpy(&configuration_copy, &configuration,
53            sizeof(RtpRtcp::Configuration));
54     configuration_copy.clock = Clock::GetRealTimeClock();
55     return new ModuleRtpRtcpImpl(configuration_copy);
56   }
57 }
58 
ModuleRtpRtcpImpl(const Configuration & configuration)59 ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration)
60     : rtp_sender_(configuration.id,
61                   configuration.audio,
62                   configuration.clock,
63                   configuration.outgoing_transport,
64                   configuration.audio_messages,
65                   configuration.paced_sender,
66                   configuration.send_bitrate_observer,
67                   configuration.send_frame_count_observer,
68                   configuration.send_side_delay_observer),
69       rtcp_sender_(configuration.id,
70                    configuration.audio,
71                    configuration.clock,
72                    configuration.receive_statistics),
73       rtcp_receiver_(configuration.id, configuration.clock, this),
74       clock_(configuration.clock),
75       id_(configuration.id),
76       audio_(configuration.audio),
77       collision_detected_(false),
78       last_process_time_(configuration.clock->TimeInMilliseconds()),
79       last_bitrate_process_time_(configuration.clock->TimeInMilliseconds()),
80       last_rtt_process_time_(configuration.clock->TimeInMilliseconds()),
81       packet_overhead_(28),  // IPV4 UDP.
82       critical_section_module_ptrs_(
83           CriticalSectionWrapper::CreateCriticalSection()),
84       critical_section_module_ptrs_feedback_(
85           CriticalSectionWrapper::CreateCriticalSection()),
86       default_module_(
87           static_cast<ModuleRtpRtcpImpl*>(configuration.default_module)),
88       padding_index_(static_cast<size_t>(-1)),  // Start padding at first child.
89       nack_method_(kNackOff),
90       nack_last_time_sent_full_(0),
91       nack_last_seq_number_sent_(0),
92       simulcast_(false),
93       key_frame_req_method_(kKeyFrameReqFirRtp),
94       remote_bitrate_(configuration.remote_bitrate_estimator),
95       rtt_stats_(configuration.rtt_stats),
96       critical_section_rtt_(CriticalSectionWrapper::CreateCriticalSection()),
97       rtt_ms_(0) {
98   send_video_codec_.codecType = kVideoCodecUnknown;
99 
100   if (default_module_) {
101     default_module_->RegisterChildModule(this);
102   }
103   // TODO(pwestin) move to constructors of each rtp/rtcp sender/receiver object.
104   rtcp_receiver_.RegisterRtcpObservers(configuration.intra_frame_callback,
105                                        configuration.bandwidth_callback,
106                                        configuration.rtcp_feedback);
107   rtcp_sender_.RegisterSendTransport(configuration.outgoing_transport);
108 
109   // Make sure that RTCP objects are aware of our SSRC.
110   uint32_t SSRC = rtp_sender_.SSRC();
111   rtcp_sender_.SetSSRC(SSRC);
112   SetRtcpReceiverSsrcs(SSRC);
113 }
114 
~ModuleRtpRtcpImpl()115 ModuleRtpRtcpImpl::~ModuleRtpRtcpImpl() {
116   // All child modules MUST be deleted before deleting the default.
117   assert(child_modules_.empty());
118 
119   // Deregister for the child modules.
120   // Will go in to the default and remove it self.
121   if (default_module_) {
122     default_module_->DeRegisterChildModule(this);
123   }
124 }
125 
RegisterChildModule(RtpRtcp * module)126 void ModuleRtpRtcpImpl::RegisterChildModule(RtpRtcp* module) {
127   CriticalSectionScoped lock(
128       critical_section_module_ptrs_.get());
129   CriticalSectionScoped double_lock(
130       critical_section_module_ptrs_feedback_.get());
131 
132   // We use two locks for protecting child_modules_, one
133   // (critical_section_module_ptrs_feedback_) for incoming
134   // messages (BitrateSent) and critical_section_module_ptrs_
135   // for all outgoing messages sending packets etc.
136   child_modules_.push_back(static_cast<ModuleRtpRtcpImpl*>(module));
137 }
138 
DeRegisterChildModule(RtpRtcp * remove_module)139 void ModuleRtpRtcpImpl::DeRegisterChildModule(RtpRtcp* remove_module) {
140   CriticalSectionScoped lock(
141       critical_section_module_ptrs_.get());
142   CriticalSectionScoped double_lock(
143       critical_section_module_ptrs_feedback_.get());
144 
145   std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
146   while (it != child_modules_.end()) {
147     RtpRtcp* module = *it;
148     if (module == remove_module) {
149       child_modules_.erase(it);
150       return;
151     }
152     it++;
153   }
154 }
155 
156 // Returns the number of milliseconds until the module want a worker thread
157 // to call Process.
TimeUntilNextProcess()158 int32_t ModuleRtpRtcpImpl::TimeUntilNextProcess() {
159     const int64_t now = clock_->TimeInMilliseconds();
160   return kRtpRtcpMaxIdleTimeProcess - (now - last_process_time_);
161 }
162 
163 // Process any pending tasks such as timeouts (non time critical events).
Process()164 int32_t ModuleRtpRtcpImpl::Process() {
165   const int64_t now = clock_->TimeInMilliseconds();
166   last_process_time_ = now;
167 
168   if (now >= last_bitrate_process_time_ + kRtpRtcpBitrateProcessTimeMs) {
169     rtp_sender_.ProcessBitrate();
170     last_bitrate_process_time_ = now;
171   }
172 
173   if (!IsDefaultModule()) {
174     bool process_rtt = now >= last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs;
175     if (rtcp_sender_.Sending()) {
176       // Process RTT if we have received a receiver report and we haven't
177       // processed RTT for at least |kRtpRtcpRttProcessTimeMs| milliseconds.
178       if (rtcp_receiver_.LastReceivedReceiverReport() >
179           last_rtt_process_time_ && process_rtt) {
180         std::vector<RTCPReportBlock> receive_blocks;
181         rtcp_receiver_.StatisticsReceived(&receive_blocks);
182         uint16_t max_rtt = 0;
183         for (std::vector<RTCPReportBlock>::iterator it = receive_blocks.begin();
184              it != receive_blocks.end(); ++it) {
185           uint16_t rtt = 0;
186           rtcp_receiver_.RTT(it->remoteSSRC, &rtt, NULL, NULL, NULL);
187           max_rtt = (rtt > max_rtt) ? rtt : max_rtt;
188         }
189         // Report the rtt.
190         if (rtt_stats_ && max_rtt != 0)
191           rtt_stats_->OnRttUpdate(max_rtt);
192       }
193 
194       // Verify receiver reports are delivered and the reported sequence number
195       // is increasing.
196       int64_t rtcp_interval = RtcpReportInterval();
197       if (rtcp_receiver_.RtcpRrTimeout(rtcp_interval)) {
198         LOG_F(LS_WARNING) << "Timeout: No RTCP RR received.";
199       } else if (rtcp_receiver_.RtcpRrSequenceNumberTimeout(rtcp_interval)) {
200         LOG_F(LS_WARNING) <<
201             "Timeout: No increase in RTCP RR extended highest sequence number.";
202       }
203 
204       if (remote_bitrate_ && rtcp_sender_.TMMBR()) {
205         unsigned int target_bitrate = 0;
206         std::vector<unsigned int> ssrcs;
207         if (remote_bitrate_->LatestEstimate(&ssrcs, &target_bitrate)) {
208           if (!ssrcs.empty()) {
209             target_bitrate = target_bitrate / ssrcs.size();
210           }
211           rtcp_sender_.SetTargetBitrate(target_bitrate);
212         }
213       }
214     } else {
215       // Report rtt from receiver.
216       if (process_rtt) {
217          uint16_t rtt_ms;
218          if (rtt_stats_ && rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms)) {
219            rtt_stats_->OnRttUpdate(rtt_ms);
220          }
221       }
222     }
223 
224     // Get processed rtt.
225     if (process_rtt) {
226       last_rtt_process_time_ = now;
227       if (rtt_stats_) {
228         set_rtt_ms(rtt_stats_->LastProcessedRtt());
229       }
230     }
231 
232     if (rtcp_sender_.TimeToSendRTCPReport()) {
233       rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
234     }
235   }
236 
237   if (UpdateRTCPReceiveInformationTimers()) {
238     // A receiver has timed out
239     rtcp_receiver_.UpdateTMMBR();
240   }
241   return 0;
242 }
243 
SetRTXSendStatus(int mode)244 void ModuleRtpRtcpImpl::SetRTXSendStatus(int mode) {
245   rtp_sender_.SetRTXStatus(mode);
246 }
247 
RTXSendStatus(int * mode,uint32_t * ssrc,int * payload_type) const248 void ModuleRtpRtcpImpl::RTXSendStatus(int* mode,
249                                       uint32_t* ssrc,
250                                       int* payload_type) const {
251   rtp_sender_.RTXStatus(mode, ssrc, payload_type);
252 }
253 
SetRtxSsrc(uint32_t ssrc)254 void ModuleRtpRtcpImpl::SetRtxSsrc(uint32_t ssrc) {
255   rtp_sender_.SetRtxSsrc(ssrc);
256 }
257 
SetRtxSendPayloadType(int payload_type)258 void ModuleRtpRtcpImpl::SetRtxSendPayloadType(int payload_type) {
259   rtp_sender_.SetRtxPayloadType(payload_type);
260 }
261 
IncomingRtcpPacket(const uint8_t * rtcp_packet,const uint16_t length)262 int32_t ModuleRtpRtcpImpl::IncomingRtcpPacket(
263     const uint8_t* rtcp_packet,
264     const uint16_t length) {
265   // Allow receive of non-compound RTCP packets.
266   RTCPUtility::RTCPParserV2 rtcp_parser(rtcp_packet, length, true);
267 
268   const bool valid_rtcpheader = rtcp_parser.IsValid();
269   if (!valid_rtcpheader) {
270     LOG(LS_WARNING) << "Incoming invalid RTCP packet";
271     return -1;
272   }
273   RTCPHelp::RTCPPacketInformation rtcp_packet_information;
274   int32_t ret_val = rtcp_receiver_.IncomingRTCPPacket(
275       rtcp_packet_information, &rtcp_parser);
276   if (ret_val == 0) {
277     rtcp_receiver_.TriggerCallbacksFromRTCPPacket(rtcp_packet_information);
278   }
279   return ret_val;
280 }
281 
RegisterSendPayload(const CodecInst & voice_codec)282 int32_t ModuleRtpRtcpImpl::RegisterSendPayload(
283     const CodecInst& voice_codec) {
284   return rtp_sender_.RegisterPayload(
285            voice_codec.plname,
286            voice_codec.pltype,
287            voice_codec.plfreq,
288            voice_codec.channels,
289            (voice_codec.rate < 0) ? 0 : voice_codec.rate);
290 }
291 
RegisterSendPayload(const VideoCodec & video_codec)292 int32_t ModuleRtpRtcpImpl::RegisterSendPayload(
293     const VideoCodec& video_codec) {
294   send_video_codec_ = video_codec;
295   {
296     // simulcast_ is accessed when accessing child_modules_, so this write needs
297     // to be protected by the same lock.
298     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
299     simulcast_ = video_codec.numberOfSimulcastStreams > 1;
300   }
301   return rtp_sender_.RegisterPayload(video_codec.plName,
302                                      video_codec.plType,
303                                      90000,
304                                      0,
305                                      video_codec.maxBitrate);
306 }
307 
DeRegisterSendPayload(const int8_t payload_type)308 int32_t ModuleRtpRtcpImpl::DeRegisterSendPayload(
309     const int8_t payload_type) {
310   return rtp_sender_.DeRegisterSendPayload(payload_type);
311 }
312 
SendPayloadType() const313 int8_t ModuleRtpRtcpImpl::SendPayloadType() const {
314   return rtp_sender_.SendPayloadType();
315 }
316 
StartTimestamp() const317 uint32_t ModuleRtpRtcpImpl::StartTimestamp() const {
318   return rtp_sender_.StartTimestamp();
319 }
320 
321 // Configure start timestamp, default is a random number.
SetStartTimestamp(const uint32_t timestamp)322 int32_t ModuleRtpRtcpImpl::SetStartTimestamp(
323     const uint32_t timestamp) {
324   rtcp_sender_.SetStartTimestamp(timestamp);
325   rtp_sender_.SetStartTimestamp(timestamp, true);
326   return 0;  // TODO(pwestin): change to void.
327 }
328 
SequenceNumber() const329 uint16_t ModuleRtpRtcpImpl::SequenceNumber() const {
330   return rtp_sender_.SequenceNumber();
331 }
332 
333 // Set SequenceNumber, default is a random number.
SetSequenceNumber(const uint16_t seq_num)334 int32_t ModuleRtpRtcpImpl::SetSequenceNumber(
335     const uint16_t seq_num) {
336   rtp_sender_.SetSequenceNumber(seq_num);
337   return 0;  // TODO(pwestin): change to void.
338 }
339 
SetRtpStateForSsrc(uint32_t ssrc,const RtpState & rtp_state)340 void ModuleRtpRtcpImpl::SetRtpStateForSsrc(uint32_t ssrc,
341                                            const RtpState& rtp_state) {
342   if (rtp_sender_.SSRC() == ssrc) {
343     rtp_sender_.SetRtpState(rtp_state);
344     return;
345   }
346   if (rtp_sender_.RtxSsrc() == ssrc) {
347     rtp_sender_.SetRtxRtpState(rtp_state);
348     return;
349   }
350 
351   CriticalSectionScoped lock(critical_section_module_ptrs_.get());
352   for (size_t i = 0; i < child_modules_.size(); ++i) {
353     child_modules_[i]->SetRtpStateForSsrc(ssrc, rtp_state);
354   }
355 }
356 
GetRtpStateForSsrc(uint32_t ssrc,RtpState * rtp_state)357 bool ModuleRtpRtcpImpl::GetRtpStateForSsrc(uint32_t ssrc, RtpState* rtp_state) {
358   if (rtp_sender_.SSRC() == ssrc) {
359     *rtp_state = rtp_sender_.GetRtpState();
360     return true;
361   }
362 
363   if (rtp_sender_.RtxSsrc() == ssrc) {
364     *rtp_state = rtp_sender_.GetRtxRtpState();
365     return true;
366   }
367 
368   CriticalSectionScoped lock(critical_section_module_ptrs_.get());
369   for (size_t i = 0; i < child_modules_.size(); ++i) {
370     if (child_modules_[i]->GetRtpStateForSsrc(ssrc, rtp_state))
371       return true;
372   }
373   return false;
374 }
375 
SSRC() const376 uint32_t ModuleRtpRtcpImpl::SSRC() const {
377   return rtp_sender_.SSRC();
378 }
379 
380 // Configure SSRC, default is a random number.
SetSSRC(const uint32_t ssrc)381 void ModuleRtpRtcpImpl::SetSSRC(const uint32_t ssrc) {
382   rtp_sender_.SetSSRC(ssrc);
383   rtcp_sender_.SetSSRC(ssrc);
384   SetRtcpReceiverSsrcs(ssrc);
385 }
386 
SetCSRCStatus(const bool include)387 int32_t ModuleRtpRtcpImpl::SetCSRCStatus(const bool include) {
388   rtcp_sender_.SetCSRCStatus(include);
389   rtp_sender_.SetCSRCStatus(include);
390   return 0;  // TODO(pwestin): change to void.
391 }
392 
CSRCs(uint32_t arr_of_csrc[kRtpCsrcSize]) const393 int32_t ModuleRtpRtcpImpl::CSRCs(
394   uint32_t arr_of_csrc[kRtpCsrcSize]) const {
395   return rtp_sender_.CSRCs(arr_of_csrc);
396 }
397 
SetCSRCs(const uint32_t arr_of_csrc[kRtpCsrcSize],const uint8_t arr_length)398 int32_t ModuleRtpRtcpImpl::SetCSRCs(
399     const uint32_t arr_of_csrc[kRtpCsrcSize],
400     const uint8_t arr_length) {
401   if (IsDefaultModule()) {
402     // For default we need to update all child modules too.
403     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
404 
405     std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
406     while (it != child_modules_.end()) {
407       RtpRtcp* module = *it;
408       if (module) {
409         module->SetCSRCs(arr_of_csrc, arr_length);
410       }
411       it++;
412     }
413   } else {
414     rtcp_sender_.SetCSRCs(arr_of_csrc, arr_length);
415     rtp_sender_.SetCSRCs(arr_of_csrc, arr_length);
416   }
417   return 0;  // TODO(pwestin): change to void.
418 }
419 
420 // TODO(pbos): Handle media and RTX streams separately (separate RTCP
421 // feedbacks).
GetFeedbackState()422 RTCPSender::FeedbackState ModuleRtpRtcpImpl::GetFeedbackState() {
423   StreamDataCounters rtp_stats;
424   StreamDataCounters rtx_stats;
425   rtp_sender_.GetDataCounters(&rtp_stats, &rtx_stats);
426 
427   RTCPSender::FeedbackState state;
428   state.send_payload_type = SendPayloadType();
429   state.frequency_hz = CurrentSendFrequencyHz();
430   state.packets_sent = rtp_stats.packets + rtx_stats.packets;
431   state.media_bytes_sent = rtp_stats.bytes + rtx_stats.bytes;
432   state.module = this;
433 
434   LastReceivedNTP(&state.last_rr_ntp_secs,
435                   &state.last_rr_ntp_frac,
436                   &state.remote_sr);
437 
438   state.has_last_xr_rr = LastReceivedXrReferenceTimeInfo(&state.last_xr_rr);
439 
440   uint32_t tmp;
441   BitrateSent(&state.send_bitrate, &tmp, &tmp, &tmp);
442   return state;
443 }
444 
CurrentSendFrequencyHz() const445 int ModuleRtpRtcpImpl::CurrentSendFrequencyHz() const {
446   return rtp_sender_.SendPayloadFrequency();
447 }
448 
SetSendingStatus(const bool sending)449 int32_t ModuleRtpRtcpImpl::SetSendingStatus(const bool sending) {
450   if (rtcp_sender_.Sending() != sending) {
451     // Sends RTCP BYE when going from true to false
452     if (rtcp_sender_.SetSendingStatus(GetFeedbackState(), sending) != 0) {
453       LOG(LS_WARNING) << "Failed to send RTCP BYE";
454     }
455 
456     collision_detected_ = false;
457 
458     // Generate a new time_stamp if true and not configured via API
459     // Generate a new SSRC for the next "call" if false
460     rtp_sender_.SetSendingStatus(sending);
461     if (sending) {
462       // Make sure the RTCP sender has the same timestamp offset.
463       rtcp_sender_.SetStartTimestamp(rtp_sender_.StartTimestamp());
464     }
465 
466     // Make sure that RTCP objects are aware of our SSRC (it could have changed
467     // Due to collision)
468     uint32_t SSRC = rtp_sender_.SSRC();
469     rtcp_sender_.SetSSRC(SSRC);
470     SetRtcpReceiverSsrcs(SSRC);
471 
472     return 0;
473   }
474   return 0;
475 }
476 
Sending() const477 bool ModuleRtpRtcpImpl::Sending() const {
478   return rtcp_sender_.Sending();
479 }
480 
SetSendingMediaStatus(const bool sending)481 int32_t ModuleRtpRtcpImpl::SetSendingMediaStatus(const bool sending) {
482   rtp_sender_.SetSendingMediaStatus(sending);
483   return 0;
484 }
485 
SendingMedia() const486 bool ModuleRtpRtcpImpl::SendingMedia() const {
487   if (!IsDefaultModule()) {
488     return rtp_sender_.SendingMedia();
489   }
490 
491   CriticalSectionScoped lock(critical_section_module_ptrs_.get());
492   std::vector<ModuleRtpRtcpImpl*>::const_iterator it = child_modules_.begin();
493   while (it != child_modules_.end()) {
494     RTPSender& rtp_sender = (*it)->rtp_sender_;
495     if (rtp_sender.SendingMedia()) {
496       return true;
497     }
498     it++;
499   }
500   return false;
501 }
502 
SendOutgoingData(FrameType frame_type,int8_t payload_type,uint32_t time_stamp,int64_t capture_time_ms,const uint8_t * payload_data,uint32_t payload_size,const RTPFragmentationHeader * fragmentation,const RTPVideoHeader * rtp_video_hdr)503 int32_t ModuleRtpRtcpImpl::SendOutgoingData(
504     FrameType frame_type,
505     int8_t payload_type,
506     uint32_t time_stamp,
507     int64_t capture_time_ms,
508     const uint8_t* payload_data,
509     uint32_t payload_size,
510     const RTPFragmentationHeader* fragmentation,
511     const RTPVideoHeader* rtp_video_hdr) {
512   rtcp_sender_.SetLastRtpTime(time_stamp, capture_time_ms);
513 
514   if (!IsDefaultModule()) {
515     // Don't send RTCP from default module.
516     if (rtcp_sender_.TimeToSendRTCPReport(kVideoFrameKey == frame_type)) {
517       rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
518     }
519     return rtp_sender_.SendOutgoingData(frame_type,
520                                         payload_type,
521                                         time_stamp,
522                                         capture_time_ms,
523                                         payload_data,
524                                         payload_size,
525                                         fragmentation,
526                                         NULL,
527                                         &(rtp_video_hdr->codecHeader));
528   }
529   int32_t ret_val = -1;
530   CriticalSectionScoped lock(critical_section_module_ptrs_.get());
531   if (simulcast_) {
532     if (rtp_video_hdr == NULL) {
533       return -1;
534     }
535     int idx = 0;
536     std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
537     for (; idx < rtp_video_hdr->simulcastIdx; ++it) {
538       if (it == child_modules_.end()) {
539         return -1;
540       }
541       if ((*it)->SendingMedia()) {
542         ++idx;
543       }
544     }
545     for (; it != child_modules_.end(); ++it) {
546       if ((*it)->SendingMedia()) {
547         break;
548       }
549       ++idx;
550     }
551     if (it == child_modules_.end()) {
552       return -1;
553     }
554     return (*it)->SendOutgoingData(frame_type,
555                                    payload_type,
556                                    time_stamp,
557                                    capture_time_ms,
558                                    payload_data,
559                                    payload_size,
560                                    fragmentation,
561                                    rtp_video_hdr);
562   } else {
563     std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
564     // Send to all "child" modules
565     while (it != child_modules_.end()) {
566       if ((*it)->SendingMedia()) {
567         ret_val = (*it)->SendOutgoingData(frame_type,
568                                           payload_type,
569                                           time_stamp,
570                                           capture_time_ms,
571                                           payload_data,
572                                           payload_size,
573                                           fragmentation,
574                                           rtp_video_hdr);
575       }
576       it++;
577     }
578   }
579   return ret_val;
580 }
581 
TimeToSendPacket(uint32_t ssrc,uint16_t sequence_number,int64_t capture_time_ms,bool retransmission)582 bool ModuleRtpRtcpImpl::TimeToSendPacket(uint32_t ssrc,
583                                          uint16_t sequence_number,
584                                          int64_t capture_time_ms,
585                                          bool retransmission) {
586   if (!IsDefaultModule()) {
587     // Don't send from default module.
588     if (SendingMedia() && ssrc == rtp_sender_.SSRC()) {
589       return rtp_sender_.TimeToSendPacket(sequence_number, capture_time_ms,
590                                           retransmission);
591     }
592   } else {
593     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
594     std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
595     while (it != child_modules_.end()) {
596       if ((*it)->SendingMedia() && ssrc == (*it)->rtp_sender_.SSRC()) {
597         return (*it)->rtp_sender_.TimeToSendPacket(sequence_number,
598                                                    capture_time_ms,
599                                                    retransmission);
600       }
601       ++it;
602     }
603   }
604   // No RTP sender is interested in sending this packet.
605   return true;
606 }
607 
TimeToSendPadding(int bytes)608 int ModuleRtpRtcpImpl::TimeToSendPadding(int bytes) {
609   if (!IsDefaultModule()) {
610     // Don't send from default module.
611     return rtp_sender_.TimeToSendPadding(bytes);
612   } else {
613     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
614     for (size_t i = 0; i < child_modules_.size(); ++i) {
615       // Send padding on one of the modules sending media.
616       if (child_modules_[i]->SendingMedia()) {
617         return child_modules_[i]->rtp_sender_.TimeToSendPadding(bytes);
618       }
619     }
620   }
621   return 0;
622 }
623 
GetSendSideDelay(int * avg_send_delay_ms,int * max_send_delay_ms) const624 bool ModuleRtpRtcpImpl::GetSendSideDelay(int* avg_send_delay_ms,
625                                          int* max_send_delay_ms) const {
626   assert(avg_send_delay_ms);
627   assert(max_send_delay_ms);
628 
629   if (IsDefaultModule()) {
630     // This API is only supported for child modules.
631     return false;
632   }
633   return rtp_sender_.GetSendSideDelay(avg_send_delay_ms, max_send_delay_ms);
634 }
635 
MaxPayloadLength() const636 uint16_t ModuleRtpRtcpImpl::MaxPayloadLength() const {
637   return rtp_sender_.MaxPayloadLength();
638 }
639 
MaxDataPayloadLength() const640 uint16_t ModuleRtpRtcpImpl::MaxDataPayloadLength() const {
641   // Assuming IP/UDP.
642   uint16_t min_data_payload_length = IP_PACKET_SIZE - 28;
643 
644   if (IsDefaultModule()) {
645     // For default we need to update all child modules too.
646     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
647     std::vector<ModuleRtpRtcpImpl*>::const_iterator it = child_modules_.begin();
648     while (it != child_modules_.end()) {
649       RtpRtcp* module = *it;
650       if (module) {
651         uint16_t data_payload_length =
652           module->MaxDataPayloadLength();
653         if (data_payload_length < min_data_payload_length) {
654           min_data_payload_length = data_payload_length;
655         }
656       }
657       it++;
658     }
659   }
660 
661   uint16_t data_payload_length = rtp_sender_.MaxDataPayloadLength();
662   if (data_payload_length < min_data_payload_length) {
663     min_data_payload_length = data_payload_length;
664   }
665   return min_data_payload_length;
666 }
667 
SetTransportOverhead(const bool tcp,const bool ipv6,const uint8_t authentication_overhead)668 int32_t ModuleRtpRtcpImpl::SetTransportOverhead(
669     const bool tcp,
670     const bool ipv6,
671     const uint8_t authentication_overhead) {
672   uint16_t packet_overhead = 0;
673   if (ipv6) {
674     packet_overhead = 40;
675   } else {
676     packet_overhead = 20;
677   }
678   if (tcp) {
679     // TCP.
680     packet_overhead += 20;
681   } else {
682     // UDP.
683     packet_overhead += 8;
684   }
685   packet_overhead += authentication_overhead;
686 
687   if (packet_overhead == packet_overhead_) {
688     // Ok same as before.
689     return 0;
690   }
691   // Calc diff.
692   int16_t packet_over_head_diff = packet_overhead - packet_overhead_;
693 
694   // Store new.
695   packet_overhead_ = packet_overhead;
696 
697   uint16_t length =
698       rtp_sender_.MaxPayloadLength() - packet_over_head_diff;
699   return rtp_sender_.SetMaxPayloadLength(length, packet_overhead_);
700 }
701 
SetMaxTransferUnit(const uint16_t mtu)702 int32_t ModuleRtpRtcpImpl::SetMaxTransferUnit(const uint16_t mtu) {
703   if (mtu > IP_PACKET_SIZE) {
704     LOG(LS_ERROR) << "Invalid mtu: " << mtu;
705     return -1;
706   }
707   return rtp_sender_.SetMaxPayloadLength(mtu - packet_overhead_,
708                                          packet_overhead_);
709 }
710 
RTCP() const711 RTCPMethod ModuleRtpRtcpImpl::RTCP() const {
712   if (rtcp_sender_.Status() != kRtcpOff) {
713     return rtcp_receiver_.Status();
714   }
715   return kRtcpOff;
716 }
717 
718 // Configure RTCP status i.e on/off.
SetRTCPStatus(const RTCPMethod method)719 int32_t ModuleRtpRtcpImpl::SetRTCPStatus(const RTCPMethod method) {
720   if (rtcp_sender_.SetRTCPStatus(method) == 0) {
721     return rtcp_receiver_.SetRTCPStatus(method);
722   }
723   return -1;
724 }
725 
726 // Only for internal test.
LastSendReport(uint32_t & last_rtcptime)727 uint32_t ModuleRtpRtcpImpl::LastSendReport(
728     uint32_t& last_rtcptime) {
729   return rtcp_sender_.LastSendReport(last_rtcptime);
730 }
731 
SetCNAME(const char c_name[RTCP_CNAME_SIZE])732 int32_t ModuleRtpRtcpImpl::SetCNAME(const char c_name[RTCP_CNAME_SIZE]) {
733   return rtcp_sender_.SetCNAME(c_name);
734 }
735 
AddMixedCNAME(const uint32_t ssrc,const char c_name[RTCP_CNAME_SIZE])736 int32_t ModuleRtpRtcpImpl::AddMixedCNAME(
737   const uint32_t ssrc,
738   const char c_name[RTCP_CNAME_SIZE]) {
739   return rtcp_sender_.AddMixedCNAME(ssrc, c_name);
740 }
741 
RemoveMixedCNAME(const uint32_t ssrc)742 int32_t ModuleRtpRtcpImpl::RemoveMixedCNAME(const uint32_t ssrc) {
743   return rtcp_sender_.RemoveMixedCNAME(ssrc);
744 }
745 
RemoteCNAME(const uint32_t remote_ssrc,char c_name[RTCP_CNAME_SIZE]) const746 int32_t ModuleRtpRtcpImpl::RemoteCNAME(
747     const uint32_t remote_ssrc,
748     char c_name[RTCP_CNAME_SIZE]) const {
749   return rtcp_receiver_.CNAME(remote_ssrc, c_name);
750 }
751 
RemoteNTP(uint32_t * received_ntpsecs,uint32_t * received_ntpfrac,uint32_t * rtcp_arrival_time_secs,uint32_t * rtcp_arrival_time_frac,uint32_t * rtcp_timestamp) const752 int32_t ModuleRtpRtcpImpl::RemoteNTP(
753     uint32_t* received_ntpsecs,
754     uint32_t* received_ntpfrac,
755     uint32_t* rtcp_arrival_time_secs,
756     uint32_t* rtcp_arrival_time_frac,
757     uint32_t* rtcp_timestamp) const {
758   return rtcp_receiver_.NTP(received_ntpsecs,
759                             received_ntpfrac,
760                             rtcp_arrival_time_secs,
761                             rtcp_arrival_time_frac,
762                             rtcp_timestamp)
763              ? 0
764              : -1;
765 }
766 
767 // Get RoundTripTime.
RTT(const uint32_t remote_ssrc,uint16_t * rtt,uint16_t * avg_rtt,uint16_t * min_rtt,uint16_t * max_rtt) const768 int32_t ModuleRtpRtcpImpl::RTT(const uint32_t remote_ssrc,
769                                uint16_t* rtt,
770                                uint16_t* avg_rtt,
771                                uint16_t* min_rtt,
772                                uint16_t* max_rtt) const {
773   int32_t ret = rtcp_receiver_.RTT(remote_ssrc, rtt, avg_rtt, min_rtt, max_rtt);
774   if (rtt && *rtt == 0) {
775     // Try to get RTT from RtcpRttStats class.
776     *rtt = static_cast<uint16_t>(rtt_ms());
777   }
778   return ret;
779 }
780 
781 // Reset RoundTripTime statistics.
ResetRTT(const uint32_t remote_ssrc)782 int32_t ModuleRtpRtcpImpl::ResetRTT(const uint32_t remote_ssrc) {
783   return rtcp_receiver_.ResetRTT(remote_ssrc);
784 }
785 
786 // Reset RTP data counters for the sending side.
ResetSendDataCountersRTP()787 int32_t ModuleRtpRtcpImpl::ResetSendDataCountersRTP() {
788   rtp_sender_.ResetDataCounters();
789   return 0;  // TODO(pwestin): change to void.
790 }
791 
792 // Force a send of an RTCP packet.
793 // Normal SR and RR are triggered via the process function.
SendRTCP(uint32_t rtcp_packet_type)794 int32_t ModuleRtpRtcpImpl::SendRTCP(uint32_t rtcp_packet_type) {
795   return rtcp_sender_.SendRTCP(GetFeedbackState(), rtcp_packet_type);
796 }
797 
SetRTCPApplicationSpecificData(const uint8_t sub_type,const uint32_t name,const uint8_t * data,const uint16_t length)798 int32_t ModuleRtpRtcpImpl::SetRTCPApplicationSpecificData(
799     const uint8_t sub_type,
800     const uint32_t name,
801     const uint8_t* data,
802     const uint16_t length) {
803   return  rtcp_sender_.SetApplicationSpecificData(sub_type, name, data, length);
804 }
805 
806 // (XR) VOIP metric.
SetRTCPVoIPMetrics(const RTCPVoIPMetric * voip_metric)807 int32_t ModuleRtpRtcpImpl::SetRTCPVoIPMetrics(
808   const RTCPVoIPMetric* voip_metric) {
809   return  rtcp_sender_.SetRTCPVoIPMetrics(voip_metric);
810 }
811 
SetRtcpXrRrtrStatus(bool enable)812 void ModuleRtpRtcpImpl::SetRtcpXrRrtrStatus(bool enable) {
813   return rtcp_sender_.SendRtcpXrReceiverReferenceTime(enable);
814 }
815 
RtcpXrRrtrStatus() const816 bool ModuleRtpRtcpImpl::RtcpXrRrtrStatus() const {
817   return rtcp_sender_.RtcpXrReceiverReferenceTime();
818 }
819 
DataCountersRTP(uint32_t * bytes_sent,uint32_t * packets_sent) const820 int32_t ModuleRtpRtcpImpl::DataCountersRTP(
821     uint32_t* bytes_sent,
822     uint32_t* packets_sent) const {
823   StreamDataCounters rtp_stats;
824   StreamDataCounters rtx_stats;
825   rtp_sender_.GetDataCounters(&rtp_stats, &rtx_stats);
826 
827   if (bytes_sent) {
828     *bytes_sent = rtp_stats.bytes + rtp_stats.padding_bytes +
829                   rtp_stats.header_bytes + rtx_stats.bytes +
830                   rtx_stats.padding_bytes + rtx_stats.header_bytes;
831   }
832   if (packets_sent) {
833     *packets_sent = rtp_stats.packets + rtx_stats.packets;
834   }
835   return 0;
836 }
837 
RemoteRTCPStat(RTCPSenderInfo * sender_info)838 int32_t ModuleRtpRtcpImpl::RemoteRTCPStat(RTCPSenderInfo* sender_info) {
839   return rtcp_receiver_.SenderInfoReceived(sender_info);
840 }
841 
842 // Received RTCP report.
RemoteRTCPStat(std::vector<RTCPReportBlock> * receive_blocks) const843 int32_t ModuleRtpRtcpImpl::RemoteRTCPStat(
844     std::vector<RTCPReportBlock>* receive_blocks) const {
845   return rtcp_receiver_.StatisticsReceived(receive_blocks);
846 }
847 
AddRTCPReportBlock(const uint32_t ssrc,const RTCPReportBlock * report_block)848 int32_t ModuleRtpRtcpImpl::AddRTCPReportBlock(
849     const uint32_t ssrc,
850     const RTCPReportBlock* report_block) {
851   return rtcp_sender_.AddExternalReportBlock(ssrc, report_block);
852 }
853 
RemoveRTCPReportBlock(const uint32_t ssrc)854 int32_t ModuleRtpRtcpImpl::RemoveRTCPReportBlock(
855   const uint32_t ssrc) {
856   return rtcp_sender_.RemoveExternalReportBlock(ssrc);
857 }
858 
GetRtcpPacketTypeCounters(RtcpPacketTypeCounter * packets_sent,RtcpPacketTypeCounter * packets_received) const859 void ModuleRtpRtcpImpl::GetRtcpPacketTypeCounters(
860     RtcpPacketTypeCounter* packets_sent,
861     RtcpPacketTypeCounter* packets_received) const {
862   rtcp_sender_.GetPacketTypeCounter(packets_sent);
863   rtcp_receiver_.GetPacketTypeCounter(packets_received);
864 }
865 
866 // (REMB) Receiver Estimated Max Bitrate.
REMB() const867 bool ModuleRtpRtcpImpl::REMB() const {
868   return rtcp_sender_.REMB();
869 }
870 
SetREMBStatus(const bool enable)871 int32_t ModuleRtpRtcpImpl::SetREMBStatus(const bool enable) {
872   return rtcp_sender_.SetREMBStatus(enable);
873 }
874 
SetREMBData(const uint32_t bitrate,const uint8_t number_of_ssrc,const uint32_t * ssrc)875 int32_t ModuleRtpRtcpImpl::SetREMBData(const uint32_t bitrate,
876                                        const uint8_t number_of_ssrc,
877                                        const uint32_t* ssrc) {
878   return rtcp_sender_.SetREMBData(bitrate, number_of_ssrc, ssrc);
879 }
880 
881 // (IJ) Extended jitter report.
IJ() const882 bool ModuleRtpRtcpImpl::IJ() const {
883   return rtcp_sender_.IJ();
884 }
885 
SetIJStatus(const bool enable)886 int32_t ModuleRtpRtcpImpl::SetIJStatus(const bool enable) {
887   return rtcp_sender_.SetIJStatus(enable);
888 }
889 
RegisterSendRtpHeaderExtension(const RTPExtensionType type,const uint8_t id)890 int32_t ModuleRtpRtcpImpl::RegisterSendRtpHeaderExtension(
891     const RTPExtensionType type,
892     const uint8_t id) {
893   return rtp_sender_.RegisterRtpHeaderExtension(type, id);
894 }
895 
DeregisterSendRtpHeaderExtension(const RTPExtensionType type)896 int32_t ModuleRtpRtcpImpl::DeregisterSendRtpHeaderExtension(
897     const RTPExtensionType type) {
898   return rtp_sender_.DeregisterRtpHeaderExtension(type);
899 }
900 
901 // (TMMBR) Temporary Max Media Bit Rate.
TMMBR() const902 bool ModuleRtpRtcpImpl::TMMBR() const {
903   return rtcp_sender_.TMMBR();
904 }
905 
SetTMMBRStatus(const bool enable)906 int32_t ModuleRtpRtcpImpl::SetTMMBRStatus(const bool enable) {
907   return rtcp_sender_.SetTMMBRStatus(enable);
908 }
909 
SetTMMBN(const TMMBRSet * bounding_set)910 int32_t ModuleRtpRtcpImpl::SetTMMBN(const TMMBRSet* bounding_set) {
911   uint32_t max_bitrate_kbit =
912       rtp_sender_.MaxConfiguredBitrateVideo() / 1000;
913   return rtcp_sender_.SetTMMBN(bounding_set, max_bitrate_kbit);
914 }
915 
916 // Returns the currently configured retransmission mode.
SelectiveRetransmissions() const917 int ModuleRtpRtcpImpl::SelectiveRetransmissions() const {
918   return rtp_sender_.SelectiveRetransmissions();
919 }
920 
921 // Enable or disable a retransmission mode, which decides which packets will
922 // be retransmitted if NACKed.
SetSelectiveRetransmissions(uint8_t settings)923 int ModuleRtpRtcpImpl::SetSelectiveRetransmissions(uint8_t settings) {
924   return rtp_sender_.SetSelectiveRetransmissions(settings);
925 }
926 
927 // Send a Negative acknowledgment packet.
SendNACK(const uint16_t * nack_list,const uint16_t size)928 int32_t ModuleRtpRtcpImpl::SendNACK(const uint16_t* nack_list,
929                                     const uint16_t size) {
930   // Use RTT from RtcpRttStats class if provided.
931   uint16_t rtt = rtt_ms();
932   if (rtt == 0) {
933     rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), NULL, &rtt, NULL, NULL);
934   }
935 
936   int64_t wait_time = 5 + ((rtt * 3) >> 1);  // 5 + RTT * 1.5.
937   if (wait_time == 5) {
938     wait_time = 100;  // During startup we don't have an RTT.
939   }
940   const int64_t now = clock_->TimeInMilliseconds();
941   const int64_t time_limit = now - wait_time;
942   uint16_t nackLength = size;
943   uint16_t start_id = 0;
944 
945   if (nack_last_time_sent_full_ < time_limit) {
946     // Send list. Set the timer to make sure we only send a full NACK list once
947     // within every time_limit.
948     nack_last_time_sent_full_ = now;
949   } else {
950     // Only send if extended list.
951     if (nack_last_seq_number_sent_ == nack_list[size - 1]) {
952       // Last seq num is the same don't send list.
953       return 0;
954     } else {
955       // Send NACKs only for new sequence numbers to avoid re-sending
956       // NACKs for sequences we have already sent.
957       for (int i = 0; i < size; ++i)  {
958         if (nack_last_seq_number_sent_ == nack_list[i]) {
959           start_id = i + 1;
960           break;
961         }
962       }
963       nackLength = size - start_id;
964     }
965   }
966   // Our RTCP NACK implementation is limited to kRtcpMaxNackFields sequence
967   // numbers per RTCP packet.
968   if (nackLength > kRtcpMaxNackFields) {
969     nackLength = kRtcpMaxNackFields;
970   }
971   nack_last_seq_number_sent_ = nack_list[start_id + nackLength - 1];
972 
973   return rtcp_sender_.SendRTCP(
974       GetFeedbackState(), kRtcpNack, nackLength, &nack_list[start_id]);
975 }
976 
977 // Store the sent packets, needed to answer to a Negative acknowledgment
978 // requests.
SetStorePacketsStatus(const bool enable,const uint16_t number_to_store)979 int32_t ModuleRtpRtcpImpl::SetStorePacketsStatus(
980     const bool enable,
981     const uint16_t number_to_store) {
982   rtp_sender_.SetStorePacketsStatus(enable, number_to_store);
983   return 0;  // TODO(pwestin): change to void.
984 }
985 
StorePackets() const986 bool ModuleRtpRtcpImpl::StorePackets() const {
987   return rtp_sender_.StorePackets();
988 }
989 
RegisterSendChannelRtcpStatisticsCallback(RtcpStatisticsCallback * callback)990 void ModuleRtpRtcpImpl::RegisterSendChannelRtcpStatisticsCallback(
991     RtcpStatisticsCallback* callback) {
992   rtcp_receiver_.RegisterRtcpStatisticsCallback(callback);
993 }
994 
995 RtcpStatisticsCallback* ModuleRtpRtcpImpl::
GetSendChannelRtcpStatisticsCallback()996         GetSendChannelRtcpStatisticsCallback() {
997   return rtcp_receiver_.GetRtcpStatisticsCallback();
998 }
999 
1000 // Send a TelephoneEvent tone using RFC 2833 (4733).
SendTelephoneEventOutband(const uint8_t key,const uint16_t time_ms,const uint8_t level)1001 int32_t ModuleRtpRtcpImpl::SendTelephoneEventOutband(
1002     const uint8_t key,
1003     const uint16_t time_ms,
1004     const uint8_t level) {
1005   return rtp_sender_.SendTelephoneEvent(key, time_ms, level);
1006 }
1007 
SendTelephoneEventActive(int8_t & telephone_event) const1008 bool ModuleRtpRtcpImpl::SendTelephoneEventActive(
1009     int8_t& telephone_event) const {
1010   return rtp_sender_.SendTelephoneEventActive(&telephone_event);
1011 }
1012 
1013 // Set audio packet size, used to determine when it's time to send a DTMF
1014 // packet in silence (CNG).
SetAudioPacketSize(const uint16_t packet_size_samples)1015 int32_t ModuleRtpRtcpImpl::SetAudioPacketSize(
1016     const uint16_t packet_size_samples) {
1017   return rtp_sender_.SetAudioPacketSize(packet_size_samples);
1018 }
1019 
SetAudioLevel(const uint8_t level_d_bov)1020 int32_t ModuleRtpRtcpImpl::SetAudioLevel(
1021     const uint8_t level_d_bov) {
1022   return rtp_sender_.SetAudioLevel(level_d_bov);
1023 }
1024 
1025 // Set payload type for Redundant Audio Data RFC 2198.
SetSendREDPayloadType(const int8_t payload_type)1026 int32_t ModuleRtpRtcpImpl::SetSendREDPayloadType(
1027     const int8_t payload_type) {
1028   return rtp_sender_.SetRED(payload_type);
1029 }
1030 
1031 // Get payload type for Redundant Audio Data RFC 2198.
SendREDPayloadType(int8_t & payload_type) const1032 int32_t ModuleRtpRtcpImpl::SendREDPayloadType(
1033     int8_t& payload_type) const {
1034   return rtp_sender_.RED(&payload_type);
1035 }
1036 
SetTargetSendBitrate(const std::vector<uint32_t> & stream_bitrates)1037 void ModuleRtpRtcpImpl::SetTargetSendBitrate(
1038     const std::vector<uint32_t>& stream_bitrates) {
1039   if (IsDefaultModule()) {
1040     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
1041     if (simulcast_) {
1042       std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
1043       for (size_t i = 0;
1044            it != child_modules_.end() && i < stream_bitrates.size(); ++it) {
1045         if ((*it)->SendingMedia()) {
1046           RTPSender& rtp_sender = (*it)->rtp_sender_;
1047           rtp_sender.SetTargetBitrate(stream_bitrates[i]);
1048           ++i;
1049         }
1050       }
1051     } else {
1052       if (stream_bitrates.size() > 1)
1053         return;
1054       std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
1055       for (; it != child_modules_.end(); ++it) {
1056         RTPSender& rtp_sender = (*it)->rtp_sender_;
1057         rtp_sender.SetTargetBitrate(stream_bitrates[0]);
1058       }
1059     }
1060   } else {
1061     if (stream_bitrates.size() > 1)
1062       return;
1063     rtp_sender_.SetTargetBitrate(stream_bitrates[0]);
1064   }
1065 }
1066 
SetKeyFrameRequestMethod(const KeyFrameRequestMethod method)1067 int32_t ModuleRtpRtcpImpl::SetKeyFrameRequestMethod(
1068     const KeyFrameRequestMethod method) {
1069   key_frame_req_method_ = method;
1070   return 0;
1071 }
1072 
RequestKeyFrame()1073 int32_t ModuleRtpRtcpImpl::RequestKeyFrame() {
1074   switch (key_frame_req_method_) {
1075     case kKeyFrameReqFirRtp:
1076       return rtp_sender_.SendRTPIntraRequest();
1077     case kKeyFrameReqPliRtcp:
1078       return SendRTCP(kRtcpPli);
1079     case kKeyFrameReqFirRtcp:
1080       return SendRTCP(kRtcpFir);
1081   }
1082   return -1;
1083 }
1084 
SendRTCPSliceLossIndication(const uint8_t picture_id)1085 int32_t ModuleRtpRtcpImpl::SendRTCPSliceLossIndication(
1086     const uint8_t picture_id) {
1087   return rtcp_sender_.SendRTCP(
1088       GetFeedbackState(), kRtcpSli, 0, 0, false, picture_id);
1089 }
1090 
SetCameraDelay(const int32_t delay_ms)1091 int32_t ModuleRtpRtcpImpl::SetCameraDelay(const int32_t delay_ms) {
1092   if (IsDefaultModule()) {
1093     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
1094     std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
1095     while (it != child_modules_.end()) {
1096       RtpRtcp* module = *it;
1097       if (module) {
1098         module->SetCameraDelay(delay_ms);
1099       }
1100       it++;
1101     }
1102     return 0;
1103   }
1104   return rtcp_sender_.SetCameraDelay(delay_ms);
1105 }
1106 
SetGenericFECStatus(const bool enable,const uint8_t payload_type_red,const uint8_t payload_type_fec)1107 int32_t ModuleRtpRtcpImpl::SetGenericFECStatus(
1108     const bool enable,
1109     const uint8_t payload_type_red,
1110     const uint8_t payload_type_fec) {
1111   return rtp_sender_.SetGenericFECStatus(enable,
1112                                          payload_type_red,
1113                                          payload_type_fec);
1114 }
1115 
GenericFECStatus(bool & enable,uint8_t & payload_type_red,uint8_t & payload_type_fec)1116 int32_t ModuleRtpRtcpImpl::GenericFECStatus(
1117     bool& enable,
1118     uint8_t& payload_type_red,
1119     uint8_t& payload_type_fec) {
1120   bool child_enabled = false;
1121   if (IsDefaultModule()) {
1122     // For default we need to check all child modules too.
1123     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
1124     std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
1125     while (it != child_modules_.end()) {
1126       RtpRtcp* module = *it;
1127       if (module)  {
1128         bool enabled = false;
1129         uint8_t dummy_ptype_red = 0;
1130         uint8_t dummy_ptype_fec = 0;
1131         if (module->GenericFECStatus(enabled,
1132                                      dummy_ptype_red,
1133                                      dummy_ptype_fec) == 0 && enabled) {
1134           child_enabled = true;
1135           break;
1136         }
1137       }
1138       it++;
1139     }
1140   }
1141   int32_t ret_val = rtp_sender_.GenericFECStatus(&enable,
1142                                                  &payload_type_red,
1143                                                  &payload_type_fec);
1144   if (child_enabled) {
1145     // Returns true if enabled for any child module.
1146     enable = child_enabled;
1147   }
1148   return ret_val;
1149 }
1150 
SetFecParameters(const FecProtectionParams * delta_params,const FecProtectionParams * key_params)1151 int32_t ModuleRtpRtcpImpl::SetFecParameters(
1152     const FecProtectionParams* delta_params,
1153     const FecProtectionParams* key_params) {
1154   if (IsDefaultModule())  {
1155     // For default we need to update all child modules too.
1156     CriticalSectionScoped lock(critical_section_module_ptrs_.get());
1157 
1158     std::vector<ModuleRtpRtcpImpl*>::iterator it = child_modules_.begin();
1159     while (it != child_modules_.end()) {
1160       RtpRtcp* module = *it;
1161       if (module) {
1162         module->SetFecParameters(delta_params, key_params);
1163       }
1164       it++;
1165     }
1166     return 0;
1167   }
1168   return rtp_sender_.SetFecParameters(delta_params, key_params);
1169 }
1170 
SetRemoteSSRC(const uint32_t ssrc)1171 void ModuleRtpRtcpImpl::SetRemoteSSRC(const uint32_t ssrc) {
1172   // Inform about the incoming SSRC.
1173   rtcp_sender_.SetRemoteSSRC(ssrc);
1174   rtcp_receiver_.SetRemoteSSRC(ssrc);
1175 
1176   // Check for a SSRC collision.
1177   if (rtp_sender_.SSRC() == ssrc && !collision_detected_) {
1178     // If we detect a collision change the SSRC but only once.
1179     collision_detected_ = true;
1180     uint32_t new_ssrc = rtp_sender_.GenerateNewSSRC();
1181     if (new_ssrc == 0) {
1182       // Configured via API ignore.
1183       return;
1184     }
1185     if (kRtcpOff != rtcp_sender_.Status()) {
1186       // Send RTCP bye on the current SSRC.
1187       SendRTCP(kRtcpBye);
1188     }
1189     // Change local SSRC and inform all objects about the new SSRC.
1190     rtcp_sender_.SetSSRC(new_ssrc);
1191     SetRtcpReceiverSsrcs(new_ssrc);
1192   }
1193 }
1194 
BitrateSent(uint32_t * total_rate,uint32_t * video_rate,uint32_t * fec_rate,uint32_t * nack_rate) const1195 void ModuleRtpRtcpImpl::BitrateSent(uint32_t* total_rate,
1196                                     uint32_t* video_rate,
1197                                     uint32_t* fec_rate,
1198                                     uint32_t* nack_rate) const {
1199   if (IsDefaultModule()) {
1200     // For default we need to update the send bitrate.
1201     CriticalSectionScoped lock(critical_section_module_ptrs_feedback_.get());
1202 
1203     if (total_rate != NULL)
1204       *total_rate = 0;
1205     if (video_rate != NULL)
1206       *video_rate = 0;
1207     if (fec_rate != NULL)
1208       *fec_rate = 0;
1209     if (nack_rate != NULL)
1210       *nack_rate = 0;
1211 
1212     std::vector<ModuleRtpRtcpImpl*>::const_iterator it = child_modules_.begin();
1213     while (it != child_modules_.end()) {
1214       RtpRtcp* module = *it;
1215       if (module) {
1216         uint32_t child_total_rate = 0;
1217         uint32_t child_video_rate = 0;
1218         uint32_t child_fec_rate = 0;
1219         uint32_t child_nack_rate = 0;
1220         module->BitrateSent(&child_total_rate,
1221                             &child_video_rate,
1222                             &child_fec_rate,
1223                             &child_nack_rate);
1224         if (total_rate != NULL && child_total_rate > *total_rate)
1225           *total_rate = child_total_rate;
1226         if (video_rate != NULL && child_video_rate > *video_rate)
1227           *video_rate = child_video_rate;
1228         if (fec_rate != NULL && child_fec_rate > *fec_rate)
1229           *fec_rate = child_fec_rate;
1230         if (nack_rate != NULL && child_nack_rate > *nack_rate)
1231           *nack_rate = child_nack_rate;
1232       }
1233       it++;
1234     }
1235     return;
1236   }
1237   if (total_rate != NULL)
1238     *total_rate = rtp_sender_.BitrateSent();
1239   if (video_rate != NULL)
1240     *video_rate = rtp_sender_.VideoBitrateSent();
1241   if (fec_rate != NULL)
1242     *fec_rate = rtp_sender_.FecOverheadRate();
1243   if (nack_rate != NULL)
1244     *nack_rate = rtp_sender_.NackOverheadRate();
1245 }
1246 
OnRequestIntraFrame()1247 void ModuleRtpRtcpImpl::OnRequestIntraFrame() {
1248   RequestKeyFrame();
1249 }
1250 
OnRequestSendReport()1251 void ModuleRtpRtcpImpl::OnRequestSendReport() {
1252   SendRTCP(kRtcpSr);
1253 }
1254 
SendRTCPReferencePictureSelection(const uint64_t picture_id)1255 int32_t ModuleRtpRtcpImpl::SendRTCPReferencePictureSelection(
1256     const uint64_t picture_id) {
1257   return rtcp_sender_.SendRTCP(
1258       GetFeedbackState(), kRtcpRpsi, 0, 0, false, picture_id);
1259 }
1260 
SendTimeOfSendReport(const uint32_t send_report)1261 uint32_t ModuleRtpRtcpImpl::SendTimeOfSendReport(
1262     const uint32_t send_report) {
1263   return rtcp_sender_.SendTimeOfSendReport(send_report);
1264 }
1265 
SendTimeOfXrRrReport(uint32_t mid_ntp,int64_t * time_ms) const1266 bool ModuleRtpRtcpImpl::SendTimeOfXrRrReport(
1267     uint32_t mid_ntp, int64_t* time_ms) const {
1268   return rtcp_sender_.SendTimeOfXrRrReport(mid_ntp, time_ms);
1269 }
1270 
OnReceivedNACK(const std::list<uint16_t> & nack_sequence_numbers)1271 void ModuleRtpRtcpImpl::OnReceivedNACK(
1272     const std::list<uint16_t>& nack_sequence_numbers) {
1273   if (!rtp_sender_.StorePackets() ||
1274       nack_sequence_numbers.size() == 0) {
1275     return;
1276   }
1277   // Use RTT from RtcpRttStats class if provided.
1278   uint16_t rtt = rtt_ms();
1279   if (rtt == 0) {
1280     rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), NULL, &rtt, NULL, NULL);
1281   }
1282   rtp_sender_.OnReceivedNACK(nack_sequence_numbers, rtt);
1283 }
1284 
LastReceivedNTP(uint32_t * rtcp_arrival_time_secs,uint32_t * rtcp_arrival_time_frac,uint32_t * remote_sr) const1285 bool ModuleRtpRtcpImpl::LastReceivedNTP(
1286     uint32_t* rtcp_arrival_time_secs,  // When we got the last report.
1287     uint32_t* rtcp_arrival_time_frac,
1288     uint32_t* remote_sr) const {
1289   // Remote SR: NTP inside the last received (mid 16 bits from sec and frac).
1290   uint32_t ntp_secs = 0;
1291   uint32_t ntp_frac = 0;
1292 
1293   if (!rtcp_receiver_.NTP(&ntp_secs,
1294                           &ntp_frac,
1295                           rtcp_arrival_time_secs,
1296                           rtcp_arrival_time_frac,
1297                           NULL)) {
1298     return false;
1299   }
1300   *remote_sr =
1301       ((ntp_secs & 0x0000ffff) << 16) + ((ntp_frac & 0xffff0000) >> 16);
1302   return true;
1303 }
1304 
LastReceivedXrReferenceTimeInfo(RtcpReceiveTimeInfo * info) const1305 bool ModuleRtpRtcpImpl::LastReceivedXrReferenceTimeInfo(
1306     RtcpReceiveTimeInfo* info) const {
1307   return rtcp_receiver_.LastReceivedXrReferenceTimeInfo(info);
1308 }
1309 
UpdateRTCPReceiveInformationTimers()1310 bool ModuleRtpRtcpImpl::UpdateRTCPReceiveInformationTimers() {
1311   // If this returns true this channel has timed out.
1312   // Periodically check if this is true and if so call UpdateTMMBR.
1313   return rtcp_receiver_.UpdateRTCPReceiveInformationTimers();
1314 }
1315 
1316 // Called from RTCPsender.
BoundingSet(bool & tmmbr_owner,TMMBRSet * & bounding_set)1317 int32_t ModuleRtpRtcpImpl::BoundingSet(bool& tmmbr_owner,
1318                                        TMMBRSet*& bounding_set) {
1319   return rtcp_receiver_.BoundingSet(tmmbr_owner, bounding_set);
1320 }
1321 
RtcpReportInterval()1322 int64_t ModuleRtpRtcpImpl::RtcpReportInterval() {
1323   if (audio_)
1324     return RTCP_INTERVAL_AUDIO_MS;
1325   else
1326     return RTCP_INTERVAL_VIDEO_MS;
1327 }
1328 
SetRtcpReceiverSsrcs(uint32_t main_ssrc)1329 void ModuleRtpRtcpImpl::SetRtcpReceiverSsrcs(uint32_t main_ssrc) {
1330   std::set<uint32_t> ssrcs;
1331   ssrcs.insert(main_ssrc);
1332   int rtx_mode = kRtxOff;
1333   uint32_t rtx_ssrc = 0;
1334   int rtx_payload_type = 0;
1335   rtp_sender_.RTXStatus(&rtx_mode, &rtx_ssrc, &rtx_payload_type);
1336   if (rtx_mode != kRtxOff)
1337     ssrcs.insert(rtx_ssrc);
1338   rtcp_receiver_.SetSsrcs(main_ssrc, ssrcs);
1339 }
1340 
set_rtt_ms(uint32_t rtt_ms)1341 void ModuleRtpRtcpImpl::set_rtt_ms(uint32_t rtt_ms) {
1342   CriticalSectionScoped cs(critical_section_rtt_.get());
1343   rtt_ms_ = rtt_ms;
1344 }
1345 
rtt_ms() const1346 uint32_t ModuleRtpRtcpImpl::rtt_ms() const {
1347   CriticalSectionScoped cs(critical_section_rtt_.get());
1348   return rtt_ms_;
1349 }
1350 
RegisterSendChannelRtpStatisticsCallback(StreamDataCountersCallback * callback)1351 void ModuleRtpRtcpImpl::RegisterSendChannelRtpStatisticsCallback(
1352     StreamDataCountersCallback* callback) {
1353   rtp_sender_.RegisterRtpStatisticsCallback(callback);
1354 }
1355 
1356 StreamDataCountersCallback*
GetSendChannelRtpStatisticsCallback() const1357     ModuleRtpRtcpImpl::GetSendChannelRtpStatisticsCallback() const {
1358   return rtp_sender_.GetRtpStatisticsCallback();
1359 }
1360 
IsDefaultModule() const1361 bool ModuleRtpRtcpImpl::IsDefaultModule() const {
1362   CriticalSectionScoped cs(critical_section_module_ptrs_.get());
1363   return !child_modules_.empty();
1364 }
1365 
1366 }  // Namespace webrtc
1367