rendered paste body#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <gdk/gdk.h>
#include <gst/gst.h>
#include <gst/interfaces/xoverlay.h>
#include <glade/glade.h>
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;
}