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 static const uint8 kSenderLogSubtype = 1;
25 static const uint8 kReceiverLogSubtype = 2;
27 static const size_t kRtcpMaxReceiverLogMessages = 256;
28 static const size_t kRtcpMaxNackFields = 253;
29 static const size_t kRtcpMaxCastLossFields = 100;
31 struct RtcpFieldReceiverReport {
34 uint8 number_of_report_blocks;
37 struct RtcpFieldSenderReport {
40 uint8 number_of_report_blocks;
41 uint32 ntp_most_significant;
42 uint32 ntp_least_significant;
44 uint32 sender_packet_count;
45 uint32 sender_octet_count;
48 struct RtcpFieldReportBlockItem {
52 uint32 cumulative_number_of_packets_lost;
53 uint32 extended_highest_sequence_number;
55 uint32 last_sender_report;
56 uint32 delay_last_sender_report;
59 struct RtcpFieldSdesCName {
62 char name[kRtcpCnameSize];
70 struct RtcpFieldGenericRtpFeedbackNack {
76 struct RtcpFieldGenericRtpFeedbackNackItem {
82 struct RtcpFieldPayloadSpecificFir {
85 uint32 media_ssrc; // zero!
88 struct RtcpFieldPayloadSpecificFirItem {
91 uint8 command_sequence_number;
94 struct RtcpFieldPayloadSpecificPli {
100 struct RtcpFieldPayloadSpecificRpsi {
105 uint16 number_of_valid_bits;
106 uint8 native_bit_string[kRtcpRpsiDataSize];
114 struct RtcpFieldXrRrtr {
116 uint32 ntp_most_significant;
117 uint32 ntp_least_significant;
120 struct RtcpFieldXrDlrr {
122 uint32 receivers_ssrc;
123 uint32 last_receiver_report;
124 uint32 delay_last_receiver_report;
127 struct RtcpFieldPayloadSpecificApplication {
132 struct RtcpFieldPayloadSpecificRembItem {
134 uint8 number_of_ssrcs;
135 uint32 ssrcs[kRtcpMaxNumberOfRembFeedbackSsrcs];
138 struct RtcpFieldPayloadSpecificCastItem {
140 uint8 number_of_lost_fields;
141 uint16 target_delay_ms;
144 struct RtcpFieldPayloadSpecificCastNackItem {
150 struct RtcpFieldApplicationSpecificCastReceiverLogItem {
152 uint32 rtp_timestamp;
153 uint32 event_timestamp_base;
155 uint16 delay_delta_or_packet_id;
156 uint16 event_timestamp_delta;
159 struct RtcpFieldApplicationSpecificCastSenderLogItem {
162 uint32 rtp_timestamp;
166 RtcpFieldReceiverReport receiver_report;
167 RtcpFieldSenderReport sender_report;
168 RtcpFieldReportBlockItem report_block_item;
169 RtcpFieldSdesCName c_name;
172 RtcpFieldXr extended_report;
173 RtcpFieldXrRrtr rrtr;
174 RtcpFieldXrDlrr dlrr;
176 RtcpFieldGenericRtpFeedbackNack nack;
177 RtcpFieldGenericRtpFeedbackNackItem nack_item;
179 RtcpFieldPayloadSpecificPli pli;
180 RtcpFieldPayloadSpecificRpsi rpsi;
181 RtcpFieldPayloadSpecificFir fir;
182 RtcpFieldPayloadSpecificFirItem fir_item;
183 RtcpFieldPayloadSpecificApplication application_specific;
184 RtcpFieldPayloadSpecificRembItem remb_item;
185 RtcpFieldPayloadSpecificCastItem cast_item;
186 RtcpFieldPayloadSpecificCastNackItem cast_nack_item;
188 RtcpFieldApplicationSpecificCastReceiverLogItem cast_receiver_log;
189 RtcpFieldApplicationSpecificCastSenderLogItem cast_sender_log;
192 enum RtcpFieldTypes {
198 kRtcpReportBlockItemCode,
207 kRtcpXrUnknownItemCode,
210 kRtcpGenericRtpFeedbackNackCode,
211 kRtcpGenericRtpFeedbackNackItemCode,
212 kRtcpPayloadSpecificPliCode,
213 kRtcpPayloadSpecificRpsiCode,
214 kRtcpPayloadSpecificAppCode,
216 // Application specific.
217 kRtcpPayloadSpecificRembCode,
218 kRtcpPayloadSpecificRembItemCode,
219 kRtcpPayloadSpecificCastCode,
220 kRtcpPayloadSpecificCastNackItemCode,
221 kRtcpApplicationSpecificCastReceiverLogCode,
222 kRtcpApplicationSpecificCastReceiverLogFrameCode,
223 kRtcpApplicationSpecificCastReceiverLogEventCode,
224 kRtcpApplicationSpecificCastSenderLogCode,
227 kRtcpPayloadSpecificFirCode,
228 kRtcpPayloadSpecificFirItemCode,
231 kRtcpGenericRtpFeedbackSrReqCode,
234 struct RtcpCommonHeader {
237 uint8 IC; // Item count / subtype.
238 uint8 PT; // Packet Type.
239 uint16 length_in_octets;
244 RtcpParser(const uint8* rtcp_data, size_t rtcp_length);
247 RtcpFieldTypes FieldType() const;
248 const RtcpField& Field() const;
250 bool IsValid() const;
252 RtcpFieldTypes Begin();
253 RtcpFieldTypes Iterate();
257 kStateTopLevel, // Top level packet
258 kStateReportBlock, // Sender/Receiver report report blocks.
261 kStateApplicationSpecificCastReceiverFrameLog,
262 kStateApplicationSpecificCastReceiverEventLog,
263 kStateApplicationSpecificCastSenderLog,
264 kStateExtendedReportBlock,
265 kStateExtendedReportDelaySinceLastReceiverReport,
266 kStateGenericRtpFeedbackNack,
267 kStatePayloadSpecificRpsi,
268 kStatePayloadSpecificFir,
269 kStatePayloadSpecificApplication,
270 kStatePayloadSpecificRemb, // Application specific Remb.
271 kStatePayloadSpecificCast, // Application specific Cast.
272 kStatePayloadSpecificCastNack, // Application specific Nack for Cast.
275 bool RtcpParseCommonHeader(const uint8* begin,
277 RtcpCommonHeader* parsed_header) const;
279 void IterateTopLevel();
280 void IterateReportBlockItem();
281 void IterateSdesItem();
282 void IterateByeItem();
283 void IterateCastReceiverLogFrame();
284 void IterateCastReceiverLogEvent();
285 void IterateCastSenderLog();
286 void IterateExtendedReportItem();
287 void IterateExtendedReportDelaySinceLastReceiverReportItem();
288 void IterateNackItem();
289 void IterateRpsiItem();
290 void IterateFirItem();
291 void IteratePayloadSpecificAppItem();
292 void IteratePayloadSpecificRembItem();
293 void IteratePayloadSpecificCastItem();
294 void IteratePayloadSpecificCastNackItem();
297 void EndCurrentBlock();
301 bool ParseReportBlockItem();
304 bool ParseSdesItem();
305 bool ParseSdesTypes();
308 bool ParseApplicationDefined(uint8 subtype);
309 bool ParseCastReceiverLogFrameItem();
310 bool ParseCastReceiverLogEventItem();
311 bool ParseCastSenderLogItem();
313 bool ParseExtendedReport();
314 bool ParseExtendedReportItem();
315 bool ParseExtendedReportReceiverReferenceTimeReport();
316 bool ParseExtendedReportDelaySinceLastReceiverReport();
318 bool ParseFeedBackCommon(const RtcpCommonHeader& header);
319 bool ParseNackItem();
320 bool ParseRpsiItem();
322 bool ParsePayloadSpecificAppItem();
323 bool ParsePayloadSpecificRembItem();
324 bool ParsePayloadSpecificCastItem();
325 bool ParsePayloadSpecificCastNackItem();
328 const uint8* const rtcp_data_begin_;
329 const uint8* const rtcp_data_end_;
332 const uint8* rtcp_data_;
333 const uint8* rtcp_block_end_;
336 uint8 number_of_blocks_;
337 RtcpFieldTypes field_type_;
340 DISALLOW_COPY_AND_ASSIGN(RtcpParser);
346 #endif // MEDIA_CAST_RTCP_RTCP_UTILITY_H_