From patchwork Wed Jan 31 22:17:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Calvin Walton X-Patchwork-Id: 7466 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp2279975jak; Wed, 31 Jan 2018 14:23:27 -0800 (PST) X-Google-Smtp-Source: AH8x226AlmgNc6MNeG/jb3FFZDjWtVNoPTPqJLOFPhVSS8eN7HzCgRx2Syq/HiwR3WvnWhlpPbIx X-Received: by 10.28.196.73 with SMTP id u70mr22365218wmf.116.1517437407286; Wed, 31 Jan 2018 14:23:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517437407; cv=none; d=google.com; s=arc-20160816; b=GK5osH17WLpX+KtnU1DkfMZlvDgci2y9XjfYmSaLCX6cXNGalB7aozQtrfiJxfKdEH qlVBqSQdXA9Rj/ni1VSvGE+kS6UQ+7EO0jC3p72FYlbyugLQJ22DLstRzYPyczent5j+ QpBA2BaUy5RtOMu2CHCGBf2+dTNXG/Gb5xIEfSRjo3I1HDUzbAsemk0K+TzmltIlmfdJ u4XW9rTkHu7GLQUKV54xFPuc3UrezQbnulKeuYziKiCAU5d5CcCVxC2xw4/fez8jZGTr 9Ox4yKNTjUovktezy5PTMfNXhl+X4CXFZQw9kNcivZPlr/psaSxzAvlCT4k+5cUdkWP1 OeGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:from:message-id :dkim-signature:delivered-to:arc-authentication-results; bh=zuBxpwTor8bSewYYe9ZFNT7TjwGxQfKPOviW6m3vSU0=; b=eGMIMcOw8vFQvYp/PD3gFTtQFldsM6EK5Vw5D++lr8pct0ggmbsCymxslfQukOytCP IbeW31ABWuNXac5TEjxPhy0h8ZYWhROYfXMNTj2XWPH9TEaG3AFRzPJ6HKEry1IuPIxD +0yqkYUfMxoeyUE57nIU/5u5qfzP3zqSwvZPWO/JwSbMXMyyZFiX19KQZWRMBJwXL8QA 1wRjbASXBOXc1KG44HYVFd1Aj9frCDJwya16LWpA6OVdZ61VPY2y5PrUoHm1VMzPcA8I aQxS7k2VTNkMPKM8pChq7iaWCx1/Qbdnc7F/29a3YXqYBQZPY45htI8d6wXMXr2AsHRk gv3g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@kepstin.ca header.s=google header.b=T4+YLp70; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=REJECT dis=NONE) header.from=kepstin.ca Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j11si483886wmh.87.2018.01.31.14.23.25; Wed, 31 Jan 2018 14:23:27 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@kepstin.ca header.s=google header.b=T4+YLp70; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=REJECT dis=NONE) header.from=kepstin.ca Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C26D0689A69; Thu, 1 Feb 2018 00:23:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io0-f169.google.com (mail-io0-f169.google.com [209.85.223.169]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 985316899B4 for ; Thu, 1 Feb 2018 00:23:12 +0200 (EET) Received: by mail-io0-f169.google.com with SMTP id d13so16934366iog.5 for ; Wed, 31 Jan 2018 14:23:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kepstin.ca; s=google; h=message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=biK63s5S0cQr1uVZ0ct2mEsK7Yews8DAyHpJobtv4dE=; b=T4+YLp70xymr6nFnEsChtx8UOdDhyGl7jaLx32JN7a5dujKbKeb8lsoq16z3cXTWUC oc2TBfFKjZYtgwC00qlQTsDSp9sib4bPxIk9S3V8viQBMAW0LISHx+BtX6H87p3NlVCP uqsPqBX/ZES8+Qay5nt6X0rQmXtt7m3B9B6p0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=biK63s5S0cQr1uVZ0ct2mEsK7Yews8DAyHpJobtv4dE=; b=b1s27NR3Jmmq+eh6yzsF142No4C5oUhlODr5TiMfthNu9QF9E6zAyeEXqTNyXH1iQF TBRCt3z7W34DHDiTf+8GPvuvZp2KHzL9uk1wOPUdq5ovkgZEb1lwQIOpmSp2KFTkOukL 2C5p4F+6lhEGvW6Y0nEL34z90lp3meDDk6jAupEYU7G51lae6ySmGK6G9uoip3WEpica Z8a2znidUb/eSoV3C2Z9al2BKPaO9l79aC/NV42X5enrv6GpCnUIONiSk6S3ElqNG0s7 eFNlBBGeluLwRqfKy/oTYCg18H4NSDhm55kwOLbbGe30gbfQBiX5djTto73lb1v7EE7/ amMw== X-Gm-Message-State: AKwxyteFuS0wuhA06VOwW6N9UcVfhaTEocGmQZAv26Txem70F+089Ij3 uz8PDuk3OIzXViix2de40SUxL2YMvXY= X-Received: by 10.107.201.206 with SMTP id z197mr34462973iof.50.1517437059351; Wed, 31 Jan 2018 14:17:39 -0800 (PST) Received: from rocky ([2001:470:8924:82da::f82b]) by smtp.gmail.com with ESMTPSA id f16sm7867395iob.75.2018.01.31.14.17.38 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 31 Jan 2018 14:17:38 -0800 (PST) Message-ID: <1517437057.19745.7.camel@kepstin.ca> From: Calvin Walton To: FFmpeg development discussions and patches Date: Wed, 31 Jan 2018 17:17:37 -0500 X-Mailer: Evolution 3.26.4 (3.26.4-1.fc27) Mime-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] librsvgdec: Fix frame clearing code X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Charles Lawrence Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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 re-used. 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, https://www.cairographics.org/FAQ/#clear_a_surface --- 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);