OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 // StatisticsUpdated calls are triggered from threads in the RTP module, | 326 // StatisticsUpdated calls are triggered from threads in the RTP module, |
327 // while GetStats calls can be triggered from the public voice engine API, | 327 // while GetStats calls can be triggered from the public voice engine API, |
328 // hence synchronization is needed. | 328 // hence synchronization is needed. |
329 rtc::CriticalSection stats_lock_; | 329 rtc::CriticalSection stats_lock_; |
330 const uint32_t ssrc_; | 330 const uint32_t ssrc_; |
331 ChannelStatistics stats_; | 331 ChannelStatistics stats_; |
332 }; | 332 }; |
333 | 333 |
334 class VoERtcpObserver : public RtcpBandwidthObserver { | 334 class VoERtcpObserver : public RtcpBandwidthObserver { |
335 public: | 335 public: |
336 explicit VoERtcpObserver(Channel* owner) : owner_(owner) {} | 336 explicit VoERtcpObserver(Channel* owner) |
| 337 : owner_(owner), bandwidth_observer_(nullptr) {} |
337 virtual ~VoERtcpObserver() {} | 338 virtual ~VoERtcpObserver() {} |
338 | 339 |
| 340 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) { |
| 341 rtc::CritScope lock(&crit_); |
| 342 bandwidth_observer_ = bandwidth_observer; |
| 343 } |
| 344 |
339 void OnReceivedEstimatedBitrate(uint32_t bitrate) override { | 345 void OnReceivedEstimatedBitrate(uint32_t bitrate) override { |
340 // Not used for Voice Engine. | 346 rtc::CritScope lock(&crit_); |
| 347 if (bandwidth_observer_) { |
| 348 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate); |
| 349 } |
341 } | 350 } |
342 | 351 |
343 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks, | 352 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks, |
344 int64_t rtt, | 353 int64_t rtt, |
345 int64_t now_ms) override { | 354 int64_t now_ms) override { |
| 355 { |
| 356 rtc::CritScope lock(&crit_); |
| 357 if (bandwidth_observer_) { |
| 358 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt, |
| 359 now_ms); |
| 360 } |
| 361 } |
346 // TODO(mflodman): Do we need to aggregate reports here or can we jut send | 362 // TODO(mflodman): Do we need to aggregate reports here or can we jut send |
347 // what we get? I.e. do we ever get multiple reports bundled into one RTCP | 363 // what we get? I.e. do we ever get multiple reports bundled into one RTCP |
348 // report for VoiceEngine? | 364 // report for VoiceEngine? |
349 if (report_blocks.empty()) | 365 if (report_blocks.empty()) |
350 return; | 366 return; |
351 | 367 |
352 int fraction_lost_aggregate = 0; | 368 int fraction_lost_aggregate = 0; |
353 int total_number_of_packets = 0; | 369 int total_number_of_packets = 0; |
354 | 370 |
355 // If receiving multiple report blocks, calculate the weighted average based | 371 // If receiving multiple report blocks, calculate the weighted average based |
(...skipping 21 matching lines...) Expand all Loading... |
377 (fraction_lost_aggregate + total_number_of_packets / 2) / | 393 (fraction_lost_aggregate + total_number_of_packets / 2) / |
378 total_number_of_packets; | 394 total_number_of_packets; |
379 } | 395 } |
380 owner_->OnIncomingFractionLoss(weighted_fraction_lost); | 396 owner_->OnIncomingFractionLoss(weighted_fraction_lost); |
381 } | 397 } |
382 | 398 |
383 private: | 399 private: |
384 Channel* owner_; | 400 Channel* owner_; |
385 // Maps remote side ssrc to extended highest sequence number received. | 401 // Maps remote side ssrc to extended highest sequence number received. |
386 std::map<uint32_t, uint32_t> extended_max_sequence_number_; | 402 std::map<uint32_t, uint32_t> extended_max_sequence_number_; |
| 403 rtc::CriticalSection crit_; |
| 404 RtcpBandwidthObserver* bandwidth_observer_ GUARDED_BY(crit_); |
387 }; | 405 }; |
388 | 406 |
389 int32_t Channel::SendData(FrameType frameType, | 407 int32_t Channel::SendData(FrameType frameType, |
390 uint8_t payloadType, | 408 uint8_t payloadType, |
391 uint32_t timeStamp, | 409 uint32_t timeStamp, |
392 const uint8_t* payloadData, | 410 const uint8_t* payloadData, |
393 size_t payloadSize, | 411 size_t payloadSize, |
394 const RTPFragmentationHeader* fragmentation) { | 412 const RTPFragmentationHeader* fragmentation) { |
395 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId), | 413 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId), |
396 "Channel::SendData(frameType=%u, payloadType=%u, timeStamp=%u," | 414 "Channel::SendData(frameType=%u, payloadType=%u, timeStamp=%u," |
(...skipping 2020 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2417 rtp_header_parser_->DeregisterRtpHeaderExtension( | 2435 rtp_header_parser_->DeregisterRtpHeaderExtension( |
2418 kRtpExtensionTransportSequenceNumber); | 2436 kRtpExtensionTransportSequenceNumber); |
2419 bool ret = rtp_header_parser_->RegisterRtpHeaderExtension( | 2437 bool ret = rtp_header_parser_->RegisterRtpHeaderExtension( |
2420 kRtpExtensionTransportSequenceNumber, id); | 2438 kRtpExtensionTransportSequenceNumber, id); |
2421 RTC_DCHECK(ret); | 2439 RTC_DCHECK(ret); |
2422 } | 2440 } |
2423 | 2441 |
2424 void Channel::RegisterSenderCongestionControlObjects( | 2442 void Channel::RegisterSenderCongestionControlObjects( |
2425 RtpPacketSender* rtp_packet_sender, | 2443 RtpPacketSender* rtp_packet_sender, |
2426 TransportFeedbackObserver* transport_feedback_observer, | 2444 TransportFeedbackObserver* transport_feedback_observer, |
2427 PacketRouter* packet_router) { | 2445 PacketRouter* packet_router, |
| 2446 RtcpBandwidthObserver* bandwidth_observer) { |
2428 RTC_DCHECK(rtp_packet_sender); | 2447 RTC_DCHECK(rtp_packet_sender); |
2429 RTC_DCHECK(transport_feedback_observer); | 2448 RTC_DCHECK(transport_feedback_observer); |
2430 RTC_DCHECK(packet_router && !packet_router_); | 2449 RTC_DCHECK(packet_router && !packet_router_); |
| 2450 rtcp_observer_->SetBandwidthObserver(bandwidth_observer); |
2431 feedback_observer_proxy_->SetTransportFeedbackObserver( | 2451 feedback_observer_proxy_->SetTransportFeedbackObserver( |
2432 transport_feedback_observer); | 2452 transport_feedback_observer); |
2433 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router); | 2453 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router); |
2434 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender); | 2454 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender); |
2435 _rtpRtcpModule->SetStorePacketsStatus(true, 600); | 2455 _rtpRtcpModule->SetStorePacketsStatus(true, 600); |
2436 packet_router->AddRtpModule(_rtpRtcpModule.get()); | 2456 packet_router->AddRtpModule(_rtpRtcpModule.get()); |
2437 packet_router_ = packet_router; | 2457 packet_router_ = packet_router; |
2438 } | 2458 } |
2439 | 2459 |
2440 void Channel::RegisterReceiverCongestionControlObjects( | 2460 void Channel::RegisterReceiverCongestionControlObjects( |
2441 PacketRouter* packet_router) { | 2461 PacketRouter* packet_router) { |
2442 RTC_DCHECK(packet_router && !packet_router_); | 2462 RTC_DCHECK(packet_router && !packet_router_); |
2443 packet_router->AddRtpModule(_rtpRtcpModule.get()); | 2463 packet_router->AddRtpModule(_rtpRtcpModule.get()); |
2444 packet_router_ = packet_router; | 2464 packet_router_ = packet_router; |
2445 } | 2465 } |
2446 | 2466 |
2447 void Channel::ResetCongestionControlObjects() { | 2467 void Channel::ResetCongestionControlObjects() { |
2448 RTC_DCHECK(packet_router_); | 2468 RTC_DCHECK(packet_router_); |
2449 _rtpRtcpModule->SetStorePacketsStatus(false, 600); | 2469 _rtpRtcpModule->SetStorePacketsStatus(false, 600); |
| 2470 rtcp_observer_->SetBandwidthObserver(nullptr); |
2450 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr); | 2471 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr); |
2451 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr); | 2472 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr); |
2452 packet_router_->RemoveRtpModule(_rtpRtcpModule.get()); | 2473 packet_router_->RemoveRtpModule(_rtpRtcpModule.get()); |
2453 packet_router_ = nullptr; | 2474 packet_router_ = nullptr; |
2454 rtp_packet_sender_proxy_->SetPacketSender(nullptr); | 2475 rtp_packet_sender_proxy_->SetPacketSender(nullptr); |
2455 } | 2476 } |
2456 | 2477 |
2457 void Channel::SetRTCPStatus(bool enable) { | 2478 void Channel::SetRTCPStatus(bool enable) { |
2458 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 2479 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
2459 "Channel::SetRTCPStatus()"); | 2480 "Channel::SetRTCPStatus()"); |
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3303 int64_t min_rtt = 0; | 3324 int64_t min_rtt = 0; |
3304 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != | 3325 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != |
3305 0) { | 3326 0) { |
3306 return 0; | 3327 return 0; |
3307 } | 3328 } |
3308 return rtt; | 3329 return rtt; |
3309 } | 3330 } |
3310 | 3331 |
3311 } // namespace voe | 3332 } // namespace voe |
3312 } // namespace webrtc | 3333 } // namespace webrtc |
OLD | NEW |