From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id E38C84A23B for ; Mon, 25 Mar 2024 16:44:47 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B086968D1A4; Mon, 25 Mar 2024 18:44:44 +0200 (EET) Received: from EUR02-VI1-obe.outbound.protection.outlook.com (mail-vi1eur02on2135.outbound.protection.outlook.com [40.107.241.135]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CA22968C95A for ; Mon, 25 Mar 2024 18:44:37 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eTkO+IK/TAs1jBwoZrmrNN8WxXTpKTn+YEVESnf3nTmGa/Te3xjvV3S0+EZWtBNuci6nYZlbXheoO1JT35WYogWMKGqARHN7ZTHCXV2yfPn8Ody+DGmdYQBk5M7RgxS8CLMdy1e2D+49dC3Cip9s75t3CJqjVLsy/ZWIB4IpYMGVKxnkduz8Y7NLhgwg4miB2R9YtIkoC5CAcE5sQPECNSdEbAWGQVDLgYZY8yW1WYwle8FgKqoXhZ4yWKfnjgssmFY1JtayhKCvamNWtyQ2CRmg76NQCqVOhWw/ejfwE+GGq/gz122zfHr/dfYtwZCZNVdvjT7pS/JkJBrFHgMQDQ== 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=efY8c5PyKbeQbDLulRQe6tsLqVtC6lGm/cNuecZPQVY=; b=bWCBUm3nIOVl0EsEEuBOlkPb56WncdcFaqM5v7LOZILPcBR/Q+V9PuJX043GjTgfS1smHryyNDUaAebq5chlptuynCH60kCpgov4TUcNDEnqZZclAf6y4DWhmeAttPj8VbWfpNE0N6PymOqgGSSpo8yjD/pKdmI10A+tThBDU9G23IRoRa1IB0rZH9AByEJ079Qa94l1AnKfVFIoOY3psQ6ouWHmE1P6bIDwn/N6sbOcN5L25+KaFB1QTHPUP3n+IsUhhl4azNWsNfu8XLY/b8eYDFGlBMgiI+7GnZ91Lxm4S4OJvJ1NkYhzIPsgxSvRX25D4nx9wFssFbr5gTO6Pg== 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 AS8P251MB0935.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:570::11) 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 16:44:35 +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 16:44:34 +0000 Content-Type: multipart/mixed; boundary="------------xuTQOAOygi3XsY0wcqZAxHQg" Message-ID: Date: Mon, 25 Mar 2024 17:44:33 +0100 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: Content-Language: en-US In-Reply-To: X-ClientProxiedBy: MI1P293CA0012.ITAP293.PROD.OUTLOOK.COM (2603:10a6:290:2::10) To DU0P251MB0720.EURP251.PROD.OUTLOOK.COM (2603:10a6:10:342::14) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU0P251MB0720:EE_|AS8P251MB0935:EE_ X-MS-Office365-Filtering-Correlation-Id: 3b8cc270-b7a4-4b86-0d3a-08dc4ceada4e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: U/8RFILjEy/NwbZaeVQlJQiBGN16mgSzC0AFyzajc6B96eiCYbpEjygTWPZsfOxgPu0ca21CBZiCJK6wy6cY4viRrVS6Afb87T1hWeAXGywoSYUgYA2I8yiSC9Y+u/F65K/LsQPFOeMwS/PKup3+Np+4Ep/TeaCr5v+CDth73Qrvw11K3j0dIyK9LtHiwJD21pglqFMp55ICPb/Z2cqBOE+saVZCXnPTm8PayiHNAYQlD7o0S0Ryzg0LxmPs3kj00gmYRHjWnPfpxKi3escuWUl4/4liKQmVdr5E9QNawq7q9CKgofXOi+0XDZFJEefBW/v59YreK4612mN8IBiYdcdCV48pIffZlaugoX5VelRMKjf2XH8ifvqYvYGAN6HylCNjgWu+BToVnuP/vVQdW4yrw5Ra3Fj8AkusU71mrBlSWVo9IlbysSPAlD0j+SGQQtlZRD3B1KGILqT+tMazvl45paTfnY5o5WH5BxAm0f6tRNlWSL/vSOOIaXJOGevmpbRCYEqyXJFnXSH/+KIDS4gu1Lc/YJWMz8D2FB/jcjCJGR79PWp7u46X27tykrvpONZp1DdIElbgXxXID1cu0y8mu7oxt6H9kaNs/92smLLVMjyQM2T4NSrTeaFsgd3tU2j+e+l2jtpkFgQ1234QMveFaEc8+k/NB1U07o/0616MFxKo/AdSgCw+emnpGfoSYXO62xjZqjrl3EB2YfYAXw== 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)(1800799015)(376005)(81742002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZUJkSVRkbW40TU5kVEtEZGcwUEdiUzcyNU1DdjZzeThBVVFTTVlaUUdLMHpN?= =?utf-8?B?bFd5blJieXJUamt6UmVsTGVpN3M2R0E0ZGl3Rzk5QWhsNzNCR0ZIV1FCdEsv?= =?utf-8?B?VWQ5ajVBTmFYekJTdjNWcm5NRGZWQytldnJteVZuMVROeUwxUklqNlExQTlr?= =?utf-8?B?UnVvd0czc2lZMXgyMHhFR1NWclBLaWdjVmlvK2dHUFlSODdnR1VFZUExU2FI?= =?utf-8?B?Z0VNQ0hwekkzUEtYS2FId3NUT2RLTzVHcmpvc3dDVjhXcmFYSUJnY0l4cVFa?= =?utf-8?B?T084MW5LcVhEU3pmNXBTMTJhSno1YXN5Q1cwbkRubFRnUlJSRmVZMVlnUnpX?= =?utf-8?B?ZFhwL0JvOHM5RU5qYlhVUSs3NjRkYzhYMlM1RVhRQmNOamVEb0wzYUhmbUov?= =?utf-8?B?V29FZGxSbGw3d3JHQWlteVZJV2RyTDRvWnVGQ2tUVWJoWDFkUm1KQzlVZHY2?= =?utf-8?B?Qy9qNTE1UlV6VTVBamg1cS9ZZUllSU1ZNlZVbnNVSVJOQWE0eGZSM2dwVFhU?= =?utf-8?B?aWU5WGp0SWNJVVYvNmdDQnYxM0RCWENEUzRoOFRGbFlGbmFOcW00eEEraExZ?= =?utf-8?B?c3A3bFBtcXl6Mk4yU3VXT3NLRmI1Z1ZrSzE0SnVRVzZsTHJZc0NEYWprTzRO?= =?utf-8?B?YjlNdUlWTVRZN2hVeUhkZU1ib2IzZXVwODc3dFZ1TXhHS0R2elBQUG1WbEV6?= =?utf-8?B?R25DOEtVL0dTYS81SjVRVnBaTkx4eE1lT3JlREtqOUN5a3NKeTh3bklJR0tM?= =?utf-8?B?UWFGNEsydnEwaERRa2UvS3VnVTVoZXFuODBhRTlXam5ISVNPUjNkOWhIN29J?= =?utf-8?B?Q29pNnFxU3E5cTVDUnBiRE1pcHlmTVlHenZnc3J2ejVITmNxYXM1R2cxS0N5?= =?utf-8?B?cmR2UVF0NnkraU83a0haamFrZFg0OVlvaklVQ3ptOTdJMi9XcTB4c3h0MWY3?= =?utf-8?B?R1UrUWtmRHQwZVdXbzdjVjloYTVPNjhWOFRTY2FVMEtMRnNCb2d5STRPYzFH?= =?utf-8?B?dFJwY0hjTU8yS3A3QnRZODJWMHhieWlyNThRTnpHWHRDeTA0OUpQNUh1b2Ry?= =?utf-8?B?OXFEdFVSa3pnK3hJS3crSk5DVEliLy9QK1RGNFZLUW0yQlJkZ0FNdVVSdDFi?= =?utf-8?B?Z3cwV1huVHJORGowSkk0Z3R5Z3pBbVhzQkUrQUZKRlh0U2sxcVh1T2xRNHRT?= =?utf-8?B?c2ZtRUw5WkhEL1VoWWRYajF3bmFOYjVPdWtJeEtZN09oS1dsNkRkRUduYy9t?= =?utf-8?B?YjN1RG1nK01SS2N1aS80ZHNmYm9UNk1PdmxvU2taTGo4b1hKRDlMaUF2RWVK?= =?utf-8?B?QmtQZWM4eFdWTHF0RzF4WjBxTlk3M0pWbHdPeGFvMUxtajRWM2E3d3V4N1po?= =?utf-8?B?ODl4YUVlMzBYcDNCYXRoRGFFR1NhWUFTblZ2bGhxS1NaRjNqWWNOTDg2RGox?= =?utf-8?B?VVpSUjVsWlBDT0d0WGZOUGF0UWszcmEvMFFWTmdBUU9WS24xMHRkSk5VdDlX?= =?utf-8?B?VVRqVDk3akNPK0RwTGtkRDFkMXJKRFpWQk9GcWJRZjBnc0R5b3ZRNnhiYnJw?= =?utf-8?B?N3VLSlVoVTg3REZNSGtsZXVpYTBvb1RjS1pNeUhaZFQ2dmtKK1lGZjFOSzRq?= =?utf-8?B?RHlKQzY1RWRFdVQxNjR5VkF4TFBXWW53Vll6bFVuRXdCMXRMRllLNTBlbE4r?= =?utf-8?B?ZmJqWTNjaXBBRVVPZzJWdVgzNmtYeGd0cDJmRHJwTmRwUVpkZ0F5OTNRYnJu?= =?utf-8?B?WEx2YzA4MThRUWl3WGl5dHZacG11RGMxeGhhK2dMYkV2UmgySStueG1telBM?= =?utf-8?B?US8yTFBOQnM4YWNrbWJBQ3NOUExBQVMyZW42eGRiQjZmSUppbzVKQnZhbTdh?= =?utf-8?B?U0NRUVIvdElRK0pEd3dNenpJRmJONGIveEVOMGo2SEM3eTJvUjZyVHM5SzhV?= =?utf-8?B?a1k3aU85WXRNeFdXbnlST1JmZlYvVXc1Snh3YjdxQVBxSzRHTVJCRVlDYm0r?= =?utf-8?B?MVR6VWdMaUNlZGtGSFhWb3lSUU5UWlJDNEtwZE1PTGlVblNWVmsvdEdJcWlB?= =?utf-8?B?ck5sb1grbHdBakhMTmJmSStVeTFVaGJHUXV5SXVjWmxBMTZhL1V4c2c1U29L?= =?utf-8?Q?dnujXoPHGY8FhGaYZcFgEYRWT?= X-OriginatorOrg: polimi.it X-MS-Exchange-CrossTenant-Network-Message-Id: 3b8cc270-b7a4-4b86-0d3a-08dc4ceada4e X-MS-Exchange-CrossTenant-AuthSource: DU0P251MB0720.EURP251.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Mar 2024 16:44:34.9323 (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: yq+Lhm0DI7FTZS1ejhOdvg6Q+8aRA3zs98WBi5N76S6zPVensyvVorNz+NF4J5mViWh0kjlpW3T5h/ybl3wl3Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8P251MB0935 Subject: Re: [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: , From: Andrea Mastroberti via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: Andrea Mastroberti <10736595@polimi.it> Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --------------xuTQOAOygi3XsY0wcqZAxHQg Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 3/25/24 9:49 AM, Andrea Mastroberti wrote: > 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(-) > > 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), > 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); >  } --------------xuTQOAOygi3XsY0wcqZAxHQg Content-Type: message/rfc822; name="0001-Added-alpha-layer-support-for-smartblur.eml" Content-Disposition: attachment; filename="0001-Added-alpha-layer-support-for-smartblur.eml" Content-Transfer-Encoding: 7bit From: Andrea Mastroberti <10736595@polimi.it> Date: Tue, 19 Mar 2024 17:44:04 +0100 Subject: [PATCH] Added alpha layer support for smartblur X-Unsent: 1 To: ffmpeg-devel@ffmpeg.org Content-Type: text/plain MIME-Version: 1.0 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(-) 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), 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); } -- 2.44.0 --------------xuTQOAOygi3XsY0wcqZAxHQg Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". --------------xuTQOAOygi3XsY0wcqZAxHQg--