From ecff617bf350517be03d2826a9c01e5660879aec Mon Sep 17 00:00:00 2001 From: Xavi Artigas Date: Tue, 3 Jul 2012 17:42:00 +0200 Subject: [PATCH] Added basic tutorial 13. --- gst-sdk/tutorials/basic-tutorial-13.c | 112 +++++++++++++++++++++ .../basic-tutorial-13/basic-tutorial-13.vcxproj | 95 +++++++++++++++++ .../basic-tutorial-13.vcxproj.filters | 6 ++ gst-sdk/tutorials/vs2010/tutorials.sln | 10 ++ 4 files changed, 223 insertions(+) create mode 100644 gst-sdk/tutorials/basic-tutorial-13.c create mode 100644 gst-sdk/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj create mode 100644 gst-sdk/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj.filters diff --git a/gst-sdk/tutorials/basic-tutorial-13.c b/gst-sdk/tutorials/basic-tutorial-13.c new file mode 100644 index 0000000..bd9846b --- /dev/null +++ b/gst-sdk/tutorials/basic-tutorial-13.c @@ -0,0 +1,112 @@ +#include +#include + +typedef struct _CustomData { + GstElement *pipeline; + GMainLoop *loop; + + gboolean playing; /* Playing or Paused */ + gdouble rate; /* Current playback rate */ + gboolean backward; /* Forward or backwards */ +} CustomData; + +/* Process keyboard input */ +static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data) { + gchar *str = NULL; + + if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) != G_IO_STATUS_NORMAL) { + return TRUE; + } + + switch (g_ascii_tolower (str[0])) { + case 'p': + data->playing = !data->playing; + gst_element_set_state (data->pipeline, data->playing ? GST_STATE_PLAYING : GST_STATE_PAUSED); + g_print ("Setting state to %s\n", data->playing ? "PLAYING" : "PAUSE"); + break; + case 's': + if (g_ascii_isupper (str[0])) { + data->rate *= 2.0; + } else { + data->rate /= 2.0; + } + gst_element_send_event (data->pipeline, + gst_event_new_step (GST_FORMAT_TIME, -1, data->rate, TRUE, FALSE)); + g_print ("Current rate: %g\n", data->rate); + break; + case 'd': + data->backward = !data->backward; + gst_element_send_event (data->pipeline, + gst_event_new_seek (data->backward ? -data->rate : data->rate, + GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, GST_SEEK_TYPE_NONE, 0, GST_SEEK_TYPE_NONE, 0)); + g_print ("Going %s\n", data->backward ? "backwards" : "forward"); + break; + case 'n': + gst_element_send_event (data->pipeline, + gst_event_new_step (GST_FORMAT_BUFFERS, 1, data->rate, TRUE, FALSE)); + g_print ("Stepping one frame\n"); + break; + case 'q': + g_main_loop_quit (data->loop); + break; + default: + break; + } + + g_free (str); + + return TRUE; +} + +int main(int argc, char *argv[]) { + CustomData data; + GstStateChangeReturn ret; + GIOChannel *io_stdin; + + /* Initialize GStreamer */ + gst_init (&argc, &argv); + + /* Initialize our data structure */ + memset (&data, 0, sizeof (data)); + + /* Print usage map */ + g_print ( + "USAGE: Choose one of the following options, then press enter:\n" + " 'P' to toggle between PAUSE and PLAY\n" + " 'S' to increase playback speed, 's' to decrease playback speed\n" + " 'D' to toggle playback direction\n" + " 'N' to move to next frame (in the current direction, better in PAUSE)\n" + " 'Q' to quit\n"); + + /* Build the pipeline */ + data.pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm", NULL); + + /* Add a keyboard watch so we get notified of keystrokes */ +#ifdef _WIN32 + io_stdin = g_io_channel_win32_new_fd (fileno (stdin)); +#else + io_stdin = g_io_channel_unix_new (fileno (stdin)); +#endif + g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data); + + /* Start playing */ + ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) { + g_printerr ("Unable to set the pipeline to the playing state.\n"); + gst_object_unref (data.pipeline); + return -1; + } + data.playing = TRUE; + data.rate = 1.0; + + /* Create a GLib Main Loop and set it to run */ + data.loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (data.loop); + + /* Free resources */ + g_main_loop_unref (data.loop); + g_io_channel_unref (io_stdin); + gst_element_set_state (data.pipeline, GST_STATE_NULL); + gst_object_unref (data.pipeline); + return 0; +} diff --git a/gst-sdk/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj b/gst-sdk/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj new file mode 100644 index 0000000..f0ae7c6 --- /dev/null +++ b/gst-sdk/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj @@ -0,0 +1,95 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + Win32Proj + {6D962544-E7A2-450B-998B-6D09B17ACCB3} + v4.0 + + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + %(AdditionalDependencies) + %(AdditionalLibraryDirectories) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + false + true + + + + + + \ No newline at end of file diff --git a/gst-sdk/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj.filters b/gst-sdk/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj.filters new file mode 100644 index 0000000..910fa05 --- /dev/null +++ b/gst-sdk/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj.filters @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/gst-sdk/tutorials/vs2010/tutorials.sln b/gst-sdk/tutorials/vs2010/tutorials.sln index 249a539..17529d2 100644 --- a/gst-sdk/tutorials/vs2010/tutorials.sln +++ b/gst-sdk/tutorials/vs2010/tutorials.sln @@ -35,6 +35,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-6", "play EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-7", "playback-tutorial-7\playback-tutorial-7.vcxproj", "{9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-13", "basic-tutorial-13\basic-tutorial-13.vcxproj", "{6D962544-E7A2-450B-998B-6D09B17ACCB3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -179,6 +181,14 @@ Global {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Release|Win32.Build.0 = Release|Win32 {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Release|x64.ActiveCfg = Release|x64 {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Release|x64.Build.0 = Release|x64 + {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Debug|Win32.Build.0 = Debug|Win32 + {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Debug|x64.ActiveCfg = Debug|x64 + {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Debug|x64.Build.0 = Debug|x64 + {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Release|Win32.ActiveCfg = Release|Win32 + {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Release|Win32.Build.0 = Release|Win32 + {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Release|x64.ActiveCfg = Release|x64 + {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE -- 2.7.4