summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorThibault Saunier <thibault.saunier@collabora.com>2013-06-26 17:08:57 -0400
committerThibault Saunier <thibault.saunier@collabora.com>2013-07-09 16:47:00 -0400
commita933d9540d4677c055d6b1e9a9fe6e9821d59478 (patch)
tree961d1a4dfccb90716400232b08a95e0521c6d754 /tests
parentd3e3871440e7cfa2b6e6a0745c058c8fb7161a45 (diff)
ges: Implement a GESGroup class, subclass of GESContainer
The GESGroup class is used to group various GESContainer together, it can contain either GESClips or GESGroup or both.
Diffstat (limited to 'tests')
-rw-r--r--tests/check/Makefile.am1
-rw-r--r--tests/check/ges/basic.c4
-rw-r--r--tests/check/ges/clip.c6
-rw-r--r--tests/check/ges/group.c500
-rw-r--r--tests/check/ges/test-utils.h12
-rw-r--r--tests/check/ges/timelineedition.c336
6 files changed, 821 insertions, 38 deletions
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index fab4ae5..b8d0747 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -41,6 +41,7 @@ check_PROGRAMS = \
ges/overlays\
ges/text_properties\
ges/mixers\
+ ges/group\
ges/project
noinst_LTLIBRARIES=$(testutils_noisnt_libraries)
diff --git a/tests/check/ges/basic.c b/tests/check/ges/basic.c
index 05e60f4..7faabb9 100644
--- a/tests/check/ges/basic.c
+++ b/tests/check/ges/basic.c
@@ -420,6 +420,7 @@ GST_START_TEST (test_ges_timeline_remove_track)
tmp_layer = ges_clip_get_layer (GES_CLIP (s1));
fail_unless (tmp_layer == layer);
gst_object_unref (tmp_layer);
+ ASSERT_OBJECT_REFCOUNT (layer, "1 for the timeline", 1);
GST_DEBUG ("Creating a source");
s2 = ges_custom_source_clip_new (my_fill_track_func, NULL);
@@ -428,6 +429,7 @@ GST_START_TEST (test_ges_timeline_remove_track)
tmp_layer = ges_clip_get_layer (GES_CLIP (s2));
fail_unless (tmp_layer == layer);
gst_object_unref (tmp_layer);
+ ASSERT_OBJECT_REFCOUNT (layer, "1 for the timeline", 1);
GST_DEBUG ("Creating a source");
s3 = ges_custom_source_clip_new (my_fill_track_func, NULL);
@@ -436,6 +438,7 @@ GST_START_TEST (test_ges_timeline_remove_track)
tmp_layer = ges_clip_get_layer (GES_CLIP (s3));
fail_unless (tmp_layer == layer);
gst_object_unref (tmp_layer);
+ ASSERT_OBJECT_REFCOUNT (layer, "1 for the timeline", 1);
GST_DEBUG ("Add the layer to the timeline");
fail_unless (ges_timeline_add_layer (timeline, layer));
@@ -447,6 +450,7 @@ GST_START_TEST (test_ges_timeline_remove_track)
fail_unless (g_list_find (layers, layer) != NULL);
g_list_foreach (layers, (GFunc) gst_object_unref, NULL);
g_list_free (layers);
+ ASSERT_OBJECT_REFCOUNT (layer, "1 for the timeline", 1);
GST_DEBUG ("Add the track to the timeline");
fail_unless (ges_timeline_add_track (timeline, track));
diff --git a/tests/check/ges/clip.c b/tests/check/ges/clip.c
index ee366a5..0fbb0b5 100644
--- a/tests/check/ges/clip.c
+++ b/tests/check/ges/clip.c
@@ -287,7 +287,11 @@ GST_START_TEST (test_clip_group_ungroup)
assert_equals_uint64 (_DURATION (clip2), 10);
regrouped_clip = ges_container_group (containers);
- fail_unless (regrouped_clip == NULL);
+ fail_unless (GES_IS_GROUP (regrouped_clip));
+ assert_equals_int (g_list_length (GES_CONTAINER_CHILDREN (regrouped_clip)),
+ 2);
+ tmp = ges_container_ungroup (regrouped_clip, FALSE);
+ g_list_free_full (tmp, gst_object_unref);
ges_timeline_element_set_start (GES_TIMELINE_ELEMENT (clip), 0);
regrouped_clip = ges_container_group (containers);
diff --git a/tests/check/ges/group.c b/tests/check/ges/group.c
new file mode 100644
index 0000000..5644b23
--- /dev/null
+++ b/tests/check/ges/group.c
@@ -0,0 +1,500 @@
+/* GStreamer Editing Services
+ *
+ * Copyright (C) <2013> Thibault Saunier <thibault.saunier@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "test-utils.h"
+#include <ges/ges.h>
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_move_group)
+{
+ GESAsset *asset;
+ GESGroup *group;
+ GESTimeline *timeline;
+ GESLayer *layer, *layer1;
+ GESClip *clip, *clip1, *clip2;
+
+ GList *clips = NULL;
+
+ ges_init ();
+
+ timeline = ges_timeline_new_audio_video ();
+
+ layer = ges_timeline_append_layer (timeline);
+ layer1 = ges_timeline_append_layer (timeline);
+ asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
+
+ /**
+ * Our timeline:
+ * -------------
+ *
+ * 0------------Group1---------------110
+ * |-------- |
+ * layer: | clip | |
+ * |-------10 |
+ * |----------------------------------|
+ * | 0--------- 0-----------|
+ * layer1: | | clip1 | | clip2 |
+ * | 10--------20 50----------|
+ * |----------------------------------|
+ */
+ clip = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ clip1 =
+ ges_layer_add_asset (layer1, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ clip2 =
+ ges_layer_add_asset (layer1, asset, 50, 0, 60, GES_TRACK_TYPE_UNKNOWN);
+ clips = g_list_prepend (clips, clip);
+ clips = g_list_prepend (clips, clip1);
+ clips = g_list_prepend (clips, clip2);
+ group = GES_GROUP (ges_container_group (clips));
+ g_list_free (clips);
+
+ fail_unless (GES_IS_GROUP (group));
+ ASSERT_OBJECT_REFCOUNT (group, "1 ref for the timeline", 1);
+ fail_unless (g_list_length (GES_CONTAINER_CHILDREN (group)) == 3);
+ assert_equals_int (GES_CONTAINER_HEIGHT (group), 2);
+ CHECK_OBJECT_PROPS (clip, 0, 0, 10);
+ CHECK_OBJECT_PROPS (clip1, 10, 0, 10);
+ CHECK_OBJECT_PROPS (clip2, 50, 0, 60);
+ CHECK_OBJECT_PROPS (group, 0, 0, 110);
+
+ /*
+ * 0 10------------Group1---------------120
+ * |-------- |
+ * layer: | clip | |
+ * |-------20 |
+ * |----------------------------------|
+ * | 0--------- 0-----------|
+ * layer1: | | clip1 | | clip2 |
+ * | 20--------30 60----------|
+ * |----------------------------------|
+ */
+ ges_timeline_element_set_start (GES_TIMELINE_ELEMENT (clip), 10);
+ CHECK_OBJECT_PROPS (clip, 10, 0, 10);
+ CHECK_OBJECT_PROPS (clip1, 20, 0, 10);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 60);
+ CHECK_OBJECT_PROPS (group, 10, 0, 110);
+
+ /*
+ * 0 10------------Group1---------------120
+ * |------ |
+ * layer: |clip | |
+ * |-----15 |
+ * |----------------------------------|
+ * | 0--------- 0-----------|
+ * layer1: | | clip1 | | clip2 |
+ * | 20--------30 60----------|
+ * |----------------------------------|
+ */
+ ges_timeline_element_set_duration (GES_TIMELINE_ELEMENT (clip), 5);
+ CHECK_OBJECT_PROPS (clip, 10, 0, 5);
+ CHECK_OBJECT_PROPS (clip1, 20, 0, 10);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 60);
+ CHECK_OBJECT_PROPS (group, 10, 0, 110);
+
+ /*
+ * 0 10------------Group1---------------110
+ * |------ |
+ * layer: |clip | |
+ * |-----15 |
+ * |----------------------------------|
+ * | 0--------- 0-----------|
+ * layer1: | | clip1 | | clip2 |
+ * | 20--------30 60----------|
+ * |----------------------------------|
+ */
+ ges_timeline_element_set_duration (GES_TIMELINE_ELEMENT (clip2), 50);
+ CHECK_OBJECT_PROPS (clip, 10, 0, 5);
+ CHECK_OBJECT_PROPS (clip1, 20, 0, 10);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
+ CHECK_OBJECT_PROPS (group, 10, 0, 100);
+
+ /*
+ * 0 10------------Group1---------------110
+ * |------ |
+ * layer: |clip | |
+ * |-----15 |
+ * |----------------------------------|
+ * | 5--------- 0-----------|
+ * layer1: | | clip1 | | clip2 |
+ * | 20--------30 60----------|
+ * |----------------------------------|
+ */
+ ges_timeline_element_set_inpoint (GES_TIMELINE_ELEMENT (clip1), 5);
+ CHECK_OBJECT_PROPS (clip, 10, 0, 5);
+ CHECK_OBJECT_PROPS (clip1, 20, 5, 10);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
+ CHECK_OBJECT_PROPS (group, 10, 0, 100);
+
+ /*
+ * 0 10------------Group1---------------110
+ * |------ |
+ * layer: |clip | |
+ * |-----15 |
+ * |----------------------------------|
+ * | 5--------- 0-----------|
+ * layer1: | | clip1 | | clip2 |
+ * | 20--------30 60----------|
+ * |----------------------------------|
+ */
+ ges_timeline_element_set_inpoint (GES_TIMELINE_ELEMENT (clip1), 5);
+ CHECK_OBJECT_PROPS (clip, 10, 0, 5);
+ CHECK_OBJECT_PROPS (clip1, 20, 5, 10);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
+ CHECK_OBJECT_PROPS (group, 10, 0, 100);
+
+ /*
+ * 0 20---Group1---------------110
+ * | |
+ * layer: | |
+ * | |
+ * |--------------------------|
+ * 5--------- 0------------|
+ * layer1: | clip1 | | clip2 |
+ * 20--------30 60----------|
+ * |--------------------------|
+ */
+ ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 20);
+ CHECK_OBJECT_PROPS (clip, 15, 5, 0);
+ CHECK_OBJECT_PROPS (clip1, 20, 5, 10);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
+ CHECK_OBJECT_PROPS (group, 20, 0, 90);
+
+ /*
+ * 0 25---Group1---------------110
+ * | |
+ * layer: | |
+ * | |
+ * |--------------------------|
+ * 10------ 0------------|
+ * layer1: | clip1 | | clip2 |
+ * 25------30 60----------|
+ * |--------------------------|
+ */
+ ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 25);
+ CHECK_OBJECT_PROPS (clip, 15, 5, 0);
+ CHECK_OBJECT_PROPS (clip1, 25, 10, 5);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
+ CHECK_OBJECT_PROPS (group, 25, 0, 85);
+
+ /*
+ * 0 10------------Group1---------------110
+ * |------ |
+ * layer: |clip | |
+ * |-----15 |
+ * |----------------------------------|
+ * 0----------------- 0-----------|
+ * layer1: | clip1 | | clip2 |
+ * |-----------------30 60----------|
+ * |----------------------------------|
+ */
+ ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 10);
+ CHECK_OBJECT_PROPS (clip, 10, 0, 5);
+ CHECK_OBJECT_PROPS (clip1, 10, 0, 20);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
+ CHECK_OBJECT_PROPS (group, 10, 0, 100);
+
+ /*
+ * 0 25---Group1---------------110
+ * | |
+ * layer: 15 | |
+ * |clip | |
+ * - |--------------------------|
+ * 15------ 0------------|
+ * layer1: | clip1 | | clip2 |
+ * 25------30 60----------|
+ * |--------------------------|
+ */
+ ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 25);
+ CHECK_OBJECT_PROPS (clip, 15, 5, 0);
+ CHECK_OBJECT_PROPS (clip1, 25, 15, 5);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 50);
+ CHECK_OBJECT_PROPS (group, 25, 0, 85);
+
+ /*
+ * 0 25---Group1--30
+ * | |
+ * layer: 15 | |
+ * |clip | |
+ * - |------------
+ * 15-----------| 60
+ * layer1: | clip1 | |clip2
+ * 25------------| -
+ * |------------|
+ */
+ ges_timeline_element_set_duration (GES_TIMELINE_ELEMENT (group), 10);
+ CHECK_OBJECT_PROPS (clip, 15, 5, 0);
+ CHECK_OBJECT_PROPS (clip1, 25, 15, 5);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 0);
+ CHECK_OBJECT_PROPS (group, 25, 0, 5);
+
+ /*
+ * 0 25---Group1---------------125
+ * | |
+ * layer: 15 | |
+ * |clip | |
+ * - |--------------------------|
+ * 15-------------------------|
+ * layer1: | clip1 | clip2 |
+ * 25--------------60----------|
+ * |--------------------------|
+ */
+ ges_timeline_element_set_duration (GES_TIMELINE_ELEMENT (group), 100);
+ CHECK_OBJECT_PROPS (clip, 15, 5, 0);
+ CHECK_OBJECT_PROPS (clip1, 25, 15, 100);
+ CHECK_OBJECT_PROPS (clip2, 60, 0, 65);
+ CHECK_OBJECT_PROPS (group, 25, 0, 100);
+
+ /*
+ * 0 20---Group1---------------120
+ * | |
+ * layer: 15 | |
+ * |clip| |
+ * - |--------------------------|
+ * 15-------------------------|
+ * layer1: | clip1 | clip2 |
+ * 20-------------55----------|
+ * |--------------------------|
+ */
+ ges_timeline_element_set_start (GES_TIMELINE_ELEMENT (group), 20);
+ CHECK_OBJECT_PROPS (clip, 15, 5, 0);
+ CHECK_OBJECT_PROPS (clip1, 20, 15, 100);
+ CHECK_OBJECT_PROPS (clip2, 55, 0, 65);
+ CHECK_OBJECT_PROPS (group, 20, 0, 100);
+
+ /*
+ * 0 10---Group1---------------120
+ * |-----15 |
+ * layer: | clip| |
+ * |------ |
+ * |--------------------------|
+ * 5--------------------------|
+ * layer1: | clip1 | clip2 |
+ * 10-------------55----------|
+ * |--------------------------|
+ */
+ ges_timeline_element_trim (GES_TIMELINE_ELEMENT (group), 10);
+ CHECK_OBJECT_PROPS (clip, 10, 0, 5);
+ CHECK_OBJECT_PROPS (clip1, 10, 5, 110);
+ CHECK_OBJECT_PROPS (clip2, 55, 0, 65);
+ CHECK_OBJECT_PROPS (group, 10, 0, 110);
+
+ ASSERT_OBJECT_REFCOUNT (group, "1 ref for the timeline", 1);
+ check_destroyed (G_OBJECT (timeline), G_OBJECT (group), NULL);
+ gst_object_unref (asset);
+}
+
+GST_END_TEST;
+
+
+
+static void
+_changed_layer_cb (GESTimelineElement * clip,
+ GParamSpec * arg G_GNUC_UNUSED, guint * nb_calls)
+{
+ *nb_calls = *nb_calls + 1;
+}
+
+GST_START_TEST (test_group_in_group)
+{
+ GESAsset *asset;
+ GESTimeline *timeline;
+ GESGroup *group, *group1;
+ GESLayer *layer, *layer1, *layer2, *layer3;
+ GESClip *c, *c1, *c2, *c3, *c4, *c5;
+
+ guint nb_layer_notifies = 0;
+ GList *clips = NULL;
+
+ ges_init ();
+
+ timeline = ges_timeline_new_audio_video ();
+
+ /* Our timeline
+ *
+ * --0------------10-Group-----20---------------30-------Group1----------70
+ * | +-----------+ |+-----------50 |
+ * L | | C | || C3 | |
+ * | +-----------+ |+-----------+ |
+ * --|-------------------------------------------|-----40----------------|
+ * | +------------+ +-------------+ | +--------60 |
+ * L1 | | C1 | | C2 | | | C4 | |
+ * | +------------+ +-------------+ | +--------+ |
+ * --|-------------------------------------------|-----------------------|
+ * | | +--------+|
+ * L2 | | | c5 ||
+ * | | +--------+|
+ * --+-------------------------------------------+-----------------------+
+ *
+ * L3
+ *
+ * -----------------------------------------------------------------------
+ */
+
+ layer = ges_timeline_append_layer (timeline);
+ layer1 = ges_timeline_append_layer (timeline);
+ layer2 = ges_timeline_append_layer (timeline);
+ layer3 = ges_timeline_append_layer (timeline);
+ assert_equals_int (ges_layer_get_priority (layer3), 3);
+ asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
+
+ c = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ c1 = ges_layer_add_asset (layer1, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ c2 = ges_layer_add_asset (layer1, asset, 20, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ clips = g_list_prepend (clips, c);
+ clips = g_list_prepend (clips, c1);
+ clips = g_list_prepend (clips, c2);
+ group = GES_GROUP (ges_container_group (clips));
+ fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
+ g_list_free (clips);
+
+ fail_unless (GES_IS_GROUP (group));
+ CHECK_OBJECT_PROPS (c, 0, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 20, 0, 10);
+ CHECK_OBJECT_PROPS (group, 0, 0, 30);
+
+ c3 = ges_layer_add_asset (layer, asset, 30, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+ c4 = ges_layer_add_asset (layer1, asset, 40, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+ c5 = ges_layer_add_asset (layer2, asset, 50, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+ clips = g_list_prepend (NULL, c3);
+ clips = g_list_prepend (clips, c4);
+ clips = g_list_prepend (clips, c5);
+ group1 = GES_GROUP (ges_container_group (clips));
+ fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group1) == timeline);
+ g_list_free (clips);
+
+ fail_unless (GES_IS_GROUP (group1));
+ CHECK_OBJECT_PROPS (c3, 30, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 50, 0, 20);
+ CHECK_OBJECT_PROPS (group1, 30, 0, 40);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+ fail_unless (ges_container_add (GES_CONTAINER (group),
+ GES_TIMELINE_ELEMENT (group1)));
+ CHECK_OBJECT_PROPS (c, 0, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 20, 0, 10);
+ CHECK_OBJECT_PROPS (c3, 30, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 50, 0, 20);
+ CHECK_OBJECT_PROPS (group, 0, 0, 70);
+ CHECK_OBJECT_PROPS (group1, 30, 0, 40);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+ fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
+ fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group1) == timeline);
+
+ ges_timeline_element_set_start (GES_TIMELINE_ELEMENT (c4), 50);
+ CHECK_OBJECT_PROPS (c, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 20, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 30, 0, 10);
+ CHECK_OBJECT_PROPS (c3, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 50, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 60, 0, 20);
+ CHECK_OBJECT_PROPS (group, 10, 0, 70);
+ CHECK_OBJECT_PROPS (group1, 40, 0, 40);
+ fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
+ fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group1) == timeline);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+ /* Our timeline
+ *
+ * L
+ * -----------------------------------------------------------------------
+ * 0------------10-Group-----20---------------30-------Group1----------70
+ * | +-----------+ |+-----------50 |
+ * L1 | | C | || C3 | |
+ * | +-----------+ |+-----------+ |
+ * | | |
+ * --|-------------------------------------------|-----40----------------|
+ * | +------------+ +-------------+ | +--------60 |
+ * L2 | | C1 | | C2 | | | C4 | |
+ * | +------------+ +-------------+ | +--------+ |
+ * --|-------------------------------------------|-----------------------|
+ * | | +--------+|
+ * L3 | | | c5 ||
+ * | | +--------+|
+ * --+-------------------------------------------+-----------------------+
+ */
+ fail_unless (ges_clip_move_to_layer (c, layer1));
+ check_layer (c, 1);
+ check_layer (c1, 2);
+ check_layer (c2, 2);
+ check_layer (c3, 1);
+ check_layer (c4, 2);
+ check_layer (c5, 3);
+ assert_equals_int (_PRIORITY (group), 1);
+ assert_equals_int (_PRIORITY (group1), 1);
+
+ /* We can not move so far! */
+ g_signal_connect_after (c4, "notify::layer",
+ (GCallback) _changed_layer_cb, &nb_layer_notifies);
+ fail_if (ges_clip_move_to_layer (c4, layer));
+ assert_equals_int (nb_layer_notifies, 0);
+ check_layer (c, 1);
+ check_layer (c1, 2);
+ check_layer (c2, 2);
+ check_layer (c3, 1);
+ check_layer (c4, 2);
+ check_layer (c5, 3);
+ assert_equals_int (_PRIORITY (group), 1);
+ assert_equals_int (_PRIORITY (group1), 1);
+
+ clips = ges_container_ungroup (GES_CONTAINER (group), FALSE);
+ assert_equals_int (g_list_length (clips), 4);
+ g_list_free_full (clips, gst_object_unref);
+
+ gst_object_unref (timeline);
+ gst_object_unref (asset);
+}
+
+GST_END_TEST;
+
+static Suite *
+ges_suite (void)
+{
+ Suite *s = suite_create ("ges-group");
+ TCase *tc_chain = tcase_create ("group");
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_move_group);
+ tcase_add_test (tc_chain, test_group_in_group);
+
+ return s;
+}
+
+GST_CHECK_MAIN (ges);
diff --git a/tests/check/ges/test-utils.h b/tests/check/ges/test-utils.h
index 6210dc4..e3f3431 100644
--- a/tests/check/ges/test-utils.h
+++ b/tests/check/ges/test-utils.h
@@ -72,4 +72,16 @@ G_STMT_START { \
#define _INPOINT(obj) GES_TIMELINE_ELEMENT_INPOINT (obj)
#define _PRIORITY(obj) GES_TIMELINE_ELEMENT_PRIORITY (obj)
+#define CHECK_OBJECT_PROPS(obj, start, inpoint, duration) {\
+ assert_equals_uint64 (_START (obj), start);\
+ assert_equals_uint64 (_INPOINT (obj), inpoint);\
+ assert_equals_uint64 (_DURATION (obj), duration);\
+}
+
+#define check_layer(clip, layer_prio) { \
+ GESLayer *tmplayer = ges_clip_get_layer ((clip)); \
+ assert_equals_int (ges_layer_get_priority (tmplayer), (layer_prio)); \
+ gst_object_unref (tmplayer); \
+}
+
#endif /* _GES_TEST_UTILS */
diff --git a/tests/check/ges/timelineedition.c b/tests/check/ges/timelineedition.c
index 3d42d24..f96be28 100644
--- a/tests/check/ges/timelineedition.c
+++ b/tests/check/ges/timelineedition.c
@@ -22,6 +22,33 @@
#include <ges/ges.h>
#include <gst/check/gstcheck.h>
+#define DEEP_CHECK(element, start, inpoint, duration) \
+{ \
+ GList *track_elements, *tmp; \
+ GstClockTime rstart, rinpoint, rduration; \
+ \
+ rstart = ges_timeline_element_get_start (GES_TIMELINE_ELEMENT (element)); \
+ rinpoint = ges_timeline_element_get_inpoint (GES_TIMELINE_ELEMENT (element));\
+ rduration = \
+ ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (element)); \
+ \
+ assert_equals_uint64 (rstart, start); \
+ assert_equals_uint64 (rinpoint, inpoint); \
+ assert_equals_uint64 (rduration, duration); \
+ \
+ track_elements = GES_CONTAINER_CHILDREN (element); \
+ for (tmp = track_elements; tmp; tmp = tmp->next) { \
+ rstart = ges_timeline_element_get_start (GES_TIMELINE_ELEMENT (tmp->data));\
+ rinpoint = \
+ ges_timeline_element_get_inpoint (GES_TIMELINE_ELEMENT (tmp->data)); \
+ rduration = \
+ ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (tmp->data)); \
+ assert_equals_uint64 (rstart, start); \
+ assert_equals_uint64 (rinpoint, inpoint); \
+ assert_equals_uint64 (rduration, duration); \
+ } \
+}
+
static gboolean
my_fill_track_func (GESClip * clip,
GESTrackElement * track_element, GstElement * gnlobj, gpointer user_data)
@@ -46,12 +73,6 @@ create_custom_clip (void)
return GES_CLIP (ges_custom_source_clip_new (my_fill_track_func, NULL));
}
-#define CHECK_OBJECT_PROPS(obj, start, inpoint, duration) {\
- assert_equals_uint64 (_START (obj), start);\
- assert_equals_uint64 (_INPOINT (obj), inpoint);\
- assert_equals_uint64 (_DURATION (obj), duration);\
-}
-
GST_START_TEST (test_basic_timeline_edition)
{
GESAsset *asset;
@@ -487,35 +508,6 @@ asset_added_cb (GESProject * project, GESAsset * asset, void *mainloop)
g_main_loop_quit ((GMainLoop *) mainloop);
}
-static void
-deep_check (GESTimelineElement * element, GstClockTime start,
- GstClockTime inpoint, GstClockTime duration)
-{
- GList *track_elements, *tmp;
- GstClockTime rstart, rinpoint, rduration;
-
- rstart = ges_timeline_element_get_start (GES_TIMELINE_ELEMENT (element));
- rinpoint = ges_timeline_element_get_inpoint (GES_TIMELINE_ELEMENT (element));
- rduration =
- ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (element));
-
- assert_equals_uint64 (rstart, start);
- assert_equals_uint64 (rinpoint, inpoint);
- assert_equals_uint64 (rduration, duration);
-
- track_elements = GES_CONTAINER_CHILDREN (element);
- for (tmp = track_elements; tmp; tmp = tmp->next) {
- rstart = ges_timeline_element_get_start (GES_TIMELINE_ELEMENT (tmp->data));
- rinpoint =
- ges_timeline_element_get_inpoint (GES_TIMELINE_ELEMENT (tmp->data));
- rduration =
- ges_timeline_element_get_duration (GES_TIMELINE_ELEMENT (tmp->data));
- assert_equals_uint64 (rstart, start);
- assert_equals_uint64 (rinpoint, inpoint);
- assert_equals_uint64 (rduration, duration);
- }
-}
-
GST_START_TEST (test_simple_triming)
{
GList *assets;
@@ -556,10 +548,10 @@ GST_START_TEST (test_simple_triming)
element = ges_layer_get_clips (layer)->data;
- deep_check (element, 0, 0, 10);
+ DEEP_CHECK (element, 0, 0, 10);
ges_container_edit (GES_CONTAINER (element), NULL, -1, GES_EDIT_MODE_TRIM,
GES_EDGE_START, 5);
- deep_check (element, 5, 5, 5);
+ DEEP_CHECK (element, 5, 5, 5);
g_main_loop_unref (mainloop);
gst_object_unref (timeline);
@@ -1018,6 +1010,274 @@ GST_START_TEST (test_timeline_edition_mode)
GST_END_TEST;
+GST_START_TEST (test_groups)
+{
+ GESAsset *asset;
+ GESTimeline *timeline;
+ GESGroup *group;
+ GESLayer *layer, *layer1, *layer2, *layer3;
+ GESClip *c, *c1, *c2, *c3, *c4, *c5;
+
+ GList *clips = NULL;
+
+ ges_init ();
+
+ timeline = ges_timeline_new_audio_video ();
+
+ /* Our timeline
+ *
+ * --0------------10-Group-----20---------------30-----------------------70
+ * | +-----------+ |+-----------50 |
+ * L | | C | || C3 | |
+ * | +-----------+ |+-----------+ |
+ * --|-------------------------------------------|-----40----------------|
+ * | +------------+ +-------------+ | +--------60 |
+ * L1 | | C1 | | C2 | | | C4 | |
+ * | +------------+ +-------------+ | +--------+ |
+ * --|-------------------------------------------|-----------------------|
+ * | | +--------+|
+ * L2 | | | c5 ||
+ * | | +--------+|
+ * --+-------------------------------------------+-----------------------+
+ *
+ * L3
+ *
+ * -----------------------------------------------------------------------
+ */
+
+ layer = ges_timeline_append_layer (timeline);
+ layer1 = ges_timeline_append_layer (timeline);
+ layer2 = ges_timeline_append_layer (timeline);
+ layer3 = ges_timeline_append_layer (timeline);
+ assert_equals_int (ges_layer_get_priority (layer3), 3);
+ asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
+
+ c = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ c1 = ges_layer_add_asset (layer1, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ c2 = ges_layer_add_asset (layer1, asset, 20, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ clips = g_list_prepend (clips, c);
+ clips = g_list_prepend (clips, c1);
+ clips = g_list_prepend (clips, c2);
+ group = GES_GROUP (ges_container_group (clips));
+ fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
+ g_list_free (clips);
+
+ fail_unless (GES_IS_GROUP (group));
+ CHECK_OBJECT_PROPS (c, 0, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 20, 0, 10);
+ CHECK_OBJECT_PROPS (group, 0, 0, 30);
+
+ c3 = ges_layer_add_asset (layer, asset, 30, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+ c4 = ges_layer_add_asset (layer1, asset, 40, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+ c5 = ges_layer_add_asset (layer2, asset, 50, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+
+ CHECK_OBJECT_PROPS (c3, 30, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 50, 0, 20);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+ fail_unless (ges_container_edit (GES_CONTAINER (c), NULL, -1,
+ GES_EDIT_MODE_RIPPLE, GES_EDGE_NONE, 10) == TRUE);
+
+ CHECK_OBJECT_PROPS (c, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 20, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 30, 0, 10);
+ CHECK_OBJECT_PROPS (c3, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 50, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 60, 0, 20);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+ fail_unless (ges_container_edit (GES_CONTAINER (c), NULL, 1,
+ GES_EDIT_MODE_RIPPLE, GES_EDGE_NONE, 10) == TRUE);
+ CHECK_OBJECT_PROPS (c, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 20, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 30, 0, 10);
+ CHECK_OBJECT_PROPS (c3, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 50, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 60, 0, 20);
+ check_layer (c, 1);
+ check_layer (c1, 2);
+ check_layer (c2, 2);
+ check_layer (c3, 1);
+ check_layer (c4, 2);
+ check_layer (c5, 3);
+
+ fail_unless (ges_container_edit (GES_CONTAINER (c1), NULL, 2,
+ GES_EDIT_MODE_RIPPLE, GES_EDGE_END, 40) == TRUE);
+ CHECK_OBJECT_PROPS (c, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 20, 0, 20);
+ CHECK_OBJECT_PROPS (c2, 40, 0, 10);
+ CHECK_OBJECT_PROPS (c3, 50, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 60, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 70, 0, 20);
+ check_layer (c, 1);
+ check_layer (c1, 2);
+ check_layer (c2, 2);
+ check_layer (c3, 1);
+ check_layer (c4, 2);
+ check_layer (c5, 3);
+
+ fail_unless (ges_container_edit (GES_CONTAINER (c1), NULL, 2,
+ GES_EDIT_MODE_RIPPLE, GES_EDGE_END, 30) == TRUE);
+ CHECK_OBJECT_PROPS (c, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 20, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 30, 0, 10);
+ CHECK_OBJECT_PROPS (c3, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 50, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 60, 0, 20);
+ check_layer (c, 1);
+ check_layer (c1, 2);
+ check_layer (c2, 2);
+ check_layer (c3, 1);
+ check_layer (c4, 2);
+ check_layer (c5, 3);
+
+ fail_unless (ges_container_edit (GES_CONTAINER (c), NULL, 0,
+ GES_EDIT_MODE_RIPPLE, GES_EDGE_NONE, 0) == TRUE);
+ CHECK_OBJECT_PROPS (c, 0, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 20, 0, 10);
+ CHECK_OBJECT_PROPS (c3, 30, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 50, 0, 20);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+ fail_unless (ges_container_edit (GES_CONTAINER (c2), NULL, -1,
+ GES_EDIT_MODE_ROLL, GES_EDGE_END, 40) == TRUE);
+ CHECK_OBJECT_PROPS (c, 0, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 20, 0, 20);
+ CHECK_OBJECT_PROPS (c3, 40, 10, 10);
+ CHECK_OBJECT_PROPS (c4, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 50, 0, 20);
+ CHECK_OBJECT_PROPS (group, 0, 0, 40);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+ gst_object_unref (timeline);
+ gst_object_unref (asset);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_snapping_groups)
+{
+ GESAsset *asset;
+ GESTimeline *timeline;
+ GESGroup *group;
+ GESLayer *layer, *layer1, *layer2, *layer3;
+ GESClip *c, *c1, *c2, *c3, *c4, *c5;
+
+ GList *clips = NULL;
+
+ ges_init ();
+
+ timeline = ges_timeline_new_audio_video ();
+ g_object_set (timeline, "snapping-distance", (guint64) 3, NULL);
+
+ /* Our timeline
+ *
+ * --0------------10-Group-----20---------25-----30----------------------70
+ * | +-----------+ | +-----------50 |
+ * L | | C | | | C3 | |
+ * | +-----------+ | +-----------+ |
+ * --|------------------------------------|------------40----------------|
+ * | +------------+ +--------+ +--------60 |
+ * L1 | | C1 | | C2 | | C4 | |
+ * | +------------+ +--------+ +--------+ |
+ * --|------------------------------------+------------------------------|
+ * | +--------+|
+ * L2 | | c5 ||
+ * | +--------+|
+ * --+-------------------------------------------------------------------+
+ *
+ * L3
+ *
+ * -----------------------------------------------------------------------
+ */
+
+ layer = ges_timeline_append_layer (timeline);
+ layer1 = ges_timeline_append_layer (timeline);
+ layer2 = ges_timeline_append_layer (timeline);
+ layer3 = ges_timeline_append_layer (timeline);
+ assert_equals_int (ges_layer_get_priority (layer3), 3);
+ asset = ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL);
+
+ c = ges_layer_add_asset (layer, asset, 0, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ c1 = ges_layer_add_asset (layer1, asset, 10, 0, 10, GES_TRACK_TYPE_UNKNOWN);
+ c2 = ges_layer_add_asset (layer1, asset, 20, 0, 5, GES_TRACK_TYPE_UNKNOWN);
+ clips = g_list_prepend (clips, c);
+ clips = g_list_prepend (clips, c1);
+ clips = g_list_prepend (clips, c2);
+ group = GES_GROUP (ges_container_group (clips));
+ fail_unless (GES_TIMELINE_ELEMENT_TIMELINE (group) == timeline);
+ g_list_free (clips);
+
+ fail_unless (GES_IS_GROUP (group));
+ CHECK_OBJECT_PROPS (c, 0, 0, 10);
+ CHECK_OBJECT_PROPS (c1, 10, 0, 10);
+ CHECK_OBJECT_PROPS (c2, 20, 0, 5);
+ CHECK_OBJECT_PROPS (group, 0, 0, 25);
+
+ c3 = ges_layer_add_asset (layer, asset, 30, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+ c4 = ges_layer_add_asset (layer1, asset, 40, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+ c5 = ges_layer_add_asset (layer2, asset, 50, 0, 20, GES_TRACK_TYPE_UNKNOWN);
+
+ CHECK_OBJECT_PROPS (c3, 30, 0, 20);
+ CHECK_OBJECT_PROPS (c4, 40, 0, 20);
+ CHECK_OBJECT_PROPS (c5, 50, 0, 20);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+ /* c2 should snap with C3 and make the group moving to 5 */
+ fail_unless (ges_container_edit (GES_CONTAINER (c), NULL, -1,
+ GES_EDIT_MODE_NORMAL, GES_EDGE_NONE, 3) == TRUE);
+
+ DEEP_CHECK (c, 5, 0, 10);
+ DEEP_CHECK (c1, 15, 0, 10);
+ DEEP_CHECK (c2, 25, 0, 5);
+ DEEP_CHECK (c2, 25, 0, 5);
+ DEEP_CHECK (c4, 40, 0, 20);
+ DEEP_CHECK (c5, 50, 0, 20);
+ CHECK_OBJECT_PROPS (group, 5, 0, 25);
+ check_layer (c, 0);
+ check_layer (c1, 1);
+ check_layer (c2, 1);
+ check_layer (c3, 0);
+ check_layer (c4, 1);
+ check_layer (c5, 2);
+
+
+ gst_object_unref (timeline);
+ gst_object_unref (asset);
+}
+
+GST_END_TEST;
+
static Suite *
ges_suite (void)
{
@@ -1030,6 +1290,8 @@ ges_suite (void)
tcase_add_test (tc_chain, test_snapping);
tcase_add_test (tc_chain, test_timeline_edition_mode);
tcase_add_test (tc_chain, test_simple_triming);
+ tcase_add_test (tc_chain, test_groups);
+ tcase_add_test (tc_chain, test_snapping_groups);
return s;
}