- add sources.
[platform/framework/web/crosswalk.git] / src / media / cast / rtcp / rtcp_utility.h
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 struct RtcpFieldReceiverReport {
25   // RFC 3550.
26   uint32 sender_ssrc;
27   uint8 number_of_report_blocks;
28 };
29
30 struct RtcpFieldSenderReport {
31   // RFC 3550.
32   uint32 sender_ssrc;
33   uint8  number_of_report_blocks;
34   uint32 ntp_most_significant;
35   uint32 ntp_least_significant;
36   uint32 rtp_timestamp;
37   uint32 sender_packet_count;
38   uint32 sender_octet_count;
39 };
40
41 struct RtcpFieldReportBlockItem {
42   // RFC 3550.
43   uint32 ssrc;
44   uint8  fraction_lost;
45   uint32 cumulative_number_of_packets_lost;
46   uint32 extended_highest_sequence_number;
47   uint32 jitter;
48   uint32 last_sender_report;
49   uint32 delay_last_sender_report;
50 };
51
52 struct RtcpFieldSdesCName {
53   // RFC 3550
54   uint32 sender_ssrc;
55   char name[kRtcpCnameSize];
56 };
57
58 struct RtcpFieldBye {
59   // RFC 3550.
60   uint32 sender_ssrc;
61 };
62
63 struct RtcpFieldGenericRtpFeedbackNack {
64   // RFC 4585.
65   uint32 sender_ssrc;
66   uint32 media_ssrc;
67 };
68
69 struct RtcpFieldGenericRtpFeedbackNackItem {
70   // RFC 4585.
71   uint16 packet_id;
72   uint16 bitmask;
73 };
74
75 struct RtcpFieldPayloadSpecificFir {
76   // RFC 5104.
77   uint32 sender_ssrc;
78   uint32 media_ssrc;  // zero!
79 };
80
81 struct RtcpFieldPayloadSpecificFirItem {
82   // RFC 5104.
83   uint32 ssrc;
84   uint8 command_sequence_number;
85 };
86
87 struct RtcpFieldPayloadSpecificPli {
88   // RFC 4585.
89   uint32 sender_ssrc;
90   uint32 media_ssrc;
91 };
92
93 struct RtcpFieldPayloadSpecificRpsi {
94   // RFC 4585.
95   uint32 sender_ssrc;
96   uint32 media_ssrc;
97   uint8  payload_type;
98   uint16 number_of_valid_bits;
99   uint8  native_bit_string[kRtcpRpsiDataSize];
100 };
101
102 struct RtcpFieldXr {
103   // RFC 3611.
104   uint32 sender_ssrc;
105 };
106
107 struct RtcpFieldXrRrtr {
108   // RFC 3611.
109   uint32 ntp_most_significant;
110   uint32 ntp_least_significant;
111 };
112
113 struct RtcpFieldXrDlrr {
114   // RFC 3611.
115   uint32 receivers_ssrc;
116   uint32 last_receiver_report;
117   uint32 delay_last_receiver_report;
118 };
119
120 struct RtcpFieldPayloadSpecificApplication {
121   uint32 sender_ssrc;
122   uint32 media_ssrc;
123 };
124
125 struct RtcpFieldPayloadSpecificRembItem {
126   uint32 bitrate;
127   uint8 number_of_ssrcs;
128   uint32 ssrcs[kRtcpMaxNumberOfRembFeedbackSsrcs];
129 };
130
131 struct RtcpFieldPayloadSpecificCastItem {
132   uint8 last_frame_id;
133   uint8 number_of_lost_fields;
134 };
135
136 struct RtcpFieldPayloadSpecificCastNackItem {
137   uint8 frame_id;
138   uint16 packet_id;
139   uint8 bitmask;
140 };
141
142 union RtcpField {
143   RtcpFieldReceiverReport               receiver_report;
144   RtcpFieldSenderReport                 sender_report;
145   RtcpFieldReportBlockItem              report_block_item;
146   RtcpFieldSdesCName                    c_name;
147   RtcpFieldBye                          bye;
148
149   RtcpFieldXr                           extended_report;
150   RtcpFieldXrRrtr                       rrtr;
151   RtcpFieldXrDlrr                       dlrr;
152
153   RtcpFieldGenericRtpFeedbackNack       nack;
154   RtcpFieldGenericRtpFeedbackNackItem   nack_item;
155
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;
164 };
165
166 enum RtcpFieldTypes {
167   kRtcpNotValidCode,
168
169   // RFC 3550.
170   kRtcpRrCode,
171   kRtcpSrCode,
172   kRtcpReportBlockItemCode,
173
174   kRtcpSdesCode,
175   kRtcpSdesChunkCode,
176   kRtcpByeCode,
177
178   // RFC 3611.
179   kRtcpXrCode,
180   kRtcpXrRrtrCode,
181   kRtcpXrDlrrCode,
182   kRtcpXrUnknownItemCode,
183
184   // RFC 4585.
185   kRtcpGenericRtpFeedbackNackCode,
186   kRtcpGenericRtpFeedbackNackItemCode,
187
188   kRtcpPayloadSpecificPliCode,
189   kRtcpPayloadSpecificRpsiCode,
190   kRtcpPayloadSpecificAppCode,
191
192   kRtcpPayloadSpecificRembCode,
193   kRtcpPayloadSpecificRembItemCode,
194   kRtcpPayloadSpecificCastCode,
195   kRtcpPayloadSpecificCastNackItemCode,
196
197   // RFC 5104.
198   kRtcpPayloadSpecificFirCode,
199   kRtcpPayloadSpecificFirItemCode,
200
201   // RFC 6051.
202   kRtcpGenericRtpFeedbackSrReqCode,
203 };
204
205 struct RtcpCommonHeader {
206   uint8  V;   // Version.
207   bool   P;   // Padding.
208   uint8  IC;  // Item count / subtype.
209   uint8  PT;  // Packet Type.
210   uint16 length_in_octets;
211 };
212
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,
223   kPacketTypeXr = 207,
224   kPacketTypeHigh = 210,  // Port Mapping.
225 };
226
227 class RtcpParser {
228  public:
229   RtcpParser(const uint8* rtcp_data, size_t rtcp_length);
230   ~RtcpParser();
231
232   RtcpFieldTypes FieldType() const;
233   const RtcpField& Field() const;
234
235   bool IsValid() const;
236
237   RtcpFieldTypes Begin();
238   RtcpFieldTypes Iterate();
239
240  private:
241   enum ParseState {
242     kStateTopLevel,     // Top level packet
243     kStateReportBlock,  // Sender/Receiver report report blocks.
244     kStateSdes,
245     kStateBye,
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.
255   };
256
257   bool RtcpParseCommonHeader(const uint8* begin,
258                              const uint8* end,
259                              RtcpCommonHeader* parsed_header) const;
260
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();
274
275   void Validate();
276   void EndCurrentBlock();
277
278   bool ParseRR();
279   bool ParseSR();
280   bool ParseReportBlockItem();
281
282   bool ParseSdes();
283   bool ParseSdesItem();
284   bool ParseSdesTypes();
285   bool ParseBye();
286   bool ParseByeItem();
287
288   bool ParseExtendedReport();
289   bool ParseExtendedReportItem();
290   bool ParseExtendedReportReceiverReferenceTimeReport();
291   bool ParseExtendedReportDelaySinceLastReceiverReport();
292
293   bool ParseFeedBackCommon(const RtcpCommonHeader& header);
294   bool ParseNackItem();
295   bool ParseRpsiItem();
296   bool ParseFirItem();
297   bool ParsePayloadSpecificAppItem();
298   bool ParsePayloadSpecificRembItem();
299   bool ParsePayloadSpecificCastItem();
300   bool ParsePayloadSpecificCastNackItem();
301
302  private:
303   const uint8* const rtcp_data_begin_;
304   const uint8* const rtcp_data_end_;
305
306   bool valid_packet_;
307   const uint8* rtcp_data_;
308   const uint8* rtcp_block_end_;
309
310   ParseState state_;
311   uint8 number_of_blocks_;
312   RtcpFieldTypes field_type_;
313   RtcpField field_;
314
315   DISALLOW_COPY_AND_ASSIGN(RtcpParser);
316 };
317
318 }  // namespace cast
319 }  // namespace media
320
321 #endif  // MEDIA_CAST_RTCP_RTCP_UTILITY_H_