1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker *
10*d9f75844SAndroid Build Coastguard Worker */
11*d9f75844SAndroid Build Coastguard Worker
12*d9f75844SAndroid Build Coastguard Worker #ifndef TEST_RTCP_PACKET_PARSER_H_
13*d9f75844SAndroid Build Coastguard Worker #define TEST_RTCP_PACKET_PARSER_H_
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
16*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
19*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/app.h"
20*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
21*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/common_header.h"
22*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
23*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/fir.h"
24*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/loss_notification.h"
25*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/nack.h"
26*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/pli.h"
27*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
28*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
29*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/remb.h"
30*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/sdes.h"
31*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
32*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/tmmbn.h"
33*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
34*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
35*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
36*d9f75844SAndroid Build Coastguard Worker
37*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
38*d9f75844SAndroid Build Coastguard Worker namespace test {
39*d9f75844SAndroid Build Coastguard Worker // Parse RTCP packet of given type. Assumes RTCP header is valid and that there
40*d9f75844SAndroid Build Coastguard Worker // is excatly one packet of correct type in the buffer.
41*d9f75844SAndroid Build Coastguard Worker template <typename Packet>
ParseSinglePacket(const uint8_t * buffer,size_t size,Packet * packet)42*d9f75844SAndroid Build Coastguard Worker bool ParseSinglePacket(const uint8_t* buffer, size_t size, Packet* packet) {
43*d9f75844SAndroid Build Coastguard Worker rtcp::CommonHeader header;
44*d9f75844SAndroid Build Coastguard Worker RTC_CHECK(header.Parse(buffer, size));
45*d9f75844SAndroid Build Coastguard Worker RTC_CHECK_EQ(size, header.NextPacket() - buffer);
46*d9f75844SAndroid Build Coastguard Worker return packet->Parse(header);
47*d9f75844SAndroid Build Coastguard Worker }
48*d9f75844SAndroid Build Coastguard Worker // Same function, but takes raw buffer as single argument instead of pair.
49*d9f75844SAndroid Build Coastguard Worker template <typename Packet>
ParseSinglePacket(rtc::ArrayView<const uint8_t> buffer,Packet * packet)50*d9f75844SAndroid Build Coastguard Worker bool ParseSinglePacket(rtc::ArrayView<const uint8_t> buffer, Packet* packet) {
51*d9f75844SAndroid Build Coastguard Worker return ParseSinglePacket(buffer.data(), buffer.size(), packet);
52*d9f75844SAndroid Build Coastguard Worker }
53*d9f75844SAndroid Build Coastguard Worker
54*d9f75844SAndroid Build Coastguard Worker class RtcpPacketParser {
55*d9f75844SAndroid Build Coastguard Worker public:
56*d9f75844SAndroid Build Coastguard Worker // Keeps last parsed packet, count number of parsed packets of given type.
57*d9f75844SAndroid Build Coastguard Worker template <typename TypedRtcpPacket>
58*d9f75844SAndroid Build Coastguard Worker class PacketCounter : public TypedRtcpPacket {
59*d9f75844SAndroid Build Coastguard Worker public:
num_packets()60*d9f75844SAndroid Build Coastguard Worker int num_packets() const { return num_packets_; }
Parse(const rtcp::CommonHeader & header)61*d9f75844SAndroid Build Coastguard Worker void Parse(const rtcp::CommonHeader& header) {
62*d9f75844SAndroid Build Coastguard Worker if (TypedRtcpPacket::Parse(header))
63*d9f75844SAndroid Build Coastguard Worker ++num_packets_;
64*d9f75844SAndroid Build Coastguard Worker }
Parse(const rtcp::CommonHeader & header,uint32_t * sender_ssrc)65*d9f75844SAndroid Build Coastguard Worker bool Parse(const rtcp::CommonHeader& header, uint32_t* sender_ssrc) {
66*d9f75844SAndroid Build Coastguard Worker const bool result = TypedRtcpPacket::Parse(header);
67*d9f75844SAndroid Build Coastguard Worker if (result) {
68*d9f75844SAndroid Build Coastguard Worker ++num_packets_;
69*d9f75844SAndroid Build Coastguard Worker if (*sender_ssrc == 0) // Use first sender ssrc in compound packet.
70*d9f75844SAndroid Build Coastguard Worker *sender_ssrc = TypedRtcpPacket::sender_ssrc();
71*d9f75844SAndroid Build Coastguard Worker }
72*d9f75844SAndroid Build Coastguard Worker return result;
73*d9f75844SAndroid Build Coastguard Worker }
74*d9f75844SAndroid Build Coastguard Worker
75*d9f75844SAndroid Build Coastguard Worker private:
76*d9f75844SAndroid Build Coastguard Worker int num_packets_ = 0;
77*d9f75844SAndroid Build Coastguard Worker };
78*d9f75844SAndroid Build Coastguard Worker
79*d9f75844SAndroid Build Coastguard Worker RtcpPacketParser();
80*d9f75844SAndroid Build Coastguard Worker ~RtcpPacketParser();
81*d9f75844SAndroid Build Coastguard Worker
82*d9f75844SAndroid Build Coastguard Worker bool Parse(const void* packet, size_t packet_len);
83*d9f75844SAndroid Build Coastguard Worker
app()84*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::App>* app() { return &app_; }
bye()85*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Bye>* bye() { return &bye_; }
xr()86*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::ExtendedReports>* xr() { return &xr_; }
fir()87*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Fir>* fir() { return &fir_; }
nack()88*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Nack>* nack() { return &nack_; }
pli()89*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Pli>* pli() { return &pli_; }
rrr()90*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::RapidResyncRequest>* rrr() { return &rrr_; }
receiver_report()91*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::ReceiverReport>* receiver_report() {
92*d9f75844SAndroid Build Coastguard Worker return &receiver_report_;
93*d9f75844SAndroid Build Coastguard Worker }
loss_notification()94*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::LossNotification>* loss_notification() {
95*d9f75844SAndroid Build Coastguard Worker return &loss_notification_;
96*d9f75844SAndroid Build Coastguard Worker }
remb()97*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Remb>* remb() { return &remb_; }
sdes()98*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Sdes>* sdes() { return &sdes_; }
sender_report()99*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::SenderReport>* sender_report() { return &sender_report_; }
tmmbn()100*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Tmmbn>* tmmbn() { return &tmmbn_; }
tmmbr()101*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Tmmbr>* tmmbr() { return &tmmbr_; }
transport_feedback()102*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::TransportFeedback>* transport_feedback() {
103*d9f75844SAndroid Build Coastguard Worker return &transport_feedback_;
104*d9f75844SAndroid Build Coastguard Worker }
sender_ssrc()105*d9f75844SAndroid Build Coastguard Worker uint32_t sender_ssrc() const { return sender_ssrc_; }
processed_rtcp_packets()106*d9f75844SAndroid Build Coastguard Worker size_t processed_rtcp_packets() const { return processed_rtcp_packets_; }
107*d9f75844SAndroid Build Coastguard Worker
108*d9f75844SAndroid Build Coastguard Worker private:
109*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::App> app_;
110*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Bye> bye_;
111*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::ExtendedReports> xr_;
112*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Fir> fir_;
113*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Nack> nack_;
114*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Pli> pli_;
115*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::RapidResyncRequest> rrr_;
116*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::ReceiverReport> receiver_report_;
117*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::LossNotification> loss_notification_;
118*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Remb> remb_;
119*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Sdes> sdes_;
120*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::SenderReport> sender_report_;
121*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Tmmbn> tmmbn_;
122*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::Tmmbr> tmmbr_;
123*d9f75844SAndroid Build Coastguard Worker PacketCounter<rtcp::TransportFeedback> transport_feedback_;
124*d9f75844SAndroid Build Coastguard Worker uint32_t sender_ssrc_ = 0;
125*d9f75844SAndroid Build Coastguard Worker size_t processed_rtcp_packets_ = 0;
126*d9f75844SAndroid Build Coastguard Worker };
127*d9f75844SAndroid Build Coastguard Worker
128*d9f75844SAndroid Build Coastguard Worker } // namespace test
129*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
130*d9f75844SAndroid Build Coastguard Worker #endif // TEST_RTCP_PACKET_PARSER_H_
131