blob: 2eb48c11a37b99ef44a9b6599504b05032194c18 [file] [log] [blame]
asapersson@webrtc.org0f2809a2014-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
Danil Chapovalovba6f7be2016-09-02 16:29:1011#include "webrtc/base/checks.h"
12#include "webrtc/base/logging.h"
asapersson@webrtc.org0f2809a2014-02-21 08:14:4513#include "webrtc/test/rtcp_packet_parser.h"
14
15namespace webrtc {
16namespace test {
17
Danil Chapovalovba6f7be2016-09-02 16:29:1018RtcpPacketParser::RtcpPacketParser() = default;
19RtcpPacketParser::~RtcpPacketParser() = default;
Erik Språng242e22b2015-05-11 08:17:4320
Danil Chapovalovba6f7be2016-09-02 16:29:1021bool RtcpPacketParser::Parse(const void* data, size_t length) {
22 const uint8_t* const buffer = static_cast<const uint8_t*>(data);
23 const uint8_t* const buffer_end = buffer + length;
24 rtcp::CommonHeader header;
25 for (const uint8_t* next_packet = buffer; next_packet != buffer_end;
26 next_packet = header.NextPacket()) {
27 RTC_DCHECK_GT(buffer_end - next_packet, 0);
28 if (!header.Parse(next_packet, buffer_end - next_packet)) {
29 LOG(LS_WARNING)
30 << "Invalid rtcp header or unaligned rtcp packet at position "
31 << (next_packet - buffer);
32 return false;
33 }
34 switch (header.type()) {
35 case rtcp::App::kPacketType:
36 app_.Parse(header);
asapersson@webrtc.orga8260062014-05-20 09:53:5137 break;
Danil Chapovalovba6f7be2016-09-02 16:29:1038 case rtcp::Bye::kPacketType:
39 bye_.Parse(header);
asapersson@webrtc.orga8260062014-05-20 09:53:5140 break;
Danil Chapovalovba6f7be2016-09-02 16:29:1041 case rtcp::ExtendedReports::kPacketType:
42 xr_.Parse(header);
asapersson@webrtc.orga8260062014-05-20 09:53:5143 break;
Danil Chapovalovba6f7be2016-09-02 16:29:1044 case rtcp::ExtendedJitterReport::kPacketType:
45 ij_.Parse(header);
asapersson@webrtc.org4b12d402014-06-16 14:09:2846 break;
Danil Chapovalovba6f7be2016-09-02 16:29:1047 case rtcp::Psfb::kPacketType:
48 switch (header.fmt()) {
49 case rtcp::Fir::kFeedbackMessageType:
50 fir_.Parse(header);
51 break;
52 case rtcp::Pli::kFeedbackMessageType:
53 pli_.Parse(header);
54 break;
55 case rtcp::Remb::kFeedbackMessageType:
56 remb_.Parse(header);
57 break;
58 case rtcp::Rpsi::kFeedbackMessageType:
59 rpsi_.Parse(header);
60 break;
61 case rtcp::Sli::kFeedbackMessageType:
62 sli_.Parse(header);
63 break;
64 default:
65 LOG(LS_WARNING) << "Unknown rtcp payload specific feedback type "
66 << header.fmt();
67 break;
68 }
asapersson@webrtc.org4b12d402014-06-16 14:09:2869 break;
Danil Chapovalovba6f7be2016-09-02 16:29:1070 case rtcp::ReceiverReport::kPacketType:
71 receiver_report_.Parse(header);
asapersson@webrtc.org4b12d402014-06-16 14:09:2872 break;
Danil Chapovalovba6f7be2016-09-02 16:29:1073 case rtcp::Rtpfb::kPacketType:
74 switch (header.fmt()) {
75 case rtcp::Nack::kFeedbackMessageType:
76 nack_.Parse(header);
77 break;
78 case rtcp::RapidResyncRequest::kFeedbackMessageType:
79 rrr_.Parse(header);
80 break;
81 case rtcp::Tmmbn::kFeedbackMessageType:
82 tmmbn_.Parse(header);
83 break;
84 case rtcp::Tmmbr::kFeedbackMessageType:
85 tmmbr_.Parse(header);
86 break;
87 case rtcp::TransportFeedback::kFeedbackMessageType:
88 transport_feedback_.Parse(header);
89 break;
90 default:
91 LOG(LS_WARNING) << "Unknown rtcp transport feedback type "
92 << header.fmt();
93 break;
94 }
asapersson@webrtc.org4b12d402014-06-16 14:09:2895 break;
Danil Chapovalovba6f7be2016-09-02 16:29:1096 case rtcp::Sdes::kPacketType:
97 sdes_.Parse(header);
asapersson@webrtc.org4b12d402014-06-16 14:09:2898 break;
Danil Chapovalovba6f7be2016-09-02 16:29:1099 case rtcp::SenderReport::kPacketType:
100 sender_report_.Parse(header);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17101 break;
asapersson@webrtc.orga8260062014-05-20 09:53:51102 default:
Danil Chapovalovba6f7be2016-09-02 16:29:10103 LOG(LS_WARNING) << "Unknown rtcp packet type " << header.type();
asapersson@webrtc.orga8260062014-05-20 09:53:51104 break;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45105 }
106 }
Danil Chapovalovba6f7be2016-09-02 16:29:10107 return true;
asapersson@webrtc.orga8260062014-05-20 09:53:51108}
109
asapersson@webrtc.org0f2809a2014-02-21 08:14:45110} // namespace test
111} // namespace webrtc