blob: 94f500fe573a88bd882226a9a145e54822980162 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "test/rtcp_packet_parser.h"
Yves Gerey3e707812018-11-28 16:47:49 +010012
13#include "modules/rtp_rtcp/source/rtcp_packet/psfb.h"
14#include "modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/checks.h"
16#include "rtc_base/logging.h"
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000017
18namespace webrtc {
19namespace test {
20
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020021RtcpPacketParser::RtcpPacketParser() = default;
22RtcpPacketParser::~RtcpPacketParser() = default;
Erik Språng242e22b2015-05-11 10:17:43 +020023
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020024bool RtcpPacketParser::Parse(const void* data, size_t length) {
Elad Alone86af2c2019-06-03 14:37:50 +020025 ++processed_rtcp_packets_;
26
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020027 const uint8_t* const buffer = static_cast<const uint8_t*>(data);
28 const uint8_t* const buffer_end = buffer + length;
Elad Alone86af2c2019-06-03 14:37:50 +020029
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020030 rtcp::CommonHeader header;
31 for (const uint8_t* next_packet = buffer; next_packet != buffer_end;
32 next_packet = header.NextPacket()) {
33 RTC_DCHECK_GT(buffer_end - next_packet, 0);
34 if (!header.Parse(next_packet, buffer_end - next_packet)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010035 RTC_LOG(LS_WARNING)
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020036 << "Invalid rtcp header or unaligned rtcp packet at position "
37 << (next_packet - buffer);
38 return false;
39 }
40 switch (header.type()) {
41 case rtcp::App::kPacketType:
42 app_.Parse(header);
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000043 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020044 case rtcp::Bye::kPacketType:
danilchap3dc929e2016-11-02 08:21:59 -070045 bye_.Parse(header, &sender_ssrc_);
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000046 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020047 case rtcp::ExtendedReports::kPacketType:
danilchap3dc929e2016-11-02 08:21:59 -070048 xr_.Parse(header, &sender_ssrc_);
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000049 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020050 case rtcp::ExtendedJitterReport::kPacketType:
51 ij_.Parse(header);
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000052 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020053 case rtcp::Psfb::kPacketType:
54 switch (header.fmt()) {
55 case rtcp::Fir::kFeedbackMessageType:
danilchap3dc929e2016-11-02 08:21:59 -070056 fir_.Parse(header, &sender_ssrc_);
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020057 break;
58 case rtcp::Pli::kFeedbackMessageType:
danilchap3dc929e2016-11-02 08:21:59 -070059 pli_.Parse(header, &sender_ssrc_);
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020060 break;
Elad Alon74f0a512019-02-23 22:16:52 +010061 case rtcp::Psfb::kAfbMessageType:
Elad Alon7d6a4c02019-02-25 13:00:51 +010062 if (!loss_notification_.Parse(header, &sender_ssrc_) &&
63 !remb_.Parse(header, &sender_ssrc_)) {
64 RTC_LOG(LS_WARNING) << "Unknown application layer FB message.";
65 }
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020066 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020067 default:
Mirko Bonadei675513b2017-11-09 11:09:25 +010068 RTC_LOG(LS_WARNING)
69 << "Unknown rtcp payload specific feedback type "
70 << header.fmt();
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020071 break;
72 }
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000073 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020074 case rtcp::ReceiverReport::kPacketType:
danilchap3dc929e2016-11-02 08:21:59 -070075 receiver_report_.Parse(header, &sender_ssrc_);
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000076 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020077 case rtcp::Rtpfb::kPacketType:
78 switch (header.fmt()) {
79 case rtcp::Nack::kFeedbackMessageType:
danilchap3dc929e2016-11-02 08:21:59 -070080 nack_.Parse(header, &sender_ssrc_);
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020081 break;
82 case rtcp::RapidResyncRequest::kFeedbackMessageType:
danilchap3dc929e2016-11-02 08:21:59 -070083 rrr_.Parse(header, &sender_ssrc_);
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020084 break;
85 case rtcp::Tmmbn::kFeedbackMessageType:
danilchap3dc929e2016-11-02 08:21:59 -070086 tmmbn_.Parse(header, &sender_ssrc_);
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020087 break;
88 case rtcp::Tmmbr::kFeedbackMessageType:
danilchap3dc929e2016-11-02 08:21:59 -070089 tmmbr_.Parse(header, &sender_ssrc_);
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020090 break;
91 case rtcp::TransportFeedback::kFeedbackMessageType:
danilchap3dc929e2016-11-02 08:21:59 -070092 transport_feedback_.Parse(header, &sender_ssrc_);
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020093 break;
94 default:
Mirko Bonadei675513b2017-11-09 11:09:25 +010095 RTC_LOG(LS_WARNING)
96 << "Unknown rtcp transport feedback type " << header.fmt();
Danil Chapovalovba6f7be2016-09-02 18:29:10 +020097 break;
98 }
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000099 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200100 case rtcp::Sdes::kPacketType:
101 sdes_.Parse(header);
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000102 break;
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200103 case rtcp::SenderReport::kPacketType:
danilchap3dc929e2016-11-02 08:21:59 -0700104 sender_report_.Parse(header, &sender_ssrc_);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000105 break;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000106 default:
Mirko Bonadei675513b2017-11-09 11:09:25 +0100107 RTC_LOG(LS_WARNING) << "Unknown rtcp packet type " << header.type();
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000108 break;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000109 }
110 }
Danil Chapovalovba6f7be2016-09-02 18:29:10 +0200111 return true;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000112}
113
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000114} // namespace test
115} // namespace webrtc