diff options
Diffstat (limited to 'samples/BasicTutorial7.cs')
-rw-r--r-- | samples/BasicTutorial7.cs | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/samples/BasicTutorial7.cs b/samples/BasicTutorial7.cs new file mode 100644 index 0000000..7c4f5c1 --- /dev/null +++ b/samples/BasicTutorial7.cs @@ -0,0 +1,80 @@ +// Authors +// Copyright (C) 2014 Stephan Sundermann <stephansundermann@gmail.com> + +using System; +using Gst; +using System.Runtime.InteropServices; + +namespace GstreamerSharp +{ + class Playback + { + public static void Main (string[] args) + { + // Initialize Gstreamer + Gst.Application.Init(ref args); + + // Create the elements + var audioSource = ElementFactory.Make ("audiotestsrc", "audio_source"); + var tee = ElementFactory.Make ("tee", "tee"); + var audioQueue = ElementFactory.Make ("queue", "audio_queue"); + var audioConvert = ElementFactory.Make ("audioconvert", "audio_convert"); + var audioResample = ElementFactory.Make ("audioresample", "audio_resample"); + var audioSink = ElementFactory.Make ("autoaudiosink", "audio_sink"); + var videoQueue = ElementFactory.Make ("queue", "video_queue"); + var visual = ElementFactory.Make ("wavescope", "visual"); + var videoConvert = ElementFactory.Make ("videoconvert", "csp"); + var videoSink = ElementFactory.Make ("autovideosink", "video_sink"); + + // Create the empty pipeline + var pipeline = new Pipeline ("test-pipeline"); + + if (audioSource == null || tee == null || audioQueue == null || audioConvert == null || audioResample == null || + audioSink == null || videoQueue == null || visual == null || videoConvert == null || videoSink == null || pipeline == null) { + Console.WriteLine ("Not all elements could be created."); + return; + } + + + // Link all elements that can be automatically linked because they have "Always" pads + pipeline.Add (audioSource, tee, audioQueue, audioConvert, audioResample, audioSink, + videoQueue, visual, videoConvert, videoSink); + if (!audioSource.Link (tee) || + !Element.Link (audioQueue, audioConvert, audioResample, audioSink) || + !Element.Link (videoQueue, visual, videoConvert, videoSink)) { + Console.WriteLine ("Elements could not be linked."); + return; + } + + // Manually link the Tee, which has "Request" pads + var teeSrcPadTemplate = tee.GetPadTemplate ("src_%u"); + var teeAudioPad = tee.RequestPad (teeSrcPadTemplate, null, null); + Console.WriteLine ("Obtained request pad {0} for audio branch.", teeAudioPad.Name); + var queueAudioPad = audioQueue.GetStaticPad ("sink"); + var teeVideoPad = tee.RequestPad (teeSrcPadTemplate, null, null); + Console.WriteLine ("Obtained request pad {0} for video branch.", teeVideoPad.Name); + var queueVideoPad = videoQueue.GetStaticPad ("sink"); + if (teeAudioPad.Link (queueAudioPad) != PadLinkReturn.Ok || + teeVideoPad.Link(queueVideoPad) != PadLinkReturn.Ok) { + Console.WriteLine ("Tee could not be linked."); + return; + } + + // Start playing + var ret = pipeline.SetState (State.Playing); + if (ret == StateChangeReturn.Failure) { + Console.WriteLine ("Unable to set the pipeline to the playing state (check the bus for error messages)."); + } + + // Wait until error or EOS + pipeline.Bus.TimedPopFiltered (Constants.CLOCK_TIME_NONE, MessageType.Error | MessageType.Eos); + + // Release the request pads from the Tee, and unref them + tee.ReleaseRequestPad (teeAudioPad); + tee.ReleaseRequestPad (teeVideoPad); + + // Free resources + pipeline.SetState (State.Null); + } + } +}
\ No newline at end of file |