#include #include #include #include #include #include #include #include #include GstElement *pipeline, *imagebin; GstElement *image_sink, *screen_sink, *webcam, *ffmpegcolorspace, *pngenc; GstPad *pad; GtkWidget *window, *screen; GtkWidget *camerabutton; /*Bus*/ static gboolean my_bus_callback (GstBus * bus, GstMessage * message, gpointer data) { switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_ERROR: { GError *err; gchar *debug; gst_message_parse_error (message, &err, &debug); g_print ("Error: %s\n", err->message); g_error_free (err); g_free (debug); gtk_main_quit (); break; } case GST_MESSAGE_EOS: /* end-of-stream */ gst_element_set_state (imagebin, GST_STATE_READY); gst_element_set_state (pipeline, GST_STATE_PLAYING); g_print ("Done\n"); break; default: /* unhandled message */ break; } /* remove message from the queue */ return TRUE; } /* llamada para conectar webcam*/ static gboolean expose_cb (GtkWidget * widget, GdkEventExpose * event, gpointer data) { /* Conecta xvimagesink a la ventana con id dado */ gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (data), gdk_x11_drawable_get_xid (widget->window)); return FALSE; } /* llamada para hacer foto */ static void take_photo (GtkWidget * widget, gpointer data) { /*gchar *location = data;*/ gst_element_set_state (pipeline, GST_STATE_READY); gst_element_set_state (imagebin, GST_STATE_PLAYING); g_print ("Playing\n"); } static void main_quit (GtkWidget * widget, gpointer data) { gst_element_set_state (pipeline, GST_STATE_NULL); gtk_main_quit (); } /*main*/ int main (int argc, char *argv[]) { GladeXML *xml; GError *error1 = NULL; /*inicializar framework */ gtk_init (&argc, &argv); gst_init (&argc, &argv); glade_init (); /* Cargar la interfaz de usuario */ xml = glade_xml_new ("gui/dipatata.glade", "mainwindow", NULL); if (!xml) { g_warning ("something bad happened while creating the interface"); return 1; } /*Cargar widgets necesarios*/ window = glade_xml_get_widget (xml, "mainwindow"); camerabutton = glade_xml_get_widget (xml, "takephotobutton"); screen = glade_xml_get_widget (xml, "display"); g_assert (window != NULL); g_assert (camerabutton != NULL); g_assert (screen != NULL); /*Cargar elementos gst*/ pipeline = gst_parse_launch("v4lsrc name=webcam ! xvimagesink name=display", &error1); if (!pipeline) { fprintf (stderr, "Parse error in central branch: %s\n", error1->message); return 1; } imagebin = gst_parse_launch("v4lsrc name=webcam ! videoscale ! ffmpegcolorspace ! pngenc ! filesink name=image_sink", &error1); if (!imagebin) { fprintf (stderr, "Parse error in central branch: %s\n", error1->message); return 1; } screen_sink = gst_bin_get_by_name (GST_BIN (pipeline), "display"); image_sink = gst_bin_get_by_name (GST_BIN (imagebin), "image_sink"); g_object_set (G_OBJECT (image_sink), "location", "foo.png", NULL); /* Eventos */ gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (imagebin)), my_bus_callback, NULL); g_signal_connect (screen, "expose-event", G_CALLBACK (expose_cb), screen_sink); g_signal_connect (G_OBJECT (camerabutton), "clicked", G_CALLBACK (take_photo), NULL); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (main_quit), NULL); /*Bucle principal */ g_object_unref (G_OBJECT (xml)); gst_element_set_state (pipeline, GST_STATE_PLAYING); gst_element_set_state (imagebin, GST_STATE_READY); gtk_main (); if (pipeline) gst_object_unref (GST_OBJECT (pipeline)); return 0; }