[FFmpeg-devel] [WIP] XComposite window capture demuxer (Linux)
Emanuele Oriani
ema at fastwebnet.it
Mon May 18 10:45:49 EEST 2020
Hi Marton/ffmpeg devs/all,
Haven't seen any response to the proposed XComposite windows capture.
As per below the reasoning for adding this code to libav*/ffmpeg is that
seems to be better in quality than x11grab, although it uses more CPU in
its current implementation (uses OpenGL and PBO - optional - to fetch
XComposite windows).
Please let me know if it's still of interest and/or you have further
technical feedback.
I've posted some performance tests in the thread below.
Here links of two captures (one with x11grab, the other with xcompgrab)
and the sources:
https://send.firefox.com/download/df859689f4cc6429/#EN6w9upyIMHqO7n_1hMTaQ
https://github.com/Emanem/replayer/blob/master/src/xcompgrab.c
Thanks in advance for your time and feedback,
Emanuele
Ps. Apologies if I've missed reposes on this list
On 10/05/2020 19:01, Emanuele Oriani wrote:
> Hi Marton/all,
>
> I've re-uploaded the firefox send link (expired) with some sample
> capture at 60 FPS:
>
> https://send.firefox.com/download/51b45decae720c08/#r5o4J2SgCJZndRdMOxxRBg
>
> Please note I have integrated usage of OpenGL's Pixel Buffer Objects -
> now the memory management of the captured framed can be managed by the
> drivers and hopefully should be DMA and less memory hops.
> This new code works on both Nvidia and AMD.
>
> CPU usage is still higher than x11grab (similar levels as below).
>
> Let me know your thoughts.
>
> Thanks,
> Emanuele
>
> Ps. quick link to demuxer:
> https://github.com/Emanem/replayer/blob/master/src/xcompgrab.c
>
> On 08/05/2020 11:43, Emanuele Oriani wrote:
>> Hi Marton,
>>
>> Capturing at 60 FPS 1920x1080, the difference is even more noticeable:
>> x11grab is choppy, xcompgrab is smooth (this time I used H264
>> ultrafast to encode).
>>
>> https://send.firefox.com/download/17001ef60837a5ec/#FaQTa-dP4MB28YfPNMXxuw
>>
>>
>> CPU performance:
>>
>> real user sys
>> - xcompgrab: 10.32s, 18.2s, 0.38s
>> - x11grab: 10.20s, 11.6s, 0.22s
>>
>> Definitely much more CPU usage, but the output quality can't be compared.
>> Please note no frames were lost/skipped, everything was processed on
>> time for both tests.
>>
>> Thanks,
>> Emanuele
>>
>> On 08/05/2020 11:05, Emanuele Oriani wrote:
>>> Hi Marton,
>>>
>>> TL;DR
>>> xcompgrab uses more CPU but produces much better streams than x11grab.
>>>
>>> I have the following CPU usage performance report (on my i7-8700k,
>>> Nvidia 2080 Ti RTX, governor set to 'performance', on Ubuntu 18.04
>>> using Gnome shell).
>>> The capture has been a surface area of 1720x1376 for 10 seconds at
>>> 30 FPS, only getting the frames, not trying to encode them into a file:
>>>
>>> real user sys
>>> - xcompgrab: 10.13s, 2.06s, 0.085s
>>> - x11grab: 10.05s, 0.20s, 0.035s
>>>
>>> from a first outlook x11grab is much more CPU efficient, almost 90%
>>> less CPU usage, but upon starting to record the video, it feels like
>>> it's 'choppier' and loses frames.
>>>
>>> Below videos have been captured at 1920x1080, the encoder is exactly
>>> the same with same settings and the total CPU time is greater for
>>> xcompgrab (as expected).
>>>
>>> But if you look at both, the xcompgrab doesn't lose frames/is not
>>> choppier, instead x11grab seems to be much worse.
>>>
>>> I've uploaded both 10 secs segments at:
>>> https://send.firefox.com/download/0cbf01f9126519c7/#DPKzIfjemAFm263ZSdMOBw
>>>
>>>
>>> The code used to grab and encode is
>>> https://github.com/Emanem/replayer again very simple, one thread gets
>>> the packets/frames, the other picks the frames and encodes them.
>>>
>>> Performance of this run has been:
>>>
>>> real user sys
>>> - xcompgrab: 10.42s, 12.5s, 0.22s
>>> - x11grab: 10.21s, 8.90s, 0.31s
>>>
>>> As expected x11grab yields better CPU usage but the quality of output
>>> is somehow lacking.
>>>
>>> Let me know your thoughts.
>>>
>>> Thanks,
>>> Emanuele
>>>
>>> On 07/05/2020 19:52, Marton Balint wrote:
>>>>
>>>>
>>>> On Thu, 7 May 2020, Emanuele Oriani wrote:
>>>>
>>>>> Hi FFMPEG devel,
>>>>>
>>>>> I have been writing a simple XComposite window capture demuxer,
>>>>> heavily inspired from x11grab sources and OBS Window capture
>>>>> logic/code.
>>>>
>>>> Have you compared performance to x11grab for various resolutions and
>>>> frame rates? Do you have some numbers?
>>>>
>>>> Thanks,
>>>> Marton
>>>>
>>>>>
>>>>> I would like to give back to the community and share the sources;
>>>>> before I would formally submit for a review/patch, I would really
>>>>> appreciate if someone could have a high level pass at the code
>>>>> (it's relatively simple actually) and point out any major
>>>>> issues/problems/...
>>>>>
>>>>> The code is available as part of a simple test application on
>>>>> github, at:
>>>>>
>>>>> https://github.com/Emanem/replayer/blob/master/src/xcompgrab.c
>>>>>
>>>>> Being the author of the code I would be happy to re-license it to
>>>>> be used in ffmpeg/libav* mainline once I get the OK from you.
>>>>> In order to compile/execute this code, one needs the following dev
>>>>> packages:
>>>>>
>>>>> libav*-dev, libx11-dev, libxcomposite-dev, OpenGL headers/libs.
>>>>>
>>>>> Libraries to be linked are:
>>>>>
>>>>> -lavcodec -lavformat -lavdevice -lavutil -lswscale -lX11
>>>>> -lXcomposite -lGL
>>>>>
>>>>> I've tested it and it's working fine on both AMD and Nvidia hardware.
>>>>>
>>>>> Let me know if this is of interest, otherwise no worries and thanks
>>>>> again for the fantastic library/software.
>>>>>
>>>>> Emanuele
>>>>>
>>>>> _______________________________________________
>>>>> ffmpeg-devel mailing list
>>>>> ffmpeg-devel at ffmpeg.org
>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>>>
>>>>> To unsubscribe, visit link above, or email
>>>>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>>>> _______________________________________________
>>>> ffmpeg-devel mailing list
>>>> ffmpeg-devel at ffmpeg.org
>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>>
>>>> To unsubscribe, visit link above, or email
>>>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>> To unsubscribe, visit link above, or email
>>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list