1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */
5 * Copyright (C) 2013 Thibault Saunier <tsaunier@gnome.org>
7 * gst-editing-services is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * gst-editing-services is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 * See the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.";
21 #include "test-utils.h"
23 #include <gst/check/gstcheck.h>
25 #include <ges/ges-smart-adder.h>
27 static GMainLoop *main_loop;
29 GST_START_TEST (simple_smart_adder_test)
31 GstPad *requested_pad;
32 GstPadTemplate *template = NULL;
34 GstElement *smart_adder;
38 track = GES_TRACK (ges_audio_track_new ());
39 smart_adder = ges_smart_adder_new (track);
41 fail_unless (GES_IS_SMART_ADDER (smart_adder));
42 fail_unless (GST_IS_ELEMENT (smart_adder));
43 fail_unless (GST_IS_ELEMENT (GES_SMART_ADDER (smart_adder)->adder));
44 fail_unless (GST_IS_PAD (GES_SMART_ADDER (smart_adder)->srcpad));
47 gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (smart_adder),
49 fail_unless (template != NULL);
50 requested_pad = gst_element_request_pad (GST_ELEMENT (smart_adder),
51 template, NULL, NULL);
52 fail_unless (GST_IS_PAD (requested_pad));
54 gst_object_unref (requested_pad);
55 gst_object_unref (smart_adder);
56 gst_object_unref (track);
64 message_received_cb (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
66 GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
67 GST_MESSAGE_SRC (message), message);
68 switch (GST_MESSAGE_TYPE (message)) {
70 /* we should check if we really finished here */
71 GST_WARNING ("Got an EOS");
72 g_main_loop_quit (main_loop);
74 case GST_MESSAGE_SEGMENT_START:
75 case GST_MESSAGE_SEGMENT_DONE:
76 /* We shouldn't see any segement messages, since we didn't do a segment seek */
77 GST_WARNING ("Saw a Segment start/stop");
79 g_main_loop_quit (main_loop);
81 case GST_MESSAGE_ERROR:
82 fail_error_message (message);
83 g_main_loop_quit (main_loop);
89 GST_START_TEST (simple_audio_mixed_with_pipeline)
95 GESLayer *layer, *layer1;
97 GESTimeline *timeline;
98 GESPipeline *pipeline;
99 GstClockTime timeout = 5 * GST_SECOND;
100 const gchar *timeout_factor_str = g_getenv ("TIMEOUT_FACTOR");
104 track = GES_TRACK (ges_audio_track_new ());
105 timeline = ges_timeline_new ();
106 pipeline = ges_test_create_pipeline (timeline);
108 ges_timeline_add_track (timeline, track);
109 layer = ges_timeline_append_layer (timeline);
110 layer1 = ges_timeline_append_layer (timeline);
112 asset = GES_ASSET (ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL));
114 GST_DEBUG ("Setting volume on the layer");
115 ges_meta_container_set_float (GES_META_CONTAINER (layer), GES_META_VOLUME,
118 tmpclip = ges_layer_add_asset (layer, asset, 0, 0, 1 * GST_SECOND,
119 GES_TRACK_TYPE_AUDIO);
120 ges_audio_test_source_set_volume (GES_CONTAINER_CHILDREN (tmpclip)->data,
122 ges_audio_test_source_set_freq (GES_CONTAINER_CHILDREN (tmpclip)->data, 550);
124 tmpclip = ges_layer_add_asset (layer1, asset, 0, 0, 2 * GST_SECOND,
125 GES_TRACK_TYPE_AUDIO);
126 g_object_unref (asset);
128 ges_audio_test_source_set_volume (GES_CONTAINER_CHILDREN (tmpclip)->data, 1);
130 bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
131 main_loop = g_main_loop_new (NULL, FALSE);
133 gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
134 g_signal_connect (bus, "message", (GCallback) message_received_cb, pipeline);
135 fail_if (gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING)
136 == GST_STATE_CHANGE_FAILURE);
137 if (timeout_factor_str) {
138 gint factor = g_ascii_strtoll (timeout_factor_str, NULL, 10);
142 message = gst_bus_timed_pop_filtered (bus, timeout,
143 GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR);
145 if (message == NULL) {
146 fail_unless ("Timed out" == NULL);
148 } else if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR)
149 fail_error_message (message);
151 gst_message_unref (message);
152 GST_INFO ("running main loop");
153 g_main_loop_run (main_loop);
154 g_main_loop_unref (main_loop);
157 gst_bus_remove_signal_watch (bus);
158 gst_object_unref (bus);
159 gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
160 gst_object_unref (pipeline);
167 GST_START_TEST (audio_video_mixed_with_pipeline)
173 GESLayer *layer, *layer1;
175 GESTrack *track_audio;
176 GESTimeline *timeline;
177 GESPipeline *pipeline;
181 track = GES_TRACK (ges_video_track_new ());
182 track_audio = GES_TRACK (ges_audio_track_new ());
183 timeline = ges_timeline_new ();
184 pipeline = ges_test_create_pipeline (timeline);
186 ges_timeline_add_track (timeline, track);
187 ges_timeline_add_track (timeline, track_audio);
188 layer = ges_timeline_append_layer (timeline);
189 layer1 = ges_timeline_append_layer (timeline);
191 asset = GES_ASSET (ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL));
194 ges_layer_add_asset (layer, asset, 0 * GST_SECOND, 0, 2 * GST_SECOND,
195 GES_TRACK_TYPE_UNKNOWN);
197 ges_test_clip_set_vpattern (GES_TEST_CLIP (tmpclip), 18);
200 ges_layer_add_asset (layer1, asset, 1 * GST_SECOND, 0, 5 * GST_SECOND,
201 GES_TRACK_TYPE_UNKNOWN);
202 g_object_unref (asset);
204 bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
205 main_loop = g_main_loop_new (NULL, FALSE);
207 gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
208 g_signal_connect (bus, "message", (GCallback) message_received_cb, pipeline);
209 fail_if (gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING)
210 == GST_STATE_CHANGE_FAILURE);
212 message = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
213 GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR);
215 if (message == NULL) {
216 fail_unless ("No message after 5 seconds" == NULL);
218 } else if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR)
219 fail_error_message (message);
221 gst_message_unref (message);
222 GST_INFO ("running main loop");
223 g_main_loop_run (main_loop);
224 g_main_loop_unref (main_loop);
227 gst_bus_remove_signal_watch (bus);
228 gst_object_unref (bus);
229 gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
230 gst_object_unref (pipeline);
240 Suite *s = suite_create ("Smart mixers");
241 TCase *tc_chain = tcase_create ("smart-mixers");
243 suite_add_tcase (s, tc_chain);
245 tcase_add_test (tc_chain, simple_smart_adder_test);
246 tcase_add_test (tc_chain, simple_audio_mixed_with_pipeline);
247 tcase_add_test (tc_chain, audio_video_mixed_with_pipeline);
252 GST_CHECK_MAIN (ges);