[FFmpeg-devel] [PATCH] librsvgdec: Fix frame clearing code

Calvin Walton calvin.walton at kepstin.ca
Thu Feb 1 00:17:37 EET 2018

The existing code attempts to clear the frame by painting in OVER mode
with transparent black - which is, of course, a no-op. As a result if
you have many input frames (e.g. you're using a sequence of svg files),
you'll start to see new frames drawn over old frames as memory gets

Fix that by clearing the frame using the SOURCE blend mode, which
will replace whatever is in the buffer with transparent black.

Referencing the cairo FAQ,
 libavcodec/librsvgdec.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

It would probably be nice to get this into 3.4 branch as well?

diff --git a/libavcodec/librsvgdec.c b/libavcodec/librsvgdec.c
index e57070f8e4..e16cb6247d 100644
--- a/libavcodec/librsvgdec.c
+++ b/libavcodec/librsvgdec.c
@@ -82,8 +82,11 @@ static int librsvg_decode_frame(AVCodecContext *avctx, void *data, int *got_fram
     crender = cairo_create(image);
-    cairo_set_source_rgba(crender, 0.0, 0.0, 0.0, 1.0f);
-    cairo_paint_with_alpha(crender, 0.0f);
+    cairo_save(crender);
+    cairo_set_source_rgba(crender, 0.0, 0.0, 0.0, 0.0f);
+    cairo_set_operator(crender, CAIRO_OPERATOR_SOURCE);
+    cairo_paint(crender);
+    cairo_restore(crender);
     cairo_scale(crender, dimensions.width / (double)unscaled_dimensions.width,
                 dimensions.height / (double)unscaled_dimensions.height);

More information about the ffmpeg-devel mailing list