blob: ef1fab823d30198c50d1aaaef520118c4d105947 [file] [log] [blame]
asapersson@webrtc.org663ba072014-02-21 08:14:451/*
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
Danil Chapovalovb9a66492016-09-02 16:29:1015#include "webrtc/base/array_view.h"
Danil Chapovalov5e79cc22016-03-17 12:15:0716#include "webrtc/base/checks.h"
Danil Chapovalovb9a66492016-09-02 16:29:1017#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
18#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
Danil Chapovalov5e79cc22016-03-17 12:15:0719#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
Danil Chapovalovb9a66492016-09-02 16:29:1020#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.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"
asapersson@webrtc.org663ba072014-02-21 08:14:4535
36namespace webrtc {
37namespace test {
Danil Chapovalov5e79cc22016-03-17 12:15:0738// Parse RTCP packet of given type. Assumes RTCP header is valid and that there
39// is excatly one packet of correct type in the buffer.
40template <typename Packet>
41bool ParseSinglePacket(const uint8_t* buffer, size_t size, Packet* packet) {
42 rtcp::CommonHeader header;
43 RTC_CHECK(header.Parse(buffer, size));
kwiberg13d93262016-11-28 23:58:5344 RTC_CHECK_EQ(size, header.NextPacket() - buffer);
Danil Chapovalov5e79cc22016-03-17 12:15:0745 return packet->Parse(header);
46}
47// Same function, but takes raw buffer as single argument instead of pair.
Danil Chapovalov5e79cc22016-03-17 12:15:0748template <typename Packet>
Danil Chapovalovb9a66492016-09-02 16:29:1049bool ParseSinglePacket(rtc::ArrayView<const uint8_t> buffer, Packet* packet) {
Danil Chapovalov5e79cc22016-03-17 12:15:0750 return ParseSinglePacket(buffer.data(), buffer.size(), packet);
51}
asapersson@webrtc.org663ba072014-02-21 08:14:4552
asapersson@webrtc.org663ba072014-02-21 08:14:4553class RtcpPacketParser {
54 public:
Danil Chapovalovb9a66492016-09-02 16:29:1055 // 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 }
danilchap09eb20c2016-11-02 15:21:5964 void Parse(const rtcp::CommonHeader& header, uint32_t* sender_ssrc) {
65 if (TypedRtcpPacket::Parse(header)) {
66 ++num_packets_;
67 if (*sender_ssrc == 0) // Use first sender ssrc in compound packet.
68 *sender_ssrc = TypedRtcpPacket::sender_ssrc();
69 }
70 }
Danil Chapovalovb9a66492016-09-02 16:29:1071
72 private:
73 int num_packets_ = 0;
74 };
75
asapersson@webrtc.org663ba072014-02-21 08:14:4576 RtcpPacketParser();
77 ~RtcpPacketParser();
78
Danil Chapovalovb9a66492016-09-02 16:29:1079 bool Parse(const void* packet, size_t packet_len);
asapersson@webrtc.org663ba072014-02-21 08:14:4580
Danil Chapovalovb9a66492016-09-02 16:29:1081 PacketCounter<rtcp::App>* app() { return &app_; }
82 PacketCounter<rtcp::Bye>* bye() { return &bye_; }
83 PacketCounter<rtcp::ExtendedJitterReport>* ij() { return &ij_; }
84 PacketCounter<rtcp::ExtendedReports>* xr() { return &xr_; }
85 PacketCounter<rtcp::Fir>* fir() { return &fir_; }
86 PacketCounter<rtcp::Nack>* nack() { return &nack_; }
87 PacketCounter<rtcp::Pli>* pli() { return &pli_; }
88 PacketCounter<rtcp::RapidResyncRequest>* rrr() { return &rrr_; }
89 PacketCounter<rtcp::ReceiverReport>* receiver_report() {
90 return &receiver_report_;
91 }
92 PacketCounter<rtcp::Remb>* remb() { return &remb_; }
93 PacketCounter<rtcp::Rpsi>* rpsi() { return &rpsi_; }
94 PacketCounter<rtcp::Sdes>* sdes() { return &sdes_; }
95 PacketCounter<rtcp::SenderReport>* sender_report() { return &sender_report_; }
96 PacketCounter<rtcp::Sli>* sli() { return &sli_; }
97 PacketCounter<rtcp::Tmmbn>* tmmbn() { return &tmmbn_; }
98 PacketCounter<rtcp::Tmmbr>* tmmbr() { return &tmmbr_; }
99 PacketCounter<rtcp::TransportFeedback>* transport_feedback() {
100 return &transport_feedback_;
101 }
danilchap09eb20c2016-11-02 15:21:59102 uint32_t sender_ssrc() const { return sender_ssrc_; }
asapersson@webrtc.org663ba072014-02-21 08:14:45103
104 private:
Danil Chapovalovb9a66492016-09-02 16:29:10105 PacketCounter<rtcp::App> app_;
106 PacketCounter<rtcp::Bye> bye_;
107 PacketCounter<rtcp::ExtendedJitterReport> ij_;
108 PacketCounter<rtcp::ExtendedReports> xr_;
109 PacketCounter<rtcp::Fir> fir_;
110 PacketCounter<rtcp::Nack> nack_;
111 PacketCounter<rtcp::Pli> pli_;
112 PacketCounter<rtcp::RapidResyncRequest> rrr_;
113 PacketCounter<rtcp::ReceiverReport> receiver_report_;
114 PacketCounter<rtcp::Remb> remb_;
115 PacketCounter<rtcp::Rpsi> rpsi_;
116 PacketCounter<rtcp::Sdes> sdes_;
117 PacketCounter<rtcp::SenderReport> sender_report_;
118 PacketCounter<rtcp::Sli> sli_;
119 PacketCounter<rtcp::Tmmbn> tmmbn_;
120 PacketCounter<rtcp::Tmmbr> tmmbr_;
121 PacketCounter<rtcp::TransportFeedback> transport_feedback_;
danilchap09eb20c2016-11-02 15:21:59122 uint32_t sender_ssrc_ = 0;
asapersson@webrtc.org663ba072014-02-21 08:14:45123};
Danil Chapovalovb9a66492016-09-02 16:29:10124
asapersson@webrtc.org663ba072014-02-21 08:14:45125} // namespace test
126} // namespace webrtc
127#endif // WEBRTC_TEST_RTCP_PACKET_PARSER_H_