blob: 8ce249e0b6f4f0185cad17488464c437101971b1 [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
11#include "webrtc/test/rtcp_packet_parser.h"
12
asapersson@webrtc.org37c05592015-01-28 13:58:27 +000013#include "testing/gtest/include/gtest/gtest.h"
14
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000015namespace webrtc {
16namespace test {
17
Erik Språng242e22b2015-05-11 10:17:43 +020018using namespace RTCPUtility;
19
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000020RtcpPacketParser::RtcpPacketParser() {}
21
22RtcpPacketParser::~RtcpPacketParser() {}
23
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000024void RtcpPacketParser::Parse(const void *data, size_t len) {
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000025 const uint8_t* packet = static_cast<const uint8_t*>(data);
26 RTCPUtility::RTCPParserV2 parser(packet, len, true);
asapersson@webrtc.org37c05592015-01-28 13:58:27 +000027 EXPECT_TRUE(parser.IsValid());
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000028 for (RTCPUtility::RTCPPacketTypes type = parser.Begin();
Erik Språng242e22b2015-05-11 10:17:43 +020029 type != RTCPPacketTypes::kInvalid; type = parser.Iterate()) {
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000030 switch (type) {
Erik Språng242e22b2015-05-11 10:17:43 +020031 case RTCPPacketTypes::kSr:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000032 sender_report_.Set(parser.Packet().SR);
33 break;
Erik Språng242e22b2015-05-11 10:17:43 +020034 case RTCPPacketTypes::kRr:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000035 receiver_report_.Set(parser.Packet().RR);
36 break;
Erik Språng242e22b2015-05-11 10:17:43 +020037 case RTCPPacketTypes::kReportBlockItem:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000038 report_block_.Set(parser.Packet().ReportBlockItem);
39 ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC];
40 break;
Erik Språng242e22b2015-05-11 10:17:43 +020041 case RTCPPacketTypes::kSdes:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000042 sdes_.Set();
43 break;
Erik Språng242e22b2015-05-11 10:17:43 +020044 case RTCPPacketTypes::kSdesChunk:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000045 sdes_chunk_.Set(parser.Packet().CName);
46 break;
Erik Språng242e22b2015-05-11 10:17:43 +020047 case RTCPPacketTypes::kBye:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000048 bye_.Set(parser.Packet().BYE);
49 break;
Erik Språng242e22b2015-05-11 10:17:43 +020050 case RTCPPacketTypes::kApp:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000051 app_.Set(parser.Packet().APP);
52 break;
Erik Språng242e22b2015-05-11 10:17:43 +020053 case RTCPPacketTypes::kAppItem:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000054 app_item_.Set(parser.Packet().APP);
55 break;
Erik Språng242e22b2015-05-11 10:17:43 +020056 case RTCPPacketTypes::kExtendedIj:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000057 ij_.Set();
58 break;
Erik Språng242e22b2015-05-11 10:17:43 +020059 case RTCPPacketTypes::kExtendedIjItem:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000060 ij_item_.Set(parser.Packet().ExtendedJitterReportItem);
61 break;
Erik Språng242e22b2015-05-11 10:17:43 +020062 case RTCPPacketTypes::kPsfbPli:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000063 pli_.Set(parser.Packet().PLI);
64 break;
Erik Språng242e22b2015-05-11 10:17:43 +020065 case RTCPPacketTypes::kPsfbSli:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000066 sli_.Set(parser.Packet().SLI);
67 break;
Erik Språng242e22b2015-05-11 10:17:43 +020068 case RTCPPacketTypes::kPsfbSliItem:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000069 sli_item_.Set(parser.Packet().SLIItem);
70 break;
Erik Språng242e22b2015-05-11 10:17:43 +020071 case RTCPPacketTypes::kPsfbRpsi:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000072 rpsi_.Set(parser.Packet().RPSI);
73 break;
Erik Språng242e22b2015-05-11 10:17:43 +020074 case RTCPPacketTypes::kPsfbFir:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000075 fir_.Set(parser.Packet().FIR);
76 break;
Erik Språng242e22b2015-05-11 10:17:43 +020077 case RTCPPacketTypes::kPsfbFirItem:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000078 fir_item_.Set(parser.Packet().FIRItem);
79 break;
Erik Språng242e22b2015-05-11 10:17:43 +020080 case RTCPPacketTypes::kRtpfbNack:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000081 nack_.Set(parser.Packet().NACK);
82 nack_item_.Clear();
83 break;
Erik Språng242e22b2015-05-11 10:17:43 +020084 case RTCPPacketTypes::kRtpfbNackItem:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000085 nack_item_.Set(parser.Packet().NACKItem);
86 break;
Erik Språng242e22b2015-05-11 10:17:43 +020087 case RTCPPacketTypes::kPsfbApp:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +000088 psfb_app_.Set(parser.Packet().PSFBAPP);
89 break;
Erik Språng242e22b2015-05-11 10:17:43 +020090 case RTCPPacketTypes::kPsfbRembItem:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +000091 remb_item_.Set(parser.Packet().REMBItem);
92 break;
Erik Språng242e22b2015-05-11 10:17:43 +020093 case RTCPPacketTypes::kRtpfbTmmbr:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +000094 tmmbr_.Set(parser.Packet().TMMBR);
95 break;
Erik Språng242e22b2015-05-11 10:17:43 +020096 case RTCPPacketTypes::kRtpfbTmmbrItem:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +000097 tmmbr_item_.Set(parser.Packet().TMMBRItem);
98 break;
Erik Språng242e22b2015-05-11 10:17:43 +020099 case RTCPPacketTypes::kRtpfbTmmbn:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000100 tmmbn_.Set(parser.Packet().TMMBN);
101 tmmbn_items_.Clear();
102 break;
Erik Språng242e22b2015-05-11 10:17:43 +0200103 case RTCPPacketTypes::kRtpfbTmmbnItem:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000104 tmmbn_items_.Set(parser.Packet().TMMBNItem);
105 break;
Erik Språng242e22b2015-05-11 10:17:43 +0200106 case RTCPPacketTypes::kXrHeader:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000107 xr_header_.Set(parser.Packet().XR);
108 dlrr_items_.Clear();
109 break;
Erik Språng242e22b2015-05-11 10:17:43 +0200110 case RTCPPacketTypes::kXrReceiverReferenceTime:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000111 rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem);
112 break;
Erik Språng242e22b2015-05-11 10:17:43 +0200113 case RTCPPacketTypes::kXrDlrrReportBlock:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000114 dlrr_.Set();
115 break;
Erik Språng242e22b2015-05-11 10:17:43 +0200116 case RTCPPacketTypes::kXrDlrrReportBlockItem:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000117 dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem);
118 break;
Erik Språng242e22b2015-05-11 10:17:43 +0200119 case RTCPPacketTypes::kXrVoipMetric:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000120 voip_metric_.Set(parser.Packet().XRVOIPMetricItem);
121 break;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000122 default:
123 break;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000124 }
125 }
126}
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000127
128uint64_t Rpsi::PictureId() const {
129 assert(num_packets_ > 0);
130 uint16_t num_bytes = rpsi_.NumberOfValidBits / 8;
131 assert(num_bytes > 0);
132 uint64_t picture_id = 0;
133 for (uint16_t i = 0; i < num_bytes - 1; ++i) {
134 picture_id += (rpsi_.NativeBitString[i] & 0x7f);
135 picture_id <<= 7;
136 }
137 picture_id += (rpsi_.NativeBitString[num_bytes - 1] & 0x7f);
138 return picture_id;
139}
140
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000141} // namespace test
142} // namespace webrtc