<div dir="ltr">Hi, gstreamer-devel:<br><br>&nbsp;&nbsp;&nbsp; Oh, I think you can use a buffer/data probe to achieve this. Modify the buffer, add a rectangle on every frame. Or, modify the xvimagesink.&nbsp; :)<br><br>Eric Zhang<br><br><div class="gmail_quote">
2008/8/26 Bruno <span dir="ltr">&lt;<a href="mailto:botte.pub@gmail.com">botte.pub@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<span class="gmail_quote"></span>Yep that is what I was doing before. Do you think I can draw rectangles over the cam image when using xvimagesink ?<br><br><br><div><span class="gmail_quote">2008/8/26, Eric Zhang &lt;<a href="mailto:nicolas.m.zhang@gmail.com" target="_blank">nicolas.m.zhang@gmail.com</a>&gt;:</span><div>
<div></div><div class="Wj3C7c"><div>
<span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi, gstreamer-devel:<br> <br>&nbsp;&nbsp;&nbsp;&nbsp;If you only want to `ximagesink&#39; or `xvimagesink&#39; draws images in<br> your GtkDrawingArea, there is a very simple way to achieve this:<br> <br>&nbsp;&nbsp;&nbsp;&nbsp;Just connect the `expose-event&#39; signal of GtkDrawingArea and pass<br>


 the window ID to the sink element:<br> <br> // Drawing on our drawing area<br> g_signal_connect(G_OBJECT(area), &quot;expose-event&quot;, G_CALLBACK(expose_cb),<br> NULL);<br> <br> /* Callback to be called when the drawing area is exposed */<br>


 <br>static gboolean expose_cb(GtkWidget * widget, GdkEventExpose * event,<br> gpointer data)<br> {<br> <br>&nbsp;&nbsp;&nbsp;&nbsp;// `play-videosink&#39; is your video sink element<br>&nbsp;&nbsp;&nbsp;&nbsp;gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(play-&gt;videosink),<br>


 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GDK_WINDOW_XWINDOW(widget-&gt;window));<br>&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br> }<br> <br> <br>&nbsp;&nbsp;&nbsp;&nbsp;That&#39;s it. If you want to draw the image yourself while not using<br> `xvimagesink&#39; or `ximagesink&#39;, then I think this is a Gtk+ problem, not<br>


 a gstreamer issue.<br> <br><br> Eric Zhang<br> <br><br> <br> <br> Bruno wrote:<br> &gt; Hello all,<br> &gt;<br> &gt; I still have some questions about gstreamer.<br> &gt;<br> &gt; Actually I&#39;d like to change the way my program work, in order to<br>


 &gt; display a frame from the camera only once the image processing has<br> &gt; been done, and with a rectangle over the face of the person.<br> &gt;<br> &gt; So I changed my pipeline (removed the screen_sink element), and I&#39;d<br>


 &gt; like to send a buffer from my image processing function to the gtk<br> &gt; drawing area where the camera image was displayed before. I tried to<br> &gt; do it with gtk drawing area (and with gtk image too with no sucess),<br>


 &gt; but I can&#39;t find the way to change the image contained in the drawing<br> &gt; area.<br> &gt;<br> &gt; Here is my code :<br> &gt;<br> &gt;<br> &gt;<br> &gt; ///// IMAGE PROCESSING CALLBACK<br> &gt;<br> &gt; /* Callback to be called when data goes through the pad */<br>


 &gt; static gboolean process_frame(GstElement *video_sink,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GstBuffer *buffer, GstPad *pad, AppData *appdata)<br> &gt; {<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x, y;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // getting the pointer to camera buffer<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char *data_photo = (unsigned char *)<br> &gt; GST_BUFFER_DATA(buffer);<br> &gt;<br> &gt;<br> &gt; // REMOVED PART WHERE THE COORDINATES OF THE POSITION OF THE FACE IS<br> &gt; CALCULATED //<br> &gt;<br>


 &gt;<br> &gt; // THIS PART IS WHAT I TRIED, BUT I HAVE A SEGMENTATION FAULT WHEN<br> &gt; CREATING PIXBUF //<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GdkPixbuf *newscreen;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //newscreen = gdk_pixbuf_new_from_data(data_photo,<br>

 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //GDK_COLORSPACE_RGB, /* RGB-colorspace */<br>
 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //FALSE, /* No alpha-channel */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8, /* Bits per RGB-component */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IMAGE_WIDTH, IMAGE_HEIGHT, /* Dimensions */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //3*IMAGE_WIDTH, /* Number of bytes between lines<br>


 &gt; (ie stride) */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //NULL, NULL); /* Callbacks */<br> &gt;<br> &gt;<br> &gt; gdk_draw_pixmap(GDK_DRAWABLE(appdata-&gt;screen),<br> &gt; appdata-&gt;screen-&gt;style-&gt;black_gc, GDK_DRAWABLE(newscreen), 0, 0, 0, 0,<br>


 &gt; -1, -1);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;<br> &gt; }<br> &gt;<br> &gt;<br> &gt;<br> &gt;<br> &gt;<br> &gt; /////// PIPELINE<br> &gt;<br> &gt;<br> &gt; /* Initialize the the Gstreamer pipeline. Below is a diagram<br>


 &gt;&nbsp;&nbsp;* of the pipeline that will be created:<br> &gt;&nbsp;&nbsp;*<br> &gt;&nbsp;&nbsp;* |Camera|&nbsp;&nbsp;|CSP&nbsp;&nbsp; |&nbsp;&nbsp;|Screen|&nbsp;&nbsp;|Screen|&nbsp;&nbsp; |Image&nbsp;&nbsp;&nbsp;&nbsp; |<br> &gt;&nbsp;&nbsp;* |src&nbsp;&nbsp; |-&gt;|Filter|-&gt;|queue |-&gt;|sink&nbsp;&nbsp;|-&gt; |processing|-&gt;&nbsp;&nbsp;Display<br>

 &gt;&nbsp;&nbsp;*/<br>
 &gt; static gboolean initialize_pipeline(AppData *appdata,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *argc, char ***argv)<br> &gt; {<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; GstElement *pipeline, *camera_src, *screen_sink;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; GstElement *screen_queue;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; GstElement *csp_filter;<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; GstCaps *caps;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; GstBus *bus;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; GstPad *sinkpad;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Initialize Gstreamer */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gst_init(argc, argv);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Create pipeline and attach a callback to it&#39;s<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* message bus */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; pipeline = gst_pipeline_new(&quot;test-camera&quot;);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gst_bus_add_watch(bus, (GstBusFunc)bus_callback, appdata);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; gst_object_unref(GST_OBJECT(bus));<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Save pipeline to the AppData structure */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata-&gt;pipeline = pipeline;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Create elements */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Camera video stream comes from a Video4Linux driver */<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; camera_src = gst_element_factory_make(VIDEO_SRC, &quot;camera_src&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Colorspace filter is needed to make sure that sinks understands<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* the stream coming from the camera */<br>

 &gt;&nbsp;&nbsp;&nbsp;&nbsp; csp_filter = gst_element_factory_make(&quot;ffmpegcolorspace&quot;,<br>
 &gt; &quot;csp_filter&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Queue creates new thread for the stream */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; screen_queue = gst_element_factory_make(&quot;queue&quot;, &quot;screen_queue&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Sink that shows the image on screen. Xephyr doesn&#39;t support XVideo<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* extension, so it needs to use ximagesink, but the device uses<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* xvimagesink */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; //screen_sink = gst_element_factory_make(VIDEO_SINK, &quot;screen_sink&quot;);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; sinkpad = gst_element_get_static_pad(screen_queue,&quot;sink&quot;);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; gst_pad_add_buffer_probe(sinkpad,G_CALLBACK(process_frame), appdata);<br> &gt;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Check that elements are correctly initialized */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; if(!(pipeline &amp;&amp; camera_src /*&amp;&amp; screen_sink*/ &amp;&amp; csp_filter &amp;&amp;<br>


 &gt; screen_queue))<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; {<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_critical(&quot;Couldn&#39;t create pipeline elements&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; }<br> &gt;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Add elements to the pipeline. This has to be done prior to<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* linking them */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gst_bin_add_many(GST_BIN(pipeline), camera_src, csp_filter,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; screen_queue, /*screen_sink,*/ NULL);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Specify what kind of video is wanted from the camera */<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; caps = gst_caps_new_simple(&quot;video/x-raw-rgb&quot;,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;width&quot;, G_TYPE_INT, IMAGE_WIDTH,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;height&quot;, G_TYPE_INT, IMAGE_HEIGHT,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;framerate&quot;, GST_TYPE_FRACTION, FRAMERATE, 1,<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL);<br> &gt;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Link the camera source and colorspace filter using capabilities<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* specified */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; if(!gst_element_link_filtered(camera_src, csp_filter, caps))<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; {<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; }<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gst_caps_unref(caps);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Connect Colorspace Filter -&gt; Screen Queue -&gt; Screen Sink<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* This finalizes the initialization of the screen-part of the<br>


 &gt; pipeline */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; if(!gst_element_link_many(csp_filter, screen_queue, /*screen_sink,<br> &gt; */NULL))<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; {<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; }<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gst_element_set_state(pipeline, GST_STATE_PAUSED);<br>


 &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;<br> &gt; }<br> &gt;<br> &gt;<br> &gt;<br> &gt;<br> &gt;<br> &gt;<br> &gt;<br> &gt; /////// MAIN FUNCTION<br> &gt;<br> &gt;<br> &gt; int main(int argc, char **argv)<br> &gt; {<br> &gt; // variables for face detection<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; // main structure for vjdetect<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; pdata = (mainstruct*) calloc(1, sizeof(mainstruct));<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; // Allocate memory for array of face detections returned by<br> &gt; facedetector (VjDetect).<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; pdata-&gt;pFaceDetections = (FLY_Rect<br> &gt; *)calloc(MAX_NUMBER_OF_FACE_DETECTIONS, sizeof(FLY_Rect));<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; init(pdata);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; AppData appdata;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.expression = 0;<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; GtkWidget *hbox, *vbox_button, *vbox, *button1, *button2;<br> &gt;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Initialize and create the GUI */<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; example_gui_initialize(<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;appdata.program, &amp;appdata.window,<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;argc, &amp;argv, &quot;Expression Detector&quot;);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; vbox = gtk_vbox_new(FALSE, 0);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; hbox = gtk_hbox_new(FALSE, 0);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; vbox_button = gtk_vbox_new(FALSE, 0);<br>


 &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_box_pack_start(GTK_BOX(hbox), vbox_button, FALSE, FALSE, 0);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.screen = gtk_drawing_area_new();<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.screen, 500, 380);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_box_pack_start(GTK_BOX(vbox), appdata.screen, FALSE, FALSE, 0);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; button1 = gtk_toggle_button_new_with_label(&quot;Run/Stop&quot;);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(button1, 170, 75);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_box_pack_start(GTK_BOX(vbox_button), button1, FALSE, FALSE, 0);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; button2 = gtk_toggle_button_new_with_label(&quot;Expressions ON/OFF&quot;);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(button2, 170, 75);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_box_pack_start(GTK_BOX(vbox_button), button2, FALSE, FALSE, 0);<br> &gt;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.anger = gtk_image_new_from_file(&quot;./smileys/anger.jpg&quot;);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.anger, 160, 180);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.disgust = gtk_image_new_from_file(&quot;./smileys/disgust.jpg&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.disgust, 160, 180);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.fear = gtk_image_new_from_file(&quot;./smileys/fear.jpg&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.fear, 160, 180);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.happy = gtk_image_new_from_file(&quot;./smileys/happy.jpg&quot;);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.happy, 160, 180);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.neutral = gtk_image_new_from_file(&quot;./smileys/neutral.jpg&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.neutral, 160, 180);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.sad = gtk_image_new_from_file(&quot;./smileys/sad.jpg&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.sad, 160, 180);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.surprise = gtk_image_new_from_file(&quot;./smileys/surprise.jpg&quot;);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.surprise, 160, 180);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.unknown = gtk_image_new_from_file(&quot;./smileys/unknown.jpg&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.unknown, 160, 180);<br>


 &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; appdata.smiley = gtk_image_new_from_file(&quot;./smileys/unknown.jpg&quot;);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_widget_set_size_request(appdata.smiley, 160, 180);<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_box_pack_start(GTK_BOX(vbox_button), appdata.smiley, FALSE,<br>


 &gt; FALSE, 0);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; g_signal_connect(G_OBJECT(button1), &quot;clicked&quot;,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G_CALLBACK(button1_pressed), &amp;appdata);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; g_signal_connect(G_OBJECT(button2), &quot;clicked&quot;,<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G_CALLBACK(button2_pressed), &amp;appdata);<br> &gt;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; gtk_container_add(GTK_CONTAINER(appdata.window), hbox);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Initialize the GTK pipeline */<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; if(!initialize_pipeline(&amp;appdata, &amp;argc, &amp;argv))<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; {<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hildon_banner_show_information(<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GTK_WIDGET(appdata.window),<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;gtk-dialog-error&quot;,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Failed to initialize pipeline&quot;);<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; }<br> &gt;<br> &gt;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; g_signal_connect(G_OBJECT(appdata.window), &quot;destroy&quot;,<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; G_CALLBACK(destroy_pipeline), &amp;appdata);<br> &gt;<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Begin the main application */<br>


 &gt;&nbsp;&nbsp;&nbsp;&nbsp; example_gui_run(appdata.program, appdata.window);<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; /* Free the gstreamer resources. Elements added<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* to the pipeline will be freed automatically */<br> &gt;<br> &gt;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>


 &gt; }<br> &gt;<br> &gt;<br> &gt; What I&#39;d like to do is to modify the data_photo buffer to draw a<br> &gt; rectangle in it (in the process_frame function), and draw the content<br> &gt; in the appdata.screen GtkWidget. (by the way screen is declared as a<br>


 &gt; GtkWidget * in the appdata structure).<br> &gt;<br> &gt; Thanks in advance for your help !<br> &gt; Bruno<br> &gt;<br> <br>&gt; ------------------------------------------------------------------------<br> <br>&gt;<br>


 &gt; -------------------------------------------------------------------------<br> &gt; This SF.Net email is sponsored by the Moblin Your Move Developer&#39;s challenge<br> &gt; Build the coolest Linux based applications with Moblin SDK &amp; win great prizes<br>


 &gt; Grand prize is a trip for two to an Open Source event anywhere in the world<br> &gt; <a href="http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/" target="_blank">http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/</a><br>


 &gt; ------------------------------------------------------------------------<br> &gt;<br> &gt; _______________________________________________<br> &gt; gstreamer-devel mailing list<br> &gt; <a href="mailto:gstreamer-devel@lists.sourceforge.net" target="_blank">gstreamer-devel@lists.sourceforge.net</a><br>


 &gt; <a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br> &gt;<br>
 <br> <br> -------------------------------------------------------------------------<br>
 This SF.Net email is sponsored by the Moblin Your Move Developer&#39;s challenge<br> Build the coolest Linux based applications with Moblin SDK &amp; win great prizes<br> Grand prize is a trip for two to an Open Source event anywhere in the world<br>


 <a href="http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/" target="_blank">http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/</a><br> _______________________________________________<br>
 gstreamer-devel mailing list<br>
 <a href="mailto:gstreamer-devel@lists.sourceforge.net" target="_blank">gstreamer-devel@lists.sourceforge.net</a><br> <a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>


 </blockquote></span></div></div></div></div><br>
<br>-------------------------------------------------------------------------<br>
This SF.Net email is sponsored by the Moblin Your Move Developer&#39;s challenge<br>
Build the coolest Linux based applications with Moblin SDK &amp; win great prizes<br>
Grand prize is a trip for two to an Open Source event anywhere in the world<br>
<a href="http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/" target="_blank">http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/</a><br>_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.sourceforge.net">gstreamer-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>
<br></blockquote></div><br></div>