15f7a4c061c92f3e2e0aad873d482e161f3d23ba
[platform/upstream/gstreamer.git] / subprojects / gst-editing-services / tests / check / ges / mixers.c
1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*-  */
2 /*
3  * gst-editing-services
4  *
5  * Copyright (C) 2013 Thibault Saunier <tsaunier@gnome.org>
6  *
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.
11  *
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.
16  *
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/>.";
19  *
20  */
21 #include "test-utils.h"
22 #include <ges/ges.h>
23 #include <gst/check/gstcheck.h>
24
25 #include <ges/ges-smart-adder.h>
26
27 static GMainLoop *main_loop;
28
29 GST_START_TEST (simple_smart_adder_test)
30 {
31   GstPad *requested_pad;
32   GstPadTemplate *template = NULL;
33   GESTrack *track;
34   GstElement *smart_adder;
35
36   ges_init ();
37
38   track = GES_TRACK (ges_audio_track_new ());
39   smart_adder = ges_smart_adder_new (track);
40
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));
45
46   template =
47       gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (smart_adder),
48       "sink_%u");
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));
53
54   gst_object_unref (requested_pad);
55   gst_object_unref (smart_adder);
56   gst_object_unref (track);
57
58   ges_deinit ();
59 }
60
61 GST_END_TEST;
62
63 static void
64 message_received_cb (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
65 {
66   GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
67       GST_MESSAGE_SRC (message), message);
68   switch (GST_MESSAGE_TYPE (message)) {
69     case GST_MESSAGE_EOS:
70       /* we should check if we really finished here */
71       GST_WARNING ("Got an EOS");
72       g_main_loop_quit (main_loop);
73       break;
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");
78       fail_if (TRUE);
79       g_main_loop_quit (main_loop);
80       break;
81     case GST_MESSAGE_ERROR:
82       fail_error_message (message);
83       g_main_loop_quit (main_loop);
84     default:
85       break;
86   }
87 }
88
89 GST_START_TEST (simple_audio_mixed_with_pipeline)
90 {
91   GstBus *bus;
92   GESAsset *asset;
93   GESClip *tmpclip;
94   GstMessage *message;
95   GESLayer *layer, *layer1;
96   GESTrack *track;
97   GESTimeline *timeline;
98   GESPipeline *pipeline;
99
100   ges_init ();
101
102   track = GES_TRACK (ges_audio_track_new ());
103   timeline = ges_timeline_new ();
104   pipeline = ges_test_create_pipeline (timeline);
105
106   ges_timeline_add_track (timeline, track);
107   layer = ges_timeline_append_layer (timeline);
108   layer1 = ges_timeline_append_layer (timeline);
109
110   asset = GES_ASSET (ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL));
111
112   GST_DEBUG ("Setting volume on the layer");
113   ges_meta_container_set_float (GES_META_CONTAINER (layer), GES_META_VOLUME,
114       1.5);
115
116   tmpclip = ges_layer_add_asset (layer, asset, 0, 0, 1 * GST_SECOND,
117       GES_TRACK_TYPE_AUDIO);
118   ges_audio_test_source_set_volume (GES_CONTAINER_CHILDREN (tmpclip)->data,
119       1.0);
120   ges_audio_test_source_set_freq (GES_CONTAINER_CHILDREN (tmpclip)->data, 550);
121
122   tmpclip = ges_layer_add_asset (layer1, asset, 0, 0, 2 * GST_SECOND,
123       GES_TRACK_TYPE_AUDIO);
124   g_object_unref (asset);
125
126   ges_audio_test_source_set_volume (GES_CONTAINER_CHILDREN (tmpclip)->data, 1);
127
128   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
129   main_loop = g_main_loop_new (NULL, FALSE);
130
131   gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
132   g_signal_connect (bus, "message", (GCallback) message_received_cb, pipeline);
133   fail_if (gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING)
134       == GST_STATE_CHANGE_FAILURE);
135   message = gst_bus_timed_pop_filtered (bus, 5 * GST_SECOND,
136       GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR);
137
138   if (message == NULL) {
139     fail_unless ("No message after 5 seconds" == NULL);
140     goto done;
141   } else if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR)
142     fail_error_message (message);
143
144   gst_message_unref (message);
145   GST_INFO ("running main loop");
146   g_main_loop_run (main_loop);
147   g_main_loop_unref (main_loop);
148
149 done:
150   gst_bus_remove_signal_watch (bus);
151   gst_object_unref (bus);
152   gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
153   gst_object_unref (pipeline);
154
155   ges_deinit ();
156 }
157
158 GST_END_TEST;
159
160 GST_START_TEST (audio_video_mixed_with_pipeline)
161 {
162   GstBus *bus;
163   GESAsset *asset;
164   GESClip *tmpclip;
165   GstMessage *message;
166   GESLayer *layer, *layer1;
167   GESTrack *track;
168   GESTrack *track_audio;
169   GESTimeline *timeline;
170   GESPipeline *pipeline;
171
172   ges_init ();
173
174   track = GES_TRACK (ges_video_track_new ());
175   track_audio = GES_TRACK (ges_audio_track_new ());
176   timeline = ges_timeline_new ();
177   pipeline = ges_test_create_pipeline (timeline);
178
179   ges_timeline_add_track (timeline, track);
180   ges_timeline_add_track (timeline, track_audio);
181   layer = ges_timeline_append_layer (timeline);
182   layer1 = ges_timeline_append_layer (timeline);
183
184   asset = GES_ASSET (ges_asset_request (GES_TYPE_TEST_CLIP, NULL, NULL));
185
186   tmpclip =
187       ges_layer_add_asset (layer, asset, 0 * GST_SECOND, 0, 2 * GST_SECOND,
188       GES_TRACK_TYPE_UNKNOWN);
189
190   ges_test_clip_set_vpattern (GES_TEST_CLIP (tmpclip), 18);
191
192   tmpclip =
193       ges_layer_add_asset (layer1, asset, 1 * GST_SECOND, 0, 5 * GST_SECOND,
194       GES_TRACK_TYPE_UNKNOWN);
195   g_object_unref (asset);
196
197   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
198   main_loop = g_main_loop_new (NULL, FALSE);
199
200   gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
201   g_signal_connect (bus, "message", (GCallback) message_received_cb, pipeline);
202   fail_if (gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING)
203       == GST_STATE_CHANGE_FAILURE);
204
205   message = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
206       GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR);
207
208   if (message == NULL) {
209     fail_unless ("No message after 5 seconds" == NULL);
210     goto done;
211   } else if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR)
212     fail_error_message (message);
213
214   gst_message_unref (message);
215   GST_INFO ("running main loop");
216   g_main_loop_run (main_loop);
217   g_main_loop_unref (main_loop);
218
219 done:
220   gst_bus_remove_signal_watch (bus);
221   gst_object_unref (bus);
222   gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
223   gst_object_unref (pipeline);
224
225   ges_deinit ();
226 }
227
228 GST_END_TEST;
229
230 static Suite *
231 ges_suite (void)
232 {
233   Suite *s = suite_create ("Smart mixers");
234   TCase *tc_chain = tcase_create ("smart-mixers");
235
236   suite_add_tcase (s, tc_chain);
237
238   tcase_add_test (tc_chain, simple_smart_adder_test);
239   tcase_add_test (tc_chain, simple_audio_mixed_with_pipeline);
240   tcase_add_test (tc_chain, audio_video_mixed_with_pipeline);
241
242   return s;
243 }
244
245 GST_CHECK_MAIN (ges);