From patchwork Wed Jan 3 15:32:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 45457 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:6623:b0:194:e134:edd4 with SMTP id n35csp7327691pzh; Wed, 3 Jan 2024 07:33:28 -0800 (PST) X-Google-Smtp-Source: AGHT+IFHOWKrVyiHl8ocXyB4ZmUjgkeqdnIrksGWg8j2d49zOMYZ8Bk6MwJKv7TNoJ+esgOshvhS X-Received: by 2002:a05:6512:4c1:b0:50e:aa77:5341 with SMTP id w1-20020a05651204c100b0050eaa775341mr27543lfq.23.1704296008223; Wed, 03 Jan 2024 07:33:28 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id s13-20020a056402520d00b00554c01b4588si9415989edd.257.2024.01.03.07.33.27; Wed, 03 Jan 2024 07:33:28 -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=@outlook.com header.s=selector1 header.b="cfm/fWpM"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0BDC568CBF3; Wed, 3 Jan 2024 17:33:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from APC01-TYZ-obe.outbound.protection.outlook.com (mail-tyzapc01olkn2033.outbound.protection.outlook.com [40.92.107.33]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4875F68CBF3 for ; Wed, 3 Jan 2024 17:33:10 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kfrC/sPpDUuxzfA3QWvS7T4zQm7cSL6uc2PYNP8DZq48bEstza2b/UW2jcpPvzfl2P5WoPEe3KWee0U5rN93Q8KuHNFwuXvPp/wUgUTtw5SS21LSfBu8qXSlaMYl1mMRgCB3v2EodE4Wwrk5YsHDC9ROv3u3J5tuBktsNP34n5arGWQMtjmxW+AcHrfScuy3DcuCg1/DrAnl3wPpevQ/SARprsE7VJX/AWWpNv8VHNKa4j2bOXgHJ77Lytb8zBE8dpm07LQsTlopKMifp3VjEyRyMFm7znqGCFkxHCvj0ZjerOUU0NvZNu1lPhqo1I9cxsY3AK0oms8nUf4kOLa3nA== 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=XNB+mcIHQdQsk/4jqZ62ubrukdlM4dvtbVYEvxoBkzY=; b=aoVnWp9YF86FTu4xm2qU6X57OOCJ8LZhQ8x0qGOgeI17x1+wCqb5NovJbGCKJn4JEtyGsH4h/LL8INsZjroG+wR4nof2j416QffLlFg4Wizem0RbN0ql08K25vqlhH8tBVg0SAoboP12jFZl32kYG0/kdZjl191GDsxm/oOa7vv2vu64ct3BGFp32kI2jnERgI3xmbJnIlOjp0I0z97cOD8pJLKrNh0FpRRD3fwRFK78ACaEnHMFhZh6g663xcKHNrYPzpNdIZjc6JM3zEJ0Ud75dgNDtc+7Dj+xbdvgNaaVtwH2iO8YnCIqQbuihzvQaDHTAQMZKxheQTMnnqiiPA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XNB+mcIHQdQsk/4jqZ62ubrukdlM4dvtbVYEvxoBkzY=; b=cfm/fWpMBuKB4GePiJJBpcatNVXe0wnrkqWnCDPYxfdV3e7P+IVMbWQk+CBiSAJIUukorImem+SFmgoihIsInPDBRmHTPuaV0a3a6nCohwNxgPwZLPNEh0b47GMjsrT4WerDtHacMGtsWmh8tUWosRXM5oXLgCX9QlLYFxQ8E8PZYdmxHrfLeQ230AHDDBEsWqZ8omekZypWlsahkVteLDyGpQZPTORIo+vkkpP1/GPYi9G0LSrX8CoqvK+KYkD0rY/ox6W46K2V9Ku2BTSDoYplunimlkc3v+N7T9pnaDti8EekVn+ZSjDiqFnibUivRe6+Krm6S3IiTPJpNOY5bg== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEYPR06MB5085.apcprd06.prod.outlook.com (2603:1096:101:55::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7159.13; Wed, 3 Jan 2024 15:33:00 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7%7]) with mapi id 15.20.7159.013; Wed, 3 Jan 2024 15:33:00 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Jan 2024 23:32:35 +0800 Message-ID: X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240103153238.18678-1-nuomi2021@gmail.com> References: <20240103153238.18678-1-nuomi2021@gmail.com> X-TMN: [6H5kCR+WcZ0sWQ++yrHY8OSmY4cjP5d4] X-ClientProxiedBy: SI1PR02CA0008.apcprd02.prod.outlook.com (2603:1096:4:1f7::14) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240103153238.18678-2-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEYPR06MB5085:EE_ X-MS-Office365-Filtering-Correlation-Id: 74ad18b8-8a12-4667-438f-08dc0c7144b2 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: vdyaweFncocUBYXc3Px3LvCrpYL21PXPEG7KiUfqJ+D3dEMB2gezY9a1smW8MtkcDE8myft2WHwjPNiY9qVSpWlMvfeOqVOQUWfZdBU5Vfs35Q7pTmZMaErgd0H8mopSlIzyUmAQT1m6KsNiDHq8y9iszCKuydK2sOi17hrtZNlBEvxpiQbIqeuRB0Y4PE7zysFzjBnaG1COreqUpBCTIdfhi4SP6oMnZsvRQJcP1xCoZRVOJvS4k+Dg4XsVW5cUMLD1a6LM/1Hdq/uu9VtIdMnpmaTCcYELTA8Cq9WEZOwqkp0oEPIICN6WCsbKxdWo/VJxSReEHHC1JpYOibkQpPeqk0ZdAeRrnAO2Sj8TADgOaqegAVLiiSynS5zVeqVrzJ/+ATwmjHW068thWcIxFXrW9bTwZvbM+Pz2DgT93qzTkLX+PkEsav6xdtHr+a/E0McEgbmxJPoDMbCHAQlaAMXdaSwSTym19c9Bsm8pl74/FbPbtHU/4yax+JLvRviJ/WcITHbzHCQpkSITKGK4wxTlEcwJ/CWnyv/4nWIhsmd0LAeIelm9lQELic6kZJxQPIYQJwIIy7J9r1Kqy68xXj4Nas0H3yVmR6Y1QjIG27OW33YOQ0PN4OKgEDalJrbj X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: pNpEBoK5lWVn517kW/O84xXKKqhL5HPwScsoKYBaQwjezXi75OXGE9J03YSqUTHV+MhEbDIXYEa3W3gqPy1hyyMrmDOwc724y0um1GJVv3oVaCQMqxd6XRWYkaMgND4OR4sfwyhpRv6MAX/EBlcgUZMspFVErkyI/M785Y2kATcmXtia1QSsQbNuH5Wu/H63OUlPLmXr025zFCeqBR/0TW2jXCFrIFfx4ac4w5VA+VgQnTPe0TFJM5nxUzvsX6Cr0i10Sgm7RKKZfABCI4/rnQpfjCg1Ob8aC8UUEpBEIJuBxhODe2hVE/wmCp5uhKkPhP6XwroAwNBeZnoWYCiKVtGRAUV/irsELTycaN6oS7VRaQoKnY3Jex3jTTv28nr8Q8NVYMz+Xkz1rh4E6MevGe9laZFXUIZhmpZja2/qXAZ4zkOcQwTmcp8hsIuBJeExek2q/oqy8vyrdd0/Y3cIXzn3IPwhv2LKsuXlSCt+/c4BZJvOdQUVjZLGlIMlrYVONv3XlVkr5+UVLL1Ehm8lRgmzUhDq0SLn3SlP7lQB4r+vQ8d3Rjez6DEyh4gDYeyELt7IbydnoN+aN7SznPMLL4AL6l/Fof2OIWWbDroXg6iyEj7ddDjpHT3Z5nWukzLgrYatdQSJNgdwYCEy83Uc2noTnFvD/8dZ0GAPckNJnc/uQN76S90ujDZ27PPUb/IaGe9bB5d+3wWc/7kKiRbl1ovx8PYgFT50/PPUBZ+px93vntgtoyzFLoX8zrTN4NJlI6oncLfYhVMzd/tuCdSCgbuEA/vxRnN5RaIukL9oicvdfD4EyF4M7peFmfk2q4aPfPTeKXFU4KJJL3ug0xyZ3rUkjY/kM73m6EiEkan280sNAJvmGJhVQnUEzzwomextZ0KoQfCZZ4OmBLHdIxr30dO9gNZQdj5a5sZG3YOJRSXRED/5/Auz6tXXgFm7iY8EWdRcUqq7t2iRWfso1zUL1CrF5bNm/6o2EoZmRIeODG05JDVxz9vXTsUc+bcuOhtzX+YMAqsRDLKfij/LAwstarPKhDVDXPdXZrAepMuRAcJVx19PxY8rViC33NsEAOJ1AeQpdD2tIPAcLa1FKT5fOeuZy6+tJfrCrat2Gz9+KG06whyj3pDpWEIsJ4TBTuOR4ieM6biWPTmTSUHcIdmjyrMiOOGdUcJ9UgYxQBX7gFDByifGHjvppxOnLy3JbdwPSTeJjxCCQKA7s8T07G8m39nquT4kPUZ39DhtxKsR8ofpVpYFxjUWukYpOyj+So/m X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 74ad18b8-8a12-4667-438f-08dc0c7144b2 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Jan 2024 15:33:00.6675 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB5085 Subject: [FFmpeg-devel] [PATCH 1/4] hevcdec: move sao template to xvc_sao_template.c 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: , Reply-To: FFmpeg development discussions and patches Cc: Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: b4APJdQvg7LD --- libavcodec/hevcdsp_template.c | 196 +----------------------------- libavcodec/xvc_sao_template.c | 217 ++++++++++++++++++++++++++++++++++ 2 files changed, 218 insertions(+), 195 deletions(-) create mode 100644 libavcodec/xvc_sao_template.c diff --git a/libavcodec/hevcdsp_template.c b/libavcodec/hevcdsp_template.c index 725fab99ed..00786bb2f8 100644 --- a/libavcodec/hevcdsp_template.c +++ b/libavcodec/hevcdsp_template.c @@ -25,6 +25,7 @@ #include "bit_depth_template.c" #include "hevcdsp.h" +#include "xvc_sao_template.c" static void FUNC(put_pcm)(uint8_t *_dst, ptrdiff_t stride, int width, int height, GetBitContext *gb, int pcm_bit_depth) @@ -295,201 +296,6 @@ IDCT_DC(32) #undef SET #undef SCALE -static void FUNC(sao_band_filter)(uint8_t *_dst, const uint8_t *_src, - ptrdiff_t stride_dst, ptrdiff_t stride_src, - const int16_t *sao_offset_val, int sao_left_class, - int width, int height) -{ - pixel *dst = (pixel *)_dst; - const pixel *src = (const pixel *)_src; - int offset_table[32] = { 0 }; - int k, y, x; - int shift = BIT_DEPTH - 5; - - stride_dst /= sizeof(pixel); - stride_src /= sizeof(pixel); - - for (k = 0; k < 4; k++) - offset_table[(k + sao_left_class) & 31] = sao_offset_val[k + 1]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel(src[x] + offset_table[(src[x] >> shift) & 31]); - dst += stride_dst; - src += stride_src; - } -} - -#define CMP(a, b) (((a) > (b)) - ((a) < (b))) - -static void FUNC(sao_edge_filter)(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, const int16_t *sao_offset_val, - int eo, int width, int height) { - - static const uint8_t edge_idx[] = { 1, 2, 0, 3, 4 }; - static const int8_t pos[4][2][2] = { - { { -1, 0 }, { 1, 0 } }, // horizontal - { { 0, -1 }, { 0, 1 } }, // vertical - { { -1, -1 }, { 1, 1 } }, // 45 degree - { { 1, -1 }, { -1, 1 } }, // 135 degree - }; - pixel *dst = (pixel *)_dst; - const pixel *src = (const pixel *)_src; - int a_stride, b_stride; - int x, y; - ptrdiff_t stride_src = (2*MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / sizeof(pixel); - stride_dst /= sizeof(pixel); - - a_stride = pos[eo][0][0] + pos[eo][0][1] * stride_src; - b_stride = pos[eo][1][0] + pos[eo][1][1] * stride_src; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - int diff0 = CMP(src[x], src[x + a_stride]); - int diff1 = CMP(src[x], src[x + b_stride]); - int offset_val = edge_idx[2 + diff0 + diff1]; - dst[x] = av_clip_pixel(src[x] + sao_offset_val[offset_val]); - } - src += stride_src; - dst += stride_dst; - } -} - -static void FUNC(sao_edge_restore_0)(uint8_t *_dst, const uint8_t *_src, - ptrdiff_t stride_dst, ptrdiff_t stride_src, const SAOParams *sao, - const int *borders, int _width, int _height, - int c_idx, const uint8_t *vert_edge, - const uint8_t *horiz_edge, const uint8_t *diag_edge) -{ - int x, y; - pixel *dst = (pixel *)_dst; - const pixel *src = (const pixel *)_src; - const int16_t *sao_offset_val = sao->offset_val[c_idx]; - int sao_eo_class = sao->eo_class[c_idx]; - int init_x = 0, width = _width, height = _height; - - stride_dst /= sizeof(pixel); - stride_src /= sizeof(pixel); - - if (sao_eo_class != SAO_EO_VERT) { - if (borders[0]) { - int offset_val = sao_offset_val[0]; - for (y = 0; y < height; y++) { - dst[y * stride_dst] = av_clip_pixel(src[y * stride_src] + offset_val); - } - init_x = 1; - } - if (borders[2]) { - int offset_val = sao_offset_val[0]; - int offset = width - 1; - for (x = 0; x < height; x++) { - dst[x * stride_dst + offset] = av_clip_pixel(src[x * stride_src + offset] + offset_val); - } - width--; - } - } - if (sao_eo_class != SAO_EO_HORIZ) { - if (borders[1]) { - int offset_val = sao_offset_val[0]; - for (x = init_x; x < width; x++) - dst[x] = av_clip_pixel(src[x] + offset_val); - } - if (borders[3]) { - int offset_val = sao_offset_val[0]; - ptrdiff_t y_stride_dst = stride_dst * (height - 1); - ptrdiff_t y_stride_src = stride_src * (height - 1); - for (x = init_x; x < width; x++) - dst[x + y_stride_dst] = av_clip_pixel(src[x + y_stride_src] + offset_val); - height--; - } - } -} - -static void FUNC(sao_edge_restore_1)(uint8_t *_dst, const uint8_t *_src, - ptrdiff_t stride_dst, ptrdiff_t stride_src, const SAOParams *sao, - const int *borders, int _width, int _height, - int c_idx, const uint8_t *vert_edge, - const uint8_t *horiz_edge, const uint8_t *diag_edge) -{ - int x, y; - pixel *dst = (pixel *)_dst; - const pixel *src = (const pixel *)_src; - const int16_t *sao_offset_val = sao->offset_val[c_idx]; - int sao_eo_class = sao->eo_class[c_idx]; - int init_x = 0, init_y = 0, width = _width, height = _height; - - stride_dst /= sizeof(pixel); - stride_src /= sizeof(pixel); - - if (sao_eo_class != SAO_EO_VERT) { - if (borders[0]) { - int offset_val = sao_offset_val[0]; - for (y = 0; y < height; y++) { - dst[y * stride_dst] = av_clip_pixel(src[y * stride_src] + offset_val); - } - init_x = 1; - } - if (borders[2]) { - int offset_val = sao_offset_val[0]; - int offset = width - 1; - for (x = 0; x < height; x++) { - dst[x * stride_dst + offset] = av_clip_pixel(src[x * stride_src + offset] + offset_val); - } - width--; - } - } - if (sao_eo_class != SAO_EO_HORIZ) { - if (borders[1]) { - int offset_val = sao_offset_val[0]; - for (x = init_x; x < width; x++) - dst[x] = av_clip_pixel(src[x] + offset_val); - init_y = 1; - } - if (borders[3]) { - int offset_val = sao_offset_val[0]; - ptrdiff_t y_stride_dst = stride_dst * (height - 1); - ptrdiff_t y_stride_src = stride_src * (height - 1); - for (x = init_x; x < width; x++) - dst[x + y_stride_dst] = av_clip_pixel(src[x + y_stride_src] + offset_val); - height--; - } - } - - { - int save_upper_left = !diag_edge[0] && sao_eo_class == SAO_EO_135D && !borders[0] && !borders[1]; - int save_upper_right = !diag_edge[1] && sao_eo_class == SAO_EO_45D && !borders[1] && !borders[2]; - int save_lower_right = !diag_edge[2] && sao_eo_class == SAO_EO_135D && !borders[2] && !borders[3]; - int save_lower_left = !diag_edge[3] && sao_eo_class == SAO_EO_45D && !borders[0] && !borders[3]; - - // Restore pixels that can't be modified - if(vert_edge[0] && sao_eo_class != SAO_EO_VERT) { - for(y = init_y+save_upper_left; y< height-save_lower_left; y++) - dst[y*stride_dst] = src[y*stride_src]; - } - if(vert_edge[1] && sao_eo_class != SAO_EO_VERT) { - for(y = init_y+save_upper_right; y< height-save_lower_right; y++) - dst[y*stride_dst+width-1] = src[y*stride_src+width-1]; - } - - if(horiz_edge[0] && sao_eo_class != SAO_EO_HORIZ) { - for(x = init_x+save_upper_left; x < width-save_upper_right; x++) - dst[x] = src[x]; - } - if(horiz_edge[1] && sao_eo_class != SAO_EO_HORIZ) { - for(x = init_x+save_lower_left; x < width-save_lower_right; x++) - dst[(height-1)*stride_dst+x] = src[(height-1)*stride_src+x]; - } - if(diag_edge[0] && sao_eo_class == SAO_EO_135D) - dst[0] = src[0]; - if(diag_edge[1] && sao_eo_class == SAO_EO_45D) - dst[width-1] = src[width-1]; - if(diag_edge[2] && sao_eo_class == SAO_EO_135D) - dst[stride_dst*(height-1)+width-1] = src[stride_src*(height-1)+width-1]; - if(diag_edge[3] && sao_eo_class == SAO_EO_45D) - dst[stride_dst*(height-1)] = src[stride_src*(height-1)]; - - } -} - -#undef CMP - //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// diff --git a/libavcodec/xvc_sao_template.c b/libavcodec/xvc_sao_template.c new file mode 100644 index 0000000000..b3eb8a3deb --- /dev/null +++ b/libavcodec/xvc_sao_template.c @@ -0,0 +1,217 @@ +/* + * HEVC/VVC SAO template + * + * Copyright (C) 2024 Nuo Mi + * Copyright (C) 2012 - 2013 Guillaume Martres + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +static void FUNC(sao_band_filter)(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, + const int16_t *sao_offset_val, int sao_left_class, + int width, int height) +{ + pixel *dst = (pixel *)_dst; + const pixel *src = (const pixel *)_src; + int offset_table[32] = { 0 }; + int k, y, x; + int shift = BIT_DEPTH - 5; + + stride_dst /= sizeof(pixel); + stride_src /= sizeof(pixel); + + for (k = 0; k < 4; k++) + offset_table[(k + sao_left_class) & 31] = sao_offset_val[k + 1]; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + dst[x] = av_clip_pixel(src[x] + offset_table[(src[x] >> shift) & 31]); + dst += stride_dst; + src += stride_src; + } +} + +#define CMP(a, b) (((a) > (b)) - ((a) < (b))) + +static void FUNC(sao_edge_filter)(uint8_t *_dst, const uint8_t *_src, ptrdiff_t stride_dst, const int16_t *sao_offset_val, + int eo, int width, int height) { + + static const uint8_t edge_idx[] = { 1, 2, 0, 3, 4 }; + static const int8_t pos[4][2][2] = { + { { -1, 0 }, { 1, 0 } }, // horizontal + { { 0, -1 }, { 0, 1 } }, // vertical + { { -1, -1 }, { 1, 1 } }, // 45 degree + { { 1, -1 }, { -1, 1 } }, // 135 degree + }; + pixel *dst = (pixel *)_dst; + const pixel *src = (const pixel *)_src; + int a_stride, b_stride; + int x, y; + ptrdiff_t stride_src = (2*MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / sizeof(pixel); + stride_dst /= sizeof(pixel); + + a_stride = pos[eo][0][0] + pos[eo][0][1] * stride_src; + b_stride = pos[eo][1][0] + pos[eo][1][1] * stride_src; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + int diff0 = CMP(src[x], src[x + a_stride]); + int diff1 = CMP(src[x], src[x + b_stride]); + int offset_val = edge_idx[2 + diff0 + diff1]; + dst[x] = av_clip_pixel(src[x] + sao_offset_val[offset_val]); + } + src += stride_src; + dst += stride_dst; + } +} + +static void FUNC(sao_edge_restore_0)(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, const SAOParams *sao, + const int *borders, int _width, int _height, + int c_idx, const uint8_t *vert_edge, + const uint8_t *horiz_edge, const uint8_t *diag_edge) +{ + int x, y; + pixel *dst = (pixel *)_dst; + const pixel *src = (const pixel *)_src; + const int16_t *sao_offset_val = sao->offset_val[c_idx]; + int sao_eo_class = sao->eo_class[c_idx]; + int init_x = 0, width = _width, height = _height; + + stride_dst /= sizeof(pixel); + stride_src /= sizeof(pixel); + + if (sao_eo_class != SAO_EO_VERT) { + if (borders[0]) { + int offset_val = sao_offset_val[0]; + for (y = 0; y < height; y++) { + dst[y * stride_dst] = av_clip_pixel(src[y * stride_src] + offset_val); + } + init_x = 1; + } + if (borders[2]) { + int offset_val = sao_offset_val[0]; + int offset = width - 1; + for (x = 0; x < height; x++) { + dst[x * stride_dst + offset] = av_clip_pixel(src[x * stride_src + offset] + offset_val); + } + width--; + } + } + if (sao_eo_class != SAO_EO_HORIZ) { + if (borders[1]) { + int offset_val = sao_offset_val[0]; + for (x = init_x; x < width; x++) + dst[x] = av_clip_pixel(src[x] + offset_val); + } + if (borders[3]) { + int offset_val = sao_offset_val[0]; + ptrdiff_t y_stride_dst = stride_dst * (height - 1); + ptrdiff_t y_stride_src = stride_src * (height - 1); + for (x = init_x; x < width; x++) + dst[x + y_stride_dst] = av_clip_pixel(src[x + y_stride_src] + offset_val); + height--; + } + } +} + +static void FUNC(sao_edge_restore_1)(uint8_t *_dst, const uint8_t *_src, + ptrdiff_t stride_dst, ptrdiff_t stride_src, const SAOParams *sao, + const int *borders, int _width, int _height, + int c_idx, const uint8_t *vert_edge, + const uint8_t *horiz_edge, const uint8_t *diag_edge) +{ + int x, y; + pixel *dst = (pixel *)_dst; + const pixel *src = (const pixel *)_src; + const int16_t *sao_offset_val = sao->offset_val[c_idx]; + int sao_eo_class = sao->eo_class[c_idx]; + int init_x = 0, init_y = 0, width = _width, height = _height; + + stride_dst /= sizeof(pixel); + stride_src /= sizeof(pixel); + + if (sao_eo_class != SAO_EO_VERT) { + if (borders[0]) { + int offset_val = sao_offset_val[0]; + for (y = 0; y < height; y++) { + dst[y * stride_dst] = av_clip_pixel(src[y * stride_src] + offset_val); + } + init_x = 1; + } + if (borders[2]) { + int offset_val = sao_offset_val[0]; + int offset = width - 1; + for (x = 0; x < height; x++) { + dst[x * stride_dst + offset] = av_clip_pixel(src[x * stride_src + offset] + offset_val); + } + width--; + } + } + if (sao_eo_class != SAO_EO_HORIZ) { + if (borders[1]) { + int offset_val = sao_offset_val[0]; + for (x = init_x; x < width; x++) + dst[x] = av_clip_pixel(src[x] + offset_val); + init_y = 1; + } + if (borders[3]) { + int offset_val = sao_offset_val[0]; + ptrdiff_t y_stride_dst = stride_dst * (height - 1); + ptrdiff_t y_stride_src = stride_src * (height - 1); + for (x = init_x; x < width; x++) + dst[x + y_stride_dst] = av_clip_pixel(src[x + y_stride_src] + offset_val); + height--; + } + } + + { + int save_upper_left = !diag_edge[0] && sao_eo_class == SAO_EO_135D && !borders[0] && !borders[1]; + int save_upper_right = !diag_edge[1] && sao_eo_class == SAO_EO_45D && !borders[1] && !borders[2]; + int save_lower_right = !diag_edge[2] && sao_eo_class == SAO_EO_135D && !borders[2] && !borders[3]; + int save_lower_left = !diag_edge[3] && sao_eo_class == SAO_EO_45D && !borders[0] && !borders[3]; + + // Restore pixels that can't be modified + if(vert_edge[0] && sao_eo_class != SAO_EO_VERT) { + for(y = init_y+save_upper_left; y< height-save_lower_left; y++) + dst[y*stride_dst] = src[y*stride_src]; + } + if(vert_edge[1] && sao_eo_class != SAO_EO_VERT) { + for(y = init_y+save_upper_right; y< height-save_lower_right; y++) + dst[y*stride_dst+width-1] = src[y*stride_src+width-1]; + } + + if(horiz_edge[0] && sao_eo_class != SAO_EO_HORIZ) { + for(x = init_x+save_upper_left; x < width-save_upper_right; x++) + dst[x] = src[x]; + } + if(horiz_edge[1] && sao_eo_class != SAO_EO_HORIZ) { + for(x = init_x+save_lower_left; x < width-save_lower_right; x++) + dst[(height-1)*stride_dst+x] = src[(height-1)*stride_src+x]; + } + if(diag_edge[0] && sao_eo_class == SAO_EO_135D) + dst[0] = src[0]; + if(diag_edge[1] && sao_eo_class == SAO_EO_45D) + dst[width-1] = src[width-1]; + if(diag_edge[2] && sao_eo_class == SAO_EO_135D) + dst[stride_dst*(height-1)+width-1] = src[stride_src*(height-1)+width-1]; + if(diag_edge[3] && sao_eo_class == SAO_EO_45D) + dst[stride_dst*(height-1)] = src[stride_src*(height-1)]; + + } +} + +#undef CMP From patchwork Wed Jan 3 15:32:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 45458 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:6623:b0:194:e134:edd4 with SMTP id n35csp7327815pzh; Wed, 3 Jan 2024 07:33:38 -0800 (PST) X-Google-Smtp-Source: AGHT+IEfp928OKO1LM77DXEia8WLoT5CMqNl/+d5yOOHU3WdG1T7WcmO56EpgnMCMSK+cWaru817 X-Received: by 2002:a05:6402:3113:b0:556:ecf7:d3a1 with SMTP id dc19-20020a056402311300b00556ecf7d3a1mr15160edb.111.1704296018289; Wed, 03 Jan 2024 07:33:38 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q6-20020a056402518600b00553366d0746si12777602edd.439.2024.01.03.07.33.37; Wed, 03 Jan 2024 07:33:38 -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=@outlook.com header.s=selector1 header.b=dlDyJRsP; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1D89568CC40; Wed, 3 Jan 2024 17:33:23 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from APC01-TYZ-obe.outbound.protection.outlook.com (mail-tyzapc01olkn2033.outbound.protection.outlook.com [40.92.107.33]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1C20468CC51 for ; Wed, 3 Jan 2024 17:33:16 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VlnGiKThWg0HT5YiOrgwQk6KiWXnzKkInJDYRCPq5kPlIeiAahe4RH5QPEYZN+bj2ryigJu5Y8Ndpp1jY5V+c9L/gb5xNm2nueS7cgmU0sq1KalIewTVxq7yuj3sNpOKdwqjLwPYkNTAdhVby6w0Ek1TEuNY0tZ4bAFY2/LxGuYP7YHXVoJHIt+NwLy5tskheotGhyMk2ndvbOpkxtJAcSySxebW+NbTZRndRo5Juh8TbJbW7FQw1JFYnbokqU3IoXm+5JybCON9FmEKuADNXEGHnCcWmPHgD7hB8tAFHmQ4dF9qttnAnTc2I7rDVovYYonGIlvLuMTT5pcpTIlY1Q== 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=n7Bv6JhmnWXk+G26rodRSTEcv0Ur2BgUR5TvaWshbC4=; b=KUKqSTqkm0oeeWyfJbTJeT2NaO7U/sU4byadCrYBQt0PkfMLBTkVegHxNbzwHzyansTptxrft7tIVZhHvDfmSXA1gWOnwdOc/gwLmw5LKQIsR5fMgK8GdlYjN7rkHbA8suuLm4YG33ab5X9sngeshL8Qt4CL60bMZHUOyTagGPLTzeD5lhCU/QddxV0Vh+9laaDocGDx4dAd2zy6gAMoxX3gP6zhNmviGV1fZP+qFLCHKkpgQCTl1hoPyTxASdv0VqjPmERPU8+5O0DU5a98sG08k/JaZ28ecoIifWJ/nZREXyY06oq4ak+v3QE+zQrl3y3Q4uckOWTDd6Pjde3Ysg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=n7Bv6JhmnWXk+G26rodRSTEcv0Ur2BgUR5TvaWshbC4=; b=dlDyJRsPZKmQg8e0gxvc0B9HSb1v8D+alM4es9hLGbH+2PfFdEzB/O7mxIOq7iVmbYHufyg71XQVYNV/mfAqin1f1yE0Ni8kAfGm60Mp0nDKMjTT+nsKTHgkuvYuxFnOt2hmw1p4l6vy6zZ9dVi7PV+/VTu20+5QyaKw9CLvn/9ku+//RcZEABbrS/uBWYge2ZxEP9OCxbSSeAHYUKHVKHM2wgYKLgctoCkMrfqvt+Y2qBTKccLjHPLDey/1GTk2gaeFxP1XqwnVtMu+LTPIwLkcsO41pdtuzW9ylMSU86w58tpgUK3I3itp9K6BVQe82HQzVlctteqzi5f0XtJOxg== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEYPR06MB5085.apcprd06.prod.outlook.com (2603:1096:101:55::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7159.13; Wed, 3 Jan 2024 15:33:01 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7%7]) with mapi id 15.20.7159.013; Wed, 3 Jan 2024 15:33:01 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Jan 2024 23:32:36 +0800 Message-ID: X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240103153238.18678-1-nuomi2021@gmail.com> References: <20240103153238.18678-1-nuomi2021@gmail.com> X-TMN: [25Av/KVDVKtze2urEVHU3mHibV5oe8Yb] X-ClientProxiedBy: SI1PR02CA0008.apcprd02.prod.outlook.com (2603:1096:4:1f7::14) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240103153238.18678-3-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEYPR06MB5085:EE_ X-MS-Office365-Filtering-Correlation-Id: e3f5e4ab-8a7f-45ec-15fe-08dc0c714565 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: +9XxcjUraklmLq5GMeVlX6DNTH1mzp/Ckp78XBigAhSw1T6t627PUW1rsNp4dbjsHT7ySwwoOPh3Gwjq/PC+2DvdN1ekqMliddz9q5lauNhGZMMWhcOLVkuWthrSn/nMu/za4nqhHZWPwaaNMxrHa2ovgbs7AiKPMsHhNVCAuBi30d/yDoCZ6tfKh8tiutOcJ/tfd5kZTHG0lU59We2pbpvkz72Jkj89KlLfRy8F1EtaZlSSSuEQ6ck+DwgbyTCOOYtt8bbRWZYY7u2IEjNyKgVh6RSOEqqAC9QdzOd1PKhsTudU1ekkByAr8c00HgkIuAWGTeLi+27yReSqrJsFjI84rMZNlIhRzQUNdf7e2oE0rv5+3P2VTXfEZzkEzxulIo+vQKOMf3rX+RN+BU1AmAWMc7ip5Hdih7rXL6Z33qaQIOdiAJmzTFNhuwPBVwYeXZk4bcHp0kBKtgG2BFPz5nhV3rc5QKFg9gmJgAI8VvYuDYCotMuy4tU9CFcuGbu8xB1h8/WB3YVdOeWbLg6YEHuCZtDWKZG0i05ysCVG2rtsBeVmioWapt+38SJWZrA5ypvHRifM059FCO0m113DTp4rlskrga++f0LCeJBU6Rw90OFrCot6Bp2giuup9VuG X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: jI6BUlyfLVao0AJp6AIXMtNWTsYjVvW4UtBjXUSXIAvvE9iBkeqcezDuSfcwITWtq/XtbUb/GHKwhy2+epPMBoxCNqVXrI+bNuLfCzi6vDHkAo/ultq3+30NOtc7S825nf4rWluaPm2YG4qIkZKIuSv39JpDn+jCiCh7uIiqC0ij7bE+adSI7IQ28P5Bt61IB0bQy9PQn+Tla7BgzxGxu/ZZO/zY1Yuuq2D2r/0rxuB2+L7eScLGZXvwM3cyx9NOaPd6TpbS6TW5xtRf0O2n3AiLlnGoaijubVLQ2a3ZD8LgUDePzREZz7f9EUdOsgzH8MY+v0RHCkydW/EURQMHF6larn1RpKb18pW9S/yRf4XvLxRs74FQy9llw3bToofb/l4K7H0o6ZBBU0my1JdurrWPgRPr/T9uhbjhQB2f5vbqRj6oGg985aHcu8oYfDcjIXp2v2y68sprCIGZ1SUoe2zZ8FfB8pivWuOkrIFyCVb4HHMz/0dFtwewsxmEjqULwDajbwnoawmX5XUE1Vc+Cu78L4wh+ocPyGPipxq3cHmiyvU2LCMEOCS8KJoLT92qciNBnuTA5IaFxAiqAoU3wQRjYoVZj/MRQ/8TT+UNz2dYwlOc83JAm45kouvWr1ACigJ/wDrEODzIg9vEQQjU06qGCW4kn5GGs8DLe4MmbUVl0nzcS4CxYG3bQ0hb+eKax+qlf5HMACGFKCaba6F5o9nZc/lG7vI/WzszJsH7a+5hiO1bCmb7tfsWGanJetssx1Ox0RKc/l5T8AxaW3QxxWpdce+6UqPjTpJZlMT4iGH15XzF/SDrxaVkPAJ4WWUYoXOA1bByTBZIGrx8XfJjz6sqb9QqjSofxaoXbf/X/xyM6RZEuyvpey1pKzpQ90qoKTl+6hHs6Q+H/tPdWoUvDgvABHknWUE6Z4VRGjPzJNsHYyp84iVSKr0W7FKBSNd61N6vznniRNtzNYHc/AHxbgcC9AIGnUvMogSlkVnoSqv/A8/892GnIgNmLN8w9lI2Cs94jX1NMvZ89HNT6Ysg3h2gjZbkk7hsQEv4s2vInfex4cjHlnUXtz04h31zbby8NCoEk4gaZhifhbtC6IM3oKxntKCPCE2LMDwd6zipSYoJnMlWOGdEM/zV5es7BDUSqIl4tlvrheLlNnEs3J2B7a6Q6scTiaeJvVnvBUWDt75BXEy/a89i6alwaCH5cXGOSgdAK3HwdXSn60Ird2/huq59g+tkmMO60AhD0SvaIIsiXotX4hwDT3UAlCpacApq X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: e3f5e4ab-8a7f-45ec-15fe-08dc0c714565 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Jan 2024 15:33:01.7574 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB5085 Subject: [FFmpeg-devel] [PATCH 2/4] vvcdec: reuse xvc_sao_template.c 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: , Reply-To: FFmpeg development discussions and patches Cc: Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4DqvmT5N1OGg --- libavcodec/vvc/vvc_filter_template.c | 193 +-------------------------- 1 file changed, 2 insertions(+), 191 deletions(-) diff --git a/libavcodec/vvc/vvc_filter_template.c b/libavcodec/vvc/vvc_filter_template.c index a4f1792ec4..04eb9702dc 100644 --- a/libavcodec/vvc/vvc_filter_template.c +++ b/libavcodec/vvc/vvc_filter_template.c @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavcodec/xvc_sao_template.c" + static void FUNC(lmcs_filter_luma)(uint8_t *_dst, ptrdiff_t dst_stride, const int width, const int height, const uint8_t *_lut) { const pixel *lut = (const pixel *)_lut; @@ -33,197 +35,6 @@ static void FUNC(lmcs_filter_luma)(uint8_t *_dst, ptrdiff_t dst_stride, const in } } -static void FUNC(sao_band_filter)(uint8_t *_dst, const uint8_t *_src, ptrdiff_t dst_stride, ptrdiff_t src_stride, - const int16_t *sao_offset_val, const int sao_left_class, const int width, const int height) -{ - pixel *dst = (pixel *)_dst; - const pixel *src = (pixel *)_src; - int offset_table[32] = { 0 }; - int k, y, x; - int shift = BIT_DEPTH - 5; - - dst_stride /= sizeof(pixel); - src_stride /= sizeof(pixel); - - for (k = 0; k < 4; k++) - offset_table[(k + sao_left_class) & 31] = sao_offset_val[k + 1]; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) - dst[x] = av_clip_pixel(src[x] + offset_table[src[x] >> shift]); - dst += dst_stride; - src += src_stride; - } -} - -#define CMP(a, b) (((a) > (b)) - ((a) < (b))) - -static void FUNC(sao_edge_filter)(uint8_t *_dst, const uint8_t *_src, ptrdiff_t dst_stride, - const int16_t *sao_offset_val, const int eo, const int width, const int height) -{ - static const uint8_t edge_idx[] = { 1, 2, 0, 3, 4 }; - static const int8_t pos[4][2][2] = { - { { -1, 0 }, { 1, 0 } }, // horizontal - { { 0, -1 }, { 0, 1 } }, // vertical - { { -1, -1 }, { 1, 1 } }, // 45 degree - { { 1, -1 }, { -1, 1 } }, // 135 degree - }; - pixel *dst = (pixel *)_dst; - const pixel *src = (pixel *)_src; - int a_stride, b_stride; - int x, y; - ptrdiff_t src_stride = (2 * MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / sizeof(pixel); - dst_stride /= sizeof(pixel); - - a_stride = pos[eo][0][0] + pos[eo][0][1] * src_stride; - b_stride = pos[eo][1][0] + pos[eo][1][1] * src_stride; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - int diff0 = CMP(src[x], src[x + a_stride]); - int diff1 = CMP(src[x], src[x + b_stride]); - int offset_val = edge_idx[2 + diff0 + diff1]; - dst[x] = av_clip_pixel(src[x] + sao_offset_val[offset_val]); - } - src += src_stride; - dst += dst_stride; - } -} - -static void FUNC(sao_edge_restore_0)(uint8_t *_dst, const uint8_t *_src, - ptrdiff_t dst_stride, ptrdiff_t src_stride, const SAOParams *sao, - const int *borders, const int _width, const int _height, const int c_idx, - const uint8_t *vert_edge, const uint8_t *horiz_edge, const uint8_t *diag_edge) -{ - int x, y; - pixel *dst = (pixel *)_dst; - const pixel *src = (pixel *)_src; - const int16_t *sao_offset_val = sao->offset_val[c_idx]; - const int sao_eo_class = sao->eo_class[c_idx]; - int init_x = 0, width = _width, height = _height; - - dst_stride /= sizeof(pixel); - src_stride /= sizeof(pixel); - - if (sao_eo_class != SAO_EO_VERT) { - if (borders[0]) { - int offset_val = sao_offset_val[0]; - for (y = 0; y < height; y++) { - dst[y * dst_stride] = av_clip_pixel(src[y * src_stride] + offset_val); - } - init_x = 1; - } - if (borders[2]) { - int offset_val = sao_offset_val[0]; - int offset = width - 1; - for (x = 0; x < height; x++) { - dst[x * dst_stride + offset] = av_clip_pixel(src[x * src_stride + offset] + offset_val); - } - width--; - } - } - if (sao_eo_class != SAO_EO_HORIZ) { - if (borders[1]) { - int offset_val = sao_offset_val[0]; - for (x = init_x; x < width; x++) - dst[x] = av_clip_pixel(src[x] + offset_val); - } - if (borders[3]) { - int offset_val = sao_offset_val[0]; - ptrdiff_t y_dst_stride = dst_stride * (height - 1); - ptrdiff_t y_src_stride = src_stride * (height - 1); - for (x = init_x; x < width; x++) - dst[x + y_dst_stride] = av_clip_pixel(src[x + y_src_stride] + offset_val); - height--; - } - } -} - -static void FUNC(sao_edge_restore_1)(uint8_t *_dst, const uint8_t *_src, - ptrdiff_t dst_stride, ptrdiff_t src_stride, const SAOParams *sao, - const int *borders, const int _width, const int _height, const int c_idx, - const uint8_t *vert_edge, const uint8_t *horiz_edge, const uint8_t *diag_edge) -{ - int x, y; - pixel *dst = (pixel *)_dst; - const pixel *src = (pixel *)_src; - const int16_t *sao_offset_val = sao->offset_val[c_idx]; - const int sao_eo_class = sao->eo_class[c_idx]; - int init_x = 0, init_y = 0, width = _width, height = _height; - - dst_stride /= sizeof(pixel); - src_stride /= sizeof(pixel); - - if (sao_eo_class != SAO_EO_VERT) { - if (borders[0]) { - int offset_val = sao_offset_val[0]; - for (y = 0; y < height; y++) { - dst[y * dst_stride] = av_clip_pixel(src[y * src_stride] + offset_val); - } - init_x = 1; - } - if (borders[2]) { - int offset_val = sao_offset_val[0]; - int offset = width - 1; - for (x = 0; x < height; x++) { - dst[x * dst_stride + offset] = av_clip_pixel(src[x * src_stride + offset] + offset_val); - } - width--; - } - } - if (sao_eo_class != SAO_EO_HORIZ) { - if (borders[1]) { - int offset_val = sao_offset_val[0]; - for (x = init_x; x < width; x++) - dst[x] = av_clip_pixel(src[x] + offset_val); - init_y = 1; - } - if (borders[3]) { - int offset_val = sao_offset_val[0]; - ptrdiff_t y_dst_stride = dst_stride * (height - 1); - ptrdiff_t y_src_stride = src_stride * (height - 1); - for (x = init_x; x < width; x++) - dst[x + y_dst_stride] = av_clip_pixel(src[x + y_src_stride] + offset_val); - height--; - } - } - - { - int save_upper_left = !diag_edge[0] && sao_eo_class == SAO_EO_135D && !borders[0] && !borders[1]; - int save_upper_right = !diag_edge[1] && sao_eo_class == SAO_EO_45D && !borders[1] && !borders[2]; - int save_lower_right = !diag_edge[2] && sao_eo_class == SAO_EO_135D && !borders[2] && !borders[3]; - int save_lower_left = !diag_edge[3] && sao_eo_class == SAO_EO_45D && !borders[0] && !borders[3]; - - // Restore pixels that can't be modified - if (vert_edge[0] && sao_eo_class != SAO_EO_VERT) { - for (y = init_y + save_upper_left; y < height - save_lower_left; y++) - dst[y * dst_stride] = src[y * src_stride]; - } - if (vert_edge[1] && sao_eo_class != SAO_EO_VERT) { - for (y = init_y + save_upper_right; y < height - save_lower_right; y++) - dst[y * dst_stride + width - 1] = src[y * src_stride + width - 1]; - } - - if (horiz_edge[0] && sao_eo_class != SAO_EO_HORIZ) { - for (x = init_x + save_upper_left; x < width - save_upper_right; x++) - dst[x] = src[x]; - } - if (horiz_edge[1] && sao_eo_class != SAO_EO_HORIZ) { - for (x = init_x + save_lower_left; x < width - save_lower_right; x++) - dst[(height - 1) * dst_stride + x] = src[(height - 1) * src_stride + x]; - } - if (diag_edge[0] && sao_eo_class == SAO_EO_135D) - dst[0] = src[0]; - if (diag_edge[1] && sao_eo_class == SAO_EO_45D) - dst[width - 1] = src[width - 1]; - if (diag_edge[2] && sao_eo_class == SAO_EO_135D) - dst[dst_stride * (height - 1) + width - 1] = src[src_stride * (height - 1) + width - 1]; - if (diag_edge[3] && sao_eo_class == SAO_EO_45D) - dst[dst_stride * (height - 1)] = src[src_stride * (height - 1)]; - - } -} - -#undef CMP - static av_always_inline int16_t FUNC(alf_clip)(pixel curr, pixel v0, pixel v1, int16_t clip) { return av_clip(v0 - curr, -clip, clip) + av_clip(v1 - curr, -clip, clip); From patchwork Wed Jan 3 15:32:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 45459 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:6623:b0:194:e134:edd4 with SMTP id n35csp7327905pzh; Wed, 3 Jan 2024 07:33:48 -0800 (PST) X-Google-Smtp-Source: AGHT+IE9jBQ+qKN8yQLJeDEX1XqWvZpiNVJZKneg7UbuvJCqxfnWgccuF6sb5BkMaPqyptkThSSo X-Received: by 2002:a17:906:1d0:b0:a23:6462:4d66 with SMTP id 16-20020a17090601d000b00a2364624d66mr9465765ejj.85.1704296028127; Wed, 03 Jan 2024 07:33:48 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id pv18-20020a170907209200b00a27fb1e91desi2568599ejb.213.2024.01.03.07.33.47; Wed, 03 Jan 2024 07:33:48 -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=@outlook.com header.s=selector1 header.b=NVqLLteA; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1FBC068CC8A; Wed, 3 Jan 2024 17:33:29 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from APC01-TYZ-obe.outbound.protection.outlook.com (mail-tyzapc01olkn2033.outbound.protection.outlook.com [40.92.107.33]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AC94968CC5B for ; Wed, 3 Jan 2024 17:33:21 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SjRjdA5AD0Swd+JtC/mBT1/wlyvbafXOhYeBdWqX/Ib+YPPOhBPOEIFk0/PrbrgDh/a+9vbTDakKN3a4QY/oKX77wwylFi6vHryVP9J2B12uQT8lS/jUhe5LbxDXGMRMhhl5mVnso0iSf6dwbvK4iGtLJJcdRB5ku34QYpnFUa4Bis7hnWtwm6G21Okics7YkkP7hy9/PlJhUwpo1uKGqz4mryVvnZTA3XfQJYVtxG4h2u+dWrWbuh+hRYaaF1CvT3A6AShKhWPWv/HZof8iOXsckuIs3lEhEuJAO75p/LurZAjh4mJZMYQ48ZeucSsnyJGDfdgVeW1V6DBoG2hPwQ== 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=v3M7s2fmvsvIA1rY9839pSJpt3HsQEI/anmh+EE6Li0=; b=lH7S5U91ejwODYcdOHuRbMukXzDsh0/dHuiilRs2NVRQFsBg4c9Snb6I+Ao5UYEGHD/ZPavesVtfXuVQ6vZVBKAjH2jSfgf36CUhHGNq799LfK7YBYeeMMQ7q93/NKlqp0vEPiySMsKcgG9y13Obpu9BZt6e1jx2qJsMfRy/K9AlzjzwNDvxIsUoTu+NthLAz5Frqx9X1XZLjksZgb3Q11E0VhFNGjE7UD6juW55G9Y8HCzuo9kRoBPlkVR0K0qDQKwMOYDhxDfXOS2lwBdnrU8WgA26izUjYQjZvSbimjfEjMSLEzL+UtxGm4Rwk0KxzwCqdJ8dczH+dWbfL7J8Iw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=v3M7s2fmvsvIA1rY9839pSJpt3HsQEI/anmh+EE6Li0=; b=NVqLLteAbsGNcDx8S9CUeanJgoR+/6vsfOairnrNd8x1ZO6KTbyVri4wffZ+9OUAz72q3gvYW4kIAyf7ldh5uxkAF87ApoCZM/D3X5NlJwKD+P1ukSAglVy5ZjRtCtrVlj9EaJDEuQ4OUmKJ9l5zfVM+arhn1Fm/polM138nnAZWmmgef426FzGixvBqg9UFIJBjMgN5anZVHIhC0b55PmtzoyVC9vHdJ0kmk9pfetaPJGhNgmcpK8qrBCd0aUDn5CfTxIS6JTX/Tqj2lihQiOZR78Ml4Grpo4kBpW2NBlpGmyp9zX2q3FatHFxQrUbm2FslWyR7l+DWOiMbNeQZhQ== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEYPR06MB5085.apcprd06.prod.outlook.com (2603:1096:101:55::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7159.13; Wed, 3 Jan 2024 15:33:03 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7%7]) with mapi id 15.20.7159.013; Wed, 3 Jan 2024 15:33:02 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Jan 2024 23:32:37 +0800 Message-ID: X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240103153238.18678-1-nuomi2021@gmail.com> References: <20240103153238.18678-1-nuomi2021@gmail.com> X-TMN: [saPlrVKIxazLgUlaPZiIa3l+Pg0ddXI2] X-ClientProxiedBy: SI1PR02CA0008.apcprd02.prod.outlook.com (2603:1096:4:1f7::14) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240103153238.18678-4-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEYPR06MB5085:EE_ X-MS-Office365-Filtering-Correlation-Id: 7687ddd5-77ce-4125-5ee2-08dc0c71460e X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: fcUzZI/Ws03EspUhods0ZPJxlaRXCQrPPOibyWeeAxGWFxLTnrUuSXYAITfn4xy2A3BrR7qkqp3R0GLpqkE9YrvNMokKbEwGFBnNSwS24DYzDU8GS4DcV8bTQO069G5z5/XUJLJ71KkqXypXywjclzfbOPKVpc4/l5jSXLR9IwUtZqPmxjprvoIbJOb2nX7POAzYcMMXEM7YGvsgzfLXT9yfE2x0RY/2RpLKwK2j3EFJkzkh39uf1qXRKiRpDeFtsJ7ailWvvX4+kFGpe3yIGFOgKEjVMREZ/rAVecmiZa2/em5jH8XmVrvI5q5rQM30DCcyS6MhlRPRqbt+WWFEDA/ZYFJXcvRIhVoXAmpdjXYbuX9deZl6i5adyd839p3Jn9gSdpzc/Qe3UDdv6Z88vzP6qre7AAZ9rvKvhNvGiCh6jeimPlAzcOyCTmlSHQwhP38uHVqW/tV+4N7Xai07sLbUZjASc9lfF8H6zvUobf279Y14Ifqcd+xg8B8OJr4FJsuRjv4MZuijFba485GwYugl/KQ+dbkD+pOYaPsD37aa3OOWMY6rXkNN2W18TAIAZXegb7utEWK0epPRdLJmLEYCemyr0xQQ8CYv3qbgvB+uexcNHVaijZEvftSEEa6J X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: tnC47XSW0LilgBKxcAxSO5ua37PcJpE1oVji6Cq0b16Odn37KKw2MN/jhFPlTsfsAVpPuiXo/e3rsiopZyDmvG4wedXGbUJif6qGBhoALRvgPk2tZyc2+5Zu1iJUuuEjpjy75wieXYh4UrunxzbHatSuWGjvOhT/AeU4+dFCqOgRIPwI1/d+bjPM6camxAo4QM+DSEPVe+wP/y+M9O5aIXOcYm3rhBPDiVFCdJ7XphCvmlqoeqYcCBgCA8lQTzPO2ZmZRLkQIR2yac/gTmxjUX/xPiaKYvlwbGw5UZWRdzKkHEUmmhyGTH+4JsVT42nrSTPcr1ZVYCF7xpeyNgbj+MGbDqvuCCuweMfadtj59ML48u4xUxctvgzYUgBr8pB2gARGIn1KglxLMc/wGBQwNHK0DL1CAhxTBk6FBLBEgKdUMCOk/x61pD3cNu3oqOjm4khWzvsEEzbaVrhBM/KgGIYVz/69L7kfSGHwRrPHvP9rf8hJ2VDwWRCyeaDH0xJ0w8QtO4uRykd5gU8nD+CprKFftwBdPTwPkyPsASxcEdO6lGCqSdn8JeEm9SjIHIhjB0oJdzW4sV9VPfx7E43LZp/P3/M2O27YN4zuIXVP+AT35z9JwR+G9w/XEmAyiDFQAUR5XfgBcQBXFJUPH9xZO7XgmWzT7ChbHMMSD4Alt7/R6iuFo8J4YT4ESwvg/EHtTguZUJnjZMsZrf8oU8sS9GLLv+fz1qcP5C1x5bEX2v9K9umeEvv9TN/ygGWsYPhe0T/tqXg6yw7GkcTx8cd5rr3m6fVNvOLfHHakghgNxCNkejDcmZWyghAhibFXBOwLhY5N+tnb6qGu2n5Fb6eWuQ7e4dqHw8DW6M/Ff88j/X03umZ4DHpUAPcQZc+7For1hqREYe5DM6Eae7qVMFhGoUMJUGWGmKT7vb+yykFqOOag+QAY9HRmxnm3dSTG/IVXV4UVZV3i01aX5AoNOiT14HqcSyekUiaxjNHbzOY/mSCLLY0BHaKgH8tssD5ZPAtKDUP+CxHRGwHE0VC4WJO5XGsYeQ6FqXSRhjtwHNXtiHGksRFFMw8k2O84z20aHBfzAiNVhlZsbmZGKGdtLICn6gzGUo//fgIM+p5VC/hJxP+dotLMoFNkPStZxDtYUiQ5/uOCe/T+sKL47HNm8Y3FmaHpQCIEjPiSa1rmyM1XBxSsywkE9wNLQ8VnyLialrBDLV7wByB//xeMgVf9/OgSDeRU6M+uOgOMLA0pgUdSOfETL2W8kdS8RMankfFNL/iR X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7687ddd5-77ce-4125-5ee2-08dc0c71460e X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Jan 2024 15:33:02.9347 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB5085 Subject: [FFmpeg-devel] [PATCH 3/4] hevcdec: move deblock template to xvc_deblock_template.c 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: , Reply-To: FFmpeg development discussions and patches Cc: Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: l1v55+yypz3R --- libavcodec/hevcdsp_template.c | 96 ++++++------------------------ libavcodec/xvc_deblock_template.c | 99 +++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 79 deletions(-) create mode 100644 libavcodec/xvc_deblock_template.c diff --git a/libavcodec/hevcdsp_template.c b/libavcodec/hevcdsp_template.c index 00786bb2f8..fb7d2ebb60 100644 --- a/libavcodec/hevcdsp_template.c +++ b/libavcodec/hevcdsp_template.c @@ -1319,19 +1319,20 @@ static void FUNC(put_hevc_epel_bi_w_hv)(uint8_t *_dst, ptrdiff_t _dststride, #define TQ2 pix[2 * xstride + 3 * ystride] #define TQ3 pix[3 * xstride + 3 * ystride] +#include "xvc_deblock_template.c" + static void FUNC(hevc_loop_filter_luma)(uint8_t *_pix, ptrdiff_t _xstride, ptrdiff_t _ystride, int beta, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q) { - int d, j; - pixel *pix = (pixel *)_pix; ptrdiff_t xstride = _xstride / sizeof(pixel); ptrdiff_t ystride = _ystride / sizeof(pixel); beta <<= BIT_DEPTH - 8; - for (j = 0; j < 2; j++) { + for (int j = 0; j < 2; j++) { + pixel* pix = (pixel*)_pix + j * 4 * ystride; const int dp0 = abs(P2 - 2 * P1 + P0); const int dq0 = abs(Q2 - 2 * Q1 + Q0); const int dp3 = abs(TP2 - 2 * TP1 + TP0); @@ -1342,10 +1343,7 @@ static void FUNC(hevc_loop_filter_luma)(uint8_t *_pix, const int no_p = _no_p[j]; const int no_q = _no_q[j]; - if (d0 + d3 >= beta) { - pix += 4 * ystride; - continue; - } else { + if (d0 + d3 < beta) { const int beta_3 = beta >> 3; const int beta_2 = beta >> 2; const int tc25 = ((tc * 5 + 1) >> 1); @@ -1353,63 +1351,16 @@ static void FUNC(hevc_loop_filter_luma)(uint8_t *_pix, if (abs(P3 - P0) + abs(Q3 - Q0) < beta_3 && abs(P0 - Q0) < tc25 && abs(TP3 - TP0) + abs(TQ3 - TQ0) < beta_3 && abs(TP0 - TQ0) < tc25 && (d0 << 1) < beta_2 && (d3 << 1) < beta_2) { - // strong filtering const int tc2 = tc << 1; - for (d = 0; d < 4; d++) { - const int p3 = P3; - const int p2 = P2; - const int p1 = P1; - const int p0 = P0; - const int q0 = Q0; - const int q1 = Q1; - const int q2 = Q2; - const int q3 = Q3; - if (!no_p) { - P0 = p0 + av_clip(((p2 + 2 * p1 + 2 * p0 + 2 * q0 + q1 + 4) >> 3) - p0, -tc2, tc2); - P1 = p1 + av_clip(((p2 + p1 + p0 + q0 + 2) >> 2) - p1, -tc2, tc2); - P2 = p2 + av_clip(((2 * p3 + 3 * p2 + p1 + p0 + q0 + 4) >> 3) - p2, -tc2, tc2); - } - if (!no_q) { - Q0 = q0 + av_clip(((p1 + 2 * p0 + 2 * q0 + 2 * q1 + q2 + 4) >> 3) - q0, -tc2, tc2); - Q1 = q1 + av_clip(((p0 + q0 + q1 + q2 + 2) >> 2) - q1, -tc2, tc2); - Q2 = q2 + av_clip(((2 * q3 + 3 * q2 + q1 + q0 + p0 + 4) >> 3) - q2, -tc2, tc2); - } - pix += ystride; - } - } else { // normal filtering + FUNC(loop_filter_luma_strong)(pix, xstride, ystride, tc2, tc2, tc2, no_p, no_q); + } else { int nd_p = 1; int nd_q = 1; - const int tc_2 = tc >> 1; if (dp0 + dp3 < ((beta + (beta >> 1)) >> 3)) nd_p = 2; if (dq0 + dq3 < ((beta + (beta >> 1)) >> 3)) nd_q = 2; - - for (d = 0; d < 4; d++) { - const int p2 = P2; - const int p1 = P1; - const int p0 = P0; - const int q0 = Q0; - const int q1 = Q1; - const int q2 = Q2; - int delta0 = (9 * (q0 - p0) - 3 * (q1 - p1) + 8) >> 4; - if (abs(delta0) < 10 * tc) { - delta0 = av_clip(delta0, -tc, tc); - if (!no_p) - P0 = av_clip_pixel(p0 + delta0); - if (!no_q) - Q0 = av_clip_pixel(q0 - delta0); - if (!no_p && nd_p > 1) { - const int deltap1 = av_clip((((p2 + p0 + 1) >> 1) - p1 + delta0) >> 1, -tc_2, tc_2); - P1 = av_clip_pixel(p1 + deltap1); - } - if (!no_q && nd_q > 1) { - const int deltaq1 = av_clip((((q2 + q0 + 1) >> 1) - q1 - delta0) >> 1, -tc_2, tc_2); - Q1 = av_clip_pixel(q1 + deltaq1); - } - } - pix += ystride; - } + FUNC(loop_filter_luma_weak)(pix, xstride, ystride, tc, beta, no_p, no_q, nd_p, nd_q); } } } @@ -1419,32 +1370,19 @@ static void FUNC(hevc_loop_filter_chroma)(uint8_t *_pix, ptrdiff_t _xstride, ptrdiff_t _ystride, const int *_tc, const uint8_t *_no_p, const uint8_t *_no_q) { - int d, j, no_p, no_q; - pixel *pix = (pixel *)_pix; + int no_p, no_q; ptrdiff_t xstride = _xstride / sizeof(pixel); ptrdiff_t ystride = _ystride / sizeof(pixel); + const int size = 4; - for (j = 0; j < 2; j++) { + for (int j = 0; j < 2; j++) { + pixel *pix = (pixel *)_pix + j * size * ystride; const int tc = _tc[j] << (BIT_DEPTH - 8); - if (tc <= 0) { - pix += 4 * ystride; - continue; - } - no_p = _no_p[j]; - no_q = _no_q[j]; - - for (d = 0; d < 4; d++) { - int delta0; - const int p1 = P1; - const int p0 = P0; - const int q0 = Q0; - const int q1 = Q1; - delta0 = av_clip((((q0 - p0) * 4) + p1 - q1 + 4) >> 3, -tc, tc); - if (!no_p) - P0 = av_clip_pixel(p0 + delta0); - if (!no_q) - Q0 = av_clip_pixel(q0 - delta0); - pix += ystride; + if (tc > 0) { + no_p = _no_p[j]; + no_q = _no_q[j]; + + FUNC(loop_filter_chroma_weak)(pix, xstride, ystride, size, tc, no_p, no_q); } } } diff --git a/libavcodec/xvc_deblock_template.c b/libavcodec/xvc_deblock_template.c new file mode 100644 index 0000000000..8ed95e754d --- /dev/null +++ b/libavcodec/xvc_deblock_template.c @@ -0,0 +1,99 @@ + +/* + * HEVC/VVC deblocking dsp template + * + * Copyright (C) 2024 Nuo Mi + * Copyright (C) 2012 - 2013 Guillaume Martres + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +static void FUNC(loop_filter_luma_strong)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride, + const int32_t tc, const int32_t tc2, const int tc3, + const uint8_t no_p, const uint8_t no_q) +{ + for (int d = 0; d < 4; d++) { + const int p3 = P3; + const int p2 = P2; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + const int q2 = Q2; + const int q3 = Q3; + if (!no_p) { + P0 = p0 + av_clip(((p2 + 2 * p1 + 2 * p0 + 2 * q0 + q1 + 4) >> 3) - p0, -tc3, tc3); + P1 = p1 + av_clip(((p2 + p1 + p0 + q0 + 2) >> 2) - p1, -tc2, tc2); + P2 = p2 + av_clip(((2 * p3 + 3 * p2 + p1 + p0 + q0 + 4) >> 3) - p2, -tc, tc); + } + if (!no_q) { + Q0 = q0 + av_clip(((p1 + 2 * p0 + 2 * q0 + 2 * q1 + q2 + 4) >> 3) - q0, -tc3, tc3); + Q1 = q1 + av_clip(((p0 + q0 + q1 + q2 + 2) >> 2) - q1, -tc2, tc2); + Q2 = q2 + av_clip(((2 * q3 + 3 * q2 + q1 + q0 + p0 + 4) >> 3) - q2, -tc, tc); + } + pix += ystride; + } +} + +static void FUNC(loop_filter_luma_weak)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride, + const int32_t tc, const int32_t beta, const uint8_t no_p, const uint8_t no_q, const int nd_p, const int nd_q) +{ + const int tc_2 = tc >> 1; + for (int d = 0; d < 4; d++) { + const int p2 = P2; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + const int q2 = Q2; + int delta0 = (9 * (q0 - p0) - 3 * (q1 - p1) + 8) >> 4; + if (abs(delta0) < 10 * tc) { + delta0 = av_clip(delta0, -tc, tc); + if (!no_p) + P0 = av_clip_pixel(p0 + delta0); + if (!no_q) + Q0 = av_clip_pixel(q0 - delta0); + if (!no_p && nd_p > 1) { + const int deltap1 = av_clip((((p2 + p0 + 1) >> 1) - p1 + delta0) >> 1, -tc_2, tc_2); + P1 = av_clip_pixel(p1 + deltap1); + } + if (!no_q && nd_q > 1) { + const int deltaq1 = av_clip((((q2 + q0 + 1) >> 1) - q1 - delta0) >> 1, -tc_2, tc_2); + Q1 = av_clip_pixel(q1 + deltaq1); + } + } + pix += ystride; + } +} + +static void FUNC(loop_filter_chroma_weak)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride, + const int size, const int32_t tc, const uint8_t no_p, const uint8_t no_q) +{ + for (int d = 0; d < size; d++) { + int delta0; + const int p1 = P1; + const int p0 = P0; + const int q0 = Q0; + const int q1 = Q1; + delta0 = av_clip((((q0 - p0) * 4) + p1 - q1 + 4) >> 3, -tc, tc); + if (!no_p) + P0 = av_clip_pixel(p0 + delta0); + if (!no_q) + Q0 = av_clip_pixel(q0 - delta0); + pix += ystride; + } +} From patchwork Wed Jan 3 15:32:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 45460 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:6623:b0:194:e134:edd4 with SMTP id n35csp7328003pzh; Wed, 3 Jan 2024 07:33:57 -0800 (PST) X-Google-Smtp-Source: AGHT+IGJEhMjsPKuq57b98HB0fzOfZPakePyCu1LjVB6Q7ZkuvaVwLhE2jCF+p6CVwz11rIORtN4 X-Received: by 2002:ac2:4ac3:0:b0:50e:1ef0:4843 with SMTP id m3-20020ac24ac3000000b0050e1ef04843mr4753641lfp.160.1704296037255; Wed, 03 Jan 2024 07:33:57 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id t3-20020a056402524300b00554bf7cd165si9283813edd.396.2024.01.03.07.33.56; Wed, 03 Jan 2024 07:33:57 -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=@outlook.com header.s=selector1 header.b=CKtNVqk7; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 24B7F68CCB3; Wed, 3 Jan 2024 17:33:34 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from APC01-TYZ-obe.outbound.protection.outlook.com (mail-tyzapc01olkn2033.outbound.protection.outlook.com [40.92.107.33]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7C1BF68CC35 for ; Wed, 3 Jan 2024 17:33:27 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Cr4PwD5cq0SHNHc9C+fbrN7Lx4ZNBt7uvUKM9efiocK8NMkmb5dbD4uLEgqw641mxR2f4w4ITiiwYEQIE1WnKkSRyXiG6qqwy6XWkXSfP9yo9Tz8HArpusJNexMXvbR2IO/TICFyENnmFRktPuGzm8wI1ouJ8OyTagBqA8ZemtbfZQ61iSRHLIyNxuctr3CViZwBYROcURY7++bGQv/x/TPwMf0+XmxkMoNOt2EtpcgsgyNCz6zdVHZp+xaUL+Nd3vQaB/cWwwPGECWKfp0qmlbEH3ofkvpryU1DaaEBiWR2sWwPj5sr07Vx2rd2dhAi4mYshJELv3I6nSN3uotg0w== 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=D5lT3Sdn31EBj4benOQRLS24WNzgxPwC9Lw7sRjaDfg=; b=FIu+VdWi4MKvAIrRS0j0KxLIB5+EsRWZ3/mI0bfYDdkTWrQt1c8Rx9OnlEwxVXhAfFrg3ZXpFkfPY09a02Ki0Ai3uI0CGYgU76sRrCKflRJHWPBGuKBUz9AwxrB2QAQJx6pHlLKosu1Z5HgIpE/CnXYBM9dzZP7z86EIYDml2AdNxPrxv8cXdVqg49u2hTMbOyrRzoq6LvmgcjIMX/cK3HGvxuefvJXN2+XmFcPDwMkLnC4/MDj/Ww75IAyf+OPc3rGpHbU1XBpUDyFqG/PxPCNTuTbwFF9QbPq91wbDSs0+XwC3/igxjG05N3T6NfuiNqyvaSITmQC5+HavKGMxHg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=D5lT3Sdn31EBj4benOQRLS24WNzgxPwC9Lw7sRjaDfg=; b=CKtNVqk7Ac4eFH6Nxl6kRxb75al50BEljOS3SQuXYTO1SJqTG9GzTTvqWONHVsmHZqJxIJ14ei2zrc2NpOaS0Wd0lC7YQuWM+fBzVLM0BSDbUWdZBjHWHV4yXGMh7vmVgTJBqs2rXbzNEb2Kyjvah7wc1d6NqGoud6Tjoss4RFx1NbtN4eAyTvPEQI6FrBmhnpHolHpUDlsPSY0Ej+mIou5/vydV4M76ceihjpJXsg91nA3HgIbsLrblXRnQzM2uxua2Q6n3Q6mjyZKNKJ4/Q9+ubGZyWa7jq7ZUHmBsSrpsPKAyHr8fq8m592+rqmu1CSdoGQYB50AQveO9gPh72g== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEYPR06MB5085.apcprd06.prod.outlook.com (2603:1096:101:55::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7159.13; Wed, 3 Jan 2024 15:33:04 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7%7]) with mapi id 15.20.7159.013; Wed, 3 Jan 2024 15:33:04 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Jan 2024 23:32:38 +0800 Message-ID: X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240103153238.18678-1-nuomi2021@gmail.com> References: <20240103153238.18678-1-nuomi2021@gmail.com> X-TMN: [7xq3ZVIuR3cbe6hAodN5HjOVEDyTuqEH] X-ClientProxiedBy: SI1PR02CA0008.apcprd02.prod.outlook.com (2603:1096:4:1f7::14) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240103153238.18678-5-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEYPR06MB5085:EE_ X-MS-Office365-Filtering-Correlation-Id: ef6bcadf-94a2-4f82-93c1-08dc0c7146c3 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4PKglmWJ0CCeu9VvyjFCcuG57/vTXqXGlV7RDmxxYWWHX7i+ldiN42piDozHuLRyScLTSC50Wnd/+ZSgllawR0AOZQFvm8JZYaBl7jsQSZcCl2QygFShVcJSdiWZGc1WOlf1cP3yDr7Npw5aiG7uiMYS0sBsD8cq7+BfBaHbzx082AogtUrVxD/1iWc0c8VQEuPYy4u0rkR+nq/i7P9LHYSLMuVs9Y4FiIcvhFkROH1k+akMaGGKvUNOymGOoVct/DsgT45mz6CQhBHX2ulefZ7xrXh7B/ZhUx7PaPEDjmRNhaap2+rNF3oeqYlq/JScoIlVWY6K6/so2un4b2I6fOz782URSpaJd848sZnOPAUb+TJu3XyXRGiOIeu7m5qLfBUinHzZ3OrLhx0V7xykhg9LvczZaAAmoV0FBlaEL7CqtX/lmTIzoPuTmxrR51uXguNChhb20L0BLALBTD8m2OxCW6jStzsi93DFsixWp9iP7BQ8SzNYDZ5oPTfEt06TSxz28wzsSDxbkoqoBvo0VunZgReYv77jpQKqKo+hO34ZuCrjNeInldVl/E+rgGWzGXaJMtDSkiBan1LhwT+KCnOlR9WhaIhSsARrid4BfEFByw26DgrnuTUydH14zZPJ X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 0kOz+DlLNE0qNtcYnC7Ly7w0WiQNHICPYrl6fAnmb4OpqS5oDxrcSviBWJZsU0rvmW8ZqcQ+a7e4uITBCe1YNWC0Lk09oouwFCd0K72JLUjLywkemUAk/N/TfWv6M9wM5S1OwKdlRDqXVMvKaDeylMga2rxD/PW397D4XQ6bIIeNMkCiHMET0x3NQbabD40Gn2d2zcEQr+xpnl+/aOCx9sKPxCA11YOlWc8ZflroWDof/Xw4tUlZB135l+XgSz5+44gMb9jY4lgFz+El1fCcBFKEZsL73F/6icN+TOrOdP7fo6wiprh9zrxxMaw3/e2fSRkIBLYD/+o9f+hpIiv1iAwLeteMKCRM781rWAxmnIxsUridWVSlxOJTPwJIGvljUMaTwkNd+d965RvOgh6f93XbF75lDctPzHsW1q9ZmjF+Vfnmldmk+7FVCZ2ddjHYqLqxhaFtbfx/PalVgGncP7aq7KA2ifa+cT8BqbnfSy0gH2J3mJNgC2HSssdXV/Gl/TGfxsPZ2HVBtAiGxgxt9+hVPEJsv8Z/+EHwFB8wEGunhZ1XFkvjyYvKTEy0mAPSpd8vQ5MKbQ+bNuo8ctAwMMjLcAZzPMSqoTt822S8FrVDm8dWdoQQTX9zcI7nh4YzilMMvYu2neyui35NFFKMBLFmPtR6r6K68nK4ZdEk4gjchrRdVx2TIGNKf2uzTmusjBBK1YAbY+Q6FVrVjmNCo9yqgR/pchmXwmJsG2DwPTzdjtHr4vktWlfUx/jnhCRelkJPNNB0t06orwV0veBTzykKeGQ5HtIv50ge141lwsGQ3uEMWOVJDcXxrnW2nDG9ee/PSpNkbHEnQ2lDU18ihrfSmGHrfRNhC9WwrtSa34KMyNUa0o/eiz1R63RRxv/CW07WpUCNy3QJLEDGe3Qfuhq4g+k7qy7MXIl+fK9Zf4Shooh+Q8lkJFRpqEfgsISPmsTKsWTvNdULZAkCBgzrIFTBQCQOS38FaTuJqnl5lo1Af8fSY6KIY4gFfxvQVSMe69uFhJDhfCL9ErXPHOOEQCn24eE/Js/0XZAxCUCTIOxNiSAT5dWTC/3JaIydnZPJzgY0vSfvlXLDykMyGXNTX9RX4Wh33GmhEyXVuLQax9HYwpW8Yx5BcENP90+W9U/YYCl87hH8asZqnNLQlNhRC0bitRB4s3yyMVeF++tAs5TEk8zIyjEpwIPG/X1kUci9bdrTxlImuWQCzV7JSODIUhi8xPCPv4IP20xKVvl0qz6xhqNQehs+4OFkLqBWuGvM X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ef6bcadf-94a2-4f82-93c1-08dc0c7146c3 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Jan 2024 15:33:04.0902 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB5085 Subject: [FFmpeg-devel] [PATCH 4/4] vvcdec: reuse xvc_deblock_template.c 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: , Reply-To: FFmpeg development discussions and patches Cc: Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: IhyJ63ZMe7nM --- libavcodec/vvc/vvc_filter_template.c | 82 +--------------------------- 1 file changed, 3 insertions(+), 79 deletions(-) diff --git a/libavcodec/vvc/vvc_filter_template.c b/libavcodec/vvc/vvc_filter_template.c index 04eb9702dc..98a9005674 100644 --- a/libavcodec/vvc/vvc_filter_template.c +++ b/libavcodec/vvc/vvc_filter_template.c @@ -461,6 +461,8 @@ static void FUNC(alf_recon_coeff_and_clip)(int16_t *coeff, int16_t *clip, #define FQ2 pix[2 * xstride + 1 * ystride] #define FQ3 pix[3 * xstride + 1 * ystride] +#include "libavcodec/xvc_deblock_template.c" + static void FUNC(loop_filter_luma_large)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride, const int32_t tc, const uint8_t no_p, const uint8_t no_q, const uint8_t max_len_p, const uint8_t max_len_q) { @@ -541,66 +543,6 @@ static void FUNC(loop_filter_luma_large)(pixel *pix, const ptrdiff_t xstride, co } } -static void FUNC(loop_filter_luma_strong)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride, const int32_t tc, - const uint8_t no_p, const uint8_t no_q) -{ - const int tc2 = tc << 1; - const int tc3 = tc * 3; - for (int d = 0; d < 4; d++) { - const int p3 = P3; - const int p2 = P2; - const int p1 = P1; - const int p0 = P0; - const int q0 = Q0; - const int q1 = Q1; - const int q2 = Q2; - const int q3 = Q3; - if (!no_p) { - P0 = p0 + av_clip(((p2 + 2 * p1 + 2 * p0 + 2 * q0 + q1 + 4) >> 3) - p0, -tc3, tc3); - P1 = p1 + av_clip(((p2 + p1 + p0 + q0 + 2) >> 2) - p1, -tc2, tc2); - P2 = p2 + av_clip(((2 * p3 + 3 * p2 + p1 + p0 + q0 + 4) >> 3) - p2, -tc, tc); - } - if (!no_q) { - Q0 = q0 + av_clip(((p1 + 2 * p0 + 2 * q0 + 2 * q1 + q2 + 4) >> 3) - q0, -tc3, tc3); - Q1 = q1 + av_clip(((p0 + q0 + q1 + q2 + 2) >> 2) - q1, -tc2, tc2); - Q2 = q2 + av_clip(((2 * q3 + 3 * q2 + q1 + q0 + p0 + 4) >> 3) - q2, -tc, tc); - } - pix += ystride; - } -} - -static void FUNC(loop_filter_luma_weak)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride, - const int32_t tc, const int32_t beta, const uint8_t no_p, const uint8_t no_q, const int nd_p, const int nd_q) -{ - const int tc_2 = tc >> 1; - for (int d = 0; d < 4; d++) { - const int p2 = P2; - const int p1 = P1; - const int p0 = P0; - const int q0 = Q0; - const int q1 = Q1; - const int q2 = Q2; - int delta0 = (9 * (q0 - p0) - 3 * (q1 - p1) + 8) >> 4; - if (abs(delta0) < 10 * tc) { - delta0 = av_clip(delta0, -tc, tc); - if (!no_p) - P0 = av_clip_pixel(p0 + delta0); - if (!no_q) - Q0 = av_clip_pixel(q0 - delta0); - if (!no_p && nd_p > 1) { - const int deltap1 = av_clip((((p2 + p0 + 1) >> 1) - p1 + delta0) >> 1, -tc_2, tc_2); - P1 = av_clip_pixel(p1 + deltap1); - } - if (!no_q && nd_q > 1) { - const int deltaq1 = av_clip((((q2 + q0 + 1) >> 1) - q1 - delta0) >> 1, -tc_2, tc_2); - Q1 = av_clip_pixel(q1 + deltaq1); - } - } - pix += ystride; - } - -} - static void FUNC(vvc_loop_filter_luma)(uint8_t* _pix, ptrdiff_t _xstride, ptrdiff_t _ystride, const int32_t *_beta, const int32_t *_tc, const uint8_t *_no_p, const uint8_t *_no_q, const uint8_t *_max_len_p, const uint8_t *_max_len_q, int hor_ctu_edge) @@ -673,7 +615,7 @@ static void FUNC(vvc_loop_filter_luma)(uint8_t* _pix, ptrdiff_t _xstride, ptrdif abs(P3 - P0) + abs(Q3 - Q0) < beta_3 && abs(P0 - Q0) < tc25 && abs(TP3 - TP0) + abs(TQ3 - TQ0) < beta_3 && abs(TP0 - TQ0) < tc25 && (d0 << 1) < beta_2 && (d3 << 1) < beta_2) { - FUNC(loop_filter_luma_strong)(pix, xstride, ystride, tc, no_p, no_q); + FUNC(loop_filter_luma_strong)(pix, xstride, ystride, tc, tc << 1, tc * 3, no_p, no_q); } else { // weak filtering int nd_p = 1; int nd_q = 1; @@ -737,24 +679,6 @@ static void FUNC(loop_filter_chroma_strong_one_side)(pixel *pix, const ptrdiff_t } } -static void FUNC(loop_filter_chroma_weak)(pixel *pix, const ptrdiff_t xstride, const ptrdiff_t ystride, - const int size, const int32_t tc, const uint8_t no_p, const uint8_t no_q) -{ - for (int d = 0; d < size; d++) { - int delta0; - const int p1 = P1; - const int p0 = P0; - const int q0 = Q0; - const int q1 = Q1; - delta0 = av_clip((((q0 - p0) * 4) + p1 - q1 + 4) >> 3, -tc, tc); - if (!no_p) - P0 = av_clip_pixel(p0 + delta0); - if (!no_q) - Q0 = av_clip_pixel(q0 - delta0); - pix += ystride; - } -} - static void FUNC(vvc_loop_filter_chroma)(uint8_t *_pix, const ptrdiff_t _xstride, const ptrdiff_t _ystride, const int32_t *_beta, const int32_t *_tc, const uint8_t *_no_p, const uint8_t *_no_q, const uint8_t *_max_len_p, const uint8_t *_max_len_q, const int shift)