1 /* GStreamer unit tests for the RTP support library
3 * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
25 #include <gst/check/gstcheck.h>
27 #include <gst/rtp/gstrtpbuffer.h>
28 #include <gst/rtp/gstrtcpbuffer.h>
31 #define RTP_HEADER_LEN 12
33 GST_START_TEST (test_rtp_buffer)
38 /* check GstRTPHeader structure alignment and packing */
39 buf = gst_rtp_buffer_new_allocate (16, 4, 0);
40 fail_unless (buf != NULL);
41 fail_unless_equals_int (GST_BUFFER_SIZE (buf), RTP_HEADER_LEN + 16 + 4);
42 data = GST_BUFFER_DATA (buf);
45 fail_unless_equals_int (gst_rtp_buffer_get_version (buf), 2);
46 fail_unless (gst_rtp_buffer_get_padding (buf) == FALSE);
47 fail_unless (gst_rtp_buffer_get_extension (buf) == FALSE);
48 fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (buf), 0);
49 fail_unless (gst_rtp_buffer_get_marker (buf) == FALSE);
50 fail_unless (gst_rtp_buffer_get_payload_type (buf) == 0);
51 fail_unless_equals_int (GST_READ_UINT16_BE (data), 0x8000);
53 /* check version in bitfield */
54 gst_rtp_buffer_set_version (buf, 3);
55 fail_unless_equals_int (gst_rtp_buffer_get_version (buf), 3);
56 fail_unless_equals_int ((data[0] & 0xC0) >> 6, 3);
57 gst_rtp_buffer_set_version (buf, 2);
58 fail_unless_equals_int (gst_rtp_buffer_get_version (buf), 2);
59 fail_unless_equals_int ((data[0] & 0xC0) >> 6, 2);
61 /* check padding bit */
62 gst_rtp_buffer_set_padding (buf, TRUE);
63 fail_unless (gst_rtp_buffer_get_padding (buf) == TRUE);
64 fail_unless_equals_int ((data[0] & 0x20) >> 5, 1);
65 gst_rtp_buffer_set_padding (buf, FALSE);
66 fail_unless (gst_rtp_buffer_get_padding (buf) == FALSE);
67 fail_unless_equals_int ((data[0] & 0x20) >> 5, 0);
69 /* check marker bit */
70 gst_rtp_buffer_set_marker (buf, TRUE);
71 fail_unless (gst_rtp_buffer_get_marker (buf) == TRUE);
72 fail_unless_equals_int ((data[1] & 0x80) >> 7, 1);
73 gst_rtp_buffer_set_marker (buf, FALSE);
74 fail_unless (gst_rtp_buffer_get_marker (buf) == FALSE);
75 fail_unless_equals_int ((data[1] & 0x80) >> 7, 0);
77 /* check sequence offset */
78 gst_rtp_buffer_set_seq (buf, 0xF2C9);
79 fail_unless_equals_int (gst_rtp_buffer_get_seq (buf), 0xF2C9);
80 fail_unless_equals_int (GST_READ_UINT16_BE (data + 2), 0xF2C9);
81 gst_rtp_buffer_set_seq (buf, 0);
82 fail_unless_equals_int (gst_rtp_buffer_get_seq (buf), 0);
83 fail_unless_equals_int (GST_READ_UINT16_BE (data + 2), 0);
85 /* check timestamp offset */
86 gst_rtp_buffer_set_timestamp (buf, 432191);
87 fail_unless_equals_int (GST_READ_UINT32_BE (data + 4), 432191);
88 fail_unless_equals_int (gst_rtp_buffer_get_timestamp (buf), 432191);
89 gst_rtp_buffer_set_timestamp (buf, 0);
90 fail_unless_equals_int (gst_rtp_buffer_get_timestamp (buf), 0);
91 fail_unless_equals_int (GST_READ_UINT32_BE (data + 4), 0);
93 /* check ssrc offset */
94 gst_rtp_buffer_set_ssrc (buf, 0xf04043C2);
95 fail_unless_equals_int (gst_rtp_buffer_get_ssrc (buf), (gint) 0xf04043c2);
96 fail_unless_equals_int (GST_READ_UINT32_BE (data + 4 + 4), (gint) 0xf04043c2);
97 gst_rtp_buffer_set_ssrc (buf, 0);
98 fail_unless_equals_int (gst_rtp_buffer_get_ssrc (buf), 0);
99 fail_unless_equals_int (GST_READ_UINT32_BE (data + 4 + 4), 0);
101 /* check csrc bits */
102 fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (buf), 0);
103 ASSERT_CRITICAL (gst_rtp_buffer_get_csrc (buf, 0));
104 fail_unless_equals_int (data[0] & 0xf, 0);
105 gst_buffer_unref (buf);
107 /* and again, this time with CSRCs */
108 buf = gst_rtp_buffer_new_allocate (16, 4, 3);
109 fail_unless (buf != NULL);
110 fail_unless_equals_int (GST_BUFFER_SIZE (buf),
111 RTP_HEADER_LEN + 16 + 4 + 4 * 3);
113 data = GST_BUFFER_DATA (buf);
115 fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (buf), 3);
116 ASSERT_CRITICAL (gst_rtp_buffer_get_csrc (buf, 3));
117 fail_unless_equals_int (data[0] & 0xf, 3);
118 fail_unless_equals_int (gst_rtp_buffer_get_csrc (buf, 0), 0);
119 fail_unless_equals_int (gst_rtp_buffer_get_csrc (buf, 1), 0);
120 fail_unless_equals_int (gst_rtp_buffer_get_csrc (buf, 2), 0);
122 data += RTP_HEADER_LEN; /* skip the other header stuff */
123 gst_rtp_buffer_set_csrc (buf, 0, 0xf7c0);
124 fail_unless_equals_int (GST_READ_UINT32_BE (data + 0 * 4), 0xf7c0);
125 gst_rtp_buffer_set_csrc (buf, 1, 0xf7c1);
126 fail_unless_equals_int (GST_READ_UINT32_BE (data + 1 * 4), 0xf7c1);
127 gst_rtp_buffer_set_csrc (buf, 2, 0xf7c2);
128 fail_unless_equals_int (GST_READ_UINT32_BE (data + 2 * 4), 0xf7c2);
129 ASSERT_CRITICAL (gst_rtp_buffer_set_csrc (buf, 3, 0xf123));
130 gst_buffer_unref (buf);
135 GST_START_TEST (test_rtp_buffer_validate_corrupt)
138 guint8 corrupt_rtp_packet[58] = {
139 0x90, 0x7a, 0xbf, 0x28, 0x3a, 0x8a, 0x0a, 0xf4, 0x69, 0x6b, 0x76, 0xc0,
140 0x21, 0xe0, 0xe0, 0x60, 0x81, 0x10, 0x84, 0x30, 0x21, 0x52, 0x06, 0xc2,
141 0xb8, 0x30, 0x10, 0x4c, 0x08, 0x62, 0x67, 0xc2, 0x6e, 0x1a, 0x53, 0x3f,
142 0xaf, 0xd6, 0x1b, 0x29, 0x40, 0xe0, 0xa5, 0x83, 0x01, 0x4b, 0x04, 0x02,
143 0xb0, 0x97, 0x63, 0x08, 0x10, 0x4b, 0x43, 0x85, 0x37, 0x2c
146 buf = gst_buffer_new ();
147 GST_BUFFER_DATA (buf) = corrupt_rtp_packet;
148 GST_BUFFER_SIZE (buf) = sizeof (corrupt_rtp_packet);
149 fail_if (gst_rtp_buffer_validate (buf));
150 gst_buffer_unref (buf);
155 GST_START_TEST (test_rtp_buffer_list)
157 GstBuffer *rtp_header;
158 GstBuffer *rtp_payload;
159 GstBufferList *list = NULL;
160 GstBufferListIterator *it;
163 list = gst_buffer_list_new ();
164 it = gst_buffer_list_iterate (list);
166 /* Creating a list of two RTP packages */
168 /* Create first group to hold the rtp header and the payload */
169 gst_buffer_list_iterator_add_group (it);
170 rtp_header = gst_rtp_buffer_new_allocate (0, 0, 0);
171 gst_buffer_list_iterator_add (it, rtp_header);
172 rtp_payload = gst_buffer_new_and_alloc (42);
173 gst_buffer_list_iterator_add (it, rtp_payload);
175 /* Create second group to hold an rtp header and a payload */
176 gst_buffer_list_iterator_add_group (it);
177 rtp_header = gst_rtp_buffer_new_allocate (0, 0, 0);
178 gst_buffer_list_iterator_add (it, rtp_header);
179 rtp_payload = gst_buffer_new_and_alloc (42);
180 gst_buffer_list_iterator_add (it, rtp_payload);
182 gst_buffer_list_iterator_free (it);
184 /* Test SEQ number */
185 i = gst_rtp_buffer_list_set_seq (list, 1024);
187 fail_if (!gst_rtp_buffer_list_validate (list));
190 gst_rtp_buffer_list_set_timestamp (list, 432191);
191 fail_unless_equals_int (gst_rtp_buffer_list_get_timestamp (list), 432191);
194 gst_rtp_buffer_list_set_ssrc (list, 0xf04043C2);
195 fail_unless_equals_int (gst_rtp_buffer_list_get_ssrc (list),
199 gst_rtp_buffer_list_set_payload_type (list, 127);
200 fail_unless_equals_int (gst_rtp_buffer_list_get_payload_type (list), 127);
202 gst_buffer_list_unref (list);
207 GST_START_TEST (test_rtp_buffer_set_extension_data)
213 guint8 misc_data[4] = { 1, 2, 3, 4 };
217 /* check GstRTPHeader structure alignment and packing */
218 buf = gst_rtp_buffer_new_allocate (4, 0, 0);
219 data = GST_BUFFER_DATA (buf);
221 /* should be impossible to set the extension data */
222 ASSERT_WARNING (fail_unless (gst_rtp_buffer_set_extension_data (buf, 0,
224 fail_unless (gst_rtp_buffer_get_extension (buf) == FALSE);
226 /* should be possible to set the extension data */
227 fail_unless (gst_rtp_buffer_set_extension_data (buf, 270, 0) == TRUE);
228 fail_unless (gst_rtp_buffer_get_extension (buf) == TRUE);
229 gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size);
230 fail_unless (bits == 270);
231 fail_unless (size == 0);
232 fail_unless (pointer == GST_BUFFER_DATA (buf) + 16);
233 pointer = gst_rtp_buffer_get_payload (buf);
234 fail_unless (pointer == GST_BUFFER_DATA (buf) + 16);
235 gst_buffer_unref (buf);
237 buf = gst_rtp_buffer_new_allocate (20, 0, 0);
238 data = GST_BUFFER_DATA (buf);
239 fail_unless (gst_rtp_buffer_get_extension (buf) == FALSE);
240 fail_unless (gst_rtp_buffer_set_extension_data (buf, 333, 2) == TRUE);
241 fail_unless (gst_rtp_buffer_get_extension (buf) == TRUE);
242 gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size);
243 fail_unless (bits == 333);
244 fail_unless (size == 2);
245 fail_unless (pointer == GST_BUFFER_DATA (buf) + 16);
246 pointer = gst_rtp_buffer_get_payload (buf);
247 fail_unless (pointer == GST_BUFFER_DATA (buf) + 24);
248 gst_buffer_unref (buf);
250 /* Test header extensions with a one byte header */
251 buf = gst_rtp_buffer_new_allocate (20, 0, 0);
252 fail_unless (gst_rtp_buffer_get_extension (buf) == FALSE);
254 fail_unless (gst_rtp_buffer_add_extension_onebyte_header (buf, 5,
255 misc_data, 2) == TRUE);
256 fail_unless (gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size));
257 fail_unless (bits == 0xBEDE);
258 fail_unless (size == 1);
259 data = (guint8 *) pointer;
260 fail_unless (data[0] == ((5 << 4) | 1));
261 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 2,
262 1, &pointer, &size) == FALSE);
263 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
264 1, &pointer, &size) == FALSE);
265 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
266 0, &pointer, &size) == TRUE);
267 fail_unless (size == 2);
268 fail_unless (memcmp (pointer, misc_data, 2) == 0);
270 fail_unless (gst_rtp_buffer_add_extension_onebyte_header (buf, 5,
271 misc_data, 4) == TRUE);
272 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
273 0, &pointer, &size) == TRUE);
274 fail_unless (size == 2);
275 fail_unless (memcmp (pointer, misc_data, 2) == 0);
276 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
277 1, &pointer, &size) == TRUE);
278 fail_unless (size == 4);
279 fail_unless (memcmp (pointer, misc_data, 4) == 0);
280 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
281 2, &pointer, &size) == FALSE);
282 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 2,
283 1, &pointer, &size) == FALSE);
285 fail_unless (gst_rtp_buffer_add_extension_onebyte_header (buf, 6,
286 misc_data, 2) == TRUE);
287 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
288 0, &pointer, &size) == TRUE);
289 fail_unless (size == 2);
290 fail_unless (memcmp (pointer, misc_data, 2) == 0);
291 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
292 1, &pointer, &size) == TRUE);
293 fail_unless (size == 4);
294 fail_unless (memcmp (pointer, misc_data, 4) == 0);
295 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
296 3, &pointer, &size) == FALSE);
297 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 2,
298 1, &pointer, &size) == FALSE);
299 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 6,
300 2, &pointer, &size) == FALSE);
301 fail_unless (gst_rtp_buffer_get_extension_onebyte_header (buf, 5,
302 0, &pointer, &size) == TRUE);
303 fail_unless (size == 2);
304 fail_unless (memcmp (pointer, misc_data, 2) == 0);
305 gst_buffer_unref (buf);
307 /* Test header extensions with a two bytes header */
308 buf = gst_rtp_buffer_new_allocate (20, 0, 0);
309 fail_unless (gst_rtp_buffer_get_extension (buf) == FALSE);
311 fail_unless (gst_rtp_buffer_add_extension_twobytes_header (buf, 0, 5,
312 misc_data, 2) == TRUE);
313 fail_unless (gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size));
314 fail_unless (bits == 0x100 << 4);
315 fail_unless (size == 1);
316 data = (guint8 *) pointer;
317 fail_unless (data[0] == 5);
318 fail_unless (data[1] == 2);
319 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 2,
320 0, &pointer, &size) == FALSE);
321 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
322 1, &pointer, &size) == FALSE);
323 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
324 0, &pointer, &size) == TRUE);
325 fail_unless (size == 2);
326 fail_unless (memcmp (pointer, misc_data, 2) == 0);
328 fail_unless (gst_rtp_buffer_add_extension_twobytes_header (buf, 0, 5,
329 misc_data, 4) == TRUE);
330 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
331 0, &pointer, &size) == TRUE);
332 fail_unless (size == 2);
333 fail_unless (memcmp (pointer, misc_data, 2) == 0);
334 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
335 1, &pointer, &size) == TRUE);
336 fail_unless (size == 4);
337 fail_unless (memcmp (pointer, misc_data, 4) == 0);
338 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
339 2, &pointer, &size) == FALSE);
340 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 2,
341 0, &pointer, &size) == FALSE);
343 fail_unless (gst_rtp_buffer_add_extension_twobytes_header (buf, 0, 6,
344 misc_data, 2) == TRUE);
345 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
346 0, &pointer, &size) == TRUE);
347 fail_unless (size == 2);
348 fail_unless (memcmp (pointer, misc_data, 2) == 0);
349 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
350 1, &pointer, &size) == TRUE);
351 fail_unless (size == 4);
352 fail_unless (memcmp (pointer, misc_data, 4) == 0);
353 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
354 2, &pointer, &size) == FALSE);
355 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 2,
356 0, &pointer, &size) == FALSE);
357 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 6,
358 1, &pointer, &size) == FALSE);
359 fail_unless (gst_rtp_buffer_get_extension_twobytes_header (buf, &appbits, 5,
360 0, &pointer, &size) == TRUE);
361 fail_unless (size == 2);
362 fail_unless (memcmp (pointer, misc_data, 2) == 0);
363 gst_buffer_unref (buf);
368 GST_START_TEST (test_rtp_buffer_list_set_extension)
375 guint8 misc_data[4] = { 1, 2, 3, 4 };
378 GstBufferListIterator *it;
380 buf = gst_rtp_buffer_new_allocate (20, 0, 0);
381 list = gst_rtp_buffer_list_from_buffer (buf);
382 gst_buffer_unref (buf);
384 it = gst_buffer_list_iterate (list);
385 fail_unless (gst_buffer_list_iterator_next_group (it));
386 buf = gst_buffer_list_iterator_next (it);
387 fail_unless (buf != NULL);
388 fail_unless (GST_BUFFER_SIZE (buf) == 12);
389 buf = gst_buffer_list_iterator_next (it);
390 fail_unless (buf != NULL);
391 fail_unless (GST_BUFFER_SIZE (buf) == 20);
392 gst_buffer_list_iterator_free (it);
394 /* Test header extensions with a one byte header */
395 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
396 1, &pointer, &size) == FALSE);
398 it = gst_buffer_list_iterate (list);
399 fail_unless (gst_buffer_list_iterator_next_group (it));
400 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
401 fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 5,
402 misc_data, 2) == TRUE);
403 gst_buffer_list_iterator_free (it);
404 it = gst_buffer_list_iterate (list);
405 fail_unless (gst_buffer_list_iterator_next_group (it));
406 buf = gst_buffer_list_iterator_next (it);
407 fail_unless (gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size));
408 fail_unless (bits == 0xBEDE);
409 fail_unless (size == 1);
410 data = (guint8 *) pointer;
411 fail_unless (data[0] == ((5 << 4) | 1));
412 gst_buffer_list_iterator_free (it);
413 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
414 0, &pointer, &size) == FALSE);
415 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
416 1, &pointer, &size) == FALSE);
417 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
418 0, &pointer, &size) == TRUE);
419 fail_unless (size == 2);
420 fail_unless (memcmp (pointer, misc_data, 2) == 0);
422 it = gst_buffer_list_iterate (list);
423 fail_unless (gst_buffer_list_iterator_next_group (it));
424 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
425 fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 5,
426 misc_data, 4) == TRUE);
427 gst_buffer_list_iterator_free (it);
428 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
429 0, &pointer, &size) == TRUE);
430 fail_unless (size == 2);
431 fail_unless (memcmp (pointer, misc_data, 2) == 0);
432 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
433 1, &pointer, &size) == TRUE);
434 fail_unless (size == 4);
435 fail_unless (memcmp (pointer, misc_data, 4) == 0);
436 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
437 2, &pointer, &size) == FALSE);
438 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
439 0, &pointer, &size) == FALSE);
441 it = gst_buffer_list_iterate (list);
442 fail_unless (gst_buffer_list_iterator_next_group (it));
443 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
444 fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 6,
445 misc_data, 2) == TRUE);
446 gst_buffer_list_iterator_free (it);
447 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
448 0, &pointer, &size) == TRUE);
449 fail_unless (size == 2);
450 fail_unless (memcmp (pointer, misc_data, 2) == 0);
451 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
452 1, &pointer, &size) == TRUE);
453 fail_unless (size == 4);
454 fail_unless (memcmp (pointer, misc_data, 4) == 0);
455 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
456 2, &pointer, &size) == FALSE);
457 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
458 0, &pointer, &size) == FALSE);
459 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 6,
460 1, &pointer, &size) == FALSE);
461 fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
462 0, &pointer, &size) == TRUE);
463 fail_unless (size == 2);
464 fail_unless (memcmp (pointer, misc_data, 2) == 0);
465 gst_buffer_list_unref (list);
468 /* Test header extensions with a two bytes header */
469 buf = gst_rtp_buffer_new_allocate (20, 0, 0);
470 list = gst_rtp_buffer_list_from_buffer (buf);
471 gst_buffer_unref (buf);
473 it = gst_buffer_list_iterate (list);
474 fail_unless (gst_buffer_list_iterator_next_group (it));
475 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
476 fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 5,
477 misc_data, 2) == TRUE);
478 gst_buffer_list_iterator_free (it);
480 it = gst_buffer_list_iterate (list);
481 fail_unless (gst_buffer_list_iterator_next_group (it));
482 buf = gst_buffer_list_iterator_next (it);
483 fail_unless (gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size));
484 fail_unless (bits == 0x100 << 4);
485 fail_unless (size == 1);
486 data = (guint8 *) pointer;
487 fail_unless (data[0] == 5);
488 fail_unless (data[1] == 2);
489 gst_buffer_list_iterator_free (it);
490 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
491 &appbits, 2, 0, &pointer, &size) == FALSE);
492 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
493 &appbits, 5, 1, &pointer, &size) == FALSE);
494 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
495 &appbits, 5, 0, &pointer, &size) == TRUE);
496 fail_unless (size == 2);
497 fail_unless (memcmp (pointer, misc_data, 2) == 0);
499 it = gst_buffer_list_iterate (list);
500 fail_unless (gst_buffer_list_iterator_next_group (it));
501 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
502 fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 5,
503 misc_data, 4) == TRUE);
504 gst_buffer_list_iterator_free (it);
505 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
506 &appbits, 5, 0, &pointer, &size) == TRUE);
507 fail_unless (size == 2);
508 fail_unless (memcmp (pointer, misc_data, 2) == 0);
509 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
510 &appbits, 5, 1, &pointer, &size) == TRUE);
511 fail_unless (size == 4);
512 fail_unless (memcmp (pointer, misc_data, 4) == 0);
513 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
514 &appbits, 5, 2, &pointer, &size) == FALSE);
515 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
516 &appbits, 2, 0, &pointer, &size) == FALSE);
518 it = gst_buffer_list_iterate (list);
519 fail_unless (gst_buffer_list_iterator_next_group (it));
520 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
521 fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 6,
522 misc_data, 2) == TRUE);
523 gst_buffer_list_iterator_free (it);
524 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
525 &appbits, 5, 0, &pointer, &size) == TRUE);
526 fail_unless (size == 2);
527 fail_unless (memcmp (pointer, misc_data, 2) == 0);
528 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
529 &appbits, 5, 1, &pointer, &size) == TRUE);
530 fail_unless (size == 4);
531 fail_unless (memcmp (pointer, misc_data, 4) == 0);
532 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
533 &appbits, 5, 2, &pointer, &size) == FALSE);
534 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
535 &appbits, 2, 0, &pointer, &size) == FALSE);
536 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
537 &appbits, 6, 1, &pointer, &size) == FALSE);
538 fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
539 &appbits, 5, 0, &pointer, &size) == TRUE);
540 fail_unless (size == 2);
541 fail_unless (memcmp (pointer, misc_data, 2) == 0);
543 gst_buffer_list_unref (list);
548 GST_START_TEST (test_rtp_seqnum_compare)
550 #define ASSERT_COMP(a,b,c) fail_unless (gst_rtp_buffer_compare_seqnum ((guint16)a,(guint16)b) == c);
551 ASSERT_COMP (0xfffe, 0xfffd, -1);
552 ASSERT_COMP (0xffff, 0xfffe, -1);
553 ASSERT_COMP (0x0000, 0xffff, -1);
554 ASSERT_COMP (0x0001, 0x0000, -1);
555 ASSERT_COMP (0x0002, 0x0001, -1);
557 ASSERT_COMP (0xffff, 0xfffd, -2);
558 ASSERT_COMP (0x0000, 0xfffd, -3);
559 ASSERT_COMP (0x0001, 0xfffd, -4);
560 ASSERT_COMP (0x0002, 0xfffd, -5);
562 ASSERT_COMP (0x7ffe, 0x7ffd, -1);
563 ASSERT_COMP (0x7fff, 0x7ffe, -1);
564 ASSERT_COMP (0x8000, 0x7fff, -1);
565 ASSERT_COMP (0x8001, 0x8000, -1);
566 ASSERT_COMP (0x8002, 0x8001, -1);
568 ASSERT_COMP (0x7fff, 0x7ffd, -2);
569 ASSERT_COMP (0x8000, 0x7ffd, -3);
570 ASSERT_COMP (0x8001, 0x7ffd, -4);
571 ASSERT_COMP (0x8002, 0x7ffd, -5);
573 ASSERT_COMP (0x7ffd, 0xffff, -0x7ffe);
574 ASSERT_COMP (0x7ffe, 0x0000, -0x7ffe);
575 ASSERT_COMP (0x7fff, 0x0001, -0x7ffe);
576 ASSERT_COMP (0x7fff, 0x0000, -0x7fff);
577 ASSERT_COMP (0x8000, 0x0001, -0x7fff);
578 ASSERT_COMP (0x8001, 0x0002, -0x7fff);
580 ASSERT_COMP (0xfffd, 0x7ffe, -0x7fff);
581 ASSERT_COMP (0xfffe, 0x7fff, -0x7fff);
582 ASSERT_COMP (0xffff, 0x8000, -0x7fff);
583 ASSERT_COMP (0x0000, 0x8001, -0x7fff);
584 ASSERT_COMP (0x0001, 0x8002, -0x7fff);
586 ASSERT_COMP (0xfffe, 0x7ffe, -0x8000);
587 ASSERT_COMP (0xffff, 0x7fff, -0x8000);
588 ASSERT_COMP (0x0000, 0x8000, -0x8000);
589 ASSERT_COMP (0x0001, 0x8001, -0x8000);
591 ASSERT_COMP (0x7ffe, 0xfffe, -0x8000);
592 ASSERT_COMP (0x7fff, 0xffff, -0x8000);
593 ASSERT_COMP (0x8000, 0x0000, -0x8000);
594 ASSERT_COMP (0x8001, 0x0001, -0x8000);
596 ASSERT_COMP (0x0001, 0x0002, 1);
597 ASSERT_COMP (0x0000, 0x0001, 1);
598 ASSERT_COMP (0xffff, 0x0000, 1);
599 ASSERT_COMP (0xfffe, 0xffff, 1);
600 ASSERT_COMP (0xfffd, 0xfffe, 1);
602 ASSERT_COMP (0x0000, 0x0002, 2);
603 ASSERT_COMP (0xffff, 0x0002, 3);
604 ASSERT_COMP (0xfffe, 0x0002, 4);
605 ASSERT_COMP (0xfffd, 0x0002, 5);
607 ASSERT_COMP (0x8001, 0x8002, 1);
608 ASSERT_COMP (0x8000, 0x8001, 1);
609 ASSERT_COMP (0x7fff, 0x8000, 1);
610 ASSERT_COMP (0x7ffe, 0x7fff, 1);
611 ASSERT_COMP (0x7ffd, 0x7ffe, 1);
613 ASSERT_COMP (0x8000, 0x8002, 2);
614 ASSERT_COMP (0x7fff, 0x8002, 3);
615 ASSERT_COMP (0x7ffe, 0x8002, 4);
616 ASSERT_COMP (0x7ffd, 0x8002, 5);
618 ASSERT_COMP (0xfffe, 0x7ffd, 0x7fff);
619 ASSERT_COMP (0xffff, 0x7ffe, 0x7fff);
620 ASSERT_COMP (0x0000, 0x7fff, 0x7fff);
621 ASSERT_COMP (0x0001, 0x8000, 0x7fff);
622 ASSERT_COMP (0x0002, 0x8001, 0x7fff);
624 ASSERT_COMP (0x7ffe, 0xfffd, 0x7fff);
625 ASSERT_COMP (0x7fff, 0xfffe, 0x7fff);
626 ASSERT_COMP (0x8000, 0xffff, 0x7fff);
627 ASSERT_COMP (0x8001, 0x0000, 0x7fff);
628 ASSERT_COMP (0x8002, 0x0001, 0x7fff);
634 GST_START_TEST (test_rtcp_buffer)
637 GstRTCPPacket packet;
639 buf = gst_rtcp_buffer_new (1400);
640 fail_unless (buf != NULL);
641 fail_unless_equals_int (GST_BUFFER_SIZE (buf), 1400);
643 fail_unless (gst_rtcp_buffer_get_first_packet (buf, &packet) == FALSE);
644 fail_unless (gst_rtcp_buffer_get_packet_count (buf) == 0);
645 fail_unless (gst_rtcp_buffer_validate (buf) == FALSE);
647 /* add an SR packet */
648 fail_unless (gst_rtcp_buffer_add_packet (buf, GST_RTCP_TYPE_SR,
651 fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
652 fail_unless (gst_rtcp_packet_get_count (&packet) == 0);
653 fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SR);
654 fail_unless (gst_rtcp_packet_get_length (&packet) == 6);
656 gst_rtcp_packet_sr_set_sender_info (&packet, 0x44556677,
657 G_GUINT64_CONSTANT (1), 0x11111111, 101, 123456);
662 guint32 packet_count;
665 gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, &rtptime,
666 &packet_count, &octet_count);
668 fail_unless (ssrc == 0x44556677);
669 fail_unless (ntptime == G_GUINT64_CONSTANT (1));
670 fail_unless (rtptime == 0x11111111);
671 fail_unless (packet_count == 101);
672 fail_unless (octet_count == 123456);
675 /* go to first packet, this should be the packet we just added */
676 fail_unless (gst_rtcp_buffer_get_first_packet (buf, &packet) == TRUE);
678 fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
679 fail_unless (gst_rtcp_packet_get_count (&packet) == 0);
680 fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SR);
681 fail_unless (gst_rtcp_packet_get_length (&packet) == 6);
683 fail_unless (gst_rtcp_packet_move_to_next (&packet) == FALSE);
686 fail_unless (gst_rtcp_buffer_add_packet (buf, GST_RTCP_TYPE_SDES,
688 fail_unless (gst_rtcp_packet_sdes_add_item (&packet, 0xff658743) == TRUE);
689 fail_unless (gst_rtcp_packet_sdes_add_entry (&packet, GST_RTCP_SDES_CNAME,
690 sizeof ("test@foo.bar"), (guint8 *) "test@foo.bar") == TRUE);
693 fail_unless (gst_rtcp_buffer_add_packet (buf, GST_RTCP_TYPE_BYE,
695 fail_unless (gst_rtcp_packet_bye_add_ssrc (&packet, 0x5613212f) == TRUE);
696 fail_unless (gst_rtcp_packet_bye_add_ssrc (&packet, 0x00112233) == TRUE);
697 fail_unless (gst_rtcp_packet_bye_get_ssrc_count (&packet) == 2);
699 fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
700 fail_unless (gst_rtcp_packet_get_count (&packet) == 2);
701 fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_BYE);
702 fail_unless (gst_rtcp_packet_get_length (&packet) == 2);
705 fail_unless (gst_rtcp_buffer_get_first_packet (buf, &packet) == TRUE);
706 fail_unless (gst_rtcp_packet_move_to_next (&packet) == TRUE);
708 fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
709 fail_unless (gst_rtcp_packet_get_count (&packet) == 1);
710 fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SDES);
711 fail_unless (gst_rtcp_packet_get_length (&packet) == 5);
713 /* remove the SDES */
714 fail_unless (gst_rtcp_packet_remove (&packet) == TRUE);
716 /* we are now at the BYE packet */
717 fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
718 fail_unless (gst_rtcp_packet_get_count (&packet) == 2);
719 fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_BYE);
720 fail_unless (gst_rtcp_packet_get_length (&packet) == 2);
722 /* close and validate */
723 gst_rtcp_buffer_end (buf);
724 fail_unless (gst_rtcp_buffer_validate (buf) == TRUE);
725 gst_buffer_unref (buf);
733 Suite *s = suite_create ("rtp support library");
734 TCase *tc_chain = tcase_create ("general");
736 suite_add_tcase (s, tc_chain);
737 tcase_add_test (tc_chain, test_rtp_buffer);
738 tcase_add_test (tc_chain, test_rtp_buffer_validate_corrupt);
739 tcase_add_test (tc_chain, test_rtp_buffer_set_extension_data);
740 tcase_add_test (tc_chain, test_rtp_buffer_list_set_extension);
741 tcase_add_test (tc_chain, test_rtp_seqnum_compare);
743 tcase_add_test (tc_chain, test_rtcp_buffer);
745 tcase_add_test (tc_chain, test_rtp_buffer_list);
751 main (int argc, char **argv)
755 Suite *s = rtp_suite ();
756 SRunner *sr = srunner_create (s);
758 gst_check_init (&argc, &argv);
760 srunner_run_all (sr, CK_NORMAL);
761 nf = srunner_ntests_failed (sr);