--- /dev/null
+/* This example can be found in the GStreamer Editing Services git repository in:
+ * examples/c/play_timeline_with_one_clip.c
+ */
+#include <ges/ges.h>
+
+int
+main (int argc, char **argv)
+{
+ GESLayer *layer;
+ GESTimeline *timeline;
+
+ if (argc == 1) {
+ g_printerr ("Usage: play_timeline_with_one_clip file:///clip/uri\n");
+
+ return 1;
+ }
+
+ gst_init (NULL, NULL);
+ ges_init ();
+
+ timeline = ges_timeline_new_audio_video ();
+ layer = ges_timeline_append_layer (timeline);
+
+ {
+ /* Add a clip with a duration of 5 seconds */
+ GESClip *clip = GES_CLIP (ges_uri_clip_new (argv[1]));
+
+ if (clip == NULL) {
+ g_printerr ("%s can not be used, make sure it is a supported media file",
+ argv[1]);
+
+ return 1;
+ }
+
+ g_object_set (clip, "duration", 5 * GST_SECOND, "start", 0, NULL);
+ ges_layer_add_clip (layer, clip);
+ }
+
+ /* Commiting the timeline is always necessary for changes
+ * inside it to be taken into account by the Non Linear Engine */
+ ges_timeline_commit (timeline);
+
+ {
+ /* Play the timeline */
+ GESPipeline *pipeline = ges_pipeline_new ();
+ GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+
+ ges_pipeline_set_timeline (pipeline, timeline);
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+
+ /* Simple way to just play the pipeline until EOS or an error pops on the bus */
+ gst_bus_timed_pop_filtered (bus, 10 * GST_SECOND,
+ GST_MESSAGE_EOS | GST_MESSAGE_ERROR);
+
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+ }
+
+
+ return 0;
+}
--- /dev/null
+#!/usr/bin/env python3
+#
+# GStreamer
+#
+# Copyright (C) 2013 Thibault Saunier <tsaunier@gnome.org
+#
+# 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 Street, Suite 500,
+# Boston, MA 02110-1335, USA.
+
+import os
+import gi
+
+gi.require_version('Gst', '1.0')
+gi.require_version('GES', '1.0')
+
+from gi.repository import Gst, GES, GLib # noqa
+
+
+class Simple:
+ def __init__(self, uri):
+ timeline = GES.Timeline.new_audio_video()
+ self.project = timeline.get_asset()
+
+ self.project.connect("asset-added", self._asset_added_cb)
+ self.project.connect("error-loading-asset", self._error_loading_asset_cb)
+ self.project.create_asset(uri, GES.UriClip)
+ self.layer = timeline.append_layer()
+ self._create_pipeline(timeline)
+ self.loop = GLib.MainLoop()
+
+ def _create_pipeline(self, timeline):
+ self.pipeline = GES.Pipeline()
+ self.pipeline.set_timeline(timeline)
+ bus = self.pipeline.get_bus()
+ bus.add_signal_watch()
+ bus.connect("message", self.bus_message_cb)
+
+ def bus_message_cb(self, unused_bus, message):
+ if message.type == Gst.MessageType.EOS:
+ print("eos")
+ self.loop.quit()
+ elif message.type == Gst.MessageType.ERROR:
+ error = message.parse_error()
+ print("error %s" % error[1])
+ self.loop.quit()
+
+ def start(self):
+ self.loop.run()
+
+ def _asset_added_cb(self, project, asset):
+ self.layer.add_asset(asset, 0, 0, Gst.SECOND * 5, GES.TrackType.UNKNOWN)
+ self.pipeline.set_state(Gst.State.PLAYING)
+
+ def _error_loading_asset_cb(self, project, error, asset_id, type):
+ print("Could not load asset %s: %s" % (asset_id, error))
+ self.loop.quit()
+
+if __name__ == "__main__":
+ if len(os.sys.argv) != 2:
+ print("You must specify a file URI")
+ exit(-1)
+
+ Gst.init(None)
+ GES.init()
+ simple = Simple(os.sys.argv[1])
+ simple.start()