blob: b9e430fe9fa0fece5237bcc49d9d7f440ea07755 [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
18RtcpPacketParser::RtcpPacketParser() {}
19
20RtcpPacketParser::~RtcpPacketParser() {}
21
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000022void RtcpPacketParser::Parse(const void *data, size_t len) {
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000023 const uint8_t* packet = static_cast<const uint8_t*>(data);
24 RTCPUtility::RTCPParserV2 parser(packet, len, true);
asapersson@webrtc.org37c05592015-01-28 13:58:27 +000025 EXPECT_TRUE(parser.IsValid());
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000026 for (RTCPUtility::RTCPPacketTypes type = parser.Begin();
27 type != RTCPUtility::kRtcpNotValidCode;
28 type = parser.Iterate()) {
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000029 switch (type) {
30 case RTCPUtility::kRtcpSrCode:
31 sender_report_.Set(parser.Packet().SR);
32 break;
33 case RTCPUtility::kRtcpRrCode:
34 receiver_report_.Set(parser.Packet().RR);
35 break;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000036 case RTCPUtility::kRtcpReportBlockItemCode:
37 report_block_.Set(parser.Packet().ReportBlockItem);
38 ++report_blocks_per_ssrc_[parser.Packet().ReportBlockItem.SSRC];
39 break;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000040 case RTCPUtility::kRtcpSdesCode:
41 sdes_.Set();
42 break;
43 case RTCPUtility::kRtcpSdesChunkCode:
44 sdes_chunk_.Set(parser.Packet().CName);
45 break;
46 case RTCPUtility::kRtcpByeCode:
47 bye_.Set(parser.Packet().BYE);
48 break;
49 case RTCPUtility::kRtcpAppCode:
50 app_.Set(parser.Packet().APP);
51 break;
52 case RTCPUtility::kRtcpAppItemCode:
53 app_item_.Set(parser.Packet().APP);
54 break;
55 case RTCPUtility::kRtcpExtendedIjCode:
56 ij_.Set();
57 break;
58 case RTCPUtility::kRtcpExtendedIjItemCode:
59 ij_item_.Set(parser.Packet().ExtendedJitterReportItem);
60 break;
61 case RTCPUtility::kRtcpPsfbPliCode:
62 pli_.Set(parser.Packet().PLI);
63 break;
64 case RTCPUtility::kRtcpPsfbSliCode:
65 sli_.Set(parser.Packet().SLI);
66 break;
67 case RTCPUtility::kRtcpPsfbSliItemCode:
68 sli_item_.Set(parser.Packet().SLIItem);
69 break;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +000070 case RTCPUtility::kRtcpPsfbRpsiCode:
71 rpsi_.Set(parser.Packet().RPSI);
72 break;
73 case RTCPUtility::kRtcpPsfbFirCode:
74 fir_.Set(parser.Packet().FIR);
75 break;
76 case RTCPUtility::kRtcpPsfbFirItemCode:
77 fir_item_.Set(parser.Packet().FIRItem);
78 break;
79 case RTCPUtility::kRtcpRtpfbNackCode:
80 nack_.Set(parser.Packet().NACK);
81 nack_item_.Clear();
82 break;
83 case RTCPUtility::kRtcpRtpfbNackItemCode:
84 nack_item_.Set(parser.Packet().NACKItem);
85 break;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +000086 case RTCPUtility::kRtcpPsfbAppCode:
87 psfb_app_.Set(parser.Packet().PSFBAPP);
88 break;
89 case RTCPUtility::kRtcpPsfbRembItemCode:
90 remb_item_.Set(parser.Packet().REMBItem);
91 break;
92 case RTCPUtility::kRtcpRtpfbTmmbrCode:
93 tmmbr_.Set(parser.Packet().TMMBR);
94 break;
95 case RTCPUtility::kRtcpRtpfbTmmbrItemCode:
96 tmmbr_item_.Set(parser.Packet().TMMBRItem);
97 break;
98 case RTCPUtility::kRtcpRtpfbTmmbnCode:
99 tmmbn_.Set(parser.Packet().TMMBN);
100 tmmbn_items_.Clear();
101 break;
102 case RTCPUtility::kRtcpRtpfbTmmbnItemCode:
103 tmmbn_items_.Set(parser.Packet().TMMBNItem);
104 break;
105 case RTCPUtility::kRtcpXrHeaderCode:
106 xr_header_.Set(parser.Packet().XR);
107 dlrr_items_.Clear();
108 break;
109 case RTCPUtility::kRtcpXrReceiverReferenceTimeCode:
110 rrtr_.Set(parser.Packet().XRReceiverReferenceTimeItem);
111 break;
112 case RTCPUtility::kRtcpXrDlrrReportBlockCode:
113 dlrr_.Set();
114 break;
115 case RTCPUtility::kRtcpXrDlrrReportBlockItemCode:
116 dlrr_items_.Set(parser.Packet().XRDLRRReportBlockItem);
117 break;
118 case RTCPUtility::kRtcpXrVoipMetricCode:
119 voip_metric_.Set(parser.Packet().XRVOIPMetricItem);
120 break;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000121 default:
122 break;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000123 }
124 }
125}
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000126
127uint64_t Rpsi::PictureId() const {
128 assert(num_packets_ > 0);
129 uint16_t num_bytes = rpsi_.NumberOfValidBits / 8;
130 assert(num_bytes > 0);
131 uint64_t picture_id = 0;
132 for (uint16_t i = 0; i < num_bytes - 1; ++i) {
133 picture_id += (rpsi_.NativeBitString[i] & 0x7f);
134 picture_id <<= 7;
135 }
136 picture_id += (rpsi_.NativeBitString[num_bytes - 1] & 0x7f);
137 return picture_id;
138}
139
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000140} // namespace test
141} // namespace webrtc