From patchwork Thu May 16 22:42:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrea Mastroberti <10736595@polimi.it> X-Patchwork-Id: 48936 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:3a48:b0:1af:fc2d:ff5a with SMTP id zu8csp2532555pzb; Thu, 16 May 2024 15:42:44 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVNlnEwyjM2xOkzaqsnX73opFY8S98Phlb/hpubNuM95f6s+vbx3fh/I8tlhbciYDcxWErGvjLBIFogydoMM+A4G7Jsag5VmHXYXw== X-Google-Smtp-Source: AGHT+IG6irvVqc2yvQXebWR0A3H14Yfe24QC+zAC3u82p5s8JhPht4sFZW18gLfhfaM8hN//IwSo X-Received: by 2002:a17:907:3f0d:b0:a55:8f2a:950d with SMTP id a640c23a62f3a-a5a2d53b28amr1764618866b.16.1715899364413; Thu, 16 May 2024 15:42:44 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a5cdef2a533si160247566b.675.2024.05.16.15.42.43; Thu, 16 May 2024 15:42:44 -0700 (PDT) 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; arc=fail (body hash mismatch); 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C194B68D26B; Fri, 17 May 2024 01:42:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2122.outbound.protection.outlook.com [40.107.21.122]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2F4AC68CED8 for ; Fri, 17 May 2024 01:42:32 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=abKZ9oUdAipHP/CDo6G0I7WXdTEHuEsHz7DMDvENTwo6Y9V09ZgAVxLp8/GCfu84RNUPkCqWymujv4yEam8CCPt7zNTJgoUmA3JUJZ8I30EMormO/W6k5CijY5JiiSozDnky0o/ka6cqb4XcQ/TtoOct1dRWDDxRsdkn5I2O9vAiGW50BxYUfVLSIM2Cnm0B+zN0QT6H5RI+OZ86UhBLTcoH5Mpyc09Mxb8gT9bEcVJziX12xL2dnCWNfawK5noOtKLHhWmhqtkUGbQ/ZANWxgqrle83Yw9UtGroObTjb00RCRYPJpT9BABj0wH6zSvZ0oBXwKL7JckwD7Rg8bj9gQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wqNyEpAcIH+UEv2ZsQ7Gf53JSlI0I/JECWA2uvcGd7U=; b=RQRHOZBN+mUd77572sKZ6XXPnakU5JRYWxmJ0ehOedpraDGFzhsOeXEGKN/jnPAtEGdgQUUyFKTk7Q5JMbn/WjZd4wZcXKXNJ4MrIRk/ZkgU+Zd2yU1ypG0RLo0Ip/OCd1ddQzwFM0ApVi9QiH4jmj3oqUmL7c79s8AjaDP8WvpE+1lROvBiTtgw1twNHjJ85T+hbOBNT3XMFXuwZYyyXIZTLuQXnIZsQGfCNp6Pb1bx/YGeD6vcXVko+o1W+kmU13R5cN6ljCQsqhZwS1+wXBnrExQeBSl7BCWuCGOxU2Z9sCiLZjq9phCmgsUuAe5GsWlAV68syscmLp1B2rc54w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=mail.polimi.it; dmarc=pass action=none header.from=polimi.it; dkim=pass header.d=polimi.it; arc=none Received: from DU0P251MB0720.EURP251.PROD.OUTLOOK.COM (2603:10a6:10:342::14) by AS1P251MB0527.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:48f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.27; Thu, 16 May 2024 22:42:30 +0000 Received: from DU0P251MB0720.EURP251.PROD.OUTLOOK.COM ([fe80::c3d3:d0:7ff:6b57]) by DU0P251MB0720.EURP251.PROD.OUTLOOK.COM ([fe80::c3d3:d0:7ff:6b57%5]) with mapi id 15.20.7587.028; Thu, 16 May 2024 22:42:30 +0000 Message-ID: Date: Fri, 17 May 2024 00:42:28 +0200 User-Agent: Mozilla Thunderbird Content-Language: en-US To: ffmpeg-devel@ffmpeg.org X-ClientProxiedBy: ZR2P278CA0011.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:50::16) To DU0P251MB0720.EURP251.PROD.OUTLOOK.COM (2603:10a6:10:342::14) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0P251MB0720:EE_|AS1P251MB0527:EE_ X-MS-Office365-Filtering-Correlation-Id: 47d5e354-a78e-4b3e-7188-08dc75f977e4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230031|1800799015|366007|376005|81742002; X-Microsoft-Antispam-Message-Info: =?utf-8?q?wYm0GtP4oinZGAZGFfn/yX13e0e/pSV?= =?utf-8?q?7S4BZpDpgAMr6UINWAf/IvYIWXLxDsRqVl3aTWCTzWxdcUBIv0q5J6EIhFnx+Jhto?= =?utf-8?q?cuGMj8TG7FBgq10R9otQ6PJk566WvQzo5T/YpT/wv9i4BouEX2mvjWhKZSd9sy4pN?= =?utf-8?q?2e5YLxBEtrQwqpjaAooublk4n4PGAgbYGXpQtnFDrUSmtVq9Dq9XMHE5RmGIv9AV8?= =?utf-8?q?VPfMSb13OZyFHqmbGIxZdvWNZt5mpkXgI9O/KqC8Z8YSqljPzQRdifQDCcptG2jpY?= =?utf-8?q?LBEKCCh2tSeTu6DW8vyFevNWm45g+hxcnMrncPNBjqf0w9crlh0F0LYDEZj4tkyJJ?= =?utf-8?q?lPDTLSHnbX+ez4Kp3HVEA8OICtIrfuv+Uu1FhBCrWMJAw483wHSQQdPK5DhyYxN+f?= =?utf-8?q?H8xwD+zyb3UTLJSm18OEPQ5CxJWvRuNm2sRc74GmNzYTXa2DVLVDep4lN8plYkg3/?= =?utf-8?q?D4SP2MoJbHgCEM06DGsx9KDK3zBmNodvN51PfUPDVEMl5WSeURuiJv+NqnBvXlNOV?= =?utf-8?q?Xi3RUVj3eKEjl/VTgE+zuhevAuR4s8+YuLovAuDtEWDLMqUyCrYflgQsxQDR0+02+?= =?utf-8?q?G/qvNmNAmABOZo14gEi5+1fgD+Wclb/hHvYK9sWQ+6Gd+5ixlVybBWtcg1Nl11aRQ?= =?utf-8?q?lhIIMl/Ryadd/MdvJQxqHVIzaG+P4oCBaTMs9WkvekUwD2ykAbkPspHeHuvrK7nhb?= =?utf-8?q?0gOZNxYYDp/N5EhoCNTrpVu0ISlg4D9mriUSxtoFN3zZ6Et7w0XGhL2Elgiy4b47B?= =?utf-8?q?pOjA3yNxpenm6mHsJLEMAD4efeNfgL0Qa8E6Gy66w7+aMlZ9xKTyuZSFrj/qbqA29?= =?utf-8?q?A4wQzsH5zRHPaQe+ZGRhJm8M6aMpIwOYLHcDCQnLO4lcTRW2ap1cOH+bwjlHF3Qvg?= =?utf-8?q?jAXyVfVBrieBi/EFcoe3RpL7oR2eOkvI8PalUWpeqbhjJfhQN9hqN3h1+NqWgeltp?= =?utf-8?q?anB34SpuP0kwPXxILlhivf4KOnrFgJyZr0A1tNPC/slc2jQFjb/cQv26FRbXrj1Np?= =?utf-8?q?VW05QvoZ86CpCZEGm?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DU0P251MB0720.EURP251.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(13230031)(1800799015)(366007)(376005)(81742002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?fy9xTyc90R4qkOyfKIiM5sk/I2I7?= =?utf-8?q?IsTBhG3V4VWJ7DkIrmR62ynpBKpySaqNa79mj/Ut7Ptuc/LUjCJjKJf0I3/PTIRWo?= =?utf-8?q?yR4AUwdUl7L6SUViU4Pm4Ha3kPj4TmMQvHh1VmxDXWZx74NazKLIgzuHVfP5f5hxK?= =?utf-8?q?+vPaHZ1Z1QhkKY6GjKAg4DDxSvJffUNi1u7Ab9mpk9krRxOjO9fN0ukgzyYgtRMeY?= =?utf-8?q?ZNCIYPCrERTMvoEm2OX0qjezdG6K8MbFHgeCcD/VogYvJlPzpc81c4oD/Rn1oTFO0?= =?utf-8?q?2PsvQ4Bt5gmczMu5jQPt1kU0uo7TMmKbIhWPWtG2vO9r/bfv7YN5Gjo2VqMcB+PTW?= =?utf-8?q?WqpRc8TgpwE74korlIMmHmZv7DwHUPdGZX8auexAllJTNE0vLuvnhXidheUxOUwxq?= =?utf-8?q?7zVge5/dylXB9IkR6K7o4AzYc5hh5Zzwm1d+1eEedkJg3+vEX+YVtT17aa/ge31bD?= =?utf-8?q?gF8LH9up4kx0m6/sITbTj42L7vdjlFE7g1gnTgEDBw8VaeG2rWg4ZAloLq/mtcBZy?= =?utf-8?q?J4Yei9RdxustcnIhC258FvTIJ0omG/wq2kLjcqcE3vDPoVW+I6eDyUtR8XHyXg0yj?= =?utf-8?q?hUxNUgFUbi4hs6asishgzDNpwfndkg1vaWhtny+SZRb7e8SPvEFoZV7FbPZWKQmp+?= =?utf-8?q?AzdJ+Xi0PMiuoh1iQWFQjmCLsgIfM8XO1hs1Jm0CISw9TvRmAv84h5GlkxmcNFkCt?= =?utf-8?q?aQYUIkS1MapjRm1Vth0GRNfHOStYJ5+j9ICCFFTaO5gUeUuwCLKcJ5q1EkIXEwVdM?= =?utf-8?q?723Fp5/q0QD9zEK4zau1dLj1Fq6rMQimgGj0DXDr951UX4jfUQUSGufNR2tdsfaLk?= =?utf-8?q?XTFLNUww5DZgm5jMWMn3DI4MG5hRsN8r/yi2J0UaUYxVEikdLgwic4gccdNq7P7ls?= =?utf-8?q?QWMh6Bkqiw1UILZmdFYdfDy2hfRjvqc9SU2zpVEEsZy5YH0oQv85WfemItr7DsRPw?= =?utf-8?q?PD5m8JHo0Iq9KaX10Eio0V0Lxuy8Wd2DPTJxN1jMdXFjfeZAnLecdrF9dzSv5jea+?= =?utf-8?q?/f9UXEEQfUXoN8hczadkbRkmMTfnwspY4DSFZ4k4K7ZQAU13IMrWmWqeJt+O8IEr2?= =?utf-8?q?cz5KZclSSotf6fz3u3tdWPP0IwnZdYXJiNFVGhUyzVASRCyKxzcs6ElVt/qnPXx1g?= =?utf-8?q?X9Pf22dUHgWqNC/6xR0v8lND0YinXj0r3KZGurDrBTqKCORctCByYeCak3pWcUWln?= =?utf-8?q?2TApKIJuT7gmpvodYIk4OruwmV6yzCyFjCJbTd4dUHcbsRxYhHUaxteH47stX4uoh?= =?utf-8?q?Gk00HEuDFSWECkpztLo8loLAwVP0RDUTscC58bqhySiA7ije2LDVsoW68oq8P2XEV?= =?utf-8?q?ZR+33Ao565GgHMYD4e3WJ5gdOqY02drllkxW0HqTfplngdJkU1IVmcdDVEvQPDhYJ?= =?utf-8?q?SNN0YqCDnSzyHSbgkBlw+kV3r7piqBB5cxUZ2TRnePuLstv8/7qKgatKJkUYmospo?= =?utf-8?q?suvvCNEslxCBJnRfLLSaz6C8UfyJ/4iLvq9B/OpMseasVRi1CUuZoWd89pISp2JBv?= =?utf-8?q?GaJKIUqrtjZc?= X-OriginatorOrg: polimi.it X-MS-Exchange-CrossTenant-Network-Message-Id: 47d5e354-a78e-4b3e-7188-08dc75f977e4 X-MS-Exchange-CrossTenant-AuthSource: DU0P251MB0720.EURP251.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2024 22:42:29.9658 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0a17712b-6df3-425d-808e-309df28a5eeb X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5bcvwvRkM+Q+5Rh+Q3wwGFe8iTvMuih3GhhbON8aGjD71JJiCjN4qchHIVOyDqCl2hb2JyYqxarZcpDWGG5dxw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS1P251MB0527 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [FFmpeg-devel] [PATCH] Added alpha layer support v2 X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Andrea Mastroberti via ffmpeg-devel From: Andrea Mastroberti <10736595@polimi.it> Reply-To: FFmpeg development discussions and patches Cc: Andrea Mastroberti <10736595@polimi.it> Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: rnzLvnW+tFu2 From 8b62312d794ecb66cc1a8dbe4933fca0d725057b Mon Sep 17 00:00:00 2001 From: Andrea Mastroberti <10736595@polimi.it> Date: Fri, 17 May 2024 00:29:01 +0200 Subject: [PATCH] avfilter/smartblur: Added alpha layer support --- doc/filters.texi | 20 +++++++++++++++++- libavfilter/version.h | 3 ++- libavfilter/vf_smartblur.c | 43 +++++++++++++++++++++++++++++++------- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 8230661261..f5bf475d13 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -22653,9 +22653,27 @@ whether a pixel should be blurred or not. The option value must be an integer in the range [-30,30]. A value of 0 will filter all the image, a value included in [0,30] will filter flat areas and a value included in [-30,0] will filter edges. Default value is @option{luma_threshold}. + +@item alpha_radius, ar +Set the alpha radius. The option value must be a float number in +the range [0.1,5.0] that specifies the variance of the gaussian filter +used to blur the image (slower if larger). Default value is @option{luma_radius}. + +@item alpha_strength, as +Set the alpha strength. The option value must be a float number +in the range [-1.0,1.0] that configures the blurring. A value included +in [0.0,1.0] will blur the image whereas a value included in +[-1.0,0.0] will sharpen the image. Default value is @option{luma_strength}. + +@item alpha_threshold, at +Set the alpha threshold used as a coefficient to determine +whether a pixel should be blurred or not. The option value must be an +integer in the range [-30,30]. A value of 0 will filter all the image, +a value included in [0,30] will filter flat areas and a value included +in [-30,0] will filter edges. Default value is @option{luma_threshold}. @end table -If a chroma option is not explicitly set, the corresponding luma value +If a chroma or alpha option is not explicitly set, the corresponding luma value is set. @section sobel diff --git a/libavfilter/version.h b/libavfilter/version.h index 408c700767..ba0c6b3862 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -31,8 +31,9 @@ #include "version_major.h" + #define LIBAVFILTER_VERSION_MINOR 2 -#define LIBAVFILTER_VERSION_MICRO 101 +#define LIBAVFILTER_VERSION_MICRO 102 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ diff --git a/libavfilter/vf_smartblur.c b/libavfilter/vf_smartblur.c index ae0ec05b2d..dbbb74339d 100644 --- a/libavfilter/vf_smartblur.c +++ b/libavfilter/vf_smartblur.c @@ -54,6 +54,7 @@ typedef struct SmartblurContext { const AVClass *class; FilterParam luma; FilterParam chroma; + FilterParam alpha; int hsub; int vsub; unsigned int sws_flags; @@ -77,6 +78,13 @@ static const AVOption smartblur_options[] = { { "chroma_threshold", "set chroma threshold", OFFSET(chroma.threshold), AV_OPT_TYPE_INT, {.i64=THRESHOLD_MIN-1}, THRESHOLD_MIN-1, THRESHOLD_MAX, .flags=FLAGS }, { "ct", "set chroma threshold", OFFSET(chroma.threshold), AV_OPT_TYPE_INT, {.i64=THRESHOLD_MIN-1}, THRESHOLD_MIN-1, THRESHOLD_MAX, .flags=FLAGS }, + { "alpha_radius", "set alpha radius", OFFSET(alpha.radius), AV_OPT_TYPE_FLOAT, {.dbl=RADIUS_MIN-1}, RADIUS_MIN-1, RADIUS_MAX, .flags=FLAGS }, + { "ar" , "set alpha radius", OFFSET(alpha.radius), AV_OPT_TYPE_FLOAT, {.dbl=RADIUS_MIN-1}, RADIUS_MIN-1, RADIUS_MAX, .flags=FLAGS }, + { "alpha_strength", "set alpha strength", OFFSET(alpha.strength), AV_OPT_TYPE_FLOAT, {.dbl=STRENGTH_MIN-1}, STRENGTH_MIN-1, STRENGTH_MAX, .flags=FLAGS }, + { "as", "set alpha strength", OFFSET(alpha.strength), AV_OPT_TYPE_FLOAT, {.dbl=STRENGTH_MIN-1}, STRENGTH_MIN-1, STRENGTH_MAX, .flags=FLAGS }, + { "alpha_threshold", "set alpha threshold", OFFSET(alpha.threshold), AV_OPT_TYPE_INT, {.i64=THRESHOLD_MIN-1}, THRESHOLD_MIN-1, THRESHOLD_MAX, .flags=FLAGS }, + { "at", "set alpha threshold", OFFSET(alpha.threshold), AV_OPT_TYPE_INT, {.i64=THRESHOLD_MIN-1}, THRESHOLD_MIN-1, THRESHOLD_MAX, .flags=FLAGS }, + { NULL } }; @@ -94,15 +102,24 @@ static av_cold int init(AVFilterContext *ctx) if (s->chroma.threshold < THRESHOLD_MIN) s->chroma.threshold = s->luma.threshold; - s->luma.quality = s->chroma.quality = 3.0; + /* make alpha default to luma values, if not explicitly set */ + if (s->alpha.radius < RADIUS_MIN) + s->alpha.radius = s->luma.radius; + if (s->alpha.strength < STRENGTH_MIN) + s->alpha.strength = s->luma.strength; + if (s->alpha.threshold < THRESHOLD_MIN) + s->alpha.threshold = s->luma.threshold; + + s->luma.quality = s->chroma.quality = s->alpha.quality = 3.0; s->sws_flags = SWS_BICUBIC; av_log(ctx, AV_LOG_VERBOSE, "luma_radius:%f luma_strength:%f luma_threshold:%d " - "chroma_radius:%f chroma_strength:%f chroma_threshold:%d\n", + "chroma_radius:%f chroma_strength:%f chroma_threshold:%d " + "alpha_radius:%f alpha_strength:%f alpha_threshold:%d\n", s->luma.radius, s->luma.strength, s->luma.threshold, - s->chroma.radius, s->chroma.strength, s->chroma.threshold); - + s->chroma.radius, s->chroma.strength, s->chroma.threshold, + s->alpha.radius, s->alpha.strength, s->alpha.threshold); return 0; } @@ -112,13 +129,15 @@ static av_cold void uninit(AVFilterContext *ctx) sws_freeContext(s->luma.filter_context); sws_freeContext(s->chroma.filter_context); + sws_freeContext(s->alpha.filter_context); } static const enum AVPixelFormat pix_fmts[] = { - AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, - AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P, - AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P, - AV_PIX_FMT_GRAY8, + AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P, + AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA422P, + AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, + AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, + AV_PIX_FMT_YUV440P, AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE }; @@ -162,6 +181,7 @@ static int config_props(AVFilterLink *inlink) AV_CEIL_RSHIFT(inlink->w, s->hsub), AV_CEIL_RSHIFT(inlink->h, s->vsub), s->sws_flags); + alloc_sws_context(&s->alpha, inlink->w, inlink->h, s->sws_flags); return 0; } @@ -261,6 +281,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) s->chroma.filter_context); } + if (inpic->data[3]) { + blur(outpic->data[3], outpic->linesize[3], + inpic->data[3], inpic->linesize[3], + inlink->w, inlink->h, s->alpha.threshold, + s->alpha.filter_context); + } + av_frame_free(&inpic); return ff_filter_frame(outlink, outpic); } -- 2.45.1