#include #include #include "glib.h" #include #include static GstElement *pipeline = NULL; static GstElement *glimagesink = NULL; static gboolean on_quit_signal (void *userdata) { GMainLoop *main_loop = (GMainLoop *) userdata; g_return_val_if_fail (main_loop != NULL, FALSE); g_print ("received quit signal"); g_main_loop_quit (main_loop); return FALSE; } static void install_sighandlers (GMainLoop * main_loop) { GMainContext *ctx = g_main_loop_get_context (main_loop); GSource *source = g_unix_signal_source_new (SIGTERM); g_source_set_callback (source, on_quit_signal, main_loop, NULL); g_source_attach (source, ctx); source = g_unix_signal_source_new (SIGINT); g_source_set_callback (source, on_quit_signal, main_loop, NULL); g_source_attach (source, ctx); } static GstElement * create_pipeline (void) { GstElement *pipeline = NULL; GstElement *videotestsrc = NULL; GstElement *glupload = NULL; pipeline = gst_pipeline_new ("gst_test2"); videotestsrc = gst_element_factory_make ("videotestsrc", "videotestsrc"); glupload = gst_element_factory_make ("glupload", "glupload"); glimagesink = gst_element_factory_make ("glimagesinkelement", "glimagesink"); if (!pipeline || !videotestsrc || !glupload || !glimagesink) { g_printerr ("One element could not be created. Exiting.\n"); return NULL; } g_object_set (G_OBJECT (glimagesink), "sync", FALSE, NULL); gst_bin_add_many (GST_BIN (pipeline), videotestsrc, glupload, glimagesink, NULL); gst_element_link_many (videotestsrc, glupload, glimagesink, NULL); return pipeline; } static gboolean timeout_callback (void *userdata) { GstStateChangeReturn ret; g_print ("timeout_callback...\n"); // g_print ("glimagesink->object->object->ref_count = %d\n", // glimagesink->object.object.ref_count); g_print ("gst_element_set_state GST_STATE_PLAYING => GST_STATE_NULL...\n"); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); ret = gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL, GST_CLOCK_TIME_NONE); g_print ("gst_element_get_state() = %d\n", ret); // g_print ("glimagesink->object->object->ref_count = %d\n", // glimagesink->object.object.ref_count); return FALSE; } int main (int argc, char *argv[]) { GMainLoop *loop; gst_init (&argc, &argv); pipeline = create_pipeline (); g_print ("gst_element_set_state GST_STATE_NULL => GST_STATE_PLAYING...\n"); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); g_timeout_add (2000, timeout_callback, pipeline); loop = g_main_loop_new (NULL, FALSE); install_sighandlers (loop); g_main_loop_run (loop); g_print ("exiting...\n"); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0; }