int main (int argc, char *argv[]) { unicap_handle_t handle; unicap_format_t format; /* Initialize */ gtk_init (&argc, &argv); g_thread_init(NULL); gdk_threads_init (); gtk_gl_init (&argc, &argv); init_extensions (); init_gl_resources (); handle = open_device(); set_format( handle ); unicap_get_format( handle, &format ); if( ( format.size.width != 640 ) || ( format.size.height != 480 ) ) { g_warning( "The default .cg file assumes a video format of 640x480 pixels. \nYou need to change the yuv.cg file to match your size.\n" ); } prepare_yuv_buffer(&yuvbuffer, &format); unicap_register_callback( handle, UNICAP_EVENT_NEW_FRAME, (unicap_callback_t)new_frame_cb, NULL ); unicap_start_capture( handle ); /* Gtk window & container */ GtkWindow *window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); glarea = gtk_drawing_area_new (); gtk_widget_set_size_request (GTK_WIDGET (glarea), WINDOW_WIDTH, WINDOW_HEIGHT); g_signal_connect (glarea, "expose-event", G_CALLBACK (on_expose), NULL); g_signal_connect (glarea, "configure-event", G_CALLBACK (on_configure), NULL); g_signal_connect (glarea, "map-event", G_CALLBACK (on_mapped), NULL); g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL); GdkGLConfig *gl_config; gl_config = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE); if (gl_config == NULL) g_critical ("Failed to setup a double-buffered RGB visual"); if (! gtk_widget_set_gl_capability (GTK_WIDGET (glarea), gl_config, NULL, TRUE, GDK_GL_RGBA_TYPE)) g_critical ("Failed to add gl capability"); gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (glarea)); gtk_widget_show_all (GTK_WIDGET (window)); /* Main loop */ gtk_main (); return 0; }
static void on_mapped (GtkWidget *widget) { GdkGLContext *gl_context = gtk_widget_get_gl_context (widget); GdkGLDrawable *gl_drawable = gtk_widget_get_gl_drawable (widget); g_return_if_fail (gl_context != NULL && gl_drawable != NULL); g_return_if_fail (gdk_gl_drawable_gl_begin (gl_drawable, gl_context)); init_gl_resources (); update_viewport (widget); gdk_gl_drawable_gl_end (gl_drawable); }
int main (int argc, char *argv[]) { /* Initialize */ gst_init (&argc, &argv); gtk_init (&argc, &argv); gdk_threads_init (); gtk_gl_init (&argc, &argv); init_extensions (); init_gl_resources (); /* Gtk window & container */ GtkWindow *window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); glarea = gtk_drawing_area_new (); gtk_widget_set_size_request (GTK_WIDGET (glarea), WINDOW_WIDTH, WINDOW_HEIGHT); g_signal_connect (glarea, "expose-event", G_CALLBACK (on_expose), NULL); g_signal_connect (glarea, "configure-event", G_CALLBACK (on_configure), NULL); g_signal_connect (glarea, "map-event", G_CALLBACK (on_mapped), NULL); g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL); GdkGLConfig *gl_config; gl_config = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE); if (gl_config == NULL) g_critical ("Failed to setup a double-buffered RGB visual"); if (! gtk_widget_set_gl_capability (GTK_WIDGET (glarea), gl_config, NULL, TRUE, GDK_GL_RGBA_TYPE)) g_critical ("Failed to add gl capability"); gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (glarea)); gtk_widget_show_all (GTK_WIDGET (window)); /* Create the elements */ pipeline = gst_pipeline_new (NULL); source = gst_element_factory_make ("filesrc", "filesrc"); decodebin = gst_element_factory_make ("decodebin", "decodebin"); videosink = gst_element_factory_make ("fakesink", "videosink"); audiosink = gst_element_factory_make ("alsasink", "audiosink"); audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); audioqueue = gst_element_factory_make ("queue", "audioqueue"); videoqueue = gst_element_factory_make ("queue", "videoqueue"); if (pipeline == NULL || source == NULL || decodebin == NULL || videosink == NULL || audiosink == NULL || audioconvert == NULL || audioqueue == NULL || videoqueue == NULL) g_critical ("One of the GStreamer decoding elements is missing"); /* Setup the pipeline */ g_object_set (G_OBJECT (source), "location", "video.avi", NULL); gst_bin_add_many (GST_BIN (pipeline), source, decodebin, videosink, audiosink, audioconvert, audioqueue, videoqueue, NULL); g_signal_connect (decodebin, "pad-added", G_CALLBACK (on_new_pad), NULL); /* Link the elements */ gst_element_link (source, decodebin); gst_element_link (audioqueue, audioconvert); gst_element_link (audioconvert, audiosink); gst_element_link (videoqueue, videosink); /* Now run the pipeline... */ gst_element_set_state (pipeline, GST_STATE_PLAYING); /* Main loop */ gtk_main (); return 0; }