blob: 9e8c9685e9697fdf1c8469c5bb080c01686f2d68 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020012#ifndef TEST_RTCP_PACKET_PARSER_H_
13#define TEST_RTCP_PACKET_PARSER_H_
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000014
Yves Gerey3e707812018-11-28 16:47:49 +010015#include <stddef.h>
16#include <stdint.h>
17
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "api/array_view.h"
19#include "modules/rtp_rtcp/source/rtcp_packet/app.h"
20#include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
21#include "modules/rtp_rtcp/source/rtcp_packet/common_header.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
23#include "modules/rtp_rtcp/source/rtcp_packet/fir.h"
Elad Alon7d6a4c02019-02-25 13:00:51 +010024#include "modules/rtp_rtcp/source/rtcp_packet/loss_notification.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "modules/rtp_rtcp/source/rtcp_packet/nack.h"
26#include "modules/rtp_rtcp/source/rtcp_packet/pli.h"
27#include "modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
28#include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
29#include "modules/rtp_rtcp/source/rtcp_packet/remb.h"
30#include "modules/rtp_rtcp/source/rtcp_packet/sdes.h"
31#include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
32#include "modules/rtp_rtcp/source/rtcp_packet/tmmbn.h"
33#include "modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
34#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
35#include "rtc_base/checks.h"
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000036
37namespace webrtc {
38namespace test {
Danil Chapovalovb4c82472016-03-17 13:15:07 +010039// Parse RTCP packet of given type. Assumes RTCP header is valid and that there
40// is excatly one packet of correct type in the buffer.
41template <typename Packet>
42bool ParseSinglePacket(const uint8_t* buffer, size_t size, Packet* packet) {
43 rtcp::CommonHeader header;
44 RTC_CHECK(header.Parse(buffer, size));
kwiberg352444f2016-11-28 15:58:53 -080045 RTC_CHECK_EQ(size, header.NextPacket() - buffer);
Danil Chapovalovb4c82472016-03-17 13:15:07 +010046 return packet->Parse(header);
47}
48// Same function, but takes raw buffer as single argument instead of pair.
Danil Chapovalovb4c82472016-03-17 13:15:07 +010049template <typename Packet>
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020050bool ParseSinglePacket(rtc::ArrayView<const uint8_t> buffer, Packet* packet) {
Danil Chapovalovb4c82472016-03-17 13:15:07 +010051 return ParseSinglePacket(buffer.data(), buffer.size(), packet);
52}
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000053
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000054class RtcpPacketParser {
55 public:
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020056 // Keeps last parsed packet, count number of parsed packets of given type.
57 template <typename TypedRtcpPacket>
58 class PacketCounter : public TypedRtcpPacket {
59 public:
60 int num_packets() const { return num_packets_; }
61 void Parse(const rtcp::CommonHeader& header) {
62 if (TypedRtcpPacket::Parse(header))
63 ++num_packets_;
64 }
Elad Alon7d6a4c02019-02-25 13:00:51 +010065 bool Parse(const rtcp::CommonHeader& header, uint32_t* sender_ssrc) {
66 const bool result = TypedRtcpPacket::Parse(header);
67 if (result) {
danilchap3dc929e2016-11-02 08:21:59 -070068 ++num_packets_;
69 if (*sender_ssrc == 0) // Use first sender ssrc in compound packet.
70 *sender_ssrc = TypedRtcpPacket::sender_ssrc();
71 }
Elad Alon7d6a4c02019-02-25 13:00:51 +010072 return result;
danilchap3dc929e2016-11-02 08:21:59 -070073 }
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020074
75 private:
76 int num_packets_ = 0;
77 };
78
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000079 RtcpPacketParser();
80 ~RtcpPacketParser();
81
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020082 bool Parse(const void* packet, size_t packet_len);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000083
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020084 PacketCounter<rtcp::App>* app() { return &app_; }
85 PacketCounter<rtcp::Bye>* bye() { return &bye_; }
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020086 PacketCounter<rtcp::ExtendedReports>* xr() { return &xr_; }
87 PacketCounter<rtcp::Fir>* fir() { return &fir_; }
88 PacketCounter<rtcp::Nack>* nack() { return &nack_; }
89 PacketCounter<rtcp::Pli>* pli() { return &pli_; }
90 PacketCounter<rtcp::RapidResyncRequest>* rrr() { return &rrr_; }
91 PacketCounter<rtcp::ReceiverReport>* receiver_report() {
92 return &receiver_report_;
93 }
Elad Alon7d6a4c02019-02-25 13:00:51 +010094 PacketCounter<rtcp::LossNotification>* loss_notification() {
95 return &loss_notification_;
96 }
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020097 PacketCounter<rtcp::Remb>* remb() { return &remb_; }
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020098 PacketCounter<rtcp::Sdes>* sdes() { return &sdes_; }
99 PacketCounter<rtcp::SenderReport>* sender_report() { return &sender_report_; }
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200100 PacketCounter<rtcp::Tmmbn>* tmmbn() { return &tmmbn_; }
101 PacketCounter<rtcp::Tmmbr>* tmmbr() { return &tmmbr_; }
102 PacketCounter<rtcp::TransportFeedback>* transport_feedback() {
103 return &transport_feedback_;
104 }
danilchap3dc929e2016-11-02 08:21:59 -0700105 uint32_t sender_ssrc() const { return sender_ssrc_; }
Elad Alone86af2c2019-06-03 14:37:50 +0200106 size_t processed_rtcp_packets() const { return processed_rtcp_packets_; }
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000107
108 private:
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200109 PacketCounter<rtcp::App> app_;
110 PacketCounter<rtcp::Bye> bye_;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200111 PacketCounter<rtcp::ExtendedReports> xr_;
112 PacketCounter<rtcp::Fir> fir_;
113 PacketCounter<rtcp::Nack> nack_;
114 PacketCounter<rtcp::Pli> pli_;
115 PacketCounter<rtcp::RapidResyncRequest> rrr_;
116 PacketCounter<rtcp::ReceiverReport> receiver_report_;
Elad Alon7d6a4c02019-02-25 13:00:51 +0100117 PacketCounter<rtcp::LossNotification> loss_notification_;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200118 PacketCounter<rtcp::Remb> remb_;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200119 PacketCounter<rtcp::Sdes> sdes_;
120 PacketCounter<rtcp::SenderReport> sender_report_;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200121 PacketCounter<rtcp::Tmmbn> tmmbn_;
122 PacketCounter<rtcp::Tmmbr> tmmbr_;
123 PacketCounter<rtcp::TransportFeedback> transport_feedback_;
danilchap3dc929e2016-11-02 08:21:59 -0700124 uint32_t sender_ssrc_ = 0;
Elad Alone86af2c2019-06-03 14:37:50 +0200125 size_t processed_rtcp_packets_ = 0;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000126};
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200127
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000128} // namespace test
129} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200130#endif // TEST_RTCP_PACKET_PARSER_H_