2 * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
3 * 2009 Wim Taymans <wim.taymans@gmail.com>
5 * gstsegment.c: Unit test for segments
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
23 #include <gst/check/gstcheck.h>
26 check_times (GstSegment * segment, guint64 position, guint64 stream_time,
31 st = gst_segment_to_stream_time (segment, segment->format, position);
32 rt = gst_segment_to_running_time (segment, segment->format, position);
33 GST_DEBUG ("position %" G_GUINT64_FORMAT ", st %" G_GUINT64_FORMAT ", rt %"
34 G_GUINT64_FORMAT, position, stream_time, running_time);
36 fail_unless_equals_int64 (st, stream_time);
37 fail_unless_equals_int64 (rt, running_time);
38 if (stream_time != -1) {
39 pos = gst_segment_position_from_stream_time (segment, segment->format, st);
40 fail_unless_equals_int64 (pos, position);
44 /* mess with the segment structure in the bytes format */
45 GST_START_TEST (segment_seek_nosize)
49 guint64 cstart, cstop;
52 gst_segment_init (&segment, GST_FORMAT_BYTES);
54 /* configure segment to start 100 */
55 gst_segment_do_seek (&segment, 1.0,
58 GST_SEEK_TYPE_SET, 100, GST_SEEK_TYPE_NONE, -1, &update);
59 fail_unless (segment.start == 100);
60 fail_unless (segment.position == 100);
61 fail_unless (segment.stop == -1);
62 fail_unless (update == TRUE);
63 /* appended after current position 0 */
64 check_times (&segment, 100, 100, 0);
66 /* do some clipping on the open range */
67 /* completely outside */
68 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop);
69 fail_unless (res == FALSE);
71 /* touching lower bound, still outside of the segment */
72 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 100, &cstart, &cstop);
73 fail_unless (res == FALSE);
75 /* partially inside */
76 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 150, &cstart, &cstop);
77 fail_unless (res == TRUE);
78 fail_unless (cstart == 100);
79 fail_unless (cstop == 150);
81 /* inside, touching lower bound */
82 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
83 100, 150, &cstart, &cstop);
84 fail_unless (res == TRUE);
85 fail_unless (cstart == 100);
86 fail_unless (cstop == 150);
88 /* special case, 0 duration and outside segment */
89 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 90, 90, &cstart, &cstop);
90 fail_unless (res == FALSE);
92 /* special case, 0 duration and touching lower bound, i.e. inside segment */
93 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
94 100, 100, &cstart, &cstop);
95 fail_unless (res == TRUE);
96 fail_unless (cstart == 100);
97 fail_unless (cstop == 100);
99 /* special case, 0 duration and inside the segment */
100 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
101 120, 120, &cstart, &cstop);
102 fail_unless (res == TRUE);
103 fail_unless (cstart == 120);
104 fail_unless (cstop == 120);
106 /* completely inside */
107 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
108 150, 200, &cstart, &cstop);
109 fail_unless (res == TRUE);
110 fail_unless (cstart == 150);
111 fail_unless (cstop == 200);
114 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, -1, 100, &cstart, &cstop);
115 fail_unless (res == FALSE);
117 /* start outside, we don't know the stop */
118 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, -1, &cstart, &cstop);
119 fail_unless (res == TRUE);
120 fail_unless (cstart == 100);
121 fail_unless (cstop == -1);
123 /* start on lower bound */
124 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 100, -1, &cstart, &cstop);
125 fail_unless (res == TRUE);
126 fail_unless (cstart == 100);
127 fail_unless (cstop == -1);
130 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 150, -1, &cstart, &cstop);
131 fail_unless (res == TRUE);
132 fail_unless (cstart == 150);
133 fail_unless (cstop == -1);
135 /* move to 150, this is a running_time of 50 */
136 segment.position = 150;
137 check_times (&segment, 150, 150, 50);
139 /* add 100 to start, set stop to 300 */
140 gst_segment_do_seek (&segment, 1.0,
143 GST_SEEK_TYPE_SET, 100 + 100, GST_SEEK_TYPE_SET, 300, &update);
144 fail_unless (segment.start == 200);
145 fail_unless (segment.position == 200);
146 fail_unless (segment.stop == 300);
147 fail_unless (segment.base == 50);
148 fail_unless (update == TRUE);
149 check_times (&segment, 200, 200, 50);
150 check_times (&segment, 250, 250, 100);
153 /* add 100 to start (to 300), set stop to 200, this is not allowed.
154 * nothing should be updated in the segment. A g_warning is
156 ASSERT_CRITICAL (gst_segment_do_seek (&segment, 1.0,
159 GST_SEEK_TYPE_SET, 200 + 100, GST_SEEK_TYPE_SET, 200, &update));
160 fail_unless (segment.start == 200);
161 fail_unless (segment.position == 200);
162 fail_unless (segment.stop == 300);
163 fail_unless (segment.base == 50);
164 /* update didn't change */
165 fail_unless (update == FALSE);
166 check_times (&segment, 200, 200, 50);
167 check_times (&segment, 250, 250, 100);
170 /* seek relative to end, should not do anything since size is
172 gst_segment_do_seek (&segment, 1.0,
175 GST_SEEK_TYPE_END, -300, GST_SEEK_TYPE_END, -100, &update);
176 fail_unless (segment.start == 200);
177 fail_unless (segment.position == 200);
178 fail_unless (segment.stop == 300);
179 fail_unless (segment.base == 50);
180 fail_unless (update == FALSE);
181 check_times (&segment, 250, 250, 100);
183 /* completely outside */
184 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop);
185 fail_unless (res == FALSE);
187 /* touching lower bound */
188 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 200, &cstart, &cstop);
189 fail_unless (res == FALSE);
191 /* partially inside */
192 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 250, &cstart, &cstop);
193 fail_unless (res == TRUE);
194 fail_unless (cstart == 200);
195 fail_unless (cstop == 250);
197 /* inside, touching lower bound */
198 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
199 200, 250, &cstart, &cstop);
200 fail_unless (res == TRUE);
201 fail_unless (cstart == 200);
202 fail_unless (cstop == 250);
204 /* completely inside */
205 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
206 250, 290, &cstart, &cstop);
207 fail_unless (res == TRUE);
208 fail_unless (cstart == 250);
209 fail_unless (cstop == 290);
211 /* partially inside */
212 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
213 250, 350, &cstart, &cstop);
214 fail_unless (res == TRUE);
215 fail_unless (cstart == 250);
216 fail_unless (cstop == 300);
219 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, -1, 100, &cstart, &cstop);
220 fail_unless (res == FALSE);
223 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, -1, &cstart, &cstop);
224 fail_unless (res == TRUE);
225 fail_unless (cstart == 200);
226 fail_unless (cstop == 300);
228 /* start on lower bound */
229 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 200, -1, &cstart, &cstop);
230 fail_unless (res == TRUE);
231 fail_unless (cstart == 200);
232 fail_unless (cstop == 300);
235 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 250, -1, &cstart, &cstop);
236 fail_unless (res == TRUE);
237 fail_unless (cstart == 250);
238 fail_unless (cstop == 300);
240 /* start outside on boundary */
241 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 300, -1, &cstart, &cstop);
242 fail_unless (res == FALSE);
244 /* start completely outside */
245 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 350, -1, &cstart, &cstop);
246 fail_unless (res == FALSE);
251 /* mess with the segment structure in the bytes format */
252 GST_START_TEST (segment_seek_size)
256 guint64 cstart, cstop;
259 gst_segment_init (&segment, GST_FORMAT_BYTES);
260 segment.duration = 200;
262 /* configure segment to start 100 */
263 gst_segment_do_seek (&segment, 1.0,
266 GST_SEEK_TYPE_SET, 100, GST_SEEK_TYPE_NONE, -1, &update);
267 fail_unless (segment.start == 100);
268 fail_unless (segment.position == 100);
269 fail_unless (segment.stop == -1);
270 fail_unless (update == TRUE);
271 check_times (&segment, 100, 100, 0);
273 /* do some clipping on the open range */
274 /* completely outside */
275 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop);
276 fail_unless (res == FALSE);
278 /* touching lower bound */
279 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 100, &cstart, &cstop);
280 fail_unless (res == FALSE);
282 /* partially inside */
283 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 150, &cstart, &cstop);
284 fail_unless (res == TRUE);
285 fail_unless (cstart == 100);
286 fail_unless (cstop == 150);
288 /* inside, touching lower bound */
289 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
290 100, 150, &cstart, &cstop);
291 fail_unless (res == TRUE);
292 fail_unless (cstart == 100);
293 fail_unless (cstop == 150);
295 /* completely inside */
296 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
297 150, 200, &cstart, &cstop);
298 fail_unless (res == TRUE);
299 fail_unless (cstart == 150);
300 fail_unless (cstop == 200);
303 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, -1, 100, &cstart, &cstop);
304 fail_unless (res == FALSE);
307 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, -1, &cstart, &cstop);
308 fail_unless (res == TRUE);
309 fail_unless (cstart == 100);
310 fail_unless (cstop == -1);
312 /* start on lower bound */
313 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 100, -1, &cstart, &cstop);
314 fail_unless (res == TRUE);
315 fail_unless (cstart == 100);
316 fail_unless (cstop == -1);
319 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 150, -1, &cstart, &cstop);
320 fail_unless (res == TRUE);
321 fail_unless (cstart == 150);
322 fail_unless (cstop == -1);
324 /* add 100 to start, set stop to 300, stop clips to 200 */
325 gst_segment_do_seek (&segment, 1.0,
328 GST_SEEK_TYPE_SET, 100 + 100, GST_SEEK_TYPE_SET, 300, &update);
329 fail_unless (segment.start == 200);
330 fail_unless (segment.position == 200);
331 fail_unless (segment.stop == 200);
332 check_times (&segment, 200, 200, 0);
334 /* add 100 to start (to 300), set stop to 200, this clips start
336 gst_segment_do_seek (&segment, 1.0,
339 GST_SEEK_TYPE_SET, 200 + 100, GST_SEEK_TYPE_SET, 200, &update);
340 fail_unless (segment.start == 200);
341 fail_unless (segment.position == 200);
342 fail_unless (segment.stop == 200);
343 fail_unless (update == FALSE);
344 check_times (&segment, 200, 200, 0);
346 /* seek relative to end */
347 gst_segment_do_seek (&segment, 1.0,
350 GST_SEEK_TYPE_END, -100, GST_SEEK_TYPE_END, -20, &update);
351 fail_unless (segment.start == 100);
352 fail_unless (segment.position == 100);
353 fail_unless (segment.stop == 180);
354 fail_unless (update == TRUE);
355 check_times (&segment, 150, 150, 50);
357 /* completely outside */
358 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop);
359 fail_unless (res == FALSE);
361 /* touching lower bound */
362 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 100, &cstart, &cstop);
363 fail_unless (res == FALSE);
365 /* partially inside */
366 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 150, &cstart, &cstop);
367 fail_unless (res == TRUE);
368 fail_unless (cstart == 100);
369 fail_unless (cstop == 150);
371 /* inside, touching lower bound */
372 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
373 100, 150, &cstart, &cstop);
374 fail_unless (res == TRUE);
375 fail_unless (cstart == 100);
376 fail_unless (cstop == 150);
378 /* completely inside */
379 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
380 150, 170, &cstart, &cstop);
381 fail_unless (res == TRUE);
382 fail_unless (cstart == 150);
383 fail_unless (cstop == 170);
385 /* partially inside */
386 res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
387 150, 250, &cstart, &cstop);
388 fail_unless (res == TRUE);
389 fail_unless (cstart == 150);
390 fail_unless (cstop == 180);
393 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, -1, 100, &cstart, &cstop);
394 fail_unless (res == FALSE);
397 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, -1, &cstart, &cstop);
398 fail_unless (res == TRUE);
399 fail_unless (cstart == 100);
400 fail_unless (cstop == 180);
402 /* start on lower bound */
403 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 100, -1, &cstart, &cstop);
404 fail_unless (res == TRUE);
405 fail_unless (cstart == 100);
406 fail_unless (cstop == 180);
409 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 150, -1, &cstart, &cstop);
410 fail_unless (res == TRUE);
411 fail_unless (cstart == 150);
412 fail_unless (cstop == 180);
414 /* start outside on boundary */
415 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 180, -1, &cstart, &cstop);
416 fail_unless (res == FALSE);
418 /* start completely outside */
419 res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 250, -1, &cstart, &cstop);
420 fail_unless (res == FALSE);
425 GST_START_TEST (segment_seek_reverse)
430 gst_segment_init (&segment, GST_FORMAT_BYTES);
431 segment.duration = 200;
433 /* configure segment to stop 100 */
434 gst_segment_do_seek (&segment, -1.0,
437 GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 100, &update);
438 fail_unless (segment.start == 0);
439 fail_unless (segment.stop == 100);
440 fail_unless (segment.time == 0);
441 fail_unless (segment.position == 100);
442 fail_unless (update == TRUE);
443 check_times (&segment, 100, 100, 0);
444 check_times (&segment, 50, 50, 50);
445 check_times (&segment, 0, 0, 100);
448 gst_segment_do_seek (&segment, -1.0,
451 GST_SEEK_TYPE_SET, 10, GST_SEEK_TYPE_SET, 100 - 20, &update);
452 fail_unless (segment.start == 10);
453 fail_unless (segment.stop == 80);
454 fail_unless (segment.time == 10);
455 fail_unless (segment.position == 80);
456 fail_unless (update == TRUE);
457 check_times (&segment, 80, 80, 0);
458 check_times (&segment, 40, 40, 40);
459 check_times (&segment, 10, 10, 70);
461 gst_segment_do_seek (&segment, -1.0,
464 GST_SEEK_TYPE_SET, 20, GST_SEEK_TYPE_NONE, 0, &update);
465 fail_unless (segment.start == 20);
466 fail_unless (segment.stop == 80);
467 fail_unless (segment.time == 20);
468 fail_unless (segment.position == 80);
469 fail_unless (update == FALSE);
470 check_times (&segment, 80, 80, 0);
471 check_times (&segment, 20, 20, 60);
476 /* mess with the segment structure in the bytes format */
477 GST_START_TEST (segment_seek_rate)
482 gst_segment_init (&segment, GST_FORMAT_BYTES);
484 /* configure segment to rate 2.0 */
485 gst_segment_do_seek (&segment, 2.0,
488 GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_NONE, -1, &update);
489 fail_unless (segment.format == GST_FORMAT_BYTES);
490 fail_unless (segment.start == 0);
491 fail_unless (segment.position == 0);
492 fail_unless (segment.stop == -1);
493 fail_unless (segment.rate == 2.0);
494 fail_unless (update == FALSE);
495 check_times (&segment, 50, 50, 25);
497 /* set a real stop position, this must happen in bytes */
498 gst_segment_do_seek (&segment, 3.0,
501 GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_SET, 100, &update);
502 fail_unless (segment.format == GST_FORMAT_BYTES);
503 fail_unless (segment.start == 0);
504 fail_unless (segment.stop == 100);
505 fail_unless (segment.rate == 3.0);
506 /* no seek should happen, we just updated the stop position in forward
508 fail_unless (update == FALSE);
509 check_times (&segment, 60, 60, 20);
511 /* set some duration, stop -1 END seeks will now work with the
512 * duration, if the formats match */
513 segment.duration = 200;
514 fail_unless (segment.duration == 200);
516 /* seek to end with 0 should set the stop to the duration */
517 gst_segment_do_seek (&segment, 2.0,
518 GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
519 GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 0, &update);
520 fail_unless (segment.stop == 200);
521 fail_unless (segment.duration == 200);
523 /* subtract 100 from the end */
524 gst_segment_do_seek (&segment, 2.0,
525 GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
526 GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, -100, &update);
527 fail_unless (segment.stop == 100);
528 fail_unless (segment.duration == 200);
530 /* add 100 to the duration, this should be clamped to the duration */
531 gst_segment_do_seek (&segment, 2.0,
532 GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
533 GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 100, &update);
534 fail_unless (segment.stop == 200);
535 fail_unless (segment.duration == 200);
540 GST_START_TEST (segment_copy)
543 GstSegment segment = { 0.0, };
545 /* this is a boxed type copy function, we support copying NULL */
546 fail_unless (gst_segment_copy (NULL) == NULL);
548 gst_segment_init (&segment, GST_FORMAT_TIME);
551 segment.applied_rate = 1.0;
556 copy = gst_segment_copy (&segment);
557 fail_unless (copy != NULL);
558 /* we inited the struct on the stack to zeroes, so direct comparison should
559 * be ok here despite the padding field and regardless of implementation */
560 fail_unless (memcmp (copy, &segment, sizeof (GstSegment)) == 0);
561 gst_segment_free (copy);
566 /* mess with the segment structure in the bytes format */
567 GST_START_TEST (segment_seek_noupdate)
572 gst_segment_init (&segment, GST_FORMAT_TIME);
575 segment.position = 50;
579 /* doesn't change anything */
580 gst_segment_do_seek (&segment, 1.0,
583 GST_SEEK_TYPE_NONE, 0, GST_SEEK_TYPE_NONE, 0, &update);
584 fail_unless (update == FALSE);
585 fail_unless (segment.format == GST_FORMAT_TIME);
586 fail_unless (segment.start == 0);
587 fail_unless (segment.stop == 200);
588 fail_unless (segment.time == 0);
589 fail_unless (segment.position == 50);
590 fail_unless (segment.base == 50);
591 fail_unless (segment.offset == 50);
593 gst_segment_do_seek (&segment, 2.0,
596 GST_SEEK_TYPE_NONE, 0, GST_SEEK_TYPE_NONE, 0, &update);
597 fail_unless (update == FALSE);
598 fail_unless (segment.format == GST_FORMAT_TIME);
599 fail_unless (segment.start == 0);
600 fail_unless (segment.stop == 200);
601 fail_unless (segment.time == 0);
602 fail_unless (segment.position == 50);
603 fail_unless (segment.base == 50);
604 fail_unless_equals_int (segment.offset, 50);
606 gst_segment_do_seek (&segment, 1.0,
609 GST_SEEK_TYPE_NONE, 0, GST_SEEK_TYPE_NONE, 0, &update);
610 fail_unless (update == FALSE);
611 fail_unless (segment.format == GST_FORMAT_TIME);
612 fail_unless (segment.start == 0);
613 fail_unless (segment.stop == 200);
614 fail_unless (segment.time == 0);
615 fail_unless (segment.position == 50);
616 fail_unless (segment.base == 0);
617 fail_unless (segment.offset == 50);
622 GST_START_TEST (segment_offset)
626 gst_segment_init (&segment, GST_FORMAT_TIME);
629 segment.position = 50;
633 check_times (&segment, 20, 20, 20);
634 check_times (&segment, 220, -1, -1);
636 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
638 fail_unless (segment.start == 0);
639 fail_unless (segment.stop == 200);
640 fail_unless (segment.time == 0);
641 fail_unless (segment.position == 50);
642 fail_unless (segment.base == 0);
643 fail_unless (segment.offset == 0);
644 check_times (&segment, 20, 20, 20);
646 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
648 fail_unless (segment.start == 0);
649 fail_unless (segment.stop == 200);
650 fail_unless (segment.time == 0);
651 fail_unless (segment.position == 50);
652 fail_unless (segment.base == 100);
653 fail_unless (segment.offset == 0);
654 check_times (&segment, 20, 20, 120);
656 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
658 fail_unless (segment.start == 0);
659 fail_unless (segment.stop == 200);
660 fail_unless (segment.time == 0);
661 fail_unless (segment.position == 50);
662 fail_unless (segment.base == 50);
663 fail_unless (segment.offset == 0);
664 check_times (&segment, 20, 20, 70);
666 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
668 fail_unless (segment.start == 0);
669 fail_unless (segment.stop == 200);
670 fail_unless (segment.time == 0);
671 fail_unless (segment.position == 50);
672 fail_unless (segment.base == 0);
673 fail_unless (segment.offset == 50);
674 check_times (&segment, 20, 20, -1);
675 check_times (&segment, 200, 200, 150);
677 /* can go negative */
678 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
680 fail_unless (segment.start == 0);
681 fail_unless (segment.stop == 200);
682 fail_unless (segment.time == 0);
683 fail_unless (segment.position == 50);
684 fail_unless (segment.base == 0);
685 fail_unless (segment.offset == 50);
686 check_times (&segment, 100, 100, 50);
687 check_times (&segment, 200, 200, 150);
689 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
691 fail_unless (segment.start == 0);
692 fail_unless (segment.stop == 200);
693 fail_unless (segment.time == 0);
694 fail_unless (segment.position == 50);
695 fail_unless (segment.base == 0);
696 fail_unless (segment.offset == 200);
697 check_times (&segment, 200, 200, 0);
699 gst_segment_init (&segment, GST_FORMAT_TIME);
702 segment.position = 50;
706 check_times (&segment, 40, 20, 20);
707 check_times (&segment, 240, -1, -1);
709 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
711 fail_unless (segment.start == 20);
712 fail_unless (segment.stop == 220);
713 fail_unless (segment.time == 0);
714 fail_unless (segment.position == 50);
715 fail_unless (segment.base == 0);
716 fail_unless (segment.offset == 0);
717 check_times (&segment, 40, 20, 20);
719 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
721 fail_unless (segment.start == 20);
722 fail_unless (segment.stop == 220);
723 fail_unless (segment.time == 0);
724 fail_unless (segment.position == 50);
725 fail_unless (segment.base == 100);
726 fail_unless (segment.offset == 0);
727 check_times (&segment, 40, 20, 120);
729 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
731 fail_unless (segment.start == 20);
732 fail_unless (segment.stop == 220);
733 fail_unless (segment.time == 0);
734 fail_unless (segment.position == 50);
735 fail_unless (segment.base == 50);
736 fail_unless (segment.offset == 0);
737 check_times (&segment, 40, 20, 70);
739 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
741 fail_unless (segment.start == 20);
742 fail_unless (segment.stop == 220);
743 fail_unless (segment.time == 0);
744 fail_unless (segment.position == 50);
745 fail_unless (segment.base == 0);
746 fail_unless (segment.offset == 50);
747 check_times (&segment, 40, 20, -1);
748 check_times (&segment, 220, 200, 150);
753 GST_START_TEST (segment_full)
758 gst_segment_init (&segment, GST_FORMAT_TIME);
761 segment.position = 150;
765 check_times (&segment, 100, 50, 50);
766 check_times (&segment, 220, -1, -1);
768 fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME,
770 fail_unless (rt == 0);
771 fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME,
773 fail_unless (rt == 150);
774 fail_unless (!gst_segment_clip (&segment, GST_FORMAT_TIME, 40, 40, NULL,
776 fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME, 40,
778 fail_unless (!gst_segment_clip (&segment, GST_FORMAT_TIME, 49, 49, NULL,
780 fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME, 49,
782 fail_unless (!gst_segment_clip (&segment, GST_FORMAT_TIME, 201, 201, NULL,
784 fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME, 201,
787 fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
789 fail_unless (segment.offset == 50);
791 fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME,
793 GST_DEBUG ("%" G_GUINT64_FORMAT, rt);
794 fail_unless (rt == 50);
800 gst_segment_suite (void)
802 Suite *s = suite_create ("GstSegment");
803 TCase *tc_chain = tcase_create ("segments");
805 tcase_set_timeout (tc_chain, 20);
807 suite_add_tcase (s, tc_chain);
808 tcase_add_test (tc_chain, segment_seek_nosize);
809 tcase_add_test (tc_chain, segment_seek_size);
810 tcase_add_test (tc_chain, segment_seek_reverse);
811 tcase_add_test (tc_chain, segment_seek_rate);
812 tcase_add_test (tc_chain, segment_copy);
813 tcase_add_test (tc_chain, segment_seek_noupdate);
814 tcase_add_test (tc_chain, segment_offset);
815 tcase_add_test (tc_chain, segment_full);
820 GST_CHECK_MAIN (gst_segment);