BadDrawable or BadWindow error



Hi everybody. I wrote a little application combining GTK and GStreamer
functions to view the camera input on the window's screen and
to take photo (not yet implemented, this is experimental code...).
When I launch the application I obtain the following error:

"The program 'test2' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadDrawable (invalid Pixmap or Window parameter)'.
  (Details: serial 1362 error_code 9 request_code 140 minor_code 9)"

Sometimes BadDrawable is substituted with BadWindow or others... I really
don't know why this occur: the application runs properly, I also manage
the "delete" and "destroy" event on the main window, but... Can anyone
help me?

Here is the launching command line to compile:

gcc base.c `pkg-config --cflags --libs gtk+-2.0 gstreamer-0.10 \
gstreamer-interfaces-0.8 gdk-2.0` -o test2


And here is the source code:

#include <gtk/gtk.h>
#include <gst/gst.h>
#include <gst/interfaces/xoverlay.h>
#include <gdk/gdkx.h>
#include <gdk/gdk.h>

static gboolean expose( GtkWidget * widget, GdkEventExpose * event,
                          gpointer data );

int main( int argc, char *argv[] )
{
    GtkWidget *window, *screen;

   GstElement *pipeline, *src, *sink, *csp;
   GstElement *tee, *csp2, *fakesink;
   GstElement *queue;
   GstCaps *filter;
   gboolean link_ok;



   gtk_init (&argc, &argv);

   gst_init(&argc, &argv);


    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    gtk_signal_connect(GTK_OBJECT(window),
                "delete_event",
                GTK_SIGNAL_FUNC(gtk_main_quit),
                NULL);

    gtk_signal_connect(GTK_OBJECT(window),
                "destroy",
                GTK_SIGNAL_FUNC(gtk_main_quit),
                NULL);

    screen = gtk_drawing_area_new();

    gtk_window_set_title(GTK_WINDOW(window), "Camera app");
    gtk_container_set_border_width (GTK_CONTAINER (window), 5);
    gtk_widget_set_size_request(window, 640, 480);

    gtk_widget_set_size_request(screen, 320, 240);
    gtk_widget_show(screen);


    gtk_container_add(GTK_CONTAINER(window), screen);


   pipeline = gst_pipeline_new("camera");
   src = gst_element_factory_make("videotestsrc", "src");
//   src = gst_element_factory_make("gconfv4l2src", "src");

   sink = gst_element_factory_make("xvimagesink", "sink");
   csp = gst_element_factory_make("ffmpegcolorspace", "csp");
   tee = gst_element_factory_make("tee", "tee");
   fakesink = gst_element_factory_make("fakesink", "fakesink");
   csp2 = gst_element_factory_make("ffmpegcolorspace", "csp2");
   queue = gst_element_factory_make("queue", "queue");


   gst_bin_add(GST_BIN(pipeline), src);
   gst_bin_add(GST_BIN(pipeline), csp);
   gst_bin_add(GST_BIN(pipeline), tee);
   gst_bin_add(GST_BIN(pipeline), csp2);
   gst_bin_add(GST_BIN(pipeline), sink);
   gst_bin_add(GST_BIN(pipeline), queue);
   gst_bin_add(GST_BIN(pipeline), fakesink);


   filter = gst_caps_new_simple("video/x-raw-yuv",
                        "width", G_TYPE_INT, 320,
                        "height",  G_TYPE_INT, 240,
                        "framerate", GST_TYPE_FRACTION, 11, 1,
                        NULL);


   link_ok = gst_element_link_filtered(src, tee, filter);
   if (!link_ok)
        g_warning("Failed to link elements\n");
   gst_element_link(tee, csp);
   gst_element_link(csp, sink);
   gst_element_link(tee, queue);
   gst_element_link(queue, csp2);
   gst_element_link(csp2, fakesink);

/* now connect the video source to the desired widget */
   g_signal_connect(screen, "expose-event", G_CALLBACK(expose), sink);


/* set current pipeline state to PLAY */
   gst_element_set_state(pipeline, GST_STATE_PLAYING);


   gtk_widget_show(window);

/* entering main loop */
    gtk_main ();

/* stop the pipeline */
   gst_element_set_state(pipeline, GST_STATE_NULL);
/* frees the pipeline */
   gst_object_unref(pipeline);

    return 0;
}


static gboolean expose
        ( GtkWidget * widget, GdkEventExpose * event, gpointer data )
{

        gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(data),
                                     GDK_WINDOW_XWINDOW(widget->window));
        return FALSE;
}


----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]