OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 */ |
11 | 11 |
12 #ifndef WEBRTC_TEST_RTCP_PACKET_PARSER_H_ | 12 #ifndef WEBRTC_TEST_RTCP_PACKET_PARSER_H_ |
13 #define WEBRTC_TEST_RTCP_PACKET_PARSER_H_ | 13 #define WEBRTC_TEST_RTCP_PACKET_PARSER_H_ |
14 | 14 |
15 #include <map> | 15 #include "webrtc/base/array_view.h" |
16 #include <string> | |
17 #include <vector> | |
18 | |
19 #include "webrtc/base/buffer.h" | |
20 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
| 17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" |
| 18 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" |
21 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h" | 19 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h" |
22 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" | 20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h" |
23 #include "webrtc/typedefs.h" | 21 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" |
| 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" |
| 23 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h" |
| 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" |
| 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h" |
| 26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" |
| 27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" |
| 28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi.h" |
| 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" |
| 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" |
| 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" |
| 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h" |
| 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" |
| 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
24 | 35 |
25 namespace webrtc { | 36 namespace webrtc { |
26 namespace test { | 37 namespace test { |
27 // Parse RTCP packet of given type. Assumes RTCP header is valid and that there | 38 // Parse RTCP packet of given type. Assumes RTCP header is valid and that there |
28 // is excatly one packet of correct type in the buffer. | 39 // is excatly one packet of correct type in the buffer. |
29 template <typename Packet> | 40 template <typename Packet> |
30 bool ParseSinglePacket(const uint8_t* buffer, size_t size, Packet* packet) { | 41 bool ParseSinglePacket(const uint8_t* buffer, size_t size, Packet* packet) { |
31 rtcp::CommonHeader header; | 42 rtcp::CommonHeader header; |
32 RTC_CHECK(header.Parse(buffer, size)); | 43 RTC_CHECK(header.Parse(buffer, size)); |
33 RTC_CHECK_EQ(static_cast<ptrdiff_t>(size), header.NextPacket() - buffer); | 44 RTC_CHECK_EQ(static_cast<ptrdiff_t>(size), header.NextPacket() - buffer); |
34 return packet->Parse(header); | 45 return packet->Parse(header); |
35 } | 46 } |
36 // Same function, but takes raw buffer as single argument instead of pair. | 47 // Same function, but takes raw buffer as single argument instead of pair. |
37 template <size_t N, typename Packet> | |
38 bool ParseSinglePacket(const uint8_t(&buffer)[N], Packet* packet) { | |
39 return ParseSinglePacket(buffer, N, packet); | |
40 } | |
41 template <typename Packet> | 48 template <typename Packet> |
42 bool ParseSinglePacket(const rtc::Buffer& buffer, Packet* packet) { | 49 bool ParseSinglePacket(rtc::ArrayView<const uint8_t> buffer, Packet* packet) { |
43 return ParseSinglePacket(buffer.data(), buffer.size(), packet); | 50 return ParseSinglePacket(buffer.data(), buffer.size(), packet); |
44 } | 51 } |
45 | 52 |
46 class RtcpPacketParser; | 53 class RtcpPacketParser { |
| 54 public: |
| 55 // Keeps last parsed packet, count number of parsed packets of given type. |
| 56 template <typename TypedRtcpPacket> |
| 57 class PacketCounter : public TypedRtcpPacket { |
| 58 public: |
| 59 int num_packets() const { return num_packets_; } |
| 60 void Parse(const rtcp::CommonHeader& header) { |
| 61 if (TypedRtcpPacket::Parse(header)) |
| 62 ++num_packets_; |
| 63 } |
47 | 64 |
48 class PacketType { | 65 private: |
49 public: | 66 int num_packets_ = 0; |
50 virtual ~PacketType() {} | 67 }; |
51 | 68 |
52 int num_packets() const { return num_packets_; } | 69 RtcpPacketParser(); |
| 70 ~RtcpPacketParser(); |
53 | 71 |
54 protected: | 72 bool Parse(const void* packet, size_t packet_len); |
55 PacketType() : num_packets_(0) {} | |
56 | 73 |
57 int num_packets_; | 74 PacketCounter<rtcp::App>* app() { return &app_; } |
58 }; | 75 PacketCounter<rtcp::Bye>* bye() { return &bye_; } |
59 | 76 PacketCounter<rtcp::ExtendedJitterReport>* ij() { return &ij_; } |
60 class SenderReport : public PacketType { | 77 PacketCounter<rtcp::ExtendedReports>* xr() { return &xr_; } |
61 public: | 78 PacketCounter<rtcp::Fir>* fir() { return &fir_; } |
62 SenderReport() {} | 79 PacketCounter<rtcp::Nack>* nack() { return &nack_; } |
63 virtual ~SenderReport() {} | 80 PacketCounter<rtcp::Pli>* pli() { return &pli_; } |
64 | 81 PacketCounter<rtcp::RapidResyncRequest>* rrr() { return &rrr_; } |
65 uint32_t Ssrc() const { return sr_.SenderSSRC; } | 82 PacketCounter<rtcp::ReceiverReport>* receiver_report() { |
66 uint32_t NtpSec() const { return sr_.NTPMostSignificant; } | 83 return &receiver_report_; |
67 uint32_t NtpFrac() const { return sr_.NTPLeastSignificant; } | |
68 uint32_t RtpTimestamp() const { return sr_.RTPTimestamp; } | |
69 uint32_t PacketCount() const { return sr_.SenderPacketCount; } | |
70 uint32_t OctetCount() const { return sr_.SenderOctetCount; } | |
71 | |
72 private: | |
73 friend class RtcpPacketParser; | |
74 | |
75 void Set(const RTCPUtility::RTCPPacketSR& sr) { | |
76 sr_ = sr; | |
77 ++num_packets_; | |
78 } | 84 } |
79 | 85 PacketCounter<rtcp::Remb>* remb() { return &remb_; } |
80 RTCPUtility::RTCPPacketSR sr_; | 86 PacketCounter<rtcp::Rpsi>* rpsi() { return &rpsi_; } |
81 }; | 87 PacketCounter<rtcp::Sdes>* sdes() { return &sdes_; } |
82 | 88 PacketCounter<rtcp::SenderReport>* sender_report() { return &sender_report_; } |
83 class ReceiverReport : public PacketType { | 89 PacketCounter<rtcp::Sli>* sli() { return &sli_; } |
84 public: | 90 PacketCounter<rtcp::Tmmbn>* tmmbn() { return &tmmbn_; } |
85 ReceiverReport() {} | 91 PacketCounter<rtcp::Tmmbr>* tmmbr() { return &tmmbr_; } |
86 virtual ~ReceiverReport() {} | 92 PacketCounter<rtcp::TransportFeedback>* transport_feedback() { |
87 | 93 return &transport_feedback_; |
88 uint32_t Ssrc() const { return rr_.SenderSSRC; } | |
89 | |
90 private: | |
91 friend class RtcpPacketParser; | |
92 | |
93 void Set(const RTCPUtility::RTCPPacketRR& rr) { | |
94 rr_ = rr; | |
95 ++num_packets_; | |
96 } | 94 } |
97 | 95 const RTCPVoIPMetric* voip_metric() { |
98 RTCPUtility::RTCPPacketRR rr_; | 96 return &xr_.voip_metrics()[0].voip_metric(); |
99 }; | |
100 | |
101 class ReportBlock : public PacketType { | |
102 public: | |
103 ReportBlock() {} | |
104 virtual ~ReportBlock() {} | |
105 | |
106 uint32_t Ssrc() const { return rb_.SSRC; } | |
107 uint8_t FractionLost() const { return rb_.FractionLost; } | |
108 uint32_t CumPacketLost() const { return rb_.CumulativeNumOfPacketsLost; } | |
109 uint32_t ExtHighestSeqNum() const { return rb_.ExtendedHighestSequenceNumber;} | |
110 uint32_t Jitter() const { return rb_.Jitter; } | |
111 uint32_t LastSr() const { return rb_.LastSR; } | |
112 uint32_t DelayLastSr()const { return rb_.DelayLastSR; } | |
113 | |
114 private: | |
115 friend class RtcpPacketParser; | |
116 | |
117 void Set(const RTCPUtility::RTCPPacketReportBlockItem& rb) { | |
118 rb_ = rb; | |
119 ++num_packets_; | |
120 } | |
121 | |
122 RTCPUtility::RTCPPacketReportBlockItem rb_; | |
123 }; | |
124 | |
125 class Ij : public PacketType { | |
126 public: | |
127 Ij() {} | |
128 virtual ~Ij() {} | |
129 | |
130 private: | |
131 friend class RtcpPacketParser; | |
132 | |
133 void Set() { ++num_packets_; } | |
134 }; | |
135 | |
136 class IjItem : public PacketType { | |
137 public: | |
138 IjItem() {} | |
139 virtual ~IjItem() {} | |
140 | |
141 uint32_t Jitter() const { return ij_item_.Jitter; } | |
142 | |
143 private: | |
144 friend class RtcpPacketParser; | |
145 | |
146 void Set(const RTCPUtility::RTCPPacketExtendedJitterReportItem& ij_item) { | |
147 ij_item_ = ij_item; | |
148 ++num_packets_; | |
149 } | |
150 | |
151 RTCPUtility::RTCPPacketExtendedJitterReportItem ij_item_; | |
152 }; | |
153 | |
154 class Sdes : public PacketType { | |
155 public: | |
156 Sdes() {} | |
157 virtual ~Sdes() {} | |
158 | |
159 private: | |
160 friend class RtcpPacketParser; | |
161 | |
162 void Set() { ++num_packets_; } | |
163 }; | |
164 | |
165 class SdesChunk : public PacketType { | |
166 public: | |
167 SdesChunk() {} | |
168 virtual ~SdesChunk() {} | |
169 | |
170 uint32_t Ssrc() const { return cname_.SenderSSRC; } | |
171 std::string Cname() const { return cname_.CName; } | |
172 | |
173 private: | |
174 friend class RtcpPacketParser; | |
175 | |
176 void Set(const RTCPUtility::RTCPPacketSDESCName& cname) { | |
177 cname_ = cname; | |
178 ++num_packets_; | |
179 } | |
180 | |
181 RTCPUtility::RTCPPacketSDESCName cname_; | |
182 }; | |
183 | |
184 class Bye : public PacketType { | |
185 public: | |
186 Bye() {} | |
187 virtual ~Bye() {} | |
188 | |
189 uint32_t Ssrc() const { return bye_.SenderSSRC; } | |
190 | |
191 private: | |
192 friend class RtcpPacketParser; | |
193 | |
194 void Set(const RTCPUtility::RTCPPacketBYE& bye) { | |
195 bye_ = bye; | |
196 ++num_packets_; | |
197 } | |
198 | |
199 RTCPUtility::RTCPPacketBYE bye_; | |
200 }; | |
201 | |
202 class Rpsi : public PacketType { | |
203 public: | |
204 Rpsi() {} | |
205 virtual ~Rpsi() {} | |
206 | |
207 uint32_t Ssrc() const { return rpsi_.SenderSSRC; } | |
208 uint32_t MediaSsrc() const { return rpsi_.MediaSSRC; } | |
209 uint8_t PayloadType() const { return rpsi_.PayloadType; } | |
210 uint16_t NumberOfValidBits() const { return rpsi_.NumberOfValidBits; } | |
211 uint64_t PictureId() const; | |
212 | |
213 private: | |
214 friend class RtcpPacketParser; | |
215 | |
216 void Set(const RTCPUtility::RTCPPacketPSFBRPSI& rpsi) { | |
217 rpsi_ = rpsi; | |
218 ++num_packets_; | |
219 } | |
220 | |
221 RTCPUtility::RTCPPacketPSFBRPSI rpsi_; | |
222 }; | |
223 | |
224 class App : public PacketType { | |
225 public: | |
226 App() {} | |
227 virtual ~App() {} | |
228 | |
229 uint8_t SubType() const { return app_.SubType; } | |
230 uint32_t Name() const { return app_.Name; } | |
231 | |
232 private: | |
233 friend class RtcpPacketParser; | |
234 | |
235 void Set(const RTCPUtility::RTCPPacketAPP& app) { | |
236 app_ = app; | |
237 ++num_packets_; | |
238 } | |
239 | |
240 RTCPUtility::RTCPPacketAPP app_; | |
241 }; | |
242 | |
243 class AppItem : public PacketType { | |
244 public: | |
245 AppItem() {} | |
246 virtual ~AppItem() {} | |
247 | |
248 uint8_t* Data() { return app_item_.Data; } | |
249 uint16_t DataLength() const { return app_item_.Size; } | |
250 | |
251 private: | |
252 friend class RtcpPacketParser; | |
253 | |
254 void Set(const RTCPUtility::RTCPPacketAPP& app) { | |
255 app_item_ = app; | |
256 ++num_packets_; | |
257 } | |
258 | |
259 RTCPUtility::RTCPPacketAPP app_item_; | |
260 }; | |
261 | |
262 class Pli : public PacketType { | |
263 public: | |
264 Pli() {} | |
265 virtual ~Pli() {} | |
266 | |
267 uint32_t Ssrc() const { return pli_.SenderSSRC; } | |
268 uint32_t MediaSsrc() const { return pli_.MediaSSRC; } | |
269 | |
270 private: | |
271 friend class RtcpPacketParser; | |
272 | |
273 void Set(const RTCPUtility::RTCPPacketPSFBPLI& pli) { | |
274 pli_ = pli; | |
275 ++num_packets_; | |
276 } | |
277 | |
278 RTCPUtility::RTCPPacketPSFBPLI pli_; | |
279 }; | |
280 | |
281 class Sli : public PacketType { | |
282 public: | |
283 Sli() {} | |
284 virtual ~Sli() {} | |
285 | |
286 uint32_t Ssrc() const { return sli_.SenderSSRC; } | |
287 uint32_t MediaSsrc() const { return sli_.MediaSSRC; } | |
288 | |
289 private: | |
290 friend class RtcpPacketParser; | |
291 | |
292 void Set(const RTCPUtility::RTCPPacketPSFBSLI& sli) { | |
293 sli_ = sli; | |
294 ++num_packets_; | |
295 } | |
296 | |
297 RTCPUtility::RTCPPacketPSFBSLI sli_; | |
298 }; | |
299 | |
300 class SliItem : public PacketType { | |
301 public: | |
302 SliItem() {} | |
303 virtual ~SliItem() {} | |
304 | |
305 uint16_t FirstMb() const { return sli_item_.FirstMB; } | |
306 uint16_t NumberOfMb() const { return sli_item_.NumberOfMB; } | |
307 uint8_t PictureId() const { return sli_item_.PictureId; } | |
308 | |
309 private: | |
310 friend class RtcpPacketParser; | |
311 | |
312 void Set(const RTCPUtility::RTCPPacketPSFBSLIItem& sli_item) { | |
313 sli_item_ = sli_item; | |
314 ++num_packets_; | |
315 } | |
316 | |
317 RTCPUtility::RTCPPacketPSFBSLIItem sli_item_; | |
318 }; | |
319 | |
320 class Fir : public PacketType { | |
321 public: | |
322 Fir() {} | |
323 virtual ~Fir() {} | |
324 | |
325 uint32_t Ssrc() const { return fir_.SenderSSRC; } | |
326 | |
327 private: | |
328 friend class RtcpPacketParser; | |
329 | |
330 void Set(const RTCPUtility::RTCPPacketPSFBFIR& fir) { | |
331 fir_ = fir; | |
332 ++num_packets_; | |
333 } | |
334 | |
335 RTCPUtility::RTCPPacketPSFBFIR fir_; | |
336 }; | |
337 | |
338 class FirItem : public PacketType { | |
339 public: | |
340 FirItem() {} | |
341 virtual ~FirItem() {} | |
342 | |
343 uint32_t Ssrc() const { return fir_item_.SSRC; } | |
344 uint8_t SeqNum() const { return fir_item_.CommandSequenceNumber; } | |
345 | |
346 private: | |
347 friend class RtcpPacketParser; | |
348 | |
349 void Set(const RTCPUtility::RTCPPacketPSFBFIRItem& fir_item) { | |
350 fir_item_ = fir_item; | |
351 ++num_packets_; | |
352 } | |
353 | |
354 RTCPUtility::RTCPPacketPSFBFIRItem fir_item_; | |
355 }; | |
356 | |
357 class Nack : public PacketType { | |
358 public: | |
359 Nack() {} | |
360 virtual ~Nack() {} | |
361 | |
362 uint32_t Ssrc() const { return nack_.SenderSSRC; } | |
363 uint32_t MediaSsrc() const { return nack_.MediaSSRC; } | |
364 | |
365 private: | |
366 friend class RtcpPacketParser; | |
367 | |
368 void Set(const RTCPUtility::RTCPPacketRTPFBNACK& nack) { | |
369 nack_ = nack; | |
370 ++num_packets_; | |
371 } | |
372 | |
373 RTCPUtility::RTCPPacketRTPFBNACK nack_; | |
374 }; | |
375 | |
376 class NackItem : public PacketType { | |
377 public: | |
378 NackItem() {} | |
379 virtual ~NackItem() {} | |
380 | |
381 std::vector<uint16_t> last_nack_list() const { | |
382 return last_nack_list_; | |
383 } | 97 } |
384 | 98 |
385 private: | 99 private: |
386 friend class RtcpPacketParser; | 100 PacketCounter<rtcp::App> app_; |
387 | 101 PacketCounter<rtcp::Bye> bye_; |
388 void Set(const RTCPUtility::RTCPPacketRTPFBNACKItem& nack_item) { | 102 PacketCounter<rtcp::ExtendedJitterReport> ij_; |
389 last_nack_list_.push_back(nack_item.PacketID); | 103 PacketCounter<rtcp::ExtendedReports> xr_; |
390 for (int i = 0; i < 16; ++i) { | 104 PacketCounter<rtcp::Fir> fir_; |
391 if (nack_item.BitMask & (1 << i)) { | 105 PacketCounter<rtcp::Nack> nack_; |
392 last_nack_list_.push_back(nack_item.PacketID + i + 1); | 106 PacketCounter<rtcp::Pli> pli_; |
393 } | 107 PacketCounter<rtcp::RapidResyncRequest> rrr_; |
394 } | 108 PacketCounter<rtcp::ReceiverReport> receiver_report_; |
395 ++num_packets_; | 109 PacketCounter<rtcp::Remb> remb_; |
396 } | 110 PacketCounter<rtcp::Rpsi> rpsi_; |
397 void Clear() { last_nack_list_.clear(); } | 111 PacketCounter<rtcp::Sdes> sdes_; |
398 | 112 PacketCounter<rtcp::SenderReport> sender_report_; |
399 std::vector<uint16_t> last_nack_list_; | 113 PacketCounter<rtcp::Sli> sli_; |
| 114 PacketCounter<rtcp::Tmmbn> tmmbn_; |
| 115 PacketCounter<rtcp::Tmmbr> tmmbr_; |
| 116 PacketCounter<rtcp::TransportFeedback> transport_feedback_; |
400 }; | 117 }; |
401 | 118 |
402 class PsfbApp : public PacketType { | |
403 public: | |
404 PsfbApp() {} | |
405 virtual ~PsfbApp() {} | |
406 | |
407 uint32_t Ssrc() const { return psfb_app_.SenderSSRC; } | |
408 | |
409 private: | |
410 friend class RtcpPacketParser; | |
411 | |
412 void Set(const RTCPUtility::RTCPPacketPSFBAPP& psfb_app) { | |
413 psfb_app_ = psfb_app; | |
414 ++num_packets_; | |
415 } | |
416 | |
417 RTCPUtility::RTCPPacketPSFBAPP psfb_app_; | |
418 }; | |
419 | |
420 class RembItem : public PacketType { | |
421 public: | |
422 RembItem() : last_bitrate_bps_(0) {} | |
423 virtual ~RembItem() {} | |
424 | |
425 int last_bitrate_bps() const { return last_bitrate_bps_; } | |
426 std::vector<uint32_t> last_ssrc_list() { | |
427 return last_ssrc_list_; | |
428 } | |
429 | |
430 private: | |
431 friend class RtcpPacketParser; | |
432 | |
433 void Set(const RTCPUtility::RTCPPacketPSFBREMBItem& remb_item) { | |
434 last_bitrate_bps_ = remb_item.BitRate; | |
435 last_ssrc_list_.clear(); | |
436 last_ssrc_list_.insert( | |
437 last_ssrc_list_.end(), | |
438 remb_item.SSRCs, | |
439 remb_item.SSRCs + remb_item.NumberOfSSRCs); | |
440 ++num_packets_; | |
441 } | |
442 | |
443 uint32_t last_bitrate_bps_; | |
444 std::vector<uint32_t> last_ssrc_list_; | |
445 }; | |
446 | |
447 class Tmmbr : public PacketType { | |
448 public: | |
449 Tmmbr() {} | |
450 virtual ~Tmmbr() {} | |
451 | |
452 uint32_t Ssrc() const { return tmmbr_.SenderSSRC; } | |
453 | |
454 private: | |
455 friend class RtcpPacketParser; | |
456 | |
457 void Set(const RTCPUtility::RTCPPacketRTPFBTMMBR& tmmbr) { | |
458 tmmbr_ = tmmbr; | |
459 ++num_packets_; | |
460 } | |
461 | |
462 RTCPUtility::RTCPPacketRTPFBTMMBR tmmbr_; | |
463 }; | |
464 | |
465 class TmmbrItem : public PacketType { | |
466 public: | |
467 TmmbrItem() {} | |
468 virtual ~TmmbrItem() {} | |
469 | |
470 uint32_t Ssrc() const { return tmmbr_item_.SSRC; } | |
471 uint32_t BitrateKbps() const { return tmmbr_item_.MaxTotalMediaBitRate; } | |
472 uint32_t Overhead() const { return tmmbr_item_.MeasuredOverhead; } | |
473 | |
474 private: | |
475 friend class RtcpPacketParser; | |
476 | |
477 void Set(const RTCPUtility::RTCPPacketRTPFBTMMBRItem& tmmbr_item) { | |
478 tmmbr_item_ = tmmbr_item; | |
479 ++num_packets_; | |
480 } | |
481 | |
482 RTCPUtility::RTCPPacketRTPFBTMMBRItem tmmbr_item_; | |
483 }; | |
484 | |
485 | |
486 class Tmmbn : public PacketType { | |
487 public: | |
488 Tmmbn() {} | |
489 virtual ~Tmmbn() {} | |
490 | |
491 uint32_t Ssrc() const { return tmmbn_.SenderSSRC; } | |
492 | |
493 private: | |
494 friend class RtcpPacketParser; | |
495 | |
496 void Set(const RTCPUtility::RTCPPacketRTPFBTMMBN& tmmbn) { | |
497 tmmbn_ = tmmbn; | |
498 ++num_packets_; | |
499 } | |
500 | |
501 RTCPUtility::RTCPPacketRTPFBTMMBN tmmbn_; | |
502 }; | |
503 | |
504 class TmmbnItems : public PacketType { | |
505 public: | |
506 TmmbnItems() {} | |
507 virtual ~TmmbnItems() {} | |
508 | |
509 uint32_t Ssrc(uint8_t num) const { | |
510 assert(num < tmmbns_.size()); | |
511 return tmmbns_[num].SSRC; | |
512 } | |
513 uint32_t BitrateKbps(uint8_t num) const { | |
514 assert(num < tmmbns_.size()); | |
515 return tmmbns_[num].MaxTotalMediaBitRate; | |
516 } | |
517 uint32_t Overhead(uint8_t num) const { | |
518 assert(num < tmmbns_.size()); | |
519 return tmmbns_[num].MeasuredOverhead; | |
520 } | |
521 | |
522 private: | |
523 friend class RtcpPacketParser; | |
524 | |
525 void Set(const RTCPUtility::RTCPPacketRTPFBTMMBNItem& tmmbn_item) { | |
526 tmmbns_.push_back(tmmbn_item); | |
527 ++num_packets_; | |
528 } | |
529 void Clear() { tmmbns_.clear(); } | |
530 | |
531 std::vector<RTCPUtility::RTCPPacketRTPFBTMMBNItem> tmmbns_; | |
532 }; | |
533 | |
534 class XrHeader : public PacketType { | |
535 public: | |
536 XrHeader() {} | |
537 virtual ~XrHeader() {} | |
538 | |
539 uint32_t Ssrc() const { return xr_header_.OriginatorSSRC; } | |
540 | |
541 private: | |
542 friend class RtcpPacketParser; | |
543 | |
544 void Set(const RTCPUtility::RTCPPacketXR& xr_header) { | |
545 xr_header_ = xr_header; | |
546 ++num_packets_; | |
547 } | |
548 | |
549 RTCPUtility::RTCPPacketXR xr_header_; | |
550 }; | |
551 | |
552 class Rrtr : public PacketType { | |
553 public: | |
554 Rrtr() {} | |
555 virtual ~Rrtr() {} | |
556 | |
557 uint32_t NtpSec() const { return rrtr_.NTPMostSignificant; } | |
558 uint32_t NtpFrac() const { return rrtr_.NTPLeastSignificant; } | |
559 | |
560 private: | |
561 friend class RtcpPacketParser; | |
562 | |
563 void Set(const RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem& rrtr) { | |
564 rrtr_ = rrtr; | |
565 ++num_packets_; | |
566 } | |
567 | |
568 RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem rrtr_; | |
569 }; | |
570 | |
571 class Dlrr : public PacketType { | |
572 public: | |
573 Dlrr() {} | |
574 virtual ~Dlrr() {} | |
575 | |
576 private: | |
577 friend class RtcpPacketParser; | |
578 | |
579 void Set() { ++num_packets_; } | |
580 }; | |
581 | |
582 class DlrrItems : public PacketType { | |
583 public: | |
584 DlrrItems() {} | |
585 virtual ~DlrrItems() {} | |
586 | |
587 uint32_t Ssrc(uint8_t num) const { | |
588 assert(num < dlrrs_.size()); | |
589 return dlrrs_[num].SSRC; | |
590 } | |
591 uint32_t LastRr(uint8_t num) const { | |
592 assert(num < dlrrs_.size()); | |
593 return dlrrs_[num].LastRR; | |
594 } | |
595 uint32_t DelayLastRr(uint8_t num) const { | |
596 assert(num < dlrrs_.size()); | |
597 return dlrrs_[num].DelayLastRR; | |
598 } | |
599 | |
600 private: | |
601 friend class RtcpPacketParser; | |
602 | |
603 void Set(const RTCPUtility::RTCPPacketXRDLRRReportBlockItem& dlrr) { | |
604 dlrrs_.push_back(dlrr); | |
605 ++num_packets_; | |
606 } | |
607 void Clear() { dlrrs_.clear(); } | |
608 | |
609 std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> dlrrs_; | |
610 }; | |
611 | |
612 class VoipMetric : public PacketType { | |
613 public: | |
614 VoipMetric() {} | |
615 virtual ~VoipMetric() {} | |
616 | |
617 uint32_t Ssrc() const { return voip_metric_.SSRC; } | |
618 uint8_t LossRate() { return voip_metric_.lossRate; } | |
619 uint8_t DiscardRate() { return voip_metric_.discardRate; } | |
620 uint8_t BurstDensity() { return voip_metric_.burstDensity; } | |
621 uint8_t GapDensity() { return voip_metric_.gapDensity; } | |
622 uint16_t BurstDuration() { return voip_metric_.burstDuration; } | |
623 uint16_t GapDuration() { return voip_metric_.gapDuration; } | |
624 uint16_t RoundTripDelay() { return voip_metric_.roundTripDelay; } | |
625 uint16_t EndSystemDelay() { return voip_metric_.endSystemDelay; } | |
626 uint8_t SignalLevel() { return voip_metric_.signalLevel; } | |
627 uint8_t NoiseLevel() { return voip_metric_.noiseLevel; } | |
628 uint8_t Rerl() { return voip_metric_.RERL; } | |
629 uint8_t Gmin() { return voip_metric_.Gmin; } | |
630 uint8_t Rfactor() { return voip_metric_.Rfactor; } | |
631 uint8_t ExtRfactor() { return voip_metric_.extRfactor; } | |
632 uint8_t MosLq() { return voip_metric_.MOSLQ; } | |
633 uint8_t MosCq() { return voip_metric_.MOSCQ; } | |
634 uint8_t RxConfig() { return voip_metric_.RXconfig; } | |
635 uint16_t JbNominal() { return voip_metric_.JBnominal; } | |
636 uint16_t JbMax() { return voip_metric_.JBmax; } | |
637 uint16_t JbAbsMax() { return voip_metric_.JBabsMax; } | |
638 | |
639 private: | |
640 friend class RtcpPacketParser; | |
641 | |
642 void Set(const RTCPUtility::RTCPPacketXRVOIPMetricItem& voip_metric) { | |
643 voip_metric_ = voip_metric; | |
644 ++num_packets_; | |
645 } | |
646 | |
647 RTCPUtility::RTCPPacketXRVOIPMetricItem voip_metric_; | |
648 }; | |
649 | |
650 class RtcpPacketParser { | |
651 public: | |
652 RtcpPacketParser(); | |
653 ~RtcpPacketParser(); | |
654 | |
655 void Parse(const void *packet, size_t packet_len); | |
656 | |
657 SenderReport* sender_report() { return &sender_report_; } | |
658 ReceiverReport* receiver_report() { return &receiver_report_; } | |
659 ReportBlock* report_block() { return &report_block_; } | |
660 Sdes* sdes() { return &sdes_; } | |
661 SdesChunk* sdes_chunk() { return &sdes_chunk_; } | |
662 Bye* bye() { return &bye_; } | |
663 App* app() { return &app_; } | |
664 AppItem* app_item() { return &app_item_; } | |
665 Ij* ij() { return &ij_; } | |
666 IjItem* ij_item() { return &ij_item_; } | |
667 Pli* pli() { return &pli_; } | |
668 Sli* sli() { return &sli_; } | |
669 SliItem* sli_item() { return &sli_item_; } | |
670 Rpsi* rpsi() { return &rpsi_; } | |
671 Fir* fir() { return &fir_; } | |
672 FirItem* fir_item() { return &fir_item_; } | |
673 Nack* nack() { return &nack_; } | |
674 NackItem* nack_item() { return &nack_item_; } | |
675 PsfbApp* psfb_app() { return &psfb_app_; } | |
676 RembItem* remb_item() { return &remb_item_; } | |
677 Tmmbr* tmmbr() { return &tmmbr_; } | |
678 TmmbrItem* tmmbr_item() { return &tmmbr_item_; } | |
679 Tmmbn* tmmbn() { return &tmmbn_; } | |
680 TmmbnItems* tmmbn_items() { return &tmmbn_items_; } | |
681 XrHeader* xr_header() { return &xr_header_; } | |
682 Rrtr* rrtr() { return &rrtr_; } | |
683 Dlrr* dlrr() { return &dlrr_; } | |
684 DlrrItems* dlrr_items() { return &dlrr_items_; } | |
685 VoipMetric* voip_metric() { return &voip_metric_; } | |
686 | |
687 int report_blocks_per_ssrc(uint32_t ssrc) { | |
688 return report_blocks_per_ssrc_[ssrc]; | |
689 } | |
690 | |
691 private: | |
692 SenderReport sender_report_; | |
693 ReceiverReport receiver_report_; | |
694 ReportBlock report_block_; | |
695 Sdes sdes_; | |
696 SdesChunk sdes_chunk_; | |
697 Bye bye_; | |
698 App app_; | |
699 AppItem app_item_; | |
700 Ij ij_; | |
701 IjItem ij_item_; | |
702 Pli pli_; | |
703 Sli sli_; | |
704 SliItem sli_item_; | |
705 Rpsi rpsi_; | |
706 Fir fir_; | |
707 FirItem fir_item_; | |
708 Nack nack_; | |
709 NackItem nack_item_; | |
710 PsfbApp psfb_app_; | |
711 RembItem remb_item_; | |
712 Tmmbr tmmbr_; | |
713 TmmbrItem tmmbr_item_; | |
714 Tmmbn tmmbn_; | |
715 TmmbnItems tmmbn_items_; | |
716 XrHeader xr_header_; | |
717 Rrtr rrtr_; | |
718 Dlrr dlrr_; | |
719 DlrrItems dlrr_items_; | |
720 VoipMetric voip_metric_; | |
721 | |
722 std::map<uint32_t, int> report_blocks_per_ssrc_; | |
723 }; | |
724 } // namespace test | 119 } // namespace test |
725 } // namespace webrtc | 120 } // namespace webrtc |
726 #endif // WEBRTC_TEST_RTCP_PACKET_PARSER_H_ | 121 #endif // WEBRTC_TEST_RTCP_PACKET_PARSER_H_ |
OLD | NEW |