diff options
author | Thibault Saunier <thibault.saunier@collabora.com> | 2013-06-26 17:08:57 -0400 |
---|---|---|
committer | Thibault Saunier <thibault.saunier@collabora.com> | 2013-07-09 16:47:00 -0400 |
commit | a933d9540d4677c055d6b1e9a9fe6e9821d59478 (patch) | |
tree | 961d1a4dfccb90716400232b08a95e0521c6d754 /tests | |
parent | d3e3871440e7cfa2b6e6a0745c058c8fb7161a45 (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.am | 1 | ||||
-rw-r--r-- | tests/check/ges/basic.c | 4 | ||||
-rw-r--r-- | tests/check/ges/clip.c | 6 | ||||
-rw-r--r-- | tests/check/ges/group.c | 500 | ||||
-rw-r--r-- | tests/check/ges/test-utils.h | 12 | ||||
-rw-r--r-- | tests/check/ges/timelineedition.c | 336 |
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; } |