3 * unit test for GstBufferList
5 * Copyright (C) 2009 Axis Communications <dev-gstreamer at axis dot com>
6 * @author Jonas Holmberg <jonas dot holmberg at axis dot com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
24 #include <gst/check/gstcheck.h>
25 #include <gst/gstbufferlist.h>
30 static GstBufferList *list;
36 list = gst_buffer_list_new ();
37 caps = gst_caps_new_empty_simple ("text/plain");
43 gst_caps_unref (caps);
44 gst_buffer_list_unref (list);
49 buffer_from_string (const gchar * str)
56 buf = gst_buffer_new_and_alloc (size);
57 gst_buffer_set_caps (buf, caps);
58 GST_BUFFER_TIMESTAMP (buf) = TIMESTAMP;
60 data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
61 memcpy (data, str, size);
62 gst_buffer_unmap (buf, data, size);
68 check_buffer (GstBuffer * buf, gsize size, const gchar * data)
71 gsize bsize, csize, msize;
73 bdata = gst_buffer_map (buf, &bsize, &msize, GST_MAP_READ);
74 csize = size ? size : bsize;
75 GST_DEBUG ("%lu %lu %lu", bsize, csize, msize);
76 fail_unless (bsize == csize);
77 fail_unless (memcmp (bdata, data, csize) == 0);
78 gst_buffer_unmap (buf, bdata, bsize);
82 GST_START_TEST (test_add_and_iterate)
87 /* buffer list is initially empty */
88 fail_unless (gst_buffer_list_length (list) == 0);
90 ASSERT_CRITICAL (gst_buffer_list_insert (list, 0, NULL));
91 ASSERT_CRITICAL (gst_buffer_list_insert (NULL, 0, NULL));
93 buf1 = gst_buffer_new ();
95 /* add a group of 2 buffers */
96 fail_unless (gst_buffer_list_length (list) == 0);
97 ASSERT_CRITICAL (gst_buffer_list_insert (list, -1, NULL));
98 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
99 gst_buffer_list_add (list, buf1);
100 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1); /* list takes ownership */
101 fail_unless (gst_buffer_list_length (list) == 1);
102 buf2 = gst_buffer_new ();
103 gst_buffer_list_add (list, buf2);
104 ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
105 fail_unless (gst_buffer_list_length (list) == 2);
111 GST_START_TEST (test_make_writable)
113 GstBufferListIterator *it;
114 GstBufferList *wlist;
120 /* add buffers to list */
121 it = gst_buffer_list_iterate (list);
122 gst_buffer_list_iterator_add_group (it);
123 buf1 = gst_buffer_new_and_alloc (1);
124 gst_buffer_list_iterator_add (it, buf1);
125 gst_buffer_list_iterator_add_group (it);
126 buf2 = gst_buffer_new_and_alloc (2);
127 gst_buffer_list_iterator_add (it, buf2);
128 buf3 = gst_buffer_new_and_alloc (3);
129 gst_buffer_list_iterator_add (it, buf3);
130 gst_buffer_list_iterator_free (it);
132 /* making it writable with refcount 1 returns the same list */
133 wlist = gst_buffer_list_make_writable (list);
134 fail_unless (wlist == list);
135 it = gst_buffer_list_iterate (list);
136 fail_unless (gst_buffer_list_iterator_next_group (it));
137 buf = gst_buffer_list_iterator_next (it);
138 fail_unless (buf == buf1);
139 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
140 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
141 fail_unless (gst_buffer_list_iterator_next_group (it));
142 buf = gst_buffer_list_iterator_next (it);
143 fail_unless (buf == buf2);
144 ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
145 buf = gst_buffer_list_iterator_next (it);
146 fail_unless (buf == buf3);
147 ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 1);
148 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
149 fail_if (gst_buffer_list_iterator_next_group (it));
150 gst_buffer_list_iterator_free (it);
152 /* making it writable with refcount 2 returns a copy of the list with
153 * increased refcount on the buffers in the list */
154 gst_buffer_list_ref (list);
155 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 2);
156 wlist = gst_buffer_list_make_writable (list);
157 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 1);
158 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (wlist) == 1);
159 fail_unless (wlist != list);
160 it = gst_buffer_list_iterate (wlist);
161 fail_unless (gst_buffer_list_iterator_next_group (it));
162 buf = gst_buffer_list_iterator_next (it);
163 fail_unless (buf == buf1);
164 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
165 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
166 fail_unless (gst_buffer_list_iterator_next_group (it));
167 buf = gst_buffer_list_iterator_next (it);
168 fail_unless (buf == buf2);
169 ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
170 buf = gst_buffer_list_iterator_next (it);
171 fail_unless (buf == buf3);
172 ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
173 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
174 fail_if (gst_buffer_list_iterator_next_group (it));
175 gst_buffer_list_iterator_free (it);
176 gst_buffer_list_unref (wlist);
181 GST_START_TEST (test_copy)
183 GstBufferListIterator *it;
184 GstBufferList *list_copy;
190 /* add buffers to the list */
191 it = gst_buffer_list_iterate (list);
192 gst_buffer_list_iterator_add_group (it);
193 buf1 = gst_buffer_new ();
194 gst_buffer_list_iterator_add (it, buf1);
195 gst_buffer_list_iterator_add_group (it);
196 buf2 = gst_buffer_new ();
197 gst_buffer_list_iterator_add (it, buf2);
198 buf3 = gst_buffer_new ();
199 gst_buffer_list_iterator_add (it, buf3);
200 gst_buffer_list_iterator_free (it);
203 list_copy = gst_buffer_list_copy (list);
204 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 1);
205 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list_copy) == 1);
206 fail_unless (list_copy != list);
207 it = gst_buffer_list_iterate (list_copy);
208 fail_unless (gst_buffer_list_iterator_next_group (it));
209 buf = gst_buffer_list_iterator_next (it);
210 fail_unless (buf == buf1);
211 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
212 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
213 fail_unless (gst_buffer_list_iterator_next_group (it));
214 buf = gst_buffer_list_iterator_next (it);
215 fail_unless (buf == buf2);
216 ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
217 buf = gst_buffer_list_iterator_next (it);
218 fail_unless (buf == buf3);
219 ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
220 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
221 fail_if (gst_buffer_list_iterator_next_group (it));
222 gst_buffer_list_iterator_free (it);
223 gst_buffer_list_unref (list_copy);
228 GST_START_TEST (test_steal)
230 GstBufferListIterator *it;
236 /* add buffers to the list */
237 it = gst_buffer_list_iterate (list);
238 gst_buffer_list_iterator_add_group (it);
239 buf1 = gst_buffer_new ();
240 gst_buffer_list_iterator_add (it, buf1);
241 gst_buffer_list_iterator_add_group (it);
242 buf2 = gst_buffer_new ();
243 gst_buffer_list_iterator_add (it, buf2);
244 buf3 = gst_buffer_new ();
245 gst_buffer_list_iterator_add (it, buf3);
246 gst_buffer_list_iterator_free (it);
248 /* check some error handling */
249 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (NULL)));
250 fail_unless (buf == NULL);
251 it = gst_buffer_list_iterate (list);
252 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
253 fail_unless (buf == NULL);
255 /* steal the first buffer */
256 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
257 fail_unless (gst_buffer_list_iterator_next_group (it));
258 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
259 fail_unless (gst_buffer_list_iterator_next (it) == buf1);
260 buf = gst_buffer_list_iterator_steal (it);
261 fail_unless (buf == buf1);
262 ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
263 gst_buffer_unref (buf);
264 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
265 fail_unless (buf == NULL);
267 /* steal the second buffer */
268 fail_unless (gst_buffer_list_iterator_next_group (it));
269 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
270 fail_unless (gst_buffer_list_iterator_next (it) == buf2);
271 buf = gst_buffer_list_iterator_steal (it);
272 fail_unless (buf == buf2);
273 ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
274 gst_buffer_unref (buf);
275 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
277 /* steal the third buffer */
278 fail_unless (gst_buffer_list_iterator_next (it) == buf3);
279 buf = gst_buffer_list_iterator_steal (it);
280 fail_unless (buf == buf3);
281 ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
282 gst_buffer_unref (buf);
283 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
285 gst_buffer_list_iterator_free (it);
287 /* iterate again when all buffers have been stolen */
288 it = gst_buffer_list_iterate (list);
289 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
290 fail_unless (gst_buffer_list_iterator_next_group (it));
291 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
292 fail_unless (gst_buffer_list_iterator_next_group (it));
293 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
294 fail_if (gst_buffer_list_iterator_next_group (it));
295 gst_buffer_list_iterator_free (it);
300 GST_START_TEST (test_take)
302 GstBufferListIterator *it;
308 /* add buffers to the list */
309 it = gst_buffer_list_iterate (list);
310 gst_buffer_list_iterator_add_group (it);
311 buf1 = gst_buffer_new ();
312 gst_buffer_ref (buf1);
313 gst_buffer_list_iterator_add (it, buf1);
314 gst_buffer_list_iterator_add_group (it);
315 buf2 = gst_buffer_new ();
316 gst_buffer_ref (buf2);
317 gst_buffer_list_iterator_add (it, buf2);
318 buf3 = gst_buffer_new ();
319 gst_buffer_ref (buf3);
320 gst_buffer_list_iterator_add (it, buf3);
321 gst_buffer_list_iterator_free (it);
323 /* check some error handling */
324 ASSERT_CRITICAL (gst_buffer_list_iterator_take (NULL, NULL));
325 it = gst_buffer_list_iterate (list);
326 ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
327 buf = gst_buffer_new ();
328 gst_buffer_ref (buf);
329 ASSERT_CRITICAL (gst_buffer_list_iterator_take (NULL, buf));
330 ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
332 /* replace the first buffer */
333 ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
334 ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
335 fail_unless (gst_buffer_list_iterator_next_group (it));
336 ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
337 ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
338 fail_unless (gst_buffer_list_iterator_next (it) == buf1);
339 ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
340 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
341 gst_buffer_list_iterator_take (it, buf);
342 ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
343 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
344 gst_buffer_unref (buf1);
346 /* replace the first buffer again, with itself */
347 gst_buffer_ref (buf);
348 gst_buffer_list_iterator_take (it, buf);
349 ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
351 /* replace the second buffer */
352 gst_buffer_ref (buf);
353 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
354 ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
355 ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
356 fail_unless (gst_buffer_list_iterator_next_group (it));
357 ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
358 ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
359 ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
360 ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
361 fail_unless (gst_buffer_list_iterator_next (it) == buf2);
362 ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
363 ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
364 gst_buffer_list_iterator_take (it, buf);
365 ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
366 ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
367 gst_buffer_unref (buf2);
369 /* replace the third buffer */
370 gst_buffer_ref (buf);
371 fail_unless (gst_buffer_list_iterator_next (it) == buf3);
372 ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
373 gst_buffer_list_iterator_take (it, buf);
374 ASSERT_BUFFER_REFCOUNT (buf, "buf", 4);
375 ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 1);
376 gst_buffer_unref (buf3);
377 fail_if (gst_buffer_list_iterator_next_group (it));
378 ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
379 ASSERT_BUFFER_REFCOUNT (buf, "buf", 4);
380 gst_buffer_unref (buf);
382 gst_buffer_list_iterator_free (it);
387 static gpointer do_data_func_data;
388 static gboolean notified;
391 do_data_func (GstBuffer * buffer, gpointer data)
393 do_data_func_data = data;
400 do_func_null (GstBuffer * buffer)
402 gst_buffer_unref (buffer);
407 GST_START_TEST (test_do)
409 GstBufferListIterator *it;
415 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (NULL, NULL, NULL)));
416 fail_unless (buf == NULL);
417 fail_unless (buf == NULL);
418 it = gst_buffer_list_iterate (list);
419 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (it, NULL, NULL)));
420 fail_unless (buf == NULL);
421 fail_unless (buf == NULL);
423 /* add buffers to the list */
424 gst_buffer_list_iterator_add_group (it);
425 buf1 = gst_buffer_new ();
426 gst_buffer_ref (buf1);
427 gst_buffer_list_iterator_add (it, buf1);
428 gst_buffer_list_iterator_add_group (it);
429 gst_buffer_list_iterator_free (it);
431 /* call do-function */
432 it = gst_buffer_list_iterate (list);
433 fail_unless (gst_buffer_list_iterator_next_group (it));
434 ASSERT_CRITICAL ((buf =
435 gst_buffer_list_iterator_do (it,
436 (GstBufferListDoFunction) gst_buffer_ref, NULL)));
437 fail_unless (buf == NULL);
438 data = (char *) "data";
439 ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (it, do_data_func,
441 fail_unless (buf == NULL);
442 fail_unless (do_data_func_data != data);
443 buf = gst_buffer_list_iterator_next (it);
444 fail_unless (buf == buf1);
445 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
447 gst_buffer_list_iterator_do (it, (GstBufferListDoFunction) gst_buffer_ref,
449 fail_unless (buf == buf1);
450 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 3);
451 gst_buffer_unref (buf);
452 buf = gst_buffer_list_iterator_do (it, do_data_func, data);
453 fail_unless (buf == buf1);
454 fail_unless (do_data_func_data == data);
456 /* do-function that return a new buffer replaces the buffer in the list */
457 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
458 buf = gst_buffer_list_iterator_do (it,
459 (GstBufferListDoFunction) gst_mini_object_make_writable, NULL);
460 fail_unless (buf != buf1);
461 ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
462 ASSERT_BUFFER_REFCOUNT (buf, "buf1", 1);
463 gst_buffer_replace (&buf1, buf);
465 /* do-function that return NULL removes the buffer from the list */
466 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
467 fail_unless (gst_buffer_list_iterator_do (it,
468 (GstBufferListDoFunction) do_func_null, NULL) == NULL);
469 ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
470 ASSERT_CRITICAL ((buf =
471 gst_buffer_list_iterator_do (it,
472 (GstBufferListDoFunction) gst_buffer_ref, NULL)));
473 fail_unless (buf == NULL);
474 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
475 gst_buffer_list_iterator_free (it);
476 it = gst_buffer_list_iterate (list);
477 fail_unless (gst_buffer_list_iterator_next_group (it));
478 fail_unless (gst_buffer_list_iterator_next (it) == NULL);
479 fail_if (gst_buffer_list_iterator_next_group (it));
480 gst_buffer_list_iterator_free (it);
481 gst_buffer_unref (buf1);
486 GST_START_TEST (test_merge)
488 GstBufferListIterator *it;
489 GstBufferListIterator *merge_it;
490 GstBuffer *merged_buf;
493 it = gst_buffer_list_iterate (list);
494 fail_unless (gst_buffer_list_iterator_merge_group (it) == NULL);
496 /* create a new group and add a buffer */
497 gst_buffer_list_iterator_add_group (it);
498 fail_unless (gst_buffer_list_iterator_merge_group (it) == NULL);
499 buf = buffer_from_string ("One");
500 gst_buffer_ref (buf);
501 gst_buffer_list_iterator_add (it, buf);
503 /* merging a group with one buffer returns a copy of the buffer */
504 merge_it = gst_buffer_list_iterate (list);
505 fail_unless (gst_buffer_list_iterator_next_group (merge_it));
506 merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
507 fail_unless (merged_buf != buf);
508 ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
509 gst_buffer_unref (buf);
510 fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
511 fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
512 check_buffer (merged_buf, 3, "One");
513 gst_buffer_unref (merged_buf);
515 /* add another buffer to the same group */
516 gst_buffer_list_iterator_add (it, buffer_from_string ("Group"));
518 /* merging a group returns a new buffer with merged data */
519 merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
520 ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
521 fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
522 fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
523 check_buffer (merged_buf, 8, "OneGroup");
525 /* merging the same group again should return a new buffer with merged data */
526 buf = gst_buffer_list_iterator_merge_group (merge_it);
527 ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
528 fail_unless (buf != merged_buf);
529 check_buffer (buf, 8, "OneGroup");
530 gst_buffer_unref (buf);
531 gst_buffer_unref (merged_buf);
533 /* add a new group */
534 gst_buffer_list_iterator_add_group (it);
535 gst_buffer_list_iterator_add (it, buffer_from_string ("AnotherGroup"));
536 gst_buffer_list_iterator_free (it);
538 /* merge the first group again */
539 merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
540 ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
541 fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
542 fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
543 check_buffer (merged_buf, 8, "OneGroup");
544 gst_buffer_unref (merged_buf);
546 /* merge the second group */
547 fail_unless (gst_buffer_list_iterator_next_group (merge_it));
548 merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
549 ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
550 fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
551 fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
552 check_buffer (merged_buf, 12, "AnotherGroup");
553 gst_buffer_unref (merged_buf);
555 gst_buffer_list_iterator_free (merge_it);
557 /* steal the second buffer and merge the first group again */
558 it = gst_buffer_list_iterate (list);
559 fail_unless (gst_buffer_list_iterator_next_group (it));
560 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
561 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
562 buf = gst_buffer_list_iterator_steal (it);
563 gst_buffer_list_iterator_free (it);
564 fail_unless (buf != NULL);
565 check_buffer (buf, 0, "Group");
566 gst_buffer_unref (buf);
567 merge_it = gst_buffer_list_iterate (list);
568 fail_unless (gst_buffer_list_iterator_next_group (merge_it));
569 merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
570 ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
571 fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
572 fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
573 check_buffer (merged_buf, 3, "One");
574 gst_buffer_unref (merged_buf);
576 /* steal the first buffer too and merge the first group again */
577 it = gst_buffer_list_iterate (list);
578 fail_unless (gst_buffer_list_iterator_next_group (it));
579 fail_unless (gst_buffer_list_iterator_next (it) != NULL);
580 buf = gst_buffer_list_iterator_steal (it);
581 fail_unless (buf != NULL);
582 check_buffer (buf, 3, "One");
583 gst_buffer_unref (buf);
584 gst_buffer_list_iterator_free (it);
585 fail_unless (gst_buffer_list_iterator_merge_group (merge_it) == NULL);
586 gst_buffer_list_iterator_free (merge_it);
593 GstBuffer *buf[3][3];
597 static GstBufferListItem
598 foreach_func1 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
600 fail_unless (buffer != NULL);
601 fail_unless (*buffer == data->buf[group][idx]);
605 return GST_BUFFER_LIST_CONTINUE;
608 static GstBufferListItem
609 foreach_func2 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
611 fail_unless (idx == 0);
612 fail_unless (buffer != NULL);
613 fail_unless (*buffer == data->buf[group][idx]);
617 return GST_BUFFER_LIST_SKIP_GROUP;
620 static GstBufferListItem
621 foreach_func3 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
623 fail_unless (group == 0);
624 fail_unless (idx == 0);
625 fail_unless (buffer != NULL);
626 fail_unless (*buffer == data->buf[group][idx]);
630 return GST_BUFFER_LIST_END;
633 static GstBufferListItem
634 foreach_func4 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
636 fail_unless (idx == 0);
637 fail_unless (buffer != NULL);
638 fail_unless (*buffer == data->buf[group][idx]);
640 gst_buffer_unref (*buffer);
644 return GST_BUFFER_LIST_SKIP_GROUP;
647 static GstBufferListItem
648 foreach_func5 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
650 fail_unless (buffer != NULL);
654 return GST_BUFFER_LIST_CONTINUE;
657 GST_START_TEST (test_foreach)
659 GstBufferListIterator *it;
662 /* add buffers to the list */
663 it = gst_buffer_list_iterate (list);
664 gst_buffer_list_iterator_add_group (it);
665 data.buf[0][0] = gst_buffer_new ();
666 gst_buffer_list_iterator_add (it, data.buf[0][0]);
667 gst_buffer_list_iterator_add_group (it);
668 data.buf[1][0] = gst_buffer_new ();
669 gst_buffer_list_iterator_add (it, data.buf[1][0]);
670 data.buf[1][1] = gst_buffer_new ();
671 gst_buffer_list_iterator_add (it, data.buf[1][1]);
672 gst_buffer_list_iterator_free (it);
674 fail_unless (gst_buffer_list_get (list, 0, 0) == data.buf[0][0]);
675 fail_unless (gst_buffer_list_get (list, 0, 1) == NULL);
676 fail_unless (gst_buffer_list_get (list, 1, 0) == data.buf[1][0]);
677 fail_unless (gst_buffer_list_get (list, 1, 1) == data.buf[1][1]);
678 fail_unless (gst_buffer_list_get (list, 1, 2) == NULL);
679 fail_unless (gst_buffer_list_get (list, 2, 0) == NULL);
680 fail_unless (gst_buffer_list_get (list, 2, 1) == NULL);
681 fail_unless (gst_buffer_list_get (list, 3, 3) == NULL);
683 /* iterate everything */
685 gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func1, &data);
686 fail_unless (data.iter == 3);
688 /* iterate only the first buffer of groups */
690 gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func2, &data);
691 fail_unless (data.iter == 2);
693 /* iterate only the first buffer */
695 gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func3, &data);
696 fail_unless (data.iter == 1);
698 /* remove the first buffer of each group */
700 gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func4, &data);
701 fail_unless (data.iter == 2);
703 fail_unless (gst_buffer_list_get (list, 0, 0) == NULL);
704 fail_unless (gst_buffer_list_get (list, 0, 1) == NULL);
705 fail_unless (gst_buffer_list_get (list, 1, 0) == data.buf[1][1]);
706 fail_unless (gst_buffer_list_get (list, 1, 1) == NULL);
707 fail_unless (gst_buffer_list_get (list, 1, 2) == NULL);
708 fail_unless (gst_buffer_list_get (list, 2, 0) == NULL);
710 /* iterate everything, just one more buffer now */
712 gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func5, &data);
713 fail_unless (data.iter == 1);
718 GST_START_TEST (test_list)
720 GstBufferListIterator *it;
724 for (i = 0; i < 10; i++) {
726 g_snprintf (name, 10, "%d", i);
727 l = g_list_append (l, buffer_from_string (name));
730 /* add buffers to the list */
731 it = gst_buffer_list_iterate (list);
732 gst_buffer_list_iterator_add_group (it);
733 gst_buffer_list_iterator_add_list (it, l);
736 gst_buffer_list_iterator_add (it, buffer_from_string ("10"));
738 /* add another list */
739 l = g_list_append (NULL, buffer_from_string ("11"));
740 gst_buffer_list_iterator_add_list (it, l);
742 for (i = 0; i < 12; i++) {
746 buf = gst_buffer_list_get (list, 0, i);
747 g_snprintf (name, 10, "%d", i);
748 check_buffer (buf, 0, name);
750 gst_buffer_list_iterator_free (it);
757 gst_buffer_list_suite (void)
759 Suite *s = suite_create ("GstBufferList");
760 TCase *tc_chain = tcase_create ("general");
762 suite_add_tcase (s, tc_chain);
763 tcase_add_checked_fixture (tc_chain, setup, cleanup);
764 tcase_add_test (tc_chain, test_add_and_iterate);
766 tcase_add_test (tc_chain, test_make_writable);
767 tcase_add_test (tc_chain, test_copy);
768 tcase_add_test (tc_chain, test_steal);
769 tcase_add_test (tc_chain, test_take);
770 tcase_add_test (tc_chain, test_do);
771 tcase_add_test (tc_chain, test_merge);
772 tcase_add_test (tc_chain, test_foreach);
773 tcase_add_test (tc_chain, test_list);
779 GST_CHECK_MAIN (gst_buffer_list);