blob: a9e650cf25df2c176e22d26c5fdadf4eb99c957b [file] [log] [blame]
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +00001/*
2 * Copyright (c) 2014 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
12#ifndef WEBRTC_TEST_RTCP_PACKET_PARSER_H_
13#define WEBRTC_TEST_RTCP_PACKET_PARSER_H_
14
15#include <map>
16#include <vector>
17
18#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
19#include "webrtc/typedefs.h"
20
21namespace webrtc {
22namespace test {
23
24class RtcpPacketParser;
25
26class SenderReport {
27 public:
28 SenderReport() : num_packets_(0) {}
29 ~SenderReport() {}
30
31 int num_packets() { return num_packets_; }
32 uint32_t Ssrc() { return sr_.SenderSSRC; }
33 uint32_t NtpSec() { return sr_.NTPMostSignificant; }
34 uint32_t NtpFrac() { return sr_.NTPLeastSignificant; }
35 uint32_t RtpTimestamp() { return sr_.RTPTimestamp; }
36 uint32_t PacketCount() { return sr_.SenderPacketCount; }
37 uint32_t OctetCount() { return sr_.SenderOctetCount; }
38
39 private:
40 friend class RtcpPacketParser;
41 void Set(const RTCPUtility::RTCPPacketSR& sr) {
42 sr_ = sr;
43 ++num_packets_;
44 }
45
46 int num_packets_;
47 RTCPUtility::RTCPPacketSR sr_;
48};
49
50class ReceiverReport {
51 public:
52 ReceiverReport() : num_packets_(0) {}
53 ~ReceiverReport() {}
54
55 int num_packets() { return num_packets_; }
56 uint32_t Ssrc() { return rr_.SenderSSRC; }
57
58 private:
59 friend class RtcpPacketParser;
60 void Set(const RTCPUtility::RTCPPacketRR& rr) {
61 rr_ = rr;
62 ++num_packets_;
63 }
64
65 int num_packets_;
66 RTCPUtility::RTCPPacketRR rr_;
67};
68
69class ReportBlock {
70 public:
71 ReportBlock() : num_packets_(0) {}
72 ~ReportBlock() {}
73
74 int num_packets() { return num_packets_; }
75 uint32_t Ssrc() { return rb_.SSRC; }
76 uint8_t FractionLost() { return rb_.FractionLost; }
77 uint32_t CumPacketLost() { return rb_.CumulativeNumOfPacketsLost; }
78 uint32_t ExtHighestSeqNum() { return rb_.ExtendedHighestSequenceNumber; }
79 uint32_t Jitter() { return rb_.Jitter; }
80 uint32_t LastSr() { return rb_.LastSR; }
81 uint32_t DelayLastSr() { return rb_.DelayLastSR; }
82
83 private:
84 friend class RtcpPacketParser;
85 void Set(const RTCPUtility::RTCPPacketReportBlockItem& rb) {
86 rb_ = rb;
87 ++num_packets_;
88 }
89
90 int num_packets_;
91 RTCPUtility::RTCPPacketReportBlockItem rb_;
92};
93
94class Bye {
95 public:
96 Bye() : num_packets_(0) {}
97 ~Bye() {}
98
99 int num_packets() { return num_packets_; }
100 uint32_t Ssrc() { return bye_.SenderSSRC; }
101
102 private:
103 friend class RtcpPacketParser;
104 void Set(const RTCPUtility::RTCPPacketBYE& bye) {
105 bye_ = bye;
106 ++num_packets_;
107 }
108
109 int num_packets_;
110 RTCPUtility::RTCPPacketBYE bye_;
111};
112
113class Fir {
114 public:
115 Fir() : num_packets_(0) {}
116 ~Fir() {}
117
118 int num_packets() { return num_packets_; }
119 uint32_t Ssrc() { return fir_.SenderSSRC; }
120
121 private:
122 friend class RtcpPacketParser;
123 void Set(const RTCPUtility::RTCPPacketPSFBFIR& fir) {
124 fir_ = fir;
125 ++num_packets_;
126 }
127
128 int num_packets_;
129 RTCPUtility::RTCPPacketPSFBFIR fir_;
130};
131
132class FirItem {
133 public:
134 FirItem() : num_packets_(0) {}
135 ~FirItem() {}
136
137 int num_packets() { return num_packets_; }
138 uint32_t Ssrc() { return fir_item_.SSRC; }
139 uint8_t SeqNum() { return fir_item_.CommandSequenceNumber; }
140
141 private:
142 friend class RtcpPacketParser;
143 void Set(const RTCPUtility::RTCPPacketPSFBFIRItem& fir_item) {
144 fir_item_ = fir_item;
145 ++num_packets_;
146 }
147
148 int num_packets_;
149 RTCPUtility::RTCPPacketPSFBFIRItem fir_item_;
150};
151
152class Nack {
153 public:
154 Nack() : num_packets_(0) {}
155 ~Nack() {}
156
157 int num_packets() { return num_packets_; }
158 uint32_t Ssrc() { return nack_.SenderSSRC; }
159 uint32_t MediaSsrc() { return nack_.MediaSSRC; }
160
161 private:
162 friend class RtcpPacketParser;
163 void Set(const RTCPUtility::RTCPPacketRTPFBNACK& nack) {
164 nack_ = nack;
165 ++num_packets_;
166 }
167
168 int num_packets_;
169 RTCPUtility::RTCPPacketRTPFBNACK nack_;
170};
171
172class NackItem {
173 public:
174 NackItem() : num_packets_(0) {}
175 ~NackItem() {}
176
177 int num_packets() { return num_packets_; }
178 std::vector<uint16_t> last_nack_list() {
179 assert(num_packets_ > 0);
180 return last_nack_list_;
181 }
182
183 private:
184 friend class RtcpPacketParser;
185 void Set(const RTCPUtility::RTCPPacketRTPFBNACKItem& nack_item) {
186 last_nack_list_.clear();
187 last_nack_list_.push_back(nack_item.PacketID);
188 for (int i = 0; i < 16; ++i) {
189 if (nack_item.BitMask & (1 << i)) {
190 last_nack_list_.push_back(nack_item.PacketID + i + 1);
191 }
192 }
193 ++num_packets_;
194 }
195
196 int num_packets_;
197 std::vector<uint16_t> last_nack_list_;
198};
199
200
201class RtcpPacketParser {
202 public:
203 RtcpPacketParser();
204 ~RtcpPacketParser();
205
206 void Parse(const void *packet, int packet_len);
207
208 SenderReport* sender_report() { return &sender_report_; }
209 ReceiverReport* receiver_report() { return &receiver_report_; }
210 ReportBlock* report_block() { return &report_block_; }
211 Bye* bye() { return &bye_; }
212 Fir* fir() { return &fir_; }
213 FirItem* fir_item() { return &fir_item_; }
214 Nack* nack() { return &nack_; }
215 NackItem* nack_item() { return &nack_item_; }
216
217 int report_blocks_per_ssrc(uint32_t ssrc) {
218 return report_blocks_per_ssrc_[ssrc];
219 }
220
221 private:
222 SenderReport sender_report_;
223 ReceiverReport receiver_report_;
224 ReportBlock report_block_;
225 Bye bye_;
226 Fir fir_;
227 FirItem fir_item_;
228 Nack nack_;
229 NackItem nack_item_;
230
231 std::map<uint32_t, int> report_blocks_per_ssrc_;
232};
233} // namespace test
234} // namespace webrtc
235#endif // WEBRTC_TEST_RTCP_PACKET_PARSER_H_