<div dir="ltr">Hi,<div><br></div><div>You could try to isolate parts of your pipeline.</div><div><br></div><div>What CPU usage gives you:</div><div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br></span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">gst-launch videotestsrc</span><span style="font-size:12.7272720336914px;font-family:arial,sans-serif"> ! fakesink sync=1 </span><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">gst-launch videotestsrc </span><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">! imagefreeze ! fakesink sync=1</span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">gst-launch videotestsrc </span><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">! imagefreeze ! glimagesink</span><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br></span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">gst-launch gltestsrc</span><span style="font-size:12.7272720336914px;font-family:arial,sans-serif"> ! glimagesink</span><span style="font-size:12.7272720336914px;font-family:arial,sans-serif"><br></span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">...</span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif"><br></span></div><div><font face="arial, sans-serif">with rgb and for different resolutions ? Try with pattern black as well.</font></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif"><br></span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">Do you have perf available ? Usually from linux-tools package.</span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif"><br></span></div><div><span style="font-size:12.7272720336914px;font-family:arial,sans-serif">Even if the image is frozen, imagefreeze still does a memcpy for each frame as you can see here </span><font face="arial, sans-serif"><a href="http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/imagefreeze/gstimagefreeze.c#n709">http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/gst/imagefreeze/gstimagefreeze.c#n709</a> . Which can be expensive at 30 FPS with full HD resolution.</font></div><div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br></span></div><div><font face="arial, sans-serif">There is way to avoid this copy, if imagefreeze would negotiate the downstream buffer pool. Then it could do the copy only the first time the buffer is pushed. Assuming that downstream elements do not modify the buffers ...</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Cheers</font></div><div><font face="arial, sans-serif">Julien</font></div><div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 7 October 2014 14:23, Jean-Michel Hautbois <span dir="ltr"><<a href="mailto:jhautbois@gmail.com" target="_blank">jhautbois@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi there,<br>
<br>
I am using openGL elements from gstreamer in particular glimagesink<br>
and I also tried glvideomixer.<br>
<br>
Here is a simple pipeline example :<br>
export GST_GL_PLATFORM=egl<br>
export GST_GL_API=gles2<br>
export DISPLAY=:0<br>
gst-launch-1.0 -vvv videotestsrc !<br>
'video/x-raw,width=640,height=480,format=RGBA' ! imagefreeze !<br>
glvideomixer ! 'video/x-raw,framerate=(fraction)30/1,width=1920,height=1080'<br>
! glimagesink<br>
<br>
This works but the CPU usage is very high, and I did some profiling in<br>
order to understand how it works.<br>
<br>
Here is the result (CPU consumption is ~75% in top).<br>
<br>
First, the global picture :<br>
:~# opreport<br>
Using /var/lib/oprofile/samples/ for samples directory.<br>
CPU: CPU with timer interrupt, speed 996000 MHz (estimated)<br>
Profiling through timer interrupt<br>
          TIMER:0|<br>
  samples|      %|<br>
------------------<br>
     4672 73.0000 vmlinux<br>
      932 14.5625 <a href="http://libc-2.20.so" target="_blank">libc-2.20.so</a><br>
      375  5.8594 libGAL.so<br>
      139  2.1719 libglib-2.0.so.0.4000.0<br>
      116  1.8125 libpython2.7.so.1.0<br>
       29  0.4531 libgstreamer-1.0.so.0.401.0<br>
       21  0.3281 <a href="http://libpthread-2.20.so" target="_blank">libpthread-2.20.so</a><br>
       15  0.2344 libGLESv2.so.2.0.0<br>
       15  0.2344 libX11.so.6.3.0<br>
       13  0.2031 Xorg<br>
<br>
Then, the kernel (Freescale 3.10.17) :<br>
:~# opreport -l /boot/vmlinux<br>
Using /var/lib/oprofile/samples/ for samples directory.<br>
CPU: CPU with timer interrupt, speed 996000 MHz (estimated)<br>
Profiling through timer interrupt<br>
samples  %        symbol name<br>
1596     34.1610  _HandleOuterCache<br>
844      18.0651  v7_dma_flush_range<br>
737      15.7748  cpuidle_enter_state<br>
161       3.4461  get_page_from_freelist<br>
139       2.9752  __memzero<br>
120       2.5685  free_hot_cold_page<br>
<br>
For the libc I don't have symbols, but using nm I can tell this is memcpy()<br>
<br>
~# opreport -l /usr/lib/libGAL.so<br>
Using /var/lib/oprofile/samples/ for samples directory.<br>
CPU: CPU with timer interrupt, speed 996000 MHz (estimated)<br>
Profiling through timer interrupt<br>
samples  %        symbol name<br>
293      80.2740  gcoHARDWARE_UploadTexture<br>
6         1.6438  gcoSURF_QueryFormat<br>
3         0.8219  _AllocateSurface<br>
3         0.8219  gcoHARDWARE_GetPatchID<br>
<br>
This seems ok, but if the pipeline is a little bit more complex, the<br>
problems start.<br>
Let's add a freezed image in the background, and this is not usuable.<br>
<br>
gst-launch-1.0 -vv \<br>
videotestsrc pattern=19 is-live=true !<br>
'video/x-raw,width=1920,height=1080,format=RGBA' ! imagefreeze ! mix.<br>
\<br>
glvideomixer name=mix ! glimagesink \<br>
videotestsrc is-live=true !<br>
'video/x-raw,width=320,height=240,format=RGBA' ! imagefreeze ! mix.<br>
<br>
CPU is ~91%<br>
But now there are some messages like :<br>
gst_base_sink_is_too_late ():<br>
/GstPipeline:pipeline0/GstGLImageSink:glimagesink0:There may be a<br>
timestamping problem, or this computer is too slow.<br>
<br>
Here is what the profiler tells :<br>
~# opreport<br>
Using /var/lib/oprofile/samples/ for samples directory.<br>
CPU: CPU with timer interrupt, speed 996000 MHz (estimated)<br>
Profiling through timer interrupt<br>
          TIMER:0|<br>
  samples|      %|<br>
------------------<br>
     1338 49.0829 vmlinux<br>
     1229 45.0844 <a href="http://libc-2.20.so" target="_blank">libc-2.20.so</a><br>
       83  3.0448 libglib-2.0.so.0.4000.0<br>
       34  1.2472 libpython2.7.so.1.0<br>
       10  0.3668 libGAL.so<br>
<br>
And this would mean that uploading of texture is not the issue now...<br>
<br>
These are static images, but in a real case, it could be a webcam, or<br>
something else like a decoded video, how could these elements be more<br>
efficient ? Maybe is it a pipeline problem, I may have forgotten some<br>
things ?<br>
<br>
Thanks in advance,<br>
JM<br>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
</blockquote></div><br></div>