From patchwork Mon Mar 25 08:49:50 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: 47423 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp1051180pzb; Mon, 25 Mar 2024 01:50:04 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUicCCb3MHHrfrOdtRuCgCBWpD3e1eEMf287Ob8t1vtNFm5F/PtWId+oK0vL7aQ9hqC5Wsz/j0a1OWhubARdcYb7PAYPagPsB2wsw== X-Google-Smtp-Source: AGHT+IEzSG6g3tpYA5yA8ZNpVj9DCzOpldm89LxzhyueNmMrbbeVAd/WWrhnL0xEG1BvQQYjfyCf X-Received: by 2002:a17:906:11d9:b0:a47:2074:31e3 with SMTP id o25-20020a17090611d900b00a47207431e3mr4017511eja.49.1711356604600; Mon, 25 Mar 2024 01:50:04 -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 l2-20020a1709060e0200b00a466a2e212dsi2254745eji.665.2024.03.25.01.50.04; Mon, 25 Mar 2024 01:50:04 -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 C6F5668D449; Mon, 25 Mar 2024 10:50:00 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2092.outbound.protection.outlook.com [40.107.104.92]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D72CD68D20F for ; Mon, 25 Mar 2024 10:49:53 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UhZXAG1MsS6fIVPYe2WxdRP5V3PYZt5Cwd/lPGwSOXMZbMWbpJRGrYqyiJN+XUPWPlwkwFLPOGkpSHN9gSl2a+z9e2Utas7aQBQwtYx5a8HSmkhTTsmBnps9zHqKZCocUycgBoCPrpTlQVpSsJIAPnyX0a8BLeek1MR8hyilxF22X1b3BPWPNBKrXLOE8ReK6nT8u2n9023tRtc0ouGGpSr/641UhyDaqL13JtN0HEZSahA8lyesX1LCp0FQtw9rxKvITDA/AL/7D2fjvSzBLB3CBrSQbqt4ppWWqqzM5szH9+M9OQpdBOl+umZZcfipsd99F8vR1sAPlg6X+JR2Ag== 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=NWkAdEa3x+OhHSp8zvg6daQLiCGvAfa/ojeHC3josfA=; b=U3q7zRRIAkLYuXfQFIl1xb9nj/E1Ex2Yi5e+J8ZFpHs1O0ej97uGVZPmmz34SKiKqPXquZBY8WA97m+2ud4Z3gkWUMHSa4pU2uQkimLSogddVKoCu9wDKEB78u7htn2HR2Y4S0AnnF4k+EtL6bmbA4gxFiUSqqPkwQ3mNFIUaEee0qNeDA/II558zSij36+1PlPrKcZ5VvbSS0C8QGDmJtPST3caVw0qIXqOiLf5L+n1wHdbaPR1FsHuTRTHEaMFqzzMtMsTPPMeolGvkhP2oqS1gIIw50k+VObyC+sTQ+fKfWgCqRXn+7RSujahkxoLpb9kbXwlPtRu5+b6nW+Zjg== 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 AS1P251MB0432.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:4a7::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.31; Mon, 25 Mar 2024 08:49:52 +0000 Received: from DU0P251MB0720.EURP251.PROD.OUTLOOK.COM ([fe80::c3d3:d0:7ff:6b57]) by DU0P251MB0720.EURP251.PROD.OUTLOOK.COM ([fe80::c3d3:d0:7ff:6b57%4]) with mapi id 15.20.7409.028; Mon, 25 Mar 2024 08:49:52 +0000 Message-ID: Date: Mon, 25 Mar 2024 09:49:50 +0100 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org Content-Language: en-US X-ClientProxiedBy: ZR0P278CA0101.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:23::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_|AS1P251MB0432:EE_ X-MS-Office365-Filtering-Correlation-Id: 04bb991d-5b97-45a8-83e2-08dc4ca88917 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Yzxi2ZIB4hMRyKob01k5+oGNaWASpiQeGTIMdWYIVlLHP3/Ctk3fz0pjd0GX7DTYwkNRbOONFq/gpBHIZ2lLMEnylX4oi+0tgwoy38XMHzWYGQMMzx42lsPsOyHvhaUm9fipW4W0fb4P8mU693/NOgv2pLrU/hPALeJavKWftZtbO+3H2PP0QIGIrtK/9rudPnrqAd7IASwtSo15paoFbNHFcy7nzlnKaWsnJT+0bj2so+u5VnthWNItqmptgLp2es5ggYCXhOqWVQcYd/MRYMai48dT8Bt2kA6Hy8pjkgoLtaP4xQkPtAi7wWVNLbadxUPk8StcBgd+JQnfV/q3GUTgAX+nbNnXmwVtHSKSJKvgyajYYBjiQqkj5lyD5o9GOaHIXrES4g7OrOtUaiE9/1HBXgxO3UDioL7mxy7jhUcurSBexlEAlWs8xYjZlY7OxkSU94U8zUIW2EX0eONcle0QKDsaf0MFZ4A9RcoAVGYnrT4HiKnA+Rk3NUHZvTQ9+XRSIHUgp7Re3YIojiARV2ptd6k3Any0AChu78Ylue4sMQTjGbPcgN4mXKfk2bwIh9XdLpkBeb1oXHS0NpeJc98jYkZqsiEP6h2vMr7NRI4+7FhAs1uaFAi7RtbFcBsjF/Bgpct9N9RzOX9bjWiOLu/fvJiDqtkfGzEwguluq3Qwpya+qOBbrycA0j6UaWZiVJX6C4qcPu4V7shTkBXczA== 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)(366007)(376005)(1800799015)(81742002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?EUjHaZpEaLeD0gNCgUcn+68QynPA?= =?utf-8?q?R+m+RZY1uGzM2JupTOQeqmXtlRGtz02MmNlPnaQuM+sokTNp8yEQdPbrLR87cxoNY?= =?utf-8?q?JQfojNx6r5aKSlpafe5IyiwAyw5Hm2zIoX8ueL9WE/WqpAZ1mjrZ3qDL7UocDxNn4?= =?utf-8?q?Uz3J9V9FXgnRQjRsjyguLe/W2KX+ISyuKOoWKMhyTwWQb6Cfr4qAkOMNRX7R9N2nf?= =?utf-8?q?1wlmxWZdUHJ5s5yzeiQ88uHeCGrWHbgN+u3QcWuLTXV2hj8VygZPgaa7i6Ea4yJib?= =?utf-8?q?5d11TvVnnzfORZCeCLbOhQbvmVHk3G93c4t87P4MYRe5VQYT8Jd4MfPlFlcW+ljzC?= =?utf-8?q?UU3UodgWfesSEsow9l8ofnGH+2TcWYBP4CEambKSH10zPBYGmNXl72itD4D0WNTAf?= =?utf-8?q?EXBXeUN3vxCEh+0V0mPC/NRT5M4TH+jwcy+M8+Kk0t9GEtVBhaNjxjj+7lUDxqTsA?= =?utf-8?q?/CMVgZlVS6nKB/Yl6GRJNCe0lYMUcmD0VcbGoU8o3nPnKa0c/V3Bb2EPkGfPyrWB5?= =?utf-8?q?F8TaLNfOhQPdAec18L/mJwTLadIKVYKwzmzbDinujqIFYM1Wp9WGAIRjrPEh7pMk7?= =?utf-8?q?UxnESaRw/WGFdQ7zlYhrbgChkh6sB5zzYmBjGCMPV3xmKOC7/j9hVlPo9g0Wf2M8s?= =?utf-8?q?FbsMxJxHvMZpwC+gsYZ70eQJzplXFfD/D4prUOd1MR3hORvaDkZdIgtGWlck4Md8c?= =?utf-8?q?1AW/giVWRFs03VcpArQEi87aaX7Pg7Em6orVOYNQ9Se/Vqhq6q0mhW+1YxQjdYPoJ?= =?utf-8?q?gGNAjNdiBkPS9t1QMb+zD2eYWsNKq5SFGTFbKrM7GtKjjRMm6oNv4LQ6YjzFwUV8q?= =?utf-8?q?gO+iD3JYrxRpkIJSB0D98Qs30IARH2tu1zVV85e6tN9ZZ5iRJmrQ2beRKNNzf4K4u?= =?utf-8?q?aZGqgPoRS5NpadOHXLpjv90RChHUHdoYpelks+EyrRhVMMc2fIMln9ZT+EhqOQ2Zw?= =?utf-8?q?aiUQ04Q2geN7bdyZYivRAwMbTVNsCD3bY3P9KAY9mc7uvQWHBeLU3yPHzRltSDNCe?= =?utf-8?q?dUdCvkXbyn/sbKaq1IJ/De8pu0beeT75sU7Ta5c/I2T2AFnj6UeyheEd89wj5z2Pv?= =?utf-8?q?gRj9HPy4OUK359TAFxP1Pn+e2UVqJMiMiQiIR0y1x88SCT8q8qE2mXWfJlzDUzuRx?= =?utf-8?q?k8VSP+QXX2ocAn3+0jTTM6d2m7B+5+GA4ieC4KIzhcJsNdNVcmlDl8g1QzWkZ6Dfo?= =?utf-8?q?yKuAj+a6OAsNa7dvIRtGIyQ2LniCfaeIe+AgKQv5y569qS3E9knXzUWj1b8o5O+MC?= =?utf-8?q?sSQrtVFw54fX8Xg9mwja0ArKDxH8jwL2IMQ/H+HGGNvGFFA6TEgXnTqbgONea/f1G?= =?utf-8?q?ys8tB4dNSTfhur6qiv0FuU+W4RThsQWKM+slwBQiJv81YeUqIlA9wuscyfKnnWLiX?= =?utf-8?q?le05Pi5KELGvCBUkLpv0Akq2Jj9X8pivMoJHW46DqmHSglf/YAO9oGYodn/gTR9SQ?= =?utf-8?q?p21NXoK4fB6uzWsTwrSk3YMw7fCVhSsonT8W+c5HPTbHDjHDXIpORXYiQQqIbhaNz?= =?utf-8?q?qg20VoRf/mW+?= X-OriginatorOrg: polimi.it X-MS-Exchange-CrossTenant-Network-Message-Id: 04bb991d-5b97-45a8-83e2-08dc4ca88917 X-MS-Exchange-CrossTenant-AuthSource: DU0P251MB0720.EURP251.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Mar 2024 08:49:51.9258 (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: F9OHWfcF4RflXuzLTsENuJC1pv0WOXct/SW5ADoVJaBeA7zUNmCpnMGKruuzr3sMpHsdNWFaRayzfeVgg3WHNw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS1P251MB0432 Subject: [FFmpeg-devel] [PATCH] Added alpha layer support for smartblur 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: 0LOR59iIW3pW Signed-off-by: Andrea Mastroberti <10736595@polimi.it> Signed-off-by: Andrea Mastroberti <10736595@polimi.it> --- doc/filters.texi | 20 ++++++++++++++++- libavfilter/version.h | 2 +- libavfilter/vf_smartblur.c | 44 ++++++++++++++++++++++++++++++-------- 3 files changed, 55 insertions(+), 11 deletions(-) AV_OPT_TYPE_FLOAT, {.dbl=1.0}, STRENGTH_MIN, STRENGTH_MAX, .flags=FLAGS }, + { "alpha_threshold", "set alpha threshold", OFFSET(alpha.threshold), AV_OPT_TYPE_INT, {.i64=0}, THRESHOLD_MIN, THRESHOLD_MAX, .flags=FLAGS }, + { "at", "set alpha threshold", OFFSET(alpha.threshold), AV_OPT_TYPE_INT, {.i64=0}, THRESHOLD_MIN, THRESHOLD_MAX, .flags=FLAGS }, + { NULL } }; @@ -86,7 +94,7 @@ static av_cold int init(AVFilterContext *ctx) { SmartblurContext *s = ctx->priv; - /* make chroma default to luma values, if not explicitly set */ + /* make chroma and alpha default to luma values, if not explicitly set */ if (s->chroma.radius < RADIUS_MIN) s->chroma.radius = s->luma.radius; if (s->chroma.strength < STRENGTH_MIN) @@ -94,15 +102,23 @@ 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; + if (s->alpha.radius < RADIUS_MIN) + s->alpha.radius = s->alpha.radius; + if (s->alpha.strength < STRENGTH_MIN) + s->alpha.strength = s->alpha.strength; + if (s->alpha.threshold < THRESHOLD_MIN) + s->alpha.threshold = s->alpha.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\n" + "alpha_radius:%f alpha_strength:%f alpha_threshold:%d ", 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 +128,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 +180,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 +280,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); } diff --git a/doc/filters.texi b/doc/filters.texi index 913365671d..30b3627724 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -22688,9 +22688,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 1.0. + +@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 1.0. + +@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 0. @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 d5a6bc143a..f01b3f8e91 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -32,7 +32,7 @@ #include "version_major.h" #define LIBAVFILTER_VERSION_MINOR 0 -#define LIBAVFILTER_VERSION_MICRO 100 +#define LIBAVFILTER_VERSION_MICRO 101 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ diff --git a/libavfilter/vf_smartblur.c b/libavfilter/vf_smartblur.c index ae0ec05b2d..bc377d0b92 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=1.0}, RADIUS_MIN, RADIUS_MAX, .flags=FLAGS }, + { "ar" , "set alpha radius", OFFSET(alpha.radius), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, RADIUS_MIN, RADIUS_MAX, .flags=FLAGS }, + { "alpha_strength", "set alpha strength", OFFSET(alpha.strength), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, STRENGTH_MIN, STRENGTH_MAX, .flags=FLAGS }, + { "as", "set alpha strength", OFFSET(alpha.strength),