1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MEDIA_CAST_RTCP_RTCP_UTILITY_H_
6 #define MEDIA_CAST_RTCP_RTCP_UTILITY_H_
8 #include "media/cast/cast_config.h"
9 #include "media/cast/cast_defines.h"
10 #include "media/cast/rtcp/rtcp_defines.h"
15 static const int kRtcpRpsiDataSize = 30;
17 // RFC 3550 page 44, including end null.
18 static const size_t kRtcpCnameSize = 256;
19 static const int kRtcpMaxNumberOfRembFeedbackSsrcs = 255;
21 static const uint32 kRemb = ('R' << 24) + ('E' << 16) + ('M' << 8) + 'B';
22 static const uint32 kCast = ('C' << 24) + ('A' << 16) + ('S' << 8) + 'T';
24 struct RtcpFieldReceiverReport {
27 uint8 number_of_report_blocks;
30 struct RtcpFieldSenderReport {
33 uint8 number_of_report_blocks;
34 uint32 ntp_most_significant;
35 uint32 ntp_least_significant;
37 uint32 sender_packet_count;
38 uint32 sender_octet_count;
41 struct RtcpFieldReportBlockItem {
45 uint32 cumulative_number_of_packets_lost;
46 uint32 extended_highest_sequence_number;
48 uint32 last_sender_report;
49 uint32 delay_last_sender_report;
52 struct RtcpFieldSdesCName {
55 char name[kRtcpCnameSize];
63 struct RtcpFieldGenericRtpFeedbackNack {
69 struct RtcpFieldGenericRtpFeedbackNackItem {
75 struct RtcpFieldPayloadSpecificFir {
78 uint32 media_ssrc; // zero!
81 struct RtcpFieldPayloadSpecificFirItem {
84 uint8 command_sequence_number;
87 struct RtcpFieldPayloadSpecificPli {
93 struct RtcpFieldPayloadSpecificRpsi {
98 uint16 number_of_valid_bits;
99 uint8 native_bit_string[kRtcpRpsiDataSize];
107 struct RtcpFieldXrRrtr {
109 uint32 ntp_most_significant;
110 uint32 ntp_least_significant;
113 struct RtcpFieldXrDlrr {
115 uint32 receivers_ssrc;
116 uint32 last_receiver_report;
117 uint32 delay_last_receiver_report;
120 struct RtcpFieldPayloadSpecificApplication {
125 struct RtcpFieldPayloadSpecificRembItem {
127 uint8 number_of_ssrcs;
128 uint32 ssrcs[kRtcpMaxNumberOfRembFeedbackSsrcs];
131 struct RtcpFieldPayloadSpecificCastItem {
133 uint8 number_of_lost_fields;
136 struct RtcpFieldPayloadSpecificCastNackItem {
143 RtcpFieldReceiverReport receiver_report;
144 RtcpFieldSenderReport sender_report;
145 RtcpFieldReportBlockItem report_block_item;
146 RtcpFieldSdesCName c_name;
149 RtcpFieldXr extended_report;
150 RtcpFieldXrRrtr rrtr;
151 RtcpFieldXrDlrr dlrr;
153 RtcpFieldGenericRtpFeedbackNack nack;
154 RtcpFieldGenericRtpFeedbackNackItem nack_item;
156 RtcpFieldPayloadSpecificPli pli;
157 RtcpFieldPayloadSpecificRpsi rpsi;
158 RtcpFieldPayloadSpecificFir fir;
159 RtcpFieldPayloadSpecificFirItem fir_item;
160 RtcpFieldPayloadSpecificApplication application_specific;
161 RtcpFieldPayloadSpecificRembItem remb_item;
162 RtcpFieldPayloadSpecificCastItem cast_item;
163 RtcpFieldPayloadSpecificCastNackItem cast_nack_item;
166 enum RtcpFieldTypes {
172 kRtcpReportBlockItemCode,
182 kRtcpXrUnknownItemCode,
185 kRtcpGenericRtpFeedbackNackCode,
186 kRtcpGenericRtpFeedbackNackItemCode,
188 kRtcpPayloadSpecificPliCode,
189 kRtcpPayloadSpecificRpsiCode,
190 kRtcpPayloadSpecificAppCode,
192 kRtcpPayloadSpecificRembCode,
193 kRtcpPayloadSpecificRembItemCode,
194 kRtcpPayloadSpecificCastCode,
195 kRtcpPayloadSpecificCastNackItemCode,
198 kRtcpPayloadSpecificFirCode,
199 kRtcpPayloadSpecificFirItemCode,
202 kRtcpGenericRtpFeedbackSrReqCode,
205 struct RtcpCommonHeader {
208 uint8 IC; // Item count / subtype.
209 uint8 PT; // Packet Type.
210 uint16 length_in_octets;
213 enum RtcpPacketTypes {
214 kPacketTypeLow = 194, // SMPTE time-code mapping.
215 kPacketTypeInterArrivalJitterReport = 195,
216 kPacketTypeSenderReport = 200,
217 kPacketTypeReceiverReport = 201,
218 kPacketTypeSdes= 202,
219 kPacketTypeBye = 203,
220 kPacketTypeApplicationDefined = 204,
221 kPacketTypeGenericRtpFeedback = 205,
222 kPacketTypePayloadSpecific = 206,
224 kPacketTypeHigh = 210, // Port Mapping.
229 RtcpParser(const uint8* rtcp_data, size_t rtcp_length);
232 RtcpFieldTypes FieldType() const;
233 const RtcpField& Field() const;
235 bool IsValid() const;
237 RtcpFieldTypes Begin();
238 RtcpFieldTypes Iterate();
242 kStateTopLevel, // Top level packet
243 kStateReportBlock, // Sender/Receiver report report blocks.
246 kStateExtendedReportBlock,
247 kStateExtendedReportDelaySinceLastReceiverReport,
248 kStateGenericRtpFeedbackNack,
249 kStatePayloadSpecificRpsi,
250 kStatePayloadSpecificFir,
251 kStatePayloadSpecificApplication,
252 kStatePayloadSpecificRemb, // Application specific Remb.
253 kStatePayloadSpecificCast, // Application specific Cast.
254 kStatePayloadSpecificCastNack, // Application specific Nack for Cast.
257 bool RtcpParseCommonHeader(const uint8* begin,
259 RtcpCommonHeader* parsed_header) const;
261 void IterateTopLevel();
262 void IterateReportBlockItem();
263 void IterateSdesItem();
264 void IterateByeItem();
265 void IterateExtendedReportItem();
266 void IterateExtendedReportDelaySinceLastReceiverReportItem();
267 void IterateNackItem();
268 void IterateRpsiItem();
269 void IterateFirItem();
270 void IteratePayloadSpecificAppItem();
271 void IteratePayloadSpecificRembItem();
272 void IteratePayloadSpecificCastItem();
273 void IteratePayloadSpecificCastNackItem();
276 void EndCurrentBlock();
280 bool ParseReportBlockItem();
283 bool ParseSdesItem();
284 bool ParseSdesTypes();
288 bool ParseExtendedReport();
289 bool ParseExtendedReportItem();
290 bool ParseExtendedReportReceiverReferenceTimeReport();
291 bool ParseExtendedReportDelaySinceLastReceiverReport();
293 bool ParseFeedBackCommon(const RtcpCommonHeader& header);
294 bool ParseNackItem();
295 bool ParseRpsiItem();
297 bool ParsePayloadSpecificAppItem();
298 bool ParsePayloadSpecificRembItem();
299 bool ParsePayloadSpecificCastItem();
300 bool ParsePayloadSpecificCastNackItem();
303 const uint8* const rtcp_data_begin_;
304 const uint8* const rtcp_data_end_;
307 const uint8* rtcp_data_;
308 const uint8* rtcp_block_end_;
311 uint8 number_of_blocks_;
312 RtcpFieldTypes field_type_;
315 DISALLOW_COPY_AND_ASSIGN(RtcpParser);
321 #endif // MEDIA_CAST_RTCP_RTCP_UTILITY_H_