// Authors
//   Copyright (C) 2017 Thibault Saunier <thibault.saunier@osg-samsung.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
// 02110-1301  USA


using System;
using Gst;
using System.Diagnostics;

namespace GESSharp
{
    class GESExample
    {
        public static void Main (string[] args)
        {
            // Initialize Gstreamer
            Gst.Application.Init();

            // Build the pipeline
            GES.Global.Init();
            var pipeline = new GES.Pipeline();
            var timeline = GES.Timeline.NewAudioVideo();
            var layer = timeline.AppendLayer();

            pipeline["timeline"] = timeline;

            var clip = new GES.TitleClip();
            clip.Duration = Constants.SECOND * 5;
            layer.AddClip(clip);
            clip.SetChildProperty("text", new GLib.Value("Clip 1"));

            var clip1 = new GES.TitleClip();
            clip1.Start = Constants.SECOND * 5;
            clip1.Duration = Constants.SECOND * 5;
            layer.AddClip(clip1);
            clip1.SetChildProperty("text", new GLib.Value("Clip 2"));

            timeline.Commit();

            pipeline.SetState(State.Playing);
            //// Wait until error or EOS
            var bus = pipeline.Bus;
            Message msg = null;
            while (msg == null) {
                var format = Format.Time;
                long position;
                msg = bus.TimedPopFiltered (Gst.Constants.SECOND, MessageType.Eos | MessageType.Error);

                pipeline.QueryPosition (format, out position);
                Console.WriteLine("position: " + Global.TimeFormat(position)
                        + " / " + Global.TimeFormat(timeline.Duration));
            }
            pipeline.SetState(State.Null);
        }
    }
}