• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #ifndef MEDIA_CAST_RTCP_RTCP_UTILITY_H_
6 #define MEDIA_CAST_RTCP_RTCP_UTILITY_H_
7 
8 #include "media/cast/cast_config.h"
9 #include "media/cast/cast_defines.h"
10 #include "media/cast/rtcp/rtcp_defines.h"
11 
12 namespace media {
13 namespace cast {
14 
15 static const int kRtcpRpsiDataSize = 30;
16 
17 // RFC 3550 page 44, including end null.
18 static const size_t kRtcpCnameSize = 256;
19 static const int kRtcpMaxNumberOfRembFeedbackSsrcs = 255;
20 
21 static const uint32 kRemb = ('R' << 24) + ('E' << 16) + ('M' << 8) + 'B';
22 static const uint32 kCast = ('C' << 24) + ('A' << 16) + ('S' << 8) + 'T';
23 
24 static const uint8 kSenderLogSubtype = 1;
25 static const uint8 kReceiverLogSubtype = 2;
26 
27 static const size_t kRtcpMaxReceiverLogMessages = 256;
28 static const size_t kRtcpMaxNackFields = 253;
29 static const size_t kRtcpMaxCastLossFields = 100;
30 
31 struct RtcpFieldReceiverReport {
32   // RFC 3550.
33   uint32 sender_ssrc;
34   uint8 number_of_report_blocks;
35 };
36 
37 struct RtcpFieldSenderReport {
38   // RFC 3550.
39   uint32 sender_ssrc;
40   uint8  number_of_report_blocks;
41   uint32 ntp_most_significant;
42   uint32 ntp_least_significant;
43   uint32 rtp_timestamp;
44   uint32 sender_packet_count;
45   uint32 sender_octet_count;
46 };
47 
48 struct RtcpFieldReportBlockItem {
49   // RFC 3550.
50   uint32 ssrc;
51   uint8  fraction_lost;
52   uint32 cumulative_number_of_packets_lost;
53   uint32 extended_highest_sequence_number;
54   uint32 jitter;
55   uint32 last_sender_report;
56   uint32 delay_last_sender_report;
57 };
58 
59 struct RtcpFieldSdesCName {
60   // RFC 3550
61   uint32 sender_ssrc;
62   char name[kRtcpCnameSize];
63 };
64 
65 struct RtcpFieldBye {
66   // RFC 3550.
67   uint32 sender_ssrc;
68 };
69 
70 struct RtcpFieldGenericRtpFeedbackNack {
71   // RFC 4585.
72   uint32 sender_ssrc;
73   uint32 media_ssrc;
74 };
75 
76 struct RtcpFieldGenericRtpFeedbackNackItem {
77   // RFC 4585.
78   uint16 packet_id;
79   uint16 bitmask;
80 };
81 
82 struct RtcpFieldPayloadSpecificFir {
83   // RFC 5104.
84   uint32 sender_ssrc;
85   uint32 media_ssrc;  // zero!
86 };
87 
88 struct RtcpFieldPayloadSpecificFirItem {
89   // RFC 5104.
90   uint32 ssrc;
91   uint8 command_sequence_number;
92 };
93 
94 struct RtcpFieldPayloadSpecificPli {
95   // RFC 4585.
96   uint32 sender_ssrc;
97   uint32 media_ssrc;
98 };
99 
100 struct RtcpFieldPayloadSpecificRpsi {
101   // RFC 4585.
102   uint32 sender_ssrc;
103   uint32 media_ssrc;
104   uint8  payload_type;
105   uint16 number_of_valid_bits;
106   uint8  native_bit_string[kRtcpRpsiDataSize];
107 };
108 
109 struct RtcpFieldXr {
110   // RFC 3611.
111   uint32 sender_ssrc;
112 };
113 
114 struct RtcpFieldXrRrtr {
115   // RFC 3611.
116   uint32 ntp_most_significant;
117   uint32 ntp_least_significant;
118 };
119 
120 struct RtcpFieldXrDlrr {
121   // RFC 3611.
122   uint32 receivers_ssrc;
123   uint32 last_receiver_report;
124   uint32 delay_last_receiver_report;
125 };
126 
127 struct RtcpFieldPayloadSpecificApplication {
128   uint32 sender_ssrc;
129   uint32 media_ssrc;
130 };
131 
132 struct RtcpFieldPayloadSpecificRembItem {
133   uint32 bitrate;
134   uint8 number_of_ssrcs;
135   uint32 ssrcs[kRtcpMaxNumberOfRembFeedbackSsrcs];
136 };
137 
138 struct RtcpFieldPayloadSpecificCastItem {
139   uint8 last_frame_id;
140   uint8 number_of_lost_fields;
141 };
142 
143 struct RtcpFieldPayloadSpecificCastNackItem {
144   uint8 frame_id;
145   uint16 packet_id;
146   uint8 bitmask;
147 };
148 
149 struct RtcpFieldApplicationSpecificCastReceiverLogItem {
150   uint32 sender_ssrc;
151   uint32 rtp_timestamp;
152   uint32 event_timestamp_base;
153   uint8 event;
154   uint16 delay_delta_or_packet_id;
155   uint16 event_timestamp_delta;
156 };
157 
158 struct RtcpFieldApplicationSpecificCastSenderLogItem {
159   uint32 sender_ssrc;
160   uint8 status;
161   uint32 rtp_timestamp;
162 };
163 
164 union RtcpField {
165   RtcpFieldReceiverReport               receiver_report;
166   RtcpFieldSenderReport                 sender_report;
167   RtcpFieldReportBlockItem              report_block_item;
168   RtcpFieldSdesCName                    c_name;
169   RtcpFieldBye                          bye;
170 
171   RtcpFieldXr                           extended_report;
172   RtcpFieldXrRrtr                       rrtr;
173   RtcpFieldXrDlrr                       dlrr;
174 
175   RtcpFieldGenericRtpFeedbackNack       nack;
176   RtcpFieldGenericRtpFeedbackNackItem   nack_item;
177 
178   RtcpFieldPayloadSpecificPli           pli;
179   RtcpFieldPayloadSpecificRpsi          rpsi;
180   RtcpFieldPayloadSpecificFir           fir;
181   RtcpFieldPayloadSpecificFirItem       fir_item;
182   RtcpFieldPayloadSpecificApplication   application_specific;
183   RtcpFieldPayloadSpecificRembItem      remb_item;
184   RtcpFieldPayloadSpecificCastItem      cast_item;
185   RtcpFieldPayloadSpecificCastNackItem  cast_nack_item;
186 
187   RtcpFieldApplicationSpecificCastReceiverLogItem cast_receiver_log;
188   RtcpFieldApplicationSpecificCastSenderLogItem cast_sender_log;
189 };
190 
191 enum RtcpFieldTypes {
192   kRtcpNotValidCode,
193 
194   // RFC 3550.
195   kRtcpRrCode,
196   kRtcpSrCode,
197   kRtcpReportBlockItemCode,
198 
199   kRtcpSdesCode,
200   kRtcpSdesChunkCode,
201   kRtcpByeCode,
202 
203   // RFC 3611.
204   kRtcpXrCode,
205   kRtcpXrRrtrCode,
206   kRtcpXrDlrrCode,
207   kRtcpXrUnknownItemCode,
208 
209   // RFC 4585.
210   kRtcpGenericRtpFeedbackNackCode,
211   kRtcpGenericRtpFeedbackNackItemCode,
212 
213   kRtcpPayloadSpecificPliCode,
214   kRtcpPayloadSpecificRpsiCode,
215   kRtcpPayloadSpecificAppCode,
216 
217   // Application specific.
218   kRtcpPayloadSpecificRembCode,
219   kRtcpPayloadSpecificRembItemCode,
220   kRtcpPayloadSpecificCastCode,
221   kRtcpPayloadSpecificCastNackItemCode,
222   kRtcpApplicationSpecificCastReceiverLogCode,
223   kRtcpApplicationSpecificCastReceiverLogFrameCode,
224   kRtcpApplicationSpecificCastReceiverLogEventCode,
225   kRtcpApplicationSpecificCastSenderLogCode,
226 
227   // RFC 5104.
228   kRtcpPayloadSpecificFirCode,
229   kRtcpPayloadSpecificFirItemCode,
230 
231   // RFC 6051.
232   kRtcpGenericRtpFeedbackSrReqCode,
233 };
234 
235 struct RtcpCommonHeader {
236   uint8  V;   // Version.
237   bool   P;   // Padding.
238   uint8  IC;  // Item count / subtype.
239   uint8  PT;  // Packet Type.
240   uint16 length_in_octets;
241 };
242 
243 enum RtcpPacketTypes {
244   kPacketTypeLow = 194,  // SMPTE time-code mapping.
245   kPacketTypeInterArrivalJitterReport = 195,
246   kPacketTypeSenderReport = 200,
247   kPacketTypeReceiverReport = 201,
248   kPacketTypeSdes = 202,
249   kPacketTypeBye = 203,
250   kPacketTypeApplicationDefined = 204,
251   kPacketTypeGenericRtpFeedback = 205,
252   kPacketTypePayloadSpecific = 206,
253   kPacketTypeXr = 207,
254   kPacketTypeHigh = 210,  // Port Mapping.
255 };
256 
257 class RtcpParser {
258  public:
259   RtcpParser(const uint8* rtcp_data, size_t rtcp_length);
260   ~RtcpParser();
261 
262   RtcpFieldTypes FieldType() const;
263   const RtcpField& Field() const;
264 
265   bool IsValid() const;
266 
267   RtcpFieldTypes Begin();
268   RtcpFieldTypes Iterate();
269 
270  private:
271   enum ParseState {
272     kStateTopLevel,     // Top level packet
273     kStateReportBlock,  // Sender/Receiver report report blocks.
274     kStateSdes,
275     kStateBye,
276     kStateApplicationSpecificCastReceiverFrameLog,
277     kStateApplicationSpecificCastReceiverEventLog,
278     kStateApplicationSpecificCastSenderLog,
279     kStateExtendedReportBlock,
280     kStateExtendedReportDelaySinceLastReceiverReport,
281     kStateGenericRtpFeedbackNack,
282     kStatePayloadSpecificRpsi,
283     kStatePayloadSpecificFir,
284     kStatePayloadSpecificApplication,
285     kStatePayloadSpecificRemb,      // Application specific Remb.
286     kStatePayloadSpecificCast,      // Application specific Cast.
287     kStatePayloadSpecificCastNack,  // Application specific Nack for Cast.
288   };
289 
290   bool RtcpParseCommonHeader(const uint8* begin,
291                              const uint8* end,
292                              RtcpCommonHeader* parsed_header) const;
293 
294   void IterateTopLevel();
295   void IterateReportBlockItem();
296   void IterateSdesItem();
297   void IterateByeItem();
298   void IterateCastReceiverLogFrame();
299   void IterateCastReceiverLogEvent();
300   void IterateCastSenderLog();
301   void IterateExtendedReportItem();
302   void IterateExtendedReportDelaySinceLastReceiverReportItem();
303   void IterateNackItem();
304   void IterateRpsiItem();
305   void IterateFirItem();
306   void IteratePayloadSpecificAppItem();
307   void IteratePayloadSpecificRembItem();
308   void IteratePayloadSpecificCastItem();
309   void IteratePayloadSpecificCastNackItem();
310 
311   void Validate();
312   void EndCurrentBlock();
313 
314   bool ParseRR();
315   bool ParseSR();
316   bool ParseReportBlockItem();
317 
318   bool ParseSdes();
319   bool ParseSdesItem();
320   bool ParseSdesTypes();
321   bool ParseBye();
322   bool ParseByeItem();
323   bool ParseApplicationDefined(uint8 subtype);
324   bool ParseCastReceiverLogFrameItem();
325   bool ParseCastReceiverLogEventItem();
326   bool ParseCastSenderLogItem();
327 
328   bool ParseExtendedReport();
329   bool ParseExtendedReportItem();
330   bool ParseExtendedReportReceiverReferenceTimeReport();
331   bool ParseExtendedReportDelaySinceLastReceiverReport();
332 
333   bool ParseFeedBackCommon(const RtcpCommonHeader& header);
334   bool ParseNackItem();
335   bool ParseRpsiItem();
336   bool ParseFirItem();
337   bool ParsePayloadSpecificAppItem();
338   bool ParsePayloadSpecificRembItem();
339   bool ParsePayloadSpecificCastItem();
340   bool ParsePayloadSpecificCastNackItem();
341 
342  private:
343   const uint8* const rtcp_data_begin_;
344   const uint8* const rtcp_data_end_;
345 
346   bool valid_packet_;
347   const uint8* rtcp_data_;
348   const uint8* rtcp_block_end_;
349 
350   ParseState state_;
351   uint8 number_of_blocks_;
352   RtcpFieldTypes field_type_;
353   RtcpField field_;
354 
355   DISALLOW_COPY_AND_ASSIGN(RtcpParser);
356 };
357 
358 }  // namespace cast
359 }  // namespace media
360 
361 #endif  // MEDIA_CAST_RTCP_RTCP_UTILITY_H_
362