<span class="gmail_quote"></span>Ok thanks a lot Eric, I didn&#39;t know the buffer can be modified on the fly this way.<br><br>But what I don&#39;t really understand is how exactly the pipeline works. If I do that way, will the pipeline take one frame from the camera, call the buffer probe related function, doing the image processing calculation, modify the buffer, then send it to the screen ? Because that processing takes a long time, and lot of frame are coming from the cam during the calculation. I&#39;d like them to be dropped, then when the calculation from the first frame is finished, the image processing callback has to take the next coming frame. (or the one just before, but not the second one).<br>

<br>Actually it seems that all frame are showed, like it does the calculation for the first, then keep the next coming in memory, and when the first is processed, it comes to the second. (or at least it seems like this when I start the prog). Maybe it&#39;s due to the &quot;queue&quot; element ? (I took this from the maemo-camera example, and I don&#39;t get what the queue element is for)<br>

<br>Thanks again for explanations !<br><br>Kind regards,<br>Bruno<br><br><br><div><span class="gmail_quote">2008/8/27, Eric Zhang &lt;<a href="mailto:nicolas.m.zhang@gmail.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">nicolas.m.zhang@gmail.com</a>&gt;:</span><div>
<span class="e" id="q_11c0370c7fdf35c7_1"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div dir="ltr">Hi, gstreamer-devel:<br><br>&nbsp;&nbsp;&nbsp; Hello, Bruno, actually I have not many experiences on this topic and I was just going to give you some clews. OK, AFAIK, you can add a buffer probe before the xvimagesink and check out the GstBuffer which is going to flow into it and add your rectangle on this GstBuffer, that&#39;s it. You don&#39;t need to draw the buffer yourself because xvimagesink will do it for you(just give your drawing area&#39;s window id to it, which you have achieved before).<br>


<br>&nbsp;&nbsp;&nbsp; You can refer to Chapter 18 of gstreamer application develop manual, there is an example which inverts the image by adding&nbsp; a buffer probe and modify the buffer on the fly. Maybe this can help you a little.<div><span><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" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">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;">
Could you be a little more precise please ?<br>How do I modify the buffer ? How do I draw it on the screen after ? should I still declare my screen widget from appdata struct as a drawing area ?<br><br>Thanks for help<div>


<div></div><div><br><br>
<div><span class="gmail_quote">2008/8/26, Eric Zhang &lt;<a href="mailto:nicolas.m.zhang@gmail.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">nicolas.m.zhang@gmail.com</a>&gt;:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">



<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" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">botte.pub@gmail.com</a>&gt;</span><div><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" onclick="return top.js.OpenExtLink(window,event,this)">nicolas.m.zhang@gmail.com</a>&gt;:</span><div>




<div></div><div><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" onclick="return top.js.OpenExtLink(window,event,this)">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" onclick="return top.js.OpenExtLink(window,event,this)">gstreamer-devel@lists.sourceforge.net</a><br>






 &gt; <a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">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" onclick="return top.js.OpenExtLink(window,event,this)">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" onclick="return top.js.OpenExtLink(window,event,this)">gstreamer-devel@lists.sourceforge.net</a><br> <a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">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" onclick="return top.js.OpenExtLink(window,event,this)">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" onclick="return top.js.OpenExtLink(window,event,this)">gstreamer-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>
<br></blockquote></span></div></div><br></div>
<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" onclick="return top.js.OpenExtLink(window,event,this)">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" onclick="return top.js.OpenExtLink(window,event,this)">gstreamer-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>
<br></blockquote></div><br>
</div></div><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" onclick="return top.js.OpenExtLink(window,event,this)">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" onclick="return top.js.OpenExtLink(window,event,this)">gstreamer-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>
<br></blockquote></div><br></span></div></div>
<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" onclick="return top.js.OpenExtLink(window,event,this)">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" onclick="return top.js.OpenExtLink(window,event,this)">gstreamer-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>
<br></blockquote></span></div></div><br>