From patchwork Sat Jun 22 06:23:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 50058 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:ae71:0:b0:482:c625:d099 with SMTP id w17csp935669vqz; Fri, 21 Jun 2024 23:25:34 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCV8gmhMRNgOGyhLvassHyALxJZVyqL+6t+nMyIyICoY7K6hfiw7//h4VgsNC+ilwFlEl1mWDZczOjflNXsVoCO8Wzo8MKM099USVQ== X-Google-Smtp-Source: AGHT+IHbo7nm5ZAssXwc50mbSABCPunBjSTVBAg952KsUNv/CNmdMsP3eUfU6knW9CI1GgqfQ97W X-Received: by 2002:a50:cc8e:0:b0:57c:6832:7b24 with SMTP id 4fb4d7f45d1cf-57d4396b872mr381031a12.0.1719037533725; Fri, 21 Jun 2024 23:25:33 -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 4fb4d7f45d1cf-57d30632872si1455342a12.95.2024.06.21.23.25.33; Fri, 21 Jun 2024 23:25:33 -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; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=B2ds3DVz; 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 5D97A68D89F; Sat, 22 Jun 2024 09:24:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from APC01-PSA-obe.outbound.protection.outlook.com (mail-psaapc01olkn2027.outbound.protection.outlook.com [40.92.52.27]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5DFF468D80F for ; Sat, 22 Jun 2024 09:24:38 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LglmVJiLWzAkJrhHaP+tftdlH0Tk9au4G3UZac8QUrnmlHa5Bovcj29/yunQCssUxPguTp2S9kGOgPH67W6exQOFT9dn+nRch9Tb1XPpmwchWzvi359GThifa46nIZFnh9suSLjgedz7BwkNArGrT2eUoMdYGsOb4aFQUFmBhEl7zumeUs4/sOTujFmhZF1p5KHFfM+tJZzmXbLCet6BxfYxcUXuUFza2fW7gzuiWvop/gyDhyhPAoqpuYzObssizZeVIKJSShI7IumKl2pTT8YUkE3s4JORbOM0p+ZN9nLj4qpsP3JW8dhv4EOf4BCUq/M+ZD7fd9PFe/f41HzySA== 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=MsmhqLsvY/uT3/mUJEGu+uCJMu7BTycUrfJziUzGtjw=; b=TZUAB7VPR6pIcC+6NdRwhqyUxRVGHfAD827QnSg5X3hRtowib2rG9fFTkg6fz4MOgbQ1ehxrsbZya/wzTpxcUiCrg8jDbnbAIwuDMQE27s7z67xH9NIRUZ5wAaCtMPBqS+6WbPdHmQFdxM9uOYbYUx4FIqp4Knt7K6mjxeLbnYBRnqlTYEO1uIP/O6/0yie7L1xIC46X2n6xqunXC69BcUwS0oQ6Zkz9NMxa4zDTx5PNIDG1H+/wzrguHvEQ5wbcpz5uaJxvDH2qQF2T2YTCJeIqkjm3AgkwqShvx4pb2yrd/1+m+4oXlXH5Ck6Hg70xAoi2bsuuQtuRaZ/pxtMKog== 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=MsmhqLsvY/uT3/mUJEGu+uCJMu7BTycUrfJziUzGtjw=; b=B2ds3DVzkWfyiIztoIPdjHvOwqsVqjhCcBNIYo4t3LF7vpMnPxxu+UqkGqqAiE1QLNT1SdsJj26Y38xsVzmtA/DLgQwPSpfEZXxhUn5TqaGDmA76x4WPGkXFwwbLaoptnhML5BXe8tT927LPCsprQu4DHj2A49aMAjdv7u5cnoSf5xHhzzfKYxB7wv++jECBydPzyuq31Sprg9DMtBbhQ99X+xLUEe434jBV6pZBpqkIsBBsoeNL/1nwQjfAwZCr/XqGvLVPBsbyWLORl6SlkHnvZPPEM74lJO3Ej1SIcbrphVzIwv/6/Ie3kPpDOMXt073l96E6cc3pBlpwjstj1A== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by TYZPR06MB6045.apcprd06.prod.outlook.com (2603:1096:400:33c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.19; Sat, 22 Jun 2024 06:24:20 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca%3]) with mapi id 15.20.7698.017; Sat, 22 Jun 2024 06:24:20 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Sat, 22 Jun 2024 14:23:54 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240622062405.285359-1-nuomi2021@gmail.com> References: <20240622062405.285359-1-nuomi2021@gmail.com> X-TMN: [ZcE1B6KWLpih5E7a0MGAjPbDj+JxNghh] X-ClientProxiedBy: TY2PR04CA0023.apcprd04.prod.outlook.com (2603:1096:404:f6::35) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240622062405.285359-7-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|TYZPR06MB6045:EE_ X-MS-Office365-Filtering-Correlation-Id: 81b508d9-b33e-4e9f-ca89-08dc9283f2d6 X-Microsoft-Antispam: BCL:0; ARA:14566002|461199025|440099025|3412199022|1710799023; X-Microsoft-Antispam-Message-Info: Y34yUqvoKJTc4dxFfRqBnziSp5hZc8VOtCGH71O0mMQ1mmmNHJRPSV+E62Pd0OCmPDv24z4EPyBGV35Fjmil2u1qGCBCFSBT5KaIIZ5PCxgEYYt9W1SakY7Ce9amBkiLVM5k5v31cBTZ3/9eO0H3eDxRyODYdFex2EqHgbkjlPm2dCqFsCR7mq/LQ+0YXp2H+emtiNGh9L+tVl4TJk8JMz6wVCMCtCSYw1OqyDudaQhN5gWflwBFR1WXzWemcg/rGASGEIJEi7YCF/3BE2vWhgeMTSYfg/7wZ+s3X7NSAQhQlfCscLWSekt8QL/xL4P8p+V/96RGTxWPjgq8jATkDUnQpHT1qxSZdgGjLFMIcGTTeVmLMwdLcIs3xwQZR0fh+iM57ODjBmArx56v+70zFd4uPonGHKWT/351onN239UQE7beUzK7AoBPO+yZBp1xX+9m6zy5opYeS4DU+A6uG0Srdr8WDARgK95TDtlbeVdW8puh3KRIkJ9y/W4QhXtPpVtKedSLNFbLiLymzEX0nw2cuGmB7IbYblX1h8xn7TjuzcSEwz8TQfqmVmACyHXcDy7Kuwlhdyk/qISRSOjodyyrAp1k/QSf8Z0t9LfiIQGL/SLN9w9xvnx+DiLeeqKF X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: vETHN7qcsObZKr+fKcF7BXf7jAXKAhg3tsFiOyiCM208RBY5ftig6njt3RqetaN7OvFNBPvdXFQAukVbICit3oR0PIA+mfwgQaUnOcoY94Kmr5J11zzfpvRqHqrAed2XdVHr+BKOK0aVBPEfY5F/Y7UtH46qjSpT5ivk1Rmf7HUxvXkGtbOtHFWI1rnDGJnx2/oYF1UNG0ubAYEpLIff9iOTKZZqHht0r83XxaYJHQ+92vOgtiNcNX/ntEaZ2uPaz+C0Elfa+h9FWhLjKbSV335f0p0bahSs6LN27FxcVe+88vQuRPR8RZH9L/8J8Q3qeLh+oprWgd0575v87I9pjiCSiSz4IlP6V6p3NOf5Hvpg7faw+rpAAMZEtSmOOZkG4c1Cjm2s//BuMABGa8MYklli9Fh0LDGBSqZlw4OtY0Ls9GZeDJFB9wGYaDQNYhgHnsoudIQtB+mGGDayrRFBJ0vhh8w3KfahNJV3bfjUCP4L6bPVt/5q1mjxt02hDEIAkv6xsvjhLamHC4dPVsmA08cA69sbOZZZZsZiIt6kYyQfTzo7PZ/7tkGYoQyuOax6ptR+p01dj6W7DQR+T7tt4Gv+XvPiGqc8h0ePXQBOGXNQ4sbi6zGDpCIPyvHL1wssERYVBKGpBzX/2ouVhi668OC3BSh3HZCoG/cOaz6nSK8tqSEpHEfpF5a4cbTN1bcK3sYDYgfOjFljFKLU7JdOrY+urqw6SMrTGcJm72q1ltNHkj19QKJX4eEujxmIQFC1Io8WRUEAW/bMSJMphRZw0se7qJbnRmHsKj/DIGJ7BfpCI7DyXLmPLfiPakIJRnSsV6iId7kyp/miFCzz4fPaHQwUK/TrrTn245ihuQS6OvOOTOkYifclPkWFawrgXbEMY+fq/CePw5qkmzozqxe7Es4vxPS2L9wc/YV1tJNmFitZ/M36cyk32QbgZJ9bmbqMn4pu1WdcF+V0fP5q5SwHzoBLG+RhomB3o2OHYrdWvVhzj4l/8YX6qyhrsDO80KmVIMrJBwIBT5DXQIGG8ADVsT+nGTdEe3jZ6uI3zw28ggMpOIk8NRrIEjQWVWhynSpv8RiJ1ckfcPMDb0n5f7FuZiVX/M88py2OpbSnAp4/NVwdJM17Tg4OunkSMxnmi1nwRhD8o6mWMj+XylaFDfMNZ8AVyycis01QEYJAhmdSEqq9Mg1TVHUjdnMcQUjQpYuPOL4Xw9hB/nd8yB3N5iLdtv8T16bqoAUn6mO53mSO13BJRXk3ElMEUudwHCBkUObRwPLULNoo+gpm6wfPOTkMhA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 81b508d9-b33e-4e9f-ca89-08dc9283f2d6 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jun 2024 06:24:19.3996 (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: TYZPR06MB6045 Subject: [FFmpeg-devel] [PATCH 07/18] avcodec/vvcdec: refact out sao_get_edges 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: 8Hm+Aom75PV5 --- libavcodec/vvc/filter.c | 119 ++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 54 deletions(-) diff --git a/libavcodec/vvc/filter.c b/libavcodec/vvc/filter.c index 89b794195e..1326d2c82e 100644 --- a/libavcodec/vvc/filter.c +++ b/libavcodec/vvc/filter.c @@ -155,70 +155,81 @@ void ff_vvc_sao_copy_ctb_to_hv(VVCLocalContext *lc, const int rx, const int ry, sao_copy_ctb_to_hv(lc, rx, ry, 0); } +static int sao_can_cross_slices(const VVCFrameContext *fc, const int rx, const int ry, const int dx, const int dy) +{ + const uint8_t lfase = fc->ps.pps->r->pps_loop_filter_across_slices_enabled_flag; + + return lfase || CTB(fc->tab.slice_idx, rx, ry) == CTB(fc->tab.slice_idx, rx + dx, ry + dy); +} + +static void sao_get_edges(uint8_t vert_edge[2], uint8_t horiz_edge[2], uint8_t diag_edge[4], int *restore, + const VVCLocalContext *lc, const int edges[4], const int rx, const int ry) +{ + const VVCFrameContext *fc = lc->fc; + const VVCSPS *sps = fc->ps.sps; + const H266RawSPS *rsps = sps->r; + const VVCPPS *pps = fc->ps.pps; + const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; + const uint8_t lfase = fc->ps.pps->r->pps_loop_filter_across_slices_enabled_flag; + const uint8_t no_tile_filter = pps->r->num_tiles_in_pic > 1 && !pps->r->pps_loop_filter_across_tiles_enabled_flag; + const uint8_t no_subpic_filter = rsps->sps_num_subpics_minus1 && !rsps->sps_loop_filter_across_subpic_enabled_flag[subpic_idx]; + uint8_t lf_edge[] = { 0, 0, 0, 0 }; + + *restore = no_subpic_filter || no_tile_filter || !lfase; + + if (!*restore) + return; + + if (!edges[LEFT]) { + lf_edge[LEFT] = no_tile_filter && pps->ctb_to_col_bd[rx] == rx; + lf_edge[LEFT] |= no_subpic_filter && rsps->sps_subpic_ctu_top_left_x[subpic_idx] == rx; + vert_edge[0] = !sao_can_cross_slices(fc, rx, ry, -1, 0) || lf_edge[LEFT]; + } + if (!edges[RIGHT]) { + lf_edge[RIGHT] = no_tile_filter && pps->ctb_to_col_bd[rx] != pps->ctb_to_col_bd[rx + 1]; + lf_edge[RIGHT] |= no_subpic_filter && rsps->sps_subpic_ctu_top_left_x[subpic_idx] + rsps->sps_subpic_width_minus1[subpic_idx] == rx; + vert_edge[1] = !sao_can_cross_slices(fc, rx, ry, 1, 0) || lf_edge[RIGHT]; + } + if (!edges[TOP]) { + lf_edge[TOP] = no_tile_filter && pps->ctb_to_row_bd[ry] == ry; + lf_edge[TOP] |= no_subpic_filter && rsps->sps_subpic_ctu_top_left_y[subpic_idx] == ry; + horiz_edge[0] = !sao_can_cross_slices(fc, rx, ry, 0, -1) || lf_edge[TOP]; + } + if (!edges[BOTTOM]) { + lf_edge[BOTTOM] = no_tile_filter && pps->ctb_to_row_bd[ry] != pps->ctb_to_row_bd[ry + 1]; + lf_edge[BOTTOM] |= no_subpic_filter && rsps->sps_subpic_ctu_top_left_y[subpic_idx] + rsps->sps_subpic_height_minus1[subpic_idx] == ry; + horiz_edge[1] = !sao_can_cross_slices(fc, rx, ry, 0, 1) || lf_edge[BOTTOM]; + } + + if (!edges[LEFT] && !edges[TOP]) + diag_edge[0] = !sao_can_cross_slices(fc, rx, ry, -1, -1) || lf_edge[LEFT] || lf_edge[TOP]; + + if (!edges[TOP] && !edges[RIGHT]) + diag_edge[1] = !sao_can_cross_slices(fc, rx, ry, 1, -1) || lf_edge[RIGHT] || lf_edge[TOP]; + + if (!edges[RIGHT] && !edges[BOTTOM]) + diag_edge[2] = !sao_can_cross_slices(fc, rx, ry, 1, 1) || lf_edge[RIGHT] || lf_edge[BOTTOM]; + + if (!edges[LEFT] && !edges[BOTTOM]) + diag_edge[3] = !sao_can_cross_slices(fc, rx, ry, -1, 1) || lf_edge[LEFT] || lf_edge[BOTTOM]; +} + void ff_vvc_sao_filter(VVCLocalContext *lc, int x, int y) { VVCFrameContext *fc = lc->fc; const int ctb_size_y = fc->ps.sps->ctb_size_y; static const uint8_t sao_tab[16] = { 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8 }; - int c_idx; + int c_idx, restore; const int rx = x >> fc->ps.sps->ctb_log2_size_y; const int ry = y >> fc->ps.sps->ctb_log2_size_y; int edges[4] = { !rx, !ry, rx == fc->ps.pps->ctb_width - 1, ry == fc->ps.pps->ctb_height - 1 }; const SAOParams *sao = &CTB(fc->tab.sao, rx, ry); // flags indicating unfilterable edges - uint8_t vert_edge[] = { 0, 0 }; - uint8_t horiz_edge[] = { 0, 0 }; - uint8_t diag_edge[] = { 0, 0, 0, 0 }; - uint8_t tile_edge[] = { 0, 0, 0, 0 }; - uint8_t subpic_edge[] = { 0, 0, 0, 0 }; - const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; - const uint8_t lfase = fc->ps.pps->r->pps_loop_filter_across_slices_enabled_flag; - const uint8_t no_tile_filter = fc->ps.pps->r->num_tiles_in_pic > 1 && - !fc->ps.pps->r->pps_loop_filter_across_tiles_enabled_flag; - const uint8_t no_subpic_filter = fc->ps.sps->r->sps_num_subpics_minus1 && - !fc->ps.sps->r->sps_loop_filter_across_subpic_enabled_flag[subpic_idx]; - const uint8_t restore = no_subpic_filter || no_tile_filter || !lfase; - - if (restore) { - if (!edges[LEFT]) { - tile_edge[LEFT] = no_tile_filter && fc->ps.pps->ctb_to_col_bd[rx] == rx; - subpic_edge[LEFT] = no_subpic_filter && fc->ps.sps->r->sps_subpic_ctu_top_left_x[subpic_idx] == rx; - vert_edge[0] = (!lfase && CTB(fc->tab.slice_idx, rx, ry) != CTB(fc->tab.slice_idx, rx - 1, ry)) || tile_edge[LEFT] || subpic_edge[LEFT]; - } - if (!edges[RIGHT]) { - tile_edge[RIGHT] = no_tile_filter && fc->ps.pps->ctb_to_col_bd[rx] != fc->ps.pps->ctb_to_col_bd[rx + 1]; - subpic_edge[RIGHT] = no_subpic_filter && - fc->ps.sps->r->sps_subpic_ctu_top_left_x[subpic_idx] + fc->ps.sps->r->sps_subpic_width_minus1[subpic_idx] == rx; - vert_edge[1] = (!lfase && CTB(fc->tab.slice_idx, rx, ry) != CTB(fc->tab.slice_idx, rx + 1, ry)) || tile_edge[RIGHT] || subpic_edge[RIGHT]; - } - if (!edges[TOP]) { - tile_edge[TOP] = no_tile_filter && fc->ps.pps->ctb_to_row_bd[ry] == ry; - subpic_edge[TOP] = no_subpic_filter && fc->ps.sps->r->sps_subpic_ctu_top_left_y[subpic_idx] == ry; - horiz_edge[0] = (!lfase && CTB(fc->tab.slice_idx, rx, ry) != CTB(fc->tab.slice_idx, rx, ry - 1)) || tile_edge[TOP] || subpic_edge[TOP]; - } - if (!edges[BOTTOM]) { - tile_edge[BOTTOM] = no_tile_filter && fc->ps.pps->ctb_to_row_bd[ry] != fc->ps.pps->ctb_to_row_bd[ry + 1]; - subpic_edge[BOTTOM] = no_subpic_filter && - fc->ps.sps->r->sps_subpic_ctu_top_left_y[subpic_idx] + fc->ps.sps->r->sps_subpic_height_minus1[subpic_idx] == ry; - horiz_edge[1] = (!lfase && CTB(fc->tab.slice_idx, rx, ry) != CTB(fc->tab.slice_idx, rx, ry + 1)) || tile_edge[BOTTOM] || subpic_edge[BOTTOM]; - } - if (!edges[LEFT] && !edges[TOP]) { - diag_edge[0] = (!lfase && CTB(fc->tab.slice_idx, rx, ry) != CTB(fc->tab.slice_idx, rx - 1, ry - 1)) || - tile_edge[LEFT] || tile_edge[TOP] || subpic_edge[LEFT] || subpic_edge[TOP]; - } - if (!edges[TOP] && !edges[RIGHT]) { - diag_edge[1] = (!lfase && CTB(fc->tab.slice_idx, rx, ry) != CTB(fc->tab.slice_idx, rx + 1, ry - 1)) || - tile_edge[RIGHT] || tile_edge[TOP] || subpic_edge[TOP] || subpic_edge[RIGHT]; - } - if (!edges[RIGHT] && !edges[BOTTOM]) { - diag_edge[2] = (!lfase && CTB(fc->tab.slice_idx, rx, ry) != CTB(fc->tab.slice_idx, rx + 1, ry + 1)) || - tile_edge[RIGHT] || tile_edge[BOTTOM] || subpic_edge[RIGHT] || subpic_edge[BOTTOM]; - } - if (!edges[LEFT] && !edges[BOTTOM]) { - diag_edge[3] = (!lfase && CTB(fc->tab.slice_idx, rx, ry) != CTB(fc->tab.slice_idx, rx - 1, ry + 1)) || - tile_edge[LEFT] || tile_edge[BOTTOM] || subpic_edge[LEFT] || subpic_edge[BOTTOM]; - } - } + uint8_t vert_edge[] = { 0, 0 }; + uint8_t horiz_edge[] = { 0, 0 }; + uint8_t diag_edge[] = { 0, 0, 0, 0 }; + + sao_get_edges(vert_edge, horiz_edge, diag_edge, &restore, lc, edges, rx, ry); for (c_idx = 0; c_idx < (fc->ps.sps->r->sps_chroma_format_idc ? 3 : 1); c_idx++) { int x0 = x >> fc->ps.sps->hshift[c_idx];