diff --git a/tests/check/gst/gstsegment.c b/tests/check/gst/gstsegment.c index ecd8b06ade..8763be5751 100644 --- a/tests/check/gst/gstsegment.c +++ b/tests/check/gst/gstsegment.c @@ -41,18 +41,6 @@ GST_START_TEST (segment_seek_nosize) fail_unless (segment.stop == -1); fail_unless (update == TRUE); -#if 0 - /* configure segment to stop relative, should not do anything since - * size is unknown. */ - gst_segment_do_seek (&segment, 1.0, - GST_FORMAT_BYTES, - GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_NONE, 200, GST_SEEK_TYPE_CUR, -100, &update); - fail_unless (segment.start == 100); - fail_unless (segment.stop == -1); - fail_unless (update == FALSE); -#endif - /* do some clipping on the open range */ /* completely outside */ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop); @@ -451,43 +439,6 @@ GST_START_TEST (segment_seek_rate) fail_unless (segment.rate == 2.0); fail_unless (update == FALSE); -#if 0 - /* 0 is the same in all formats and should not fail */ - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_NONE, -1, &update); - fail_unless (segment.format == GST_FORMAT_BYTES); - - /* set to -1 means start from 0 */ - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_SET, -1, GST_SEEK_TYPE_NONE, -1, &update); - fail_unless (segment.format == GST_FORMAT_BYTES); - fail_unless (segment.start == 0); - - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_CUR, 0, GST_SEEK_TYPE_NONE, -1, &update); - - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_END, 0, GST_SEEK_TYPE_NONE, -1, &update); - - /* -1 for end is fine too in all formats */ - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_SET, -1, &update); - - /* 0 as relative end is fine too */ - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_CUR, 0, &update); - - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 0, &update); -#endif - /* set a real stop position, this must happen in bytes */ gst_segment_do_seek (&segment, 3.0, GST_FORMAT_BYTES, @@ -501,25 +452,6 @@ GST_START_TEST (segment_seek_rate) * playback mode.*/ fail_unless (update == FALSE); -#if 0 - /* 0 as relative end is fine too */ - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_CUR, 0, &update); - fail_unless (segment.stop == 100); - - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 0, &update); - fail_unless (segment.stop == 100); - - /* -1 for end is fine too in all formats */ - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_SET, -1, &update); - fail_unless (segment.stop == -1); -#endif - /* set some duration, stop -1 END seeks will now work with the * duration, if the formats match */ segment.duration = 200; @@ -545,1183 +477,10 @@ GST_START_TEST (segment_seek_rate) GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 100, &update); fail_unless (segment.stop == 200); fail_unless (segment.duration == 200); - -#if 0 - /* add 300 to the start, this should be clamped to the duration */ - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_CUR, 300, GST_SEEK_TYPE_END, 0, &update); - fail_unless (segment.start == 200); - fail_unless (segment.stop == 200); - fail_unless (segment.duration == 200); - - /* subtract 300 from the start, this should be clamped to 0 */ - gst_segment_do_seek (&segment, 2.0, - GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE, - GST_SEEK_TYPE_CUR, -300, GST_SEEK_TYPE_END, 0, &update); - GST_DEBUG ("%" G_GINT64_FORMAT, segment.start); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.duration == 200); -#endif } GST_END_TEST; -#if 0 -/* mess with the segment structure in the bytes format */ -GST_START_TEST (segment_newsegment_open) -{ - GstSegment segment; - - gst_segment_init (&segment, GST_FORMAT_BYTES); - - /* time should also work for starting from 0 */ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, GST_FORMAT_TIME, 0, -1, - 0); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.format == GST_FORMAT_BYTES); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == -1); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* we set stop but in the wrong format, stop stays open. */ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, GST_FORMAT_TIME, 0, - 200, 0); - - fail_unless (segment.start == 0); - fail_unless (segment.stop == -1); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - - /* update, nothing changes */ - gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, GST_FORMAT_BYTES, 0, -1, - 0); - - fail_unless (segment.start == 0); - fail_unless (segment.stop == -1); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - - /* update */ - gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, - GST_FORMAT_BYTES, 100, -1, 100); - - fail_unless (segment.start == 100); - fail_unless (segment.stop == -1); - fail_unless (segment.time == 100); - fail_unless (segment.base == 100); - fail_unless (segment.position == 100); - - /* last_stop 0, base does not change */ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, GST_FORMAT_BYTES, 0, - -1, 0); - - fail_unless (segment.start == 0); - fail_unless (segment.stop == -1); - fail_unless (segment.time == 0); - fail_unless (segment.base == 100); - - gst_segment_set_last_stop (&segment, GST_FORMAT_BYTES, 200); - - fail_unless (segment.position == 200); - - /* last_stop 200, base changes */ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, GST_FORMAT_BYTES, 0, - -1, 0); - - fail_unless (segment.start == 0); - fail_unless (segment.stop == -1); - fail_unless (segment.time == 0); - fail_unless (segment.base == 300); - fail_unless (segment.position == 0); -} - -GST_END_TEST; - - -/* mess with the segment structure in the bytes format */ -GST_START_TEST (segment_newsegment_closed) -{ - GstSegment segment; - - gst_segment_init (&segment, GST_FORMAT_BYTES); - - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, - GST_FORMAT_BYTES, 0, 200, 0); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.format == GST_FORMAT_BYTES); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* assume we advanced to position 40 */ - gst_segment_set_last_stop (&segment, GST_FORMAT_BYTES, 40); - fail_unless (segment.position == 40); - - /* do an update to the start, last_stop is unchanged because it's bigger */ - gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, GST_FORMAT_BYTES, 20, - 200, 20); - - fail_unless (segment.start == 20); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 20); - fail_unless (segment.base == 20); - fail_unless (segment.position == 40); - - /* do an update past our last_stop, it should be updated now */ - gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, GST_FORMAT_BYTES, 50, - 300, 50); - - fail_unless (segment.start == 50); - fail_unless (segment.stop == 300); - fail_unless (segment.time == 50); - fail_unless (segment.base == 50); - fail_unless (segment.position == 50); - - /* and a new accumulated one */ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, - GST_FORMAT_BYTES, 100, 400, 300); - - fail_unless (segment.start == 100); - fail_unless (segment.stop == 400); - fail_unless (segment.time == 300); - fail_unless (segment.base == 300); - - /* and a new updated one */ - gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, - GST_FORMAT_BYTES, 100, 500, 300); - - fail_unless (segment.start == 100); - fail_unless (segment.stop == 500); - fail_unless (segment.time == 300); - fail_unless (segment.base == 300); - - /* and a new partially updated one */ - gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, - GST_FORMAT_BYTES, 200, 500, 400); - - fail_unless (segment.start == 200); - fail_unless (segment.stop == 500); - fail_unless (segment.time == 400); - fail_unless (segment.base == 400); -} - -GST_END_TEST; - -/* mess with the segment structure in the time format */ -GST_START_TEST (segment_newsegment_streamtime) -{ - GstSegment segment; - guint64 result; - - gst_segment_init (&segment, GST_FORMAT_TIME); - - /*************************** - * Normal segment - ***************************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, - GST_FORMAT_TIME, 0, 200, 0); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 0); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 100); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 200); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /********************* - * time shifted by 500 - *********************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, - GST_FORMAT_TIME, 0, 200, 500); - - fail_unless (segment.base == 200); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 500); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 600); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 500); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /********************* - * time offset by 500 - *********************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, - GST_FORMAT_TIME, 500, 700, 0); - - fail_unless (segment.base == 400); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* before segment is invalid */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 400); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 500); - fail_unless (result == 0); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 600); - fail_unless (result == 100); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 700); - fail_unless (result == 200); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 800); - fail_unless (result == -1); - - /************************************* - * time offset by 500, shifted by 200 - *************************************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, - GST_FORMAT_TIME, 500, 700, 200); - - fail_unless (segment.base == 600); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* before segment is invalid */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 400); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 500); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 600); - fail_unless (result == 300); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 700); - fail_unless (result == 400); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 800); - fail_unless (result == -1); -} - -GST_END_TEST; - -/* mess with the segment structure in the time format */ -GST_START_TEST (segment_newsegment_streamtime_rate) -{ - GstSegment segment; - guint64 result; - - gst_segment_init (&segment, GST_FORMAT_TIME); - - /*************************** - * Normal segment rate 2.0 - ***************************/ - gst_segment_set_newsegment (&segment, FALSE, 2.0, 1.0, - GST_FORMAT_TIME, 0, 200, 0); - - fail_unless (segment.rate == 2.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 0); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 100); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 150); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 200); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /*************************************** - * Normal segment rate 2.0, offset - ***************************************/ - gst_segment_set_newsegment (&segment, FALSE, 2.0, 1.0, - GST_FORMAT_TIME, 100, 300, 0); - - fail_unless (segment.base == 100); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 0); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 100); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 250); - fail_unless (result == 150); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == 200); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 400); - fail_unless (result == -1); - - /*************************************** - * Normal segment rate -1.0, offset - ***************************************/ - - /* buffers will arrive from 300 to 100 in a sink, stream time - * calculation is unaffected by the rate */ - gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0, - GST_FORMAT_TIME, 100, 300, 0); - - fail_unless (segment.base == 200); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 0); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 100); - - /*********************************************** - * Normal segment rate -1.0, offset, time = 200 - ***********************************************/ - gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0, - GST_FORMAT_TIME, 100, 300, 200); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 300); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == 400); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 400); - fail_unless (result == -1); -} - -GST_END_TEST; - -/* mess with the segment structure in the time format */ -GST_START_TEST (segment_newsegment_streamtime_applied_rate) -{ - GstSegment segment; - guint64 result; - - gst_segment_init (&segment, GST_FORMAT_TIME); - - /*********************************************************** - * Normal segment rate 1.0, applied rate -1.0 - * This means the timestamps represents a stream going backwards - * starting from @time to 0. - ************************************************************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, -1.0, - GST_FORMAT_TIME, 0, 200, 200); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.applied_rate == -1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 200); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* we count backwards from 200 */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 100); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 50); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 0); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /*********************************************************** - * Normal segment rate 1.0, applied rate 2.0 - * This means the timestamps represents a stream at twice the - * normal rate - ************************************************************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 2.0, - GST_FORMAT_TIME, 0, 200, 0); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.applied_rate == 2.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 200); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 0); - - /* the stream prepresents a stream going twice as fast, the position - * in the segment is therefore scaled by the applied rate */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 300); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 400); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /*********************************************************** - * Normal segment rate 1.0, applied rate -2.0 - * This means the timestamps represents a stream at twice the - * reverse rate - ************************************************************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, -2.0, - GST_FORMAT_TIME, 0, 200, 400); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.applied_rate == -2.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 400); - /* previous segment lasted 200, rate of 2.0 was already applied */ - fail_unless (segment.base == 400); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* we count backwards from 400 */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 400); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 100); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 0); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /*********************************************************** - * Normal segment rate 1.0, applied rate -2.0 - * This means the timestamps represents a stream at twice the - * reverse rate, start time cannot compensate the complete - * duration of the segment so we stop at 0 - ************************************************************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, -2.0, - GST_FORMAT_TIME, 0, 200, 200); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.applied_rate == -2.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 200); - fail_unless (segment.base == 600); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* we count backwards from 200 */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 0); - - /* clamp at 0 */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 0); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 0); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); -} - -GST_END_TEST; - -/* mess with the segment structure in the time format */ -GST_START_TEST (segment_newsegment_streamtime_applied_rate_rate) -{ - GstSegment segment; - guint64 result; - - gst_segment_init (&segment, GST_FORMAT_TIME); - - /*********************************************************** - * Segment rate 2.0, applied rate 2.0 - * this means we have a double speed stream that we should - * speed up by a factor of 2.0 some more. the resulting - * stream will be played at four times the speed. - ************************************************************/ - gst_segment_set_newsegment (&segment, FALSE, 2.0, 2.0, - GST_FORMAT_TIME, 0, 200, 0); - - fail_unless (segment.rate == 2.0); - fail_unless (segment.applied_rate == 2.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* only applied rate affects our calculation of the stream time */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 0); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 300); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 400); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /*********************************************************** - * Segment rate 2.0, applied rate -1.0 - * this means we have a reverse stream that we should - * speed up by a factor of 2.0 - ************************************************************/ - gst_segment_set_newsegment (&segment, FALSE, 2.0, -1.0, - GST_FORMAT_TIME, 0, 200, 200); - - fail_unless (segment.rate == 2.0); - fail_unless (segment.applied_rate == -1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 200); - /* previous segment lasted 100 */ - fail_unless (segment.base == 100); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* only applied rate affects our calculation of the stream time */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 100); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 50); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 0); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /*********************************************************** - * Segment rate -1.0, applied rate -1.0 - * this means we have a reverse stream that we should - * reverse to get the normal stream again. - ************************************************************/ - gst_segment_set_newsegment (&segment, FALSE, -1.0, -1.0, - GST_FORMAT_TIME, 0, 200, 200); - - fail_unless (segment.rate == -1.0); - fail_unless (segment.applied_rate == -1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 200); - /* accumulated 100 of previous segment to make 200 */ - fail_unless (segment.base == 200); - fail_unless (segment.position == 200); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* only applied rate affects our calculation of the stream time */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 100); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 50); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 0); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /*********************************************************** - * Segment rate -1.0, applied rate -1.0 - * this means we have a reverse stream that we should - * reverse to get the normal stream again. - ************************************************************/ - gst_segment_set_newsegment (&segment, FALSE, -1.0, 2.0, - GST_FORMAT_TIME, 0, 200, 0); - - fail_unless (segment.rate == -1.0); - fail_unless (segment.applied_rate == 2.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 400); - fail_unless (segment.position == 200); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* only applied rate affects our calculation of the stream time */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 0); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 200); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 300); - - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 400); - - /* outside of the segment */ - result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); -} - -GST_END_TEST; - -/* mess with the segment structure in the time format */ -GST_START_TEST (segment_newsegment_runningtime) -{ - GstSegment segment; - guint64 result; - - gst_segment_init (&segment, GST_FORMAT_TIME); - - /*************************** - * Normal segment - ***************************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, - GST_FORMAT_TIME, 0, 200, 0); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 0); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 0); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 0); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 100); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 100); - - /* at edge is exactly the segment duration */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 200); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 200); - - /* outside of the segment */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 300); - fail_unless (result == -1); - - /*********************************************************** - * time shifted by 500, check if accumulation worked. - * Rate convert to twice the speed which means scaling down - * all positions by 2.0 in this segment. - * Then time argument is not used at all here. - ***********************************************************/ - gst_segment_set_newsegment (&segment, FALSE, 2.0, 1.0, - GST_FORMAT_TIME, 0, 200, 500); - - /* normal speed gives elapsed of 200 */ - fail_unless (segment.base == 200); - - /* invalid time gives invalid result */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 0); - fail_unless (result == 200); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 0); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 250); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 100); - - /* outside of the segment */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 310); - fail_unless (result == -1); - - /******************************************** - * time offset by 500 - * applied rate is not used for running time - ********************************************/ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 2.0, - GST_FORMAT_TIME, 500, 700, 0); - - /* previous segment played at double speed gives elapsed time of - * 100 added to previous accum of 200 gives 300. */ - fail_unless (segment.base == 300); - - /* invalid time gives invalid result */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* before segment is invalid */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500); - fail_unless (result == 300); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 500); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600); - fail_unless (result == 400); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 600); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700); - fail_unless (result == 500); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 700); - - /* outside of the segment */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 600); - fail_unless (result == -1); - - /********************************************************** - * time offset by 500, shifted by 200 - * Negative rate makes the running time go backwards - * relative to the segment stop position. again time - * is ignored. - **********************************************************/ - gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0, - GST_FORMAT_TIME, 500, 700, 200); - - fail_unless (segment.base == 500); - - /* invalid time gives invalid result */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* before segment is invalid */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 400); - fail_unless (result == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500); - fail_unless (result == 700); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 500); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600); - fail_unless (result == 600); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 600); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700); - fail_unless (result == 500); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 700); - - /* outside of the segment */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 800); - fail_unless (result == -1); - - /********************************************************** - * time offset by 500, shifted by 200 - * Negative rate makes the running time go backwards at - * twice speed relative to the segment stop position. again - * time is ignored. - **********************************************************/ - gst_segment_set_newsegment (&segment, FALSE, -2.0, -2.0, - GST_FORMAT_TIME, 500, 700, 200); - - fail_unless (segment.base == 700); - - /* invalid time gives invalid result */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - /* before segment is invalid */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 600); - fail_unless (result == -1); - - /* total scaled segment time is 100, accum is 700, so we get 800 */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500); - fail_unless (result == 800); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 500); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600); - fail_unless (result == 750); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 600); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700); - fail_unless (result == 700); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 700); - - /* outside of the segment */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 900); - fail_unless (result == -1); - - /* see if negative rate closed segment correctly */ - gst_segment_set_newsegment (&segment, FALSE, -2.0, -1.0, - GST_FORMAT_TIME, 500, 700, 200); - - /* previous segment lasted 100, and was at 700 so we should get 800 */ - fail_unless (segment.base == 800); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 800); - fail_unless (result == 700); -} - -GST_END_TEST; - -/* mess with the segment structure in the time format */ -GST_START_TEST (segment_newsegment_accum) -{ - GstSegment segment; - guint64 result; - - gst_segment_init (&segment, GST_FORMAT_TIME); - - /*************************** - * Normal reverse segment - ***************************/ - gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0, - GST_FORMAT_TIME, 0, 200, 0); - - fail_unless (segment.rate == -1.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 200); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 0); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 200); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 50); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 150); - - /* update segment, this accumulates 50 from the previous segment. */ - gst_segment_set_newsegment (&segment, TRUE, -2.0, 1.0, - GST_FORMAT_TIME, 0, 150, 0); - - fail_unless (segment.rate == -2.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 150); - fail_unless (segment.time == 0); - fail_unless (segment.base == 50); - fail_unless (segment.position == 150); - fail_unless (segment.duration == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 50); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 150); - - /* 50 accumulated + 50 / 2 */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 75); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 100); - - /* update segment, this does not accumulate anything. */ - gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, - GST_FORMAT_TIME, 100, 200, 100); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 100); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 100); - fail_unless (segment.base == 50); - fail_unless (segment.position == 150); - fail_unless (segment.duration == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100); - fail_unless (result == 50); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 100); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 100); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 150); -} - -GST_END_TEST; - -/* mess with the segment structure in the time format */ -GST_START_TEST (segment_newsegment_accum2) -{ - GstSegment segment; - guint64 result; - - gst_segment_init (&segment, GST_FORMAT_TIME); - - /*************************** - * Normal reverse segment - ***************************/ - gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0, - GST_FORMAT_TIME, 0, 200, 0); - - fail_unless (segment.rate == -1.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 0); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 200); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 0); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 200); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 50); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 150); - - /* close segment, this accumulates nothing. */ - gst_segment_set_newsegment (&segment, TRUE, -1.0, 1.0, - GST_FORMAT_TIME, 150, 200, 0); - - fail_unless (segment.rate == -1.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 150); - fail_unless (segment.stop == 200); - fail_unless (segment.time == 0); - fail_unless (segment.base == 0); - fail_unless (segment.position == 200); - fail_unless (segment.duration == -1); - - /* new segment, this accumulates 50. */ - gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, - GST_FORMAT_TIME, 150, 300, 150); - - fail_unless (segment.rate == 1.0); - fail_unless (segment.applied_rate == 1.0); - fail_unless (segment.format == GST_FORMAT_TIME); - fail_unless (segment.flags == 0); - fail_unless (segment.start == 150); - fail_unless (segment.stop == 300); - fail_unless (segment.time == 150); - fail_unless (segment.base == 50); - fail_unless (segment.position == 150); - fail_unless (segment.duration == -1); - - /* invalid time gives invalid result */ - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1); - fail_unless (result == -1); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150); - fail_unless (result == 50); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 150); - - result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200); - fail_unless (result == 100); - result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result); - fail_unless (result == 200); -} - -GST_END_TEST; -#endif - GST_START_TEST (segment_copy) { GstSegment *copy; @@ -1761,17 +520,6 @@ gst_segment_suite (void) tcase_add_test (tc_chain, segment_seek_size); tcase_add_test (tc_chain, segment_seek_reverse); tcase_add_test (tc_chain, segment_seek_rate); -#if 0 - tcase_add_test (tc_chain, segment_newsegment_open); - tcase_add_test (tc_chain, segment_newsegment_closed); - tcase_add_test (tc_chain, segment_newsegment_streamtime); - tcase_add_test (tc_chain, segment_newsegment_streamtime_rate); - tcase_add_test (tc_chain, segment_newsegment_streamtime_applied_rate); - tcase_add_test (tc_chain, segment_newsegment_streamtime_applied_rate_rate); - tcase_add_test (tc_chain, segment_newsegment_runningtime); - tcase_add_test (tc_chain, segment_newsegment_accum); - tcase_add_test (tc_chain, segment_newsegment_accum2); -#endif tcase_add_test (tc_chain, segment_copy); return s;