// Authors // Copyright (C) 2014 Stephan Sundermann using System; using Gst; using System.Runtime.InteropServices; using System.Text; namespace GstreamerSharp { class Playback { static Element Pipeline; static GLib.MainLoop MainLoop; // Process a color balance command static void UpdateColorChannel (string channelName, bool increase, Gst.Video.IColorBalance cb) { // Retrieve the list of channels and locate the requested one var channels = cb.ListChannels (); Gst.Video.ColorBalanceChannel channel = null; foreach (var ch in channels) { var label = ch.Label; if (label.Contains (channelName)) { channel = ch; break; } } if (channel == null) return; // Change the channel's value var step = 0.1 * (channel.MaxValue - channel.MinValue); var value = cb.GetValue (channel); if (increase) { value = (int)(value + step); if (value > channel.MaxValue) value = channel.MaxValue; } else { value = (int)(value - step); if (value < channel.MinValue) value = channel.MinValue; } cb.SetValue (channel, value); } // Process keyboard input static bool HandleKeyboard () { if (Console.KeyAvailable) { var key = Console.ReadKey (false); var cb = new Gst.Video.ColorBalanceAdapter (Pipeline.Handle); switch (key.Key) { case ConsoleKey.C: UpdateColorChannel ("CONTRAST", key.Modifiers == ConsoleModifiers.Shift, cb); break; case ConsoleKey.B: UpdateColorChannel ("BRIGHTNESS", key.Modifiers == ConsoleModifiers.Shift, cb); break; case ConsoleKey.H: UpdateColorChannel ("HUE", key.Modifiers == ConsoleModifiers.Shift, cb); break; case ConsoleKey.S: UpdateColorChannel ("SATURATION", key.Modifiers == ConsoleModifiers.Shift, cb); break; case ConsoleKey.Q: MainLoop.Quit (); break; } PrintCurrentValues (); } return true; } // Output the current values of all Color Balance channels static void PrintCurrentValues () { // Output Color Balance value var cb = new Gst.Video.ColorBalanceAdapter (Pipeline.Handle); var channels = cb.ListChannels (); foreach (var ch in channels) { var value = cb.GetValue (ch); Console.WriteLine ("{0}: {1}", ch.Label, 100 * (value - ch.MinValue) / (ch.MaxValue - ch.MinValue)); } Console.WriteLine (); } public static void Main (string[] args) { // Initialize GStreamer Application.Init (ref args); GtkSharp.GstreamerSharp.ObjectManager.Initialize (); // Print usage map Console.WriteLine ("USAGE: Choose one of the following options, then press enter:"); Console.WriteLine (" 'C' to increase contrast, 'c' to decrease contrast"); Console.WriteLine (" 'B' to increase brightness, 'b' to decrease brightness"); Console.WriteLine (" 'H' to increase hue, 'h' to decrease hue"); Console.WriteLine (" 'S' to increase saturation, 's' to decrease saturation"); Console.WriteLine (" 'Q' to quit"); // Build the pipeline Pipeline = Parse.Launch ("playbin uri=http://freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm"); // Add a keyboard watch so we get notified of keystrokes // Start playing var ret = Pipeline.SetState (State.Playing); if (ret == StateChangeReturn.Failure) { Console.WriteLine ("Unable to set the pipeline to the playing state."); return; } PrintCurrentValues (); // Create a GLib Main Loop and set it to run MainLoop = new GLib.MainLoop (); GLib.Timeout.Add (50, HandleKeyboard); MainLoop.Run (); // Free resources Pipeline.SetState (State.Null); } } }