Image overlay over a video stream

Wolfgang Grandegger wg at grandegger.com
Fri Nov 16 09:41:04 UTC 2018


Hello,

Am 15.11.2018 um 16:56 schrieb Nicolas Dufresne:
> Le jeudi 15 novembre 2018 à 09:46 +0100, Wolfgang Grandegger a écrit :
>> Hello,
>>
>> digging deeper about text, image and graphics overlay...
>>
>> Am 18.10.2018 um 17:55 schrieb Nicolas Dufresne:
>>> Le jeudi 18 octobre 2018 à 16:21 +0200, Wolfgang Grandegger a écrit :
>>>> Hello,
>>>>
>>>> I'm currently evaluating the following pipeline to receive, display
>>>> and
>>>> record a MJPEG video stream:
>>>>
>>>>   # nice -20 \
>>>>     gst-launch-1.0 -v \
>>>>     udpsrc port=50004 buffer-size=180000000 do-timestamp=1 \
>>>>       caps="application/x-rtp, media=(string)video, clock-
>>>> rate=(int)90000, \
>>>>       encoding-name=(string)JPEG, payload=(int)26,
>>>> framerate=(fraction)50/1" \
>>>>     ! rtpjitterbuffer latency=20 \
>>>>     ! rtpjpegdepay \
>>>>     ! vaapijpegdec \
>>>>     ! timeoverlay \
>>>>     ! tee name=t
>>>>     t. ! queue ! vaapisink
>>>>     t. ! queue ! vaapih264enc ! mp4mux ! filesink
>>>> location=/tmp/test.mp4
>>>>
>>>> The CPU usage of the various threads with and without the element
>>>> "timeoverlay" is listed below:
>>>>
>>>>     with timeoverlay ->  no     yes 
>>>>   TID  Thread Name      CPU %  CPU %
>>>>   ----------------------------------
>>>>   542  gst-launch-1.0    42.0   88.8 
>>>>   550  queue0:src         0.2    0.4
>>>>   549  vaapiencodeh264    5.3    5.5
>>>>   548  gmain              0.0    0.0
>>>>   547  udpsrc0:src        8.9    8.4
>>>>   546  rtpjitterbuffer    8.5   51.6
>>>>   545  timer              0.0    0.0
>>>>   544  queue1:src        14.8   17.6
>>>>   543  queue0:src         3.9    4.9
>>>>
>>>> The "timeoverlay" adds approx. 45% to the CPU load (max is 4 x 100%).
>>>> What does take that much CPU time?
>>>
>>> It's called software rendering (with anti-aliasing and all). There is
>>> also a hit because you need to download/upload the pixels from/to the
>>> GPU.
>>
>> I see! The text needs to be rendered and inserted into (overlayed with)
>> the video frame. The CPU usage really depends how often and what is
>> rendered. Already disabling shadow or outline drawing or a smaller font
>> reduces the CPU load.
>>
>> BTW, is it possible to specify the colour for the shaded background? I
>> know that it could be achieved with Pango "<span>" text attributes, e.g.
>> "bgcolor", but it requires more CPU time than the "shaded" background
>> from the text overlay.
> 
> It looks like you can specify font and outline color, but shade or the
> shadow color. Would be nice to add properties for this.

OK, while adding color to the shadow is trivial, it's getting more
complicated/complex for the shade...

> 
> The shaded background is done using plain cairo, I'm not sure why it's
> faster.

On Intel, we are in the NV12 color space. As I see it, the shading is
done on the raw video frame here:

  https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/blob/master/ext/pango/gstbasetextoverlay.c#L2020

Just the luminance (Y) is decremented. With color more data need to
be updated, taking more CPU time. Maybe that's the reason why it has
not been implemented.

>>
>>>> Is there a faster way to do the overlay or is that element from the
>>>> Pango plugin already quiet efficient?
>>>> I want to overlay an image over the video stream, ideally done by
>>>> the graphics hardware.
>>>
>>> There is an active effort to enable GL rendering of CompositonOverlay
>>> meta, but we don't have a fast method to import back GL textures into
>>> VAAPI encoder iirc. So there is still quite some work.
>>
>> Is this work in progress visible somewhere, e.g. as GIT repo?
> 
> https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/blob/master/gst/overlaycomposition/gstoverlaycomposition.c
> https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/blob/master/ext/gl/gstgloverlaycompositorelement.c

OK.
>> I realized, that the i.MX6 GStreamer-IMX Plugin [1] does have a somehow
>> optimized implementation of the "textoverlay" using 2D acceleration.
>> Would that approach be feasible and help on Intel graphics hardware as well?
> 
> On Intel, it is probably simpler to use GL. In any case, the fonts are
> still rendered in software and using cairo. I have for a long time been
> thinking that we could take advantage of bitmap font-cache, but never
> got the time to work on it.
> 
> On IMX2, there is a 2D blitter that could be used to implement an
> overlay-compositor.
> 
>>
>> Another option for text, image and graphics overlay is to use Cairo
>> directly using the "cairooverlay". That would allow to use the Cairo
>> text renderer and also add graphics or images in one process. Would that
>> be "lighter" or more efficient? I think GStreamer 0.1 did have a
>> "cairotextoverlay".
> 
> Text overlay extracts the vector path from pango and use cairo to
> render. Using cairo instead of bitmap font cache is the second
> performance hit (but only if you change the text every frames).
> Blending with the YUV video is the biggest performance hit. The
> blending is optimized using GL implementation. I haven't tested it, but
> it's likely adding an imxoverlaycompositor to gstreamer-imx would do
> the job will less work.

OK.

> 
> I guess I should implement such an element for mainline kernel too.
> Adding this to my todos.
> 
>>
>> [1] https://github.com/Freescale/gstreamer-imx/src/g2d/pango/

Thanks,

Wolfgang.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20181116/a0dc5f0e/attachment.sig>


More information about the gstreamer-devel mailing list