asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 1 | /* |
| 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 Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 12 | #ifndef TEST_RTCP_PACKET_PARSER_H_ |
| 13 | #define TEST_RTCP_PACKET_PARSER_H_ |
asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 14 | |
Yves Gerey | 3e70781 | 2018-11-28 15:47:49 | [diff] [blame] | 15 | #include <stddef.h> |
| 16 | #include <stdint.h> |
| 17 | |
Mirko Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 18 | #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 Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 22 | #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" |
| 23 | #include "modules/rtp_rtcp/source/rtcp_packet/fir.h" |
Elad Alon | 7d6a4c0 | 2019-02-25 12:00:51 | [diff] [blame] | 24 | #include "modules/rtp_rtcp/source/rtcp_packet/loss_notification.h" |
Mirko Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 25 | #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.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 36 | |
| 37 | namespace webrtc { |
| 38 | namespace test { |
Danil Chapovalov | b4c8247 | 2016-03-17 12:15:07 | [diff] [blame] | 39 | // 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. |
| 41 | template <typename Packet> |
| 42 | bool ParseSinglePacket(const uint8_t* buffer, size_t size, Packet* packet) { |
| 43 | rtcp::CommonHeader header; |
| 44 | RTC_CHECK(header.Parse(buffer, size)); |
kwiberg | 352444f | 2016-11-28 23:58:53 | [diff] [blame] | 45 | RTC_CHECK_EQ(size, header.NextPacket() - buffer); |
Danil Chapovalov | b4c8247 | 2016-03-17 12:15:07 | [diff] [blame] | 46 | return packet->Parse(header); |
| 47 | } |
| 48 | // Same function, but takes raw buffer as single argument instead of pair. |
Danil Chapovalov | b4c8247 | 2016-03-17 12:15:07 | [diff] [blame] | 49 | template <typename Packet> |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 50 | bool ParseSinglePacket(rtc::ArrayView<const uint8_t> buffer, Packet* packet) { |
Danil Chapovalov | b4c8247 | 2016-03-17 12:15:07 | [diff] [blame] | 51 | return ParseSinglePacket(buffer.data(), buffer.size(), packet); |
| 52 | } |
asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 53 | |
asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 54 | class RtcpPacketParser { |
| 55 | public: |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 56 | // 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 Alon | 7d6a4c0 | 2019-02-25 12:00:51 | [diff] [blame] | 65 | bool Parse(const rtcp::CommonHeader& header, uint32_t* sender_ssrc) { |
| 66 | const bool result = TypedRtcpPacket::Parse(header); |
| 67 | if (result) { |
danilchap | 3dc929e | 2016-11-02 15:21:59 | [diff] [blame] | 68 | ++num_packets_; |
| 69 | if (*sender_ssrc == 0) // Use first sender ssrc in compound packet. |
| 70 | *sender_ssrc = TypedRtcpPacket::sender_ssrc(); |
| 71 | } |
Elad Alon | 7d6a4c0 | 2019-02-25 12:00:51 | [diff] [blame] | 72 | return result; |
danilchap | 3dc929e | 2016-11-02 15:21:59 | [diff] [blame] | 73 | } |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 74 | |
| 75 | private: |
| 76 | int num_packets_ = 0; |
| 77 | }; |
| 78 | |
asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 79 | RtcpPacketParser(); |
| 80 | ~RtcpPacketParser(); |
| 81 | |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 82 | bool Parse(const void* packet, size_t packet_len); |
asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 83 | |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 84 | PacketCounter<rtcp::App>* app() { return &app_; } |
| 85 | PacketCounter<rtcp::Bye>* bye() { return &bye_; } |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 86 | 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 Alon | 7d6a4c0 | 2019-02-25 12:00:51 | [diff] [blame] | 94 | PacketCounter<rtcp::LossNotification>* loss_notification() { |
| 95 | return &loss_notification_; |
| 96 | } |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 97 | PacketCounter<rtcp::Remb>* remb() { return &remb_; } |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 98 | PacketCounter<rtcp::Sdes>* sdes() { return &sdes_; } |
| 99 | PacketCounter<rtcp::SenderReport>* sender_report() { return &sender_report_; } |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 100 | PacketCounter<rtcp::Tmmbn>* tmmbn() { return &tmmbn_; } |
| 101 | PacketCounter<rtcp::Tmmbr>* tmmbr() { return &tmmbr_; } |
| 102 | PacketCounter<rtcp::TransportFeedback>* transport_feedback() { |
| 103 | return &transport_feedback_; |
| 104 | } |
danilchap | 3dc929e | 2016-11-02 15:21:59 | [diff] [blame] | 105 | uint32_t sender_ssrc() const { return sender_ssrc_; } |
Elad Alon | e86af2c | 2019-06-03 12:37:50 | [diff] [blame] | 106 | size_t processed_rtcp_packets() const { return processed_rtcp_packets_; } |
asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 107 | |
| 108 | private: |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 109 | PacketCounter<rtcp::App> app_; |
| 110 | PacketCounter<rtcp::Bye> bye_; |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 111 | 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 Alon | 7d6a4c0 | 2019-02-25 12:00:51 | [diff] [blame] | 117 | PacketCounter<rtcp::LossNotification> loss_notification_; |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 118 | PacketCounter<rtcp::Remb> remb_; |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 119 | PacketCounter<rtcp::Sdes> sdes_; |
| 120 | PacketCounter<rtcp::SenderReport> sender_report_; |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 121 | PacketCounter<rtcp::Tmmbn> tmmbn_; |
| 122 | PacketCounter<rtcp::Tmmbr> tmmbr_; |
| 123 | PacketCounter<rtcp::TransportFeedback> transport_feedback_; |
danilchap | 3dc929e | 2016-11-02 15:21:59 | [diff] [blame] | 124 | uint32_t sender_ssrc_ = 0; |
Elad Alon | e86af2c | 2019-06-03 12:37:50 | [diff] [blame] | 125 | size_t processed_rtcp_packets_ = 0; |
asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 126 | }; |
Danil Chapovalov | ba6f7be | 2016-09-02 16:29:10 | [diff] [blame] | 127 | |
asapersson@webrtc.org | 0f2809a | 2014-02-21 08:14:45 | [diff] [blame] | 128 | } // namespace test |
| 129 | } // namespace webrtc |
Mirko Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 130 | #endif // TEST_RTCP_PACKET_PARSER_H_ |