diff options
Diffstat (limited to 'webrtc/modules/rtp_rtcp/source/rtcp_packet/voip_metric.cc')
-rw-r--r-- | webrtc/modules/rtp_rtcp/source/rtcp_packet/voip_metric.cc | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/voip_metric.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/voip_metric.cc new file mode 100644 index 0000000000..a79d48e1ca --- /dev/null +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/voip_metric.cc @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2015 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_packet/voip_metric.h" + +#include "webrtc/base/checks.h" +#include "webrtc/modules/rtp_rtcp/source/byte_io.h" + +namespace webrtc { +namespace rtcp { +// VoIP Metrics Report Block (RFC 3611). +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 0 | BT=7 | reserved | block length = 8 | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 4 | SSRC of source | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 8 | loss rate | discard rate | burst density | gap density | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 12 | burst duration | gap duration | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 16 | round trip delay | end system delay | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 20 | signal level | noise level | RERL | Gmin | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 24 | R factor | ext. R factor | MOS-LQ | MOS-CQ | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 28 | RX config | reserved | JB nominal | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// 32 | JB maximum | JB abs max | +// 36 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +VoipMetric::VoipMetric() : ssrc_(0) { + memset(&voip_metric_, 0, sizeof(voip_metric_)); +} + +void VoipMetric::Parse(const uint8_t* buffer) { + RTC_DCHECK(buffer[0] == kBlockType); + // reserved = buffer[1]; + RTC_DCHECK(ByteReader<uint16_t>::ReadBigEndian(&buffer[2]) == kBlockLength); + ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[4]); + voip_metric_.lossRate = buffer[8]; + voip_metric_.discardRate = buffer[9]; + voip_metric_.burstDensity = buffer[10]; + voip_metric_.gapDensity = buffer[11]; + voip_metric_.burstDuration = ByteReader<uint16_t>::ReadBigEndian(&buffer[12]); + voip_metric_.gapDuration = ByteReader<uint16_t>::ReadBigEndian(&buffer[14]); + voip_metric_.roundTripDelay = + ByteReader<uint16_t>::ReadBigEndian(&buffer[16]); + voip_metric_.endSystemDelay = + ByteReader<uint16_t>::ReadBigEndian(&buffer[18]); + voip_metric_.signalLevel = buffer[20]; + voip_metric_.noiseLevel = buffer[21]; + voip_metric_.RERL = buffer[22]; + voip_metric_.Gmin = buffer[23]; + voip_metric_.Rfactor = buffer[24]; + voip_metric_.extRfactor = buffer[25]; + voip_metric_.MOSLQ = buffer[26]; + voip_metric_.MOSCQ = buffer[27]; + voip_metric_.RXconfig = buffer[28]; + // reserved = buffer[29]; + voip_metric_.JBnominal = ByteReader<uint16_t>::ReadBigEndian(&buffer[30]); + voip_metric_.JBmax = ByteReader<uint16_t>::ReadBigEndian(&buffer[32]); + voip_metric_.JBabsMax = ByteReader<uint16_t>::ReadBigEndian(&buffer[34]); +} + +void VoipMetric::Create(uint8_t* buffer) const { + const uint8_t kReserved = 0; + buffer[0] = kBlockType; + buffer[1] = kReserved; + ByteWriter<uint16_t>::WriteBigEndian(&buffer[2], kBlockLength); + ByteWriter<uint32_t>::WriteBigEndian(&buffer[4], ssrc_); + buffer[8] = voip_metric_.lossRate; + buffer[9] = voip_metric_.discardRate; + buffer[10] = voip_metric_.burstDensity; + buffer[11] = voip_metric_.gapDensity; + ByteWriter<uint16_t>::WriteBigEndian(&buffer[12], voip_metric_.burstDuration); + ByteWriter<uint16_t>::WriteBigEndian(&buffer[14], voip_metric_.gapDuration); + ByteWriter<uint16_t>::WriteBigEndian(&buffer[16], + voip_metric_.roundTripDelay); + ByteWriter<uint16_t>::WriteBigEndian(&buffer[18], + voip_metric_.endSystemDelay); + buffer[20] = voip_metric_.signalLevel; + buffer[21] = voip_metric_.noiseLevel; + buffer[22] = voip_metric_.RERL; + buffer[23] = voip_metric_.Gmin; + buffer[24] = voip_metric_.Rfactor; + buffer[25] = voip_metric_.extRfactor; + buffer[26] = voip_metric_.MOSLQ; + buffer[27] = voip_metric_.MOSCQ; + buffer[28] = voip_metric_.RXconfig; + buffer[29] = kReserved; + ByteWriter<uint16_t>::WriteBigEndian(&buffer[30], voip_metric_.JBnominal); + ByteWriter<uint16_t>::WriteBigEndian(&buffer[32], voip_metric_.JBmax); + ByteWriter<uint16_t>::WriteBigEndian(&buffer[34], voip_metric_.JBabsMax); +} + +} // namespace rtcp +} // namespace webrtc |