<html><head></head><body><div style="color:#000; background-color:#fff; font-family:Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:13px"><div id="yui_3_16_0_ym19_1_1505226458817_2812"><span>Hello, <br></span></div>As promised, I followed the Nicolas's suggestion and now it's working fine.<div id="yui_3_16_0_ym19_1_1505226458817_3629" dir="ltr">Regards.<br></div><br><div id="yui_3_16_0_ym19_1_1505226458817_3134"><br></div><div id="yui_3_16_0_ym19_1_1505226458817_3133"> <br></div><div class="qtdSeparateBR"><br><br></div><div style="display: block;" class="yahoo_quoted"> <div style="font-family: Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 13px;"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;"> <div dir="ltr"><font face="Arial" size="2"> El Sábado 9 de septiembre de 2017 16:25, "simon.zz@yahoo.com" <simon.zz@yahoo.com> escribió:<br></font></div>  <br><br> <div class="y_msg_container"><div dir="ltr">Hello Martín,<br></div><div dir="ltr">Thank you for tour hint. I will keep in mind that.<br></div><div dir="ltr"><br></div><div dir="ltr">At the moment, since I want to write the content of the map.data to a pipe, I tested the fdsink and the filesink instead of the appsink since they write data without the need to do it manually.<br></div><div dir="ltr"><br></div><div dir="ltr">The fdsink give me problems.. It actually overload the program and the video is not written any more after the first chunk of data.<br></div><div dir="ltr">filesink works far better.<br></div><div dir="ltr">The only problem I see with using filesink with a pipe, is that if the reader closes the stream, gstreamer stops/crashes.<br></div><div dir="ltr"><br></div><div dir="ltr">However I don't discard to use the appsink again after your hints. I will test it and report the results.<br></div><div dir="ltr"><br></div><div dir="ltr">Regards,<br></div><div dir="ltr">Simon<br></div><div dir="ltr"><br></div><div dir="ltr"><br></div><div dir="ltr">--------------------------------------<br></div><div dir="ltr">El vie, 8/9/17, Nicolas Dufresne <<a ymailto="mailto:nicolas@ndufresne.ca" href="mailto:nicolas@ndufresne.ca">nicolas@ndufresne.ca</a>> escribió:<br></div><div dir="ltr"><br></div><div dir="ltr"> Asunto: Re: Speeding up a queue<br></div><div dir="ltr"> Para: "Discussion of the development of and with GStreamer" <<a ymailto="mailto:gstreamer-devel@lists.freedesktop.org" href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a>>, "simo zz" <<a ymailto="mailto:simon.zz@yahoo.com" href="mailto:simon.zz@yahoo.com">simon.zz@yahoo.com</a>><br></div><div dir="ltr"> Fecha: viernes, 8 de septiembre, 2017 19:21<br></div><div dir="ltr"> <br></div><div dir="ltr"> Le vendredi 08 septembre 2017 à<br></div><div dir="ltr"> 09:11 +0000, Martin Vachovski a écrit :<br></div><div dir="ltr"> > Hi Simon,<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > Three suggestions in the order of<br></div><div dir="ltr"> relevance:<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > 1) I<br></div><div dir="ltr"> think there is no need to explicitly call <br></div><div dir="ltr"> > gst_buffer_ref(buffer)-- the<br></div><div dir="ltr"> gst_sample_get_buffer should do it<br></div><div dir="ltr"> ><br></div><div dir="ltr"> internally<br></div><div dir="ltr"> <br></div><div dir="ltr"> No it<br></div><div dir="ltr"> "transfer none".<br></div><div dir="ltr"> <br></div><div dir="ltr"> > <br></div><div dir="ltr"> > 2) Are you sure that<br></div><div dir="ltr"> the performance is the issue here?<br></div><div dir="ltr"> > Try<br></div><div dir="ltr"> changing the condition whether you access the data<br></div><div dir="ltr"> > and see when it stops working, like:<br></div><div dir="ltr"> > if(!(buffCntr % 20)) // every 20th<br></div><div dir="ltr"> > then <br></div><div dir="ltr"> > if(!(buffCntr %<br></div><div dir="ltr"> 15)) // every 15th<br></div><div dir="ltr"> > and see if for<br></div><div dir="ltr"> sufficiently small denominator it stops working<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > 3) Also, try calling<br></div><div dir="ltr"> the "unref" methods in the opposite order as<br></div><div dir="ltr"> the<br></div><div dir="ltr"> > "get/ref" methods: <br></div><div dir="ltr"> > You have <br></div><div dir="ltr"> ><br></div><div dir="ltr"> ref(sample)<br></div><div dir="ltr"> > ref(buffer)<br></div><div dir="ltr"> > But you release the sample first<br></div><div dir="ltr"> > unref(sample)<br></div><div dir="ltr"> ><br></div><div dir="ltr"> unref(buffer)<br></div><div dir="ltr"> > I think it should be:<br></div><div dir="ltr"> > unref(buffer)<br></div><div dir="ltr"> ><br></div><div dir="ltr"> unref(sample)<br></div><div dir="ltr"> <br></div><div dir="ltr"> This is<br></div><div dir="ltr"> usually not required with ref-counting in general. Since<br></div><div dir="ltr"> if<br></div><div dir="ltr"> there dependent object will have a ref on<br></div><div dir="ltr"> the other, which guaranty the<br></div><div dir="ltr"> free order for<br></div><div dir="ltr"> you.<br></div><div dir="ltr"> <br></div><div dir="ltr"> > <br></div><div dir="ltr"> ><br></div><div dir="ltr"> Hope that helps<br></div><div dir="ltr"> > Martin<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > From:<br></div><div dir="ltr"> gstreamer-devel <<a ymailto="mailto:gstreamer-devel-bounces@lists.freedesktop.org" href="mailto:gstreamer-devel-bounces@lists.freedesktop.org">gstreamer-devel-bounces@lists.freedesktop.org</a>><br></div><div dir="ltr"> > on behalf of simo zz <<a ymailto="mailto:simon.zz@yahoo.com" href="mailto:simon.zz@yahoo.com">simon.zz@yahoo.com</a>><br></div><div dir="ltr"> > Sent: Thursday, September 7, 2017 5:00<br></div><div dir="ltr"> PM<br></div><div dir="ltr"> > To: Discussion of the Development of<br></div><div dir="ltr"> and With GStreamer<br></div><div dir="ltr"> > Subject: Speeding up<br></div><div dir="ltr"> a queue<br></div><div dir="ltr"> >  <br></div><div dir="ltr"> > Hello,<br></div><div dir="ltr"> <br></div><div dir="ltr"> > I need to record a video from the USB<br></div><div dir="ltr"> camera and process the raw-data <br></div><div dir="ltr"> > at the<br></div><div dir="ltr"> same time, so I successfully implemented this pipeline in<br></div><div dir="ltr"> C:<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > v4l2src<br></div><div dir="ltr"> device=/dev/webcam ! videoconvert ! video/x-<br></div><div dir="ltr"> > raw,width=544,height=288,framerate=10/1 !<br></div><div dir="ltr"> tee name=t ! queue<br></div><div dir="ltr"> > ! v4l2h264enc !<br></div><div dir="ltr"> h264parse ! mp4mux ! filesink location=video.mp4 t. !<br></div><div dir="ltr"> > queue ! appsink<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > I can access to raw-data from USB camera<br></div><div dir="ltr"> is read using the "new-<br></div><div dir="ltr"> ><br></div><div dir="ltr"> sample" signal of appsink in a function called<br></div><div dir="ltr"> "dataProbe", code as<br></div><div dir="ltr"> ><br></div><div dir="ltr"> follows:<br></div><div dir="ltr"> > <br></div><div dir="ltr"> ><br></div><div dir="ltr"> GstFlowReturn dataProbe(GstElement *source)<br></div><div dir="ltr"> > {  <br></div><div dir="ltr"> >     //<br></div><div dir="ltr"> buffCntr is just a counter to choose when I want to<br></div><div dir="ltr"> process<br></div><div dir="ltr"> > the raw-data<br></div><div dir="ltr"> >     if (!(buffCntr % 10))<br></div><div dir="ltr"> >     {   <br></div><div dir="ltr"> >     <br></div><div dir="ltr">    GstMapInfo map;<br></div><div dir="ltr"> >        <br></div><div dir="ltr"> GstSample *sample =<br></div><div dir="ltr"> ><br></div><div dir="ltr"> gst_app_sink_pull_sample(GST_APP_SINK(source));<br></div><div dir="ltr"> >         GstBuffer *buffer =<br></div><div dir="ltr"> gst_sample_get_buffer(sample);<br></div><div dir="ltr"> >     <br></div><div dir="ltr">    gst_buffer_ref(buffer);<br></div><div dir="ltr"> >        <br></div><div dir="ltr"> gst_buffer_map (buffer, &map, GST_MAP_READ);<br></div><div dir="ltr"> >         g_print("Map size:<br></div><div dir="ltr"> %d\n", map.size);<br></div><div dir="ltr"> > <br></div><div dir="ltr"> >         /*int8_t fd =<br></div><div dir="ltr"> open("/path/to/someFile", O_CREAT | O_WRONLY);<br></div><div dir="ltr"> >         if (fd != -1)<br></div><div dir="ltr"> >         {<br></div><div dir="ltr"> >     <br></div><div dir="ltr">        if(write(fd, map.data, map.size) == map.size)<br></div><div dir="ltr"> >                <br></div><div dir="ltr"> g_print("Written whole data\n");<br></div><div dir="ltr"> >             else<br></div><div dir="ltr"> >                <br></div><div dir="ltr"> g_print("Cannot write whole data\n");<br></div><div dir="ltr"> >         }<br></div><div dir="ltr"> >     <br></div><div dir="ltr">    close(fd);*/<br></div><div dir="ltr"> >        <br></div><div dir="ltr"> gst_buffer_unmap(buffer, &map);<br></div><div dir="ltr"> > <br></div><div dir="ltr">        gst_sample_unref(sample);<br></div><div dir="ltr"> > <br></div><div dir="ltr">        gst_buffer_unref(buffer);<br></div><div dir="ltr"> > <br></div><div dir="ltr"> >         //buffCntr = 0;<br></div><div dir="ltr"> >     }<br></div><div dir="ltr"> > }<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > But the execution of<br></div><div dir="ltr"> the function dataProbe is so critical that if I<br></div><div dir="ltr"> > set buffCntr to zero (as shown in the last<br></div><div dir="ltr"> commented instruction of<br></div><div dir="ltr"> > the function)<br></div><div dir="ltr"> even without writing map.data to some file, the whole<br></div><div dir="ltr"> > program hangs, so the mp4 video is not<br></div><div dir="ltr"> written anymore.. <br></div><div dir="ltr"> > But I need both<br></div><div dir="ltr"> raw-data and mp4 video.<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > What can I do to 'speed up' this<br></div><div dir="ltr"> queue and let my gstreamer program<br></div><div dir="ltr"> > to<br></div><div dir="ltr"> record the video and write the raw data somewhere ? Pthread<br></div><div dir="ltr"> ?<br></div><div dir="ltr"> > There is some helpful feature already<br></div><div dir="ltr"> available from gstreamer<br></div><div dir="ltr"> > library to<br></div><div dir="ltr"> handle this situation ?<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > The device which run the application is an<br></div><div dir="ltr"> embedded board with a quad<br></div><div dir="ltr"> > core CPU.<br></div><div dir="ltr"> > <br></div><div dir="ltr"> > Thank you in<br></div><div dir="ltr"> advance.<br></div><div dir="ltr"> > Regards,<br></div><div dir="ltr"> ><br></div><div dir="ltr"> Simon<br></div><div dir="ltr"> ><br></div><div dir="ltr"> _______________________________________________<br></div><div dir="ltr"> > gstreamer-devel mailing list<br></div><div dir="ltr"> > <a ymailto="mailto:gstreamer-devel@lists.freedesktop.org" href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br></div><div dir="ltr"> > <a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel_______________________________________________" target="_blank">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel_______________________________________________</a><br></div><div dir="ltr"> gstreamer-devel mailing list<br></div><div dir="ltr"> <a ymailto="mailto:gstreamer-devel@lists.freedesktop.org" href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br></div><div dir="ltr"> <a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br></div><div dir="ltr"> <br></div><div dir="ltr"> -----Adjunto en línea a continuación-----<br></div><div dir="ltr"> <br></div><div dir="ltr"> </div><br><br></div>  </div> </div>  </div></div></body></html>