All pastes #633500 Raw Edit

Mine

public text v1 · immutable
#633500 ·published 2007-07-25 18:59 UTC
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;
}