OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright (c) 2015 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/rtcp_packet/voip_metric.h" | |
12 | |
13 #include "webrtc/base/checks.h" | |
14 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | |
15 | |
16 namespace webrtc { | |
17 namespace rtcp { | |
18 // VoIP Metrics Report Block (RFC 3611). | |
19 // | |
20 // 0 1 2 3 | |
21 // 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 | |
22 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
23 // 0 | BT=7 | reserved | block length = 8 | | |
24 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
25 // 4 | SSRC of source | | |
26 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
27 // 8 | loss rate | discard rate | burst density | gap density | | |
28 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
29 // 12 | burst duration | gap duration | | |
30 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
31 // 16 | round trip delay | end system delay | | |
32 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
33 // 20 | signal level | noise level | RERL | Gmin | | |
34 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
35 // 24 | R factor | ext. R factor | MOS-LQ | MOS-CQ | | |
36 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
37 // 28 | RX config | reserved | JB nominal | | |
38 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
39 // 32 | JB maximum | JB abs max | | |
40 // 36 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
41 VoipMetric::VoipMetric() : ssrc_(0) { | |
42 memset(&voip_metric_, 0, sizeof(voip_metric_)); | |
åsapersson
2015/12/14 10:53:45
is memset needed?
danilchap
2015/12/14 12:21:31
struct RTCPVoIPMetric (voip_metric_) doesn't have
| |
43 } | |
44 | |
45 void VoipMetric::Parse(const uint8_t* buffer) { | |
46 RTC_DCHECK(buffer[0] == kBlockType); | |
47 // reserved = buffer[1]; | |
48 RTC_DCHECK(ByteReader<uint16_t>::ReadBigEndian(&buffer[2]) == kBlockLength); | |
49 ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[4]); | |
50 voip_metric_.lossRate = buffer[8]; | |
51 voip_metric_.discardRate = buffer[9]; | |
52 voip_metric_.burstDensity = buffer[10]; | |
53 voip_metric_.gapDensity = buffer[11]; | |
54 voip_metric_.burstDuration = ByteReader<uint16_t>::ReadBigEndian(&buffer[12]); | |
55 voip_metric_.gapDuration = ByteReader<uint16_t>::ReadBigEndian(&buffer[14]); | |
56 voip_metric_.roundTripDelay = | |
57 ByteReader<uint16_t>::ReadBigEndian(&buffer[16]); | |
58 voip_metric_.endSystemDelay = | |
59 ByteReader<uint16_t>::ReadBigEndian(&buffer[18]); | |
60 voip_metric_.signalLevel = buffer[20]; | |
61 voip_metric_.noiseLevel = buffer[21]; | |
62 voip_metric_.RERL = buffer[22]; | |
63 voip_metric_.Gmin = buffer[23]; | |
64 voip_metric_.Rfactor = buffer[24]; | |
65 voip_metric_.extRfactor = buffer[25]; | |
66 voip_metric_.MOSLQ = buffer[26]; | |
67 voip_metric_.MOSCQ = buffer[27]; | |
68 voip_metric_.RXconfig = buffer[28]; | |
69 // reserved = buffer[29]; | |
70 voip_metric_.JBnominal = ByteReader<uint16_t>::ReadBigEndian(&buffer[30]); | |
71 voip_metric_.JBmax = ByteReader<uint16_t>::ReadBigEndian(&buffer[32]); | |
72 voip_metric_.JBabsMax = ByteReader<uint16_t>::ReadBigEndian(&buffer[34]); | |
73 } | |
74 | |
75 void VoipMetric::Create(uint8_t* buffer) const { | |
76 const uint8_t kReserved = 0; | |
77 buffer[0] = kBlockType; | |
78 buffer[1] = kReserved; | |
79 ByteWriter<uint16_t>::WriteBigEndian(&buffer[2], kBlockLength); | |
80 ByteWriter<uint32_t>::WriteBigEndian(&buffer[4], ssrc_); | |
81 buffer[8] = voip_metric_.lossRate; | |
82 buffer[9] = voip_metric_.discardRate; | |
83 buffer[10] = voip_metric_.burstDensity; | |
84 buffer[11] = voip_metric_.gapDensity; | |
85 ByteWriter<uint16_t>::WriteBigEndian(&buffer[12], voip_metric_.burstDuration); | |
86 ByteWriter<uint16_t>::WriteBigEndian(&buffer[14], voip_metric_.gapDuration); | |
87 ByteWriter<uint16_t>::WriteBigEndian(&buffer[16], | |
88 voip_metric_.roundTripDelay); | |
89 ByteWriter<uint16_t>::WriteBigEndian(&buffer[18], | |
90 voip_metric_.endSystemDelay); | |
91 buffer[20] = voip_metric_.signalLevel; | |
92 buffer[21] = voip_metric_.noiseLevel; | |
93 buffer[22] = voip_metric_.RERL; | |
94 buffer[23] = voip_metric_.Gmin; | |
95 buffer[24] = voip_metric_.Rfactor; | |
96 buffer[25] = voip_metric_.extRfactor; | |
97 buffer[26] = voip_metric_.MOSLQ; | |
98 buffer[27] = voip_metric_.MOSCQ; | |
99 buffer[28] = voip_metric_.RXconfig; | |
100 buffer[29] = kReserved; | |
101 ByteWriter<uint16_t>::WriteBigEndian(&buffer[30], voip_metric_.JBnominal); | |
102 ByteWriter<uint16_t>::WriteBigEndian(&buffer[32], voip_metric_.JBmax); | |
103 ByteWriter<uint16_t>::WriteBigEndian(&buffer[34], voip_metric_.JBabsMax); | |
104 } | |
105 | |
106 } // namespace rtcp | |
107 } // namespace webrtc | |
OLD | NEW |