| /* |
| * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver_help.h" |
| |
| #include <assert.h> // assert |
| #include <string.h> // memset |
| |
| #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
| #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
| |
| namespace webrtc { |
| namespace RTCPHelp { |
| |
| RTCPPacketInformation::RTCPPacketInformation() |
| : rtcpPacketTypeFlags(0), |
| remoteSSRC(0), |
| nackSequenceNumbers(), |
| rtt(0), |
| sliPictureId(0), |
| rpsiPictureId(0), |
| receiverEstimatedMaxBitrate(0), |
| ntp_secs(0), |
| ntp_frac(0), |
| rtp_timestamp(0), |
| xr_originator_ssrc(0), |
| xr_dlrr_item(false) {} |
| |
| RTCPPacketInformation::~RTCPPacketInformation() {} |
| |
| void RTCPPacketInformation::AddReportInfo( |
| const RTCPReportBlockInformation& report_block_info) { |
| this->rtt = report_block_info.RTT; |
| report_blocks.push_back(report_block_info.remoteReceiveBlock); |
| } |
| |
| RTCPReportBlockInformation::RTCPReportBlockInformation() |
| : remoteReceiveBlock(), |
| remoteMaxJitter(0), |
| RTT(0), |
| minRTT(0), |
| maxRTT(0), |
| avgRTT(0), |
| numAverageCalcs(0) { |
| memset(&remoteReceiveBlock, 0, sizeof(remoteReceiveBlock)); |
| } |
| |
| RTCPReportBlockInformation::~RTCPReportBlockInformation() {} |
| |
| RTCPReceiveInformation::RTCPReceiveInformation() = default; |
| RTCPReceiveInformation::~RTCPReceiveInformation() = default; |
| |
| void RTCPReceiveInformation::InsertTmmbrItem(uint32_t sender_ssrc, |
| const rtcp::TmmbItem& tmmbr_item, |
| int64_t current_time_ms) { |
| TimedTmmbrItem* entry = &tmmbr_[sender_ssrc]; |
| entry->tmmbr_item = rtcp::TmmbItem(sender_ssrc, tmmbr_item.bitrate_bps(), |
| tmmbr_item.packet_overhead()); |
| entry->last_updated_ms = current_time_ms; |
| } |
| |
| void RTCPReceiveInformation::GetTmmbrSet( |
| int64_t current_time_ms, |
| std::vector<rtcp::TmmbItem>* candidates) { |
| // Use audio define since we don't know what interval the remote peer use. |
| int64_t timeouted_ms = current_time_ms - 5 * RTCP_INTERVAL_AUDIO_MS; |
| for (auto it = tmmbr_.begin(); it != tmmbr_.end();) { |
| if (it->second.last_updated_ms < timeouted_ms) { |
| // Erase timeout entries. |
| it = tmmbr_.erase(it); |
| } else { |
| candidates->push_back(it->second.tmmbr_item); |
| ++it; |
| } |
| } |
| } |
| |
| void RTCPReceiveInformation::ClearTmmbr() { |
| tmmbr_.clear(); |
| } |
| |
| } // namespace RTCPHelp |
| } // namespace webrtc |