OLD | NEW |
| (Empty) |
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/logging/logging_defines.h" | |
11 #include "media/cast/rtcp/rtcp_defines.h" | |
12 | |
13 namespace media { | |
14 namespace cast { | |
15 | |
16 static const int kRtcpRpsiDataSize = 30; | |
17 | |
18 // RFC 3550 page 44, including end null. | |
19 static const size_t kRtcpCnameSize = 256; | |
20 static const int kRtcpMaxNumberOfRembFeedbackSsrcs = 255; | |
21 | |
22 static const uint32 kRemb = ('R' << 24) + ('E' << 16) + ('M' << 8) + 'B'; | |
23 static const uint32 kCast = ('C' << 24) + ('A' << 16) + ('S' << 8) + 'T'; | |
24 | |
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 uint16 target_delay_ms; | |
142 }; | |
143 | |
144 struct RtcpFieldPayloadSpecificCastNackItem { | |
145 uint8 frame_id; | |
146 uint16 packet_id; | |
147 uint8 bitmask; | |
148 }; | |
149 | |
150 struct RtcpFieldApplicationSpecificCastReceiverLogItem { | |
151 uint32 sender_ssrc; | |
152 uint32 rtp_timestamp; | |
153 uint32 event_timestamp_base; | |
154 uint8 event; | |
155 union { | |
156 uint16 packet_id; | |
157 int16 delay_delta; | |
158 } delay_delta_or_packet_id; | |
159 uint16 event_timestamp_delta; | |
160 }; | |
161 | |
162 union RtcpField { | |
163 RtcpFieldReceiverReport receiver_report; | |
164 RtcpFieldSenderReport sender_report; | |
165 RtcpFieldReportBlockItem report_block_item; | |
166 RtcpFieldSdesCName c_name; | |
167 RtcpFieldBye bye; | |
168 | |
169 RtcpFieldXr extended_report; | |
170 RtcpFieldXrRrtr rrtr; | |
171 RtcpFieldXrDlrr dlrr; | |
172 | |
173 RtcpFieldGenericRtpFeedbackNack nack; | |
174 RtcpFieldGenericRtpFeedbackNackItem nack_item; | |
175 | |
176 RtcpFieldPayloadSpecificPli pli; | |
177 RtcpFieldPayloadSpecificRpsi rpsi; | |
178 RtcpFieldPayloadSpecificFir fir; | |
179 RtcpFieldPayloadSpecificFirItem fir_item; | |
180 RtcpFieldPayloadSpecificApplication application_specific; | |
181 RtcpFieldPayloadSpecificRembItem remb_item; | |
182 RtcpFieldPayloadSpecificCastItem cast_item; | |
183 RtcpFieldPayloadSpecificCastNackItem cast_nack_item; | |
184 | |
185 RtcpFieldApplicationSpecificCastReceiverLogItem cast_receiver_log; | |
186 }; | |
187 | |
188 enum RtcpFieldTypes { | |
189 kRtcpNotValidCode, | |
190 | |
191 // RFC 3550. | |
192 kRtcpRrCode, | |
193 kRtcpSrCode, | |
194 kRtcpReportBlockItemCode, | |
195 kRtcpSdesCode, | |
196 kRtcpSdesChunkCode, | |
197 kRtcpByeCode, | |
198 | |
199 // RFC 3611. | |
200 kRtcpXrCode, | |
201 kRtcpXrRrtrCode, | |
202 kRtcpXrDlrrCode, | |
203 kRtcpXrUnknownItemCode, | |
204 | |
205 // RFC 4585. | |
206 kRtcpGenericRtpFeedbackNackCode, | |
207 kRtcpGenericRtpFeedbackNackItemCode, | |
208 kRtcpPayloadSpecificPliCode, | |
209 kRtcpPayloadSpecificRpsiCode, | |
210 kRtcpPayloadSpecificAppCode, | |
211 | |
212 // Application specific. | |
213 kRtcpPayloadSpecificRembCode, | |
214 kRtcpPayloadSpecificRembItemCode, | |
215 kRtcpPayloadSpecificCastCode, | |
216 kRtcpPayloadSpecificCastNackItemCode, | |
217 kRtcpApplicationSpecificCastReceiverLogCode, | |
218 kRtcpApplicationSpecificCastReceiverLogFrameCode, | |
219 kRtcpApplicationSpecificCastReceiverLogEventCode, | |
220 | |
221 // RFC 5104. | |
222 kRtcpPayloadSpecificFirCode, | |
223 kRtcpPayloadSpecificFirItemCode, | |
224 | |
225 // RFC 6051. | |
226 kRtcpGenericRtpFeedbackSrReqCode, | |
227 }; | |
228 | |
229 struct RtcpCommonHeader { | |
230 uint8 V; // Version. | |
231 bool P; // Padding. | |
232 uint8 IC; // Item count / subtype. | |
233 uint8 PT; // Packet Type. | |
234 uint16 length_in_octets; | |
235 }; | |
236 | |
237 class RtcpParser { | |
238 public: | |
239 RtcpParser(const uint8* rtcp_data, size_t rtcp_length); | |
240 ~RtcpParser(); | |
241 | |
242 RtcpFieldTypes FieldType() const; | |
243 const RtcpField& Field() const; | |
244 | |
245 bool IsValid() const; | |
246 | |
247 RtcpFieldTypes Begin(); | |
248 RtcpFieldTypes Iterate(); | |
249 | |
250 private: | |
251 enum ParseState { | |
252 kStateTopLevel, // Top level packet | |
253 kStateReportBlock, // Sender/Receiver report report blocks. | |
254 kStateSdes, | |
255 kStateBye, | |
256 kStateApplicationSpecificCastReceiverFrameLog, | |
257 kStateApplicationSpecificCastReceiverEventLog, | |
258 kStateExtendedReportBlock, | |
259 kStateExtendedReportDelaySinceLastReceiverReport, | |
260 kStateGenericRtpFeedbackNack, | |
261 kStatePayloadSpecificRpsi, | |
262 kStatePayloadSpecificFir, | |
263 kStatePayloadSpecificApplication, | |
264 kStatePayloadSpecificRemb, // Application specific Remb. | |
265 kStatePayloadSpecificCast, // Application specific Cast. | |
266 kStatePayloadSpecificCastNack, // Application specific Nack for Cast. | |
267 }; | |
268 | |
269 bool RtcpParseCommonHeader(const uint8* begin, | |
270 const uint8* end, | |
271 RtcpCommonHeader* parsed_header) const; | |
272 | |
273 void IterateTopLevel(); | |
274 void IterateReportBlockItem(); | |
275 void IterateSdesItem(); | |
276 void IterateByeItem(); | |
277 void IterateCastReceiverLogFrame(); | |
278 void IterateCastReceiverLogEvent(); | |
279 void IterateExtendedReportItem(); | |
280 void IterateExtendedReportDelaySinceLastReceiverReportItem(); | |
281 void IterateNackItem(); | |
282 void IterateRpsiItem(); | |
283 void IterateFirItem(); | |
284 void IteratePayloadSpecificAppItem(); | |
285 void IteratePayloadSpecificRembItem(); | |
286 void IteratePayloadSpecificCastItem(); | |
287 void IteratePayloadSpecificCastNackItem(); | |
288 | |
289 void Validate(); | |
290 void EndCurrentBlock(); | |
291 | |
292 bool ParseRR(); | |
293 bool ParseSR(); | |
294 bool ParseReportBlockItem(); | |
295 | |
296 bool ParseSdes(); | |
297 bool ParseSdesItem(); | |
298 bool ParseSdesTypes(); | |
299 bool ParseBye(); | |
300 bool ParseByeItem(); | |
301 bool ParseApplicationDefined(uint8 subtype); | |
302 bool ParseCastReceiverLogFrameItem(); | |
303 bool ParseCastReceiverLogEventItem(); | |
304 | |
305 bool ParseExtendedReport(); | |
306 bool ParseExtendedReportItem(); | |
307 bool ParseExtendedReportReceiverReferenceTimeReport(); | |
308 bool ParseExtendedReportDelaySinceLastReceiverReport(); | |
309 | |
310 bool ParseFeedBackCommon(const RtcpCommonHeader& header); | |
311 bool ParseNackItem(); | |
312 bool ParseRpsiItem(); | |
313 bool ParseFirItem(); | |
314 bool ParsePayloadSpecificAppItem(); | |
315 bool ParsePayloadSpecificRembItem(); | |
316 bool ParsePayloadSpecificCastItem(); | |
317 bool ParsePayloadSpecificCastNackItem(); | |
318 | |
319 private: | |
320 const uint8* const rtcp_data_begin_; | |
321 const uint8* const rtcp_data_end_; | |
322 | |
323 bool valid_packet_; | |
324 const uint8* rtcp_data_; | |
325 const uint8* rtcp_block_end_; | |
326 | |
327 ParseState state_; | |
328 uint8 number_of_blocks_; | |
329 RtcpFieldTypes field_type_; | |
330 RtcpField field_; | |
331 | |
332 DISALLOW_COPY_AND_ASSIGN(RtcpParser); | |
333 }; | |
334 | |
335 // Converts a log event type to an integer value. | |
336 // NOTE: We have only allocated 4 bits to represent the type of event over the | |
337 // wire. Therefore, this function can only return values from 0 to 15. | |
338 uint8 ConvertEventTypeToWireFormat(CastLoggingEvent event); | |
339 | |
340 // The inverse of |ConvertEventTypeToWireFormat()|. | |
341 CastLoggingEvent TranslateToLogEventFromWireFormat(uint8 event); | |
342 | |
343 } // namespace cast | |
344 } // namespace media | |
345 | |
346 #endif // MEDIA_CAST_RTCP_RTCP_UTILITY_H_ | |
OLD | NEW |