From patchwork Tue Jun 4 12:04:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 49537 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9183:0:b0:460:55fa:d5ed with SMTP id s3csp2634774vqg; Tue, 4 Jun 2024 05:05:04 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWz0NK4W1i0MJ0kIMbMDxsEJy9gNU8QQWTZkleUwIX/S8E+yFTaof7sJO6FesUdd+GMN17zcJTL1jhx8I1RWVmVELDI0I2HUqknzg== X-Google-Smtp-Source: AGHT+IG6vdDw4/wZ5HzKra0gBWvA7B64H1xm61e30u+FQXOLKu+17ZA1S9n8iEHK/W33cNFrjFl7 X-Received: by 2002:a50:a6d6:0:b0:579:e283:d2a4 with SMTP id 4fb4d7f45d1cf-57a365641f4mr6851810a12.36.1717502704267; Tue, 04 Jun 2024 05:05:04 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57a31ca4e40si4884761a12.503.2024.06.04.05.05.03; Tue, 04 Jun 2024 05:05:04 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=CNq36iAD; 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 862AD68D6FA; Tue, 4 Jun 2024 15:05:00 +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-psaapc01olkn2047.outbound.protection.outlook.com [40.92.52.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3C72B68D6E0 for ; Tue, 4 Jun 2024 15:04:53 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=J8V/orBzdZDeKE+nKXF6BR7cwl2ruuqn9HYP6q/u3vMoGneknioTyt/ha781R1PzF8J2AOYiXwXecsdSOhXBgv/TdZqq4/pbopd1Tot4SG36GiZNP8NnlT7zixPgBqffYus7gBKFijHyEYbsEjNepXf6RQfqFwirkeBcPrW/KyKuotxxrCww+mEpJMni1sEr75tyHQM/REuuuKKJdkmxovvKj5+QhBxfElVjyIP/WBlHF0T1JGvl+dPQqm25w69dvmX0UUcEndBHkHZVmjFM/y15pf7a67v8JJ38n0b9RjiVV+skGLSujE7zX7Rz47GjQqRSjRhRVKvGE8QqQkbfIA== 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=po2wkLhe6FvF6Jh0fFg6xtHF4zSn1EgDF2PyfvJ5WRk=; b=R5jBmYjCVFhixJG4628vJfVnsv7FFyxGA2IA0tbdeG7sC0FEgsUwplpSoRTgnZoliBwTTBqIr3t2umdtfXds+GdgkDGRecHO73230q9V9BZRDePsegU1p3yCXUpO7zLV/EV0G60PjY2U5Gp6zSQM+BJ5IYOXjHXUKFCrq3xdxlkJP9urwnYv7rC5LsQNnb1r5fmJuhb9bq9gAwwfl5hZ3XqXI0CnR1LQlZgXu8V3o9JnLoxUv+4oqKQ64jD8yv2fass7T+9wFZp7cjoUCrCyZrVTaAwZ0S09fH+vhc7Xsc4/Pmzk01+RDJuC3BfoaYQOwsJIRdsrEl30yz6iXTLDpg== 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=po2wkLhe6FvF6Jh0fFg6xtHF4zSn1EgDF2PyfvJ5WRk=; b=CNq36iAD2vi3ecdSKfN3MZ/R6XHZ7K3riQVKfUpMrDfXW1H+UIj6WJbSOzCI4Z/kDhYxnQh0HcKMwI7tooXKUiT9BT+2jbZ3c6hL2JgEg6zYBsSh74gzWa2Pt31+V5rt6p+KBfc91u/+xNNOoHgv3nsdclFZszXqWd6v7BKnWyn64OfvbjsBF7CVnoMa/VTQWzEWNvCzWFUNRHFgXQjm8fqx61aNOZuwzmSo17SFkAM9EYae2Ha0TOQ1MuZ5F+xnpZRW9xH0uKDdR+V8brECobww5k6vQfXpTWmcCX1R0ycJ6d09mSahKW8rpP5fwVnlGmeU5+PKAtBKGIKTh9UkIQ== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEZPR06MB7187.apcprd06.prod.outlook.com (2603:1096:101:234::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7611.30; Tue, 4 Jun 2024 12:04:46 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca%4]) with mapi id 15.20.7633.021; Tue, 4 Jun 2024 12:04:46 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Tue, 4 Jun 2024 20:04:07 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [2RovtOa6spuwEb1Hc1p3HyYdIcLqWR8u] X-ClientProxiedBy: TYCP286CA0038.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:29d::9) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240604120411.435626-1-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEZPR06MB7187:EE_ X-MS-Office365-Filtering-Correlation-Id: f7753d5d-9621-4aa3-8bb7-08dc848e86ec X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|440099019|3412199016|1710799017; X-Microsoft-Antispam-Message-Info: 5Wn7Cd4MdY9JGzOxx+ekK30Fe1Kir5UjOqPeaV+LViR//LLxvHerTa3uXXnzbxckfH1+lVQ0Gw7Om/qNTvtBRITQkDaKpyIVt8iJTO2SMCA0TJTk2ibF6deZdaEIgqpbZk3jReeounilBVB92ljPbqEKy21d8un+8ZuKaSfYdP2v8/uvZ0fbRbFHOV4Fk68HfzBRF6tMpcZ90bIzIrPgiLGegQEO+v0VdFWFDRWvwp0WLM1+XGB4p18TFKQNrkf5WPjP68uQDdnxBSenXTBAFlzcHphGpAK+x+aCz48ieBWu3Njw1wmbHNlF+UiHG2KiZ8IQdMR9P/vgjAIMnlDSdFkqnfGFYEyrhaunEWLsuQtIXNxMKN5pZUkZuMT4GC12FWzsd05NYFif5F0Pgy9suRS3qgosVxrnK0k7oar9skH1KaofaRSPfC6Wp9xOxuesVprHRDief2BIBKZZ0otrvIi3bJo1IwQr7P/GYNp5rblFW3EyFhid9nn1v8NXBIA6CTfnzUNKa2CCkaKB/Mo/xjjXll6IyaUfSAbh4lR+BUZBjLi2DvHpqfLs+4fuipXvXVoWMYuo5M0uBJFrryaazzfQoujzwRwnPTRVdOnmAryrky7uMfZ7L7ryhrOvfK81 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: bX13Ug4uWNextmgwIVXMAQwNjWk6i/8Rx+ttgzV3uxRDafGHEK+Q0WEdDkawKHFXxIBrn+F1Pja3x+HdtAierj8NTQnJE2aZozmXDIgqa3qLE3tKpSPnAkk+gafIHMhJPB3vqqoYwIpvWCpzzxsMpyOa8SK4fLXOKsmjVcw88tGCdaPRZSuILWjCMFBN72GkouzSCvXMifZPJx55imo2IA8SlFIc+7G624Lo1AYwZdJ35rvOi/wBuSrsZ4PVdOjRoAbotdrAZAeeIbT5K2axaKMXuDue0SJrNHQui06Plf511PiBZy+kXstLppMcilXI8p1inWgSdP9P0atAj+Gg+RVBVamXm5rp3l9lPNLC0DOfMkNdugVB2EZXz6fzCNjtoLv9osk21oh8INCT9BKgos9zfZhSgu49ecHXvoYq7jPj7Kq1Ev2yRtqkVgvtfFHmjNOnblLanfN7zT7wgGUucCx71Yt7duWPQfy16gZq9y47Av/DUxFZJrqyjSwO6BtlV66vTUmKvXQnFvhB6Ier4SrSk0abypQ0bsqHf/gv8VeBKfpo1Dy2weXkFXqZwWnTzBzmfv7nBbKs8350C4wk3nxFOqjdNh3G3vEGexsViBdWEj8m/a6kM77ei8l6quLHhCD4STTVG6wBV/VBPOiEkKm2Wg06jyWKahOrQ966srWPW4mKjSFZ/xajaSIKhL+HtmKjKaD8jGsrJfCdxi7SeELV4Px5w+JJSqHG90ZQgLxi00qBLGcoVE0BSQPP1sJW/6VW7YOk0KGy4M6agblQj4VgvcFbDcUUTvYbHmzCmd6KLoqGgaEIGLaZEhjTiQU1GjFniM4C1fd/wewdvb6iuJvwGvcqaBDf6/vC3ns1oadKsypqkxePIl2RmIKYDmIoLiq+1DDeRTMAKHI1HifqRLdoRQ5ibw3Uh5MM79bcjbaRCpAAu7Edhz6I0dLLu07MO8Oe6WoMxC0HeDKVKT0Ehbua4LyWPULfwDmPdT7hXMFy/FSWx+vNT0gEV5rofZfJa/T3PumuNZB16iw6YPXUEFCQcJgM5jyOtlCIB8T12nS/q0xp9D7V1Iz36UA2TSKMmb1YSaqXL6cyg7OjGcFxLcxcQeK8LlK6JOc5l/vmaykMHPF0fV0JhXH0gdkvHvURY2Mg5nrIi2OJuriNSxSdQbTL7GMN/AZWTG+S7nbJvsUZlvJPwgBBD9aqBg6XJbiIsaGKYnkD8JA/7VsnEIXzdVUUzVaQsL2kSqQK+R4kSpAvpda8KUjFkOy4hf/ZtjfchkqO+kn+L+g/UchQ+gJCFQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f7753d5d-9621-4aa3-8bb7-08dc848e86ec X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jun 2024 12:04:46.6622 (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: SEZPR06MB7187 Subject: [FFmpeg-devel] [PATCH v2 1/5] avcodec/vvcdec: refact, remove emulated_edge_dmvr and emulated_edge_bilinear to simplify code 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: benjamin.bross@hhi.fraunhofer.de, Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: MyEMa8Wa7VPx --- libavcodec/vvc/inter.c | 146 +++++++++++++---------------------------- 1 file changed, 46 insertions(+), 100 deletions(-) diff --git a/libavcodec/vvc/inter.c b/libavcodec/vvc/inter.c index e1011b4fa1..0843c99eb6 100644 --- a/libavcodec/vvc/inter.c +++ b/libavcodec/vvc/inter.c @@ -44,112 +44,59 @@ static void subpic_width_height(int *pic_width, int *pic_height, *pic_height = pps->subpic_height[subpic_idx] >> sps->vshift[is_chroma]; } -static int emulated_edge(const VVCLocalContext *lc, uint8_t *dst, const uint8_t **src, ptrdiff_t *src_stride, const VVCFrame *src_frame, - int x_off, int y_off, const int block_w, const int block_h, const int is_chroma) +static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst, + const uint8_t **src, ptrdiff_t *src_stride, const VVCFrame *src_frame, + int x_sb, int y_sb, int x_off, int y_off, const int block_w, const int block_h, + const int is_chroma, const int extra_before, const int extra_after) { const VVCFrameContext *fc = lc->fc; const VVCSPS *sps = src_frame->sps; const VVCPPS *pps = src_frame->pps; const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; - const int extra_before = is_chroma ? CHROMA_EXTRA_BEFORE : LUMA_EXTRA_BEFORE; - const int extra_after = is_chroma ? CHROMA_EXTRA_AFTER : LUMA_EXTRA_AFTER; - const int extra = is_chroma ? CHROMA_EXTRA : LUMA_EXTRA; - int pic_width, pic_height; - - subpic_offset(&x_off, &y_off, sps, pps, subpic_idx, is_chroma); - subpic_width_height(&pic_width, &pic_height, sps, pps, subpic_idx, is_chroma); - - if (x_off < extra_before || y_off < extra_before || - x_off >= pic_width - block_w - extra_after || - y_off >= pic_height - block_h - extra_after) { - const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << fc->ps.sps->pixel_shift; - int offset = extra_before * *src_stride + (extra_before << fc->ps.sps->pixel_shift); - int buf_offset = extra_before * edge_emu_stride + (extra_before << fc->ps.sps->pixel_shift); - - fc->vdsp.emulated_edge_mc(dst, *src - offset, edge_emu_stride, *src_stride, - block_w + extra, block_h + extra, x_off - extra_before, y_off - extra_before, - pic_width, pic_height); - - *src = dst + buf_offset; - *src_stride = edge_emu_stride; - return 1; - } - return 0; -} - -static void emulated_edge_dmvr(const VVCLocalContext *lc, uint8_t *dst, const uint8_t **src, ptrdiff_t *src_stride, - int x_sb, int y_sb, int x_off, int y_off, const int block_w, const int block_h, const int is_chroma) -{ - const VVCFrameContext *fc = lc->fc; - const VVCSPS *sps = fc->ps.sps; - const VVCPPS *pps = fc->ps.pps; - const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; - const int extra_before = is_chroma ? CHROMA_EXTRA_BEFORE : LUMA_EXTRA_BEFORE; - const int extra_after = is_chroma ? CHROMA_EXTRA_AFTER : LUMA_EXTRA_AFTER; - const int extra = is_chroma ? CHROMA_EXTRA : LUMA_EXTRA; + const int extra = extra_before + extra_after; + const int dmvr_clip = x_sb != x_off || y_sb != y_off; int pic_width, pic_height; subpic_offset(&x_off, &y_off, sps, pps, subpic_idx, is_chroma); subpic_offset(&x_sb, &y_sb, sps, pps, subpic_idx, is_chroma); subpic_width_height(&pic_width, &pic_height, sps, pps, subpic_idx, is_chroma); + if (dmvr_clip) { + const int start_x = FFMIN(FFMAX(x_sb - extra_before, 0), pic_width - 1); + const int start_y = FFMIN(FFMAX(y_sb - extra_before, 0), pic_height - 1); + pic_width = FFMAX(FFMIN(pic_width, x_sb + block_w + extra_after) - start_x, 1); + pic_height = FFMAX(FFMIN(pic_height, y_sb + block_h + extra_after) - start_y, 1); + x_off -= start_x; + y_off -= start_y; + } - if (x_off < extra_before || y_off < extra_before || + if (dmvr_clip || x_off < extra_before || y_off < extra_before || x_off >= pic_width - block_w - extra_after || - y_off >= pic_height - block_h - extra_after|| - (x_off != x_sb || y_off != y_sb)) { + y_off >= pic_height - block_h - extra_after) { const int ps = fc->ps.sps->pixel_shift; const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << ps; - const int offset = extra_before * *src_stride + (extra_before << ps); + const int offset = extra_before * *src_stride + (extra_before << ps); const int buf_offset = extra_before * edge_emu_stride + (extra_before << ps); - const int start_x = FFMIN(FFMAX(x_sb - extra_before, 0), pic_width - 1); - const int start_y = FFMIN(FFMAX(y_sb - extra_before, 0), pic_height - 1); - const int width = FFMAX(FFMIN(pic_width, x_sb + block_w + extra_after) - start_x, 1); - const int height = FFMAX(FFMIN(pic_height, y_sb + block_h + extra_after) - start_y, 1); - - fc->vdsp.emulated_edge_mc(dst, *src - offset, edge_emu_stride, *src_stride, block_w + extra, block_h + extra, - x_off - start_x - extra_before, y_off - start_y - extra_before, width, height); - - *src = dst + buf_offset; - *src_stride = edge_emu_stride; - } -} - -static void emulated_edge_bilinear(const VVCLocalContext *lc, uint8_t *dst, const uint8_t **src, ptrdiff_t *src_stride, - int x_off, int y_off, const int block_w, const int block_h) -{ - const VVCFrameContext *fc = lc->fc; - const VVCSPS *sps = fc->ps.sps; - const VVCPPS *pps = fc->ps.pps; - const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; - int pic_width, pic_height; - - subpic_offset(&x_off, &y_off, sps, pps, subpic_idx, 0); - subpic_width_height(&pic_width, &pic_height, sps, pps, subpic_idx, 0); - - if (x_off < BILINEAR_EXTRA_BEFORE || y_off < BILINEAR_EXTRA_BEFORE || - x_off >= pic_width - block_w - BILINEAR_EXTRA_AFTER || - y_off >= pic_height - block_h - BILINEAR_EXTRA_AFTER) { - const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << fc->ps.sps->pixel_shift; - const int offset = BILINEAR_EXTRA_BEFORE * *src_stride + (BILINEAR_EXTRA_BEFORE << fc->ps.sps->pixel_shift); - const int buf_offset = BILINEAR_EXTRA_BEFORE * edge_emu_stride + (BILINEAR_EXTRA_BEFORE << fc->ps.sps->pixel_shift); - - fc->vdsp.emulated_edge_mc(dst, *src - offset, edge_emu_stride, *src_stride, block_w + BILINEAR_EXTRA, block_h + BILINEAR_EXTRA, - x_off - BILINEAR_EXTRA_BEFORE, y_off - BILINEAR_EXTRA_BEFORE, pic_width, pic_height); + fc->vdsp.emulated_edge_mc(dst, *src - offset, edge_emu_stride, *src_stride, + block_w + extra, block_h + extra, x_off - extra_before, y_off - extra_before, + pic_width, pic_height); *src = dst + buf_offset; *src_stride = edge_emu_stride; } } -#define MC_EMULATED_EDGE(dst, src, src_stride, x_off, y_off) \ - emulated_edge(lc, dst, src, src_stride, ref, x_off, y_off, block_w, block_h, is_chroma) +#define MC_EMULATED_EDGE(dst, src, src_stride, x_off, y_off) \ + emulated_edge(lc, dst, src, src_stride, ref, x_off, y_off, x_off, y_off, block_w, block_h, is_chroma, \ + is_chroma ? CHROMA_EXTRA_BEFORE : LUMA_EXTRA_BEFORE, is_chroma ? CHROMA_EXTRA_AFTER : LUMA_EXTRA_AFTER) -#define MC_EMULATED_EDGE_DMVR(dst, src, src_stride, x_sb, y_sb, x_off, y_off) \ - emulated_edge_dmvr(lc, dst, src, src_stride, x_sb, y_sb, x_off, y_off, block_w, block_h, is_chroma) +#define MC_EMULATED_EDGE_DMVR(dst, src, src_stride, x_sb, y_sb, x_off, y_off) \ + emulated_edge(lc, dst, src, src_stride, ref, x_sb, y_sb, x_off, y_off, block_w, block_h, is_chroma, \ + is_chroma ? CHROMA_EXTRA_BEFORE : LUMA_EXTRA_BEFORE, is_chroma ? CHROMA_EXTRA_AFTER : LUMA_EXTRA_AFTER) -#define MC_EMULATED_EDGE_BILINEAR(dst, src, src_stride, x_off, y_off) \ - emulated_edge_bilinear(lc, dst, src, src_stride, x_off, y_off, pred_w, pred_h) +#define MC_EMULATED_EDGE_BILINEAR(dst, src, src_stride, x_off, y_off) \ + emulated_edge(lc, dst, src, src_stride, ref, x_off, y_off, x_off, y_off, pred_w, pred_h, 0, \ + BILINEAR_EXTRA_BEFORE, BILINEAR_EXTRA_AFTER) // part of 8.5.6.6 Weighted sample prediction process static int derive_weight_uni(int *denom, int *wx, int *ox, @@ -357,23 +304,21 @@ static void scaled_ref_pos_and_step(const VVCLocalContext *lc, const VVCRefPic * } static void emulated_edge_scaled(VVCLocalContext *lc, const uint8_t **src, ptrdiff_t *src_stride, int *src_height, - const VVCFrame *ref, const int x, const int y, const int dx, const int dy, - const int block_w, const int block_h, const int is_chroma) + const VVCFrame *ref, const int x, const int y, const int dx, const int dy, const int w, const int h, const int is_chroma) { const VVCFrameContext *fc = lc->fc; - const int x0 = SCALED_INT(x); - const int y0 = SCALED_INT(y); - const int x_end = SCALED_INT(x + block_w * dx); - const int y_end = SCALED_INT(y + block_h * dy); - const int x_last = SCALED_INT(x + (block_w - 1) * dx); - const int y_last = SCALED_INT(y + (block_h - 1) * dy); - const int src_width = x_end - x0 + (x_end == x_last); + const int x_off = SCALED_INT(x); + const int y_off = SCALED_INT(y); + const int x_end = SCALED_INT(x + w * dx); + const int y_end = SCALED_INT(y + h * dy); + const int x_last = SCALED_INT(x + (w - 1) * dx); + const int y_last = SCALED_INT(y + (h - 1) * dy); + const int block_w = x_end - x_off + (x_end == x_last); + const int block_h = *src_height = y_end - y_off + (y_end == y_last); - *src_height = y_end - y0 + (y_end == y_last); + *src += y_off * *src_stride + (x_off * (1 << fc->ps.sps->pixel_shift)); - *src += y0 * *src_stride + (x0 * (1 << fc->ps.sps->pixel_shift)); - - emulated_edge(lc, lc->edge_emu_buffer, src, src_stride, ref, x0, y0, src_width, *src_height, is_chroma); + MC_EMULATED_EDGE(lc->edge_emu_buffer, src, src_stride, x_off, y_off); } static void mc_scaled(VVCLocalContext *lc, int16_t *dst, const VVCRefPic *refp, const Mv *mv, @@ -737,11 +682,11 @@ static int parametric_mv_refine(const int *sad, const int stride) #define SAD_ARRAY_SIZE 5 //8.5.3 Decoder-side motion vector refinement process static void dmvr_mv_refine(VVCLocalContext *lc, MvField *mvf, MvField *orig_mv, int *sb_bdof_flag, - const AVFrame *ref0, const AVFrame *ref1, const int x_off, const int y_off, const int block_w, const int block_h) + const VVCFrame *ref0, const VVCFrame *ref1, const int x_off, const int y_off, const int block_w, const int block_h) { const VVCFrameContext *fc = lc->fc; const int sr_range = 2; - const AVFrame *ref[] = { ref0, ref1 }; + const VVCFrame *refs[] = { ref0, ref1 }; int16_t *tmp[] = { lc->tmp, lc->tmp1 }; int sad[SAD_ARRAY_SIZE][SAD_ARRAY_SIZE]; int min_dx, min_dy, min_sad, dx, dy; @@ -757,8 +702,9 @@ static void dmvr_mv_refine(VVCLocalContext *lc, MvField *mvf, MvField *orig_mv, const int my = mv->y & 0xf; const int ox = x_off + (mv->x >> 4) - sr_range; const int oy = y_off + (mv->y >> 4) - sr_range; - ptrdiff_t src_stride = ref[i]->linesize[LUMA]; - const uint8_t *src = ref[i]->data[LUMA] + oy * src_stride + (ox * (1 << fc->ps.sps->pixel_shift)); + const VVCFrame *ref = refs[i]; + ptrdiff_t src_stride = ref->frame->linesize[LUMA]; + const uint8_t *src = ref->frame->data[LUMA] + oy * src_stride + (ox * (1 << fc->ps.sps->pixel_shift)); MC_EMULATED_EDGE_BILINEAR(lc->edge_emu_buffer, &src, &src_stride, ox, oy); fc->vvcdsp.inter.dmvr[!!my][!!mx](tmp[i], src, src_stride, pred_h, mx, my, pred_w); } @@ -828,7 +774,7 @@ static void derive_sb_mv(VVCLocalContext *lc, MvField *mv, MvField *orig_mv, int VVCRefPic *refp[2]; if (pred_get_refs(lc, refp, mv) < 0) return; - dmvr_mv_refine(lc, mv, orig_mv, sb_bdof_flag, refp[L0]->ref->frame, refp[L1]->ref->frame, x0, y0, sbw, sbh); + dmvr_mv_refine(lc, mv, orig_mv, sb_bdof_flag, refp[L0]->ref, refp[L1]->ref, x0, y0, sbw, sbh); set_dmvr_info(fc, x0, y0, sbw, sbh, mv); } } From patchwork Tue Jun 4 12:04:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 49538 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9183:0:b0:460:55fa:d5ed with SMTP id s3csp2634913vqg; Tue, 4 Jun 2024 05:05:17 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWCHIGpTR+AjMTiZoj1vSv29JeYbSyQL7TOomy+d3/pD2oaOehnnI/R5rsI6jF7LTMKtNYIiQ/KCRUM6Aoj80fu+Ex3m1hu9YaSRA== X-Google-Smtp-Source: AGHT+IH47XIpiKe2H4s7ZMcV8v89Cc8rU6IOx5L0Hmf73X45oXj6aT4gF2a9DG8/AkbDu6uhetYr X-Received: by 2002:a2e:3a06:0:b0:2ea:97a3:74ce with SMTP id 38308e7fff4ca-2eabb750f94mr7681691fa.5.1717502716757; Tue, 04 Jun 2024 05:05:16 -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 38308e7fff4ca-2ea91d4cb1esi29242801fa.519.2024.06.04.05.05.16; Tue, 04 Jun 2024 05:05:16 -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=R1lsGQe3; 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 23EB968D701; Tue, 4 Jun 2024 15:05:07 +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-psaapc01olkn2047.outbound.protection.outlook.com [40.92.52.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 18EB768D6EF for ; Tue, 4 Jun 2024 15:04:59 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lOsqwDNfsDVSvp3A2RVRLaDYCtFsb3RcmqeSorBgK3bNTLMpPGxSMTq7sCi4euqezVfJECgC/DJ1WAwe6Koc1EBlQc3YPwunAHKJ7YQ2oBQmSScGEEiG+ZoethmrddQfL1rweXDXcbeSnHfUWMzEk39H4xkls/eGfkvCXJuQQHhTpcNGo3LzatVEUEs4OiTc8k6g1e9uZyPWMmYse/WOx5Rs2zwtLE+0uzml+kiiAGHNl2FOrj0l07rBgT4XDxFT6kcsHHaf5dN+8I8In5jlrVfg6qF7XYIhSDO0R7mASbDdDm5BSlqEEjDKdufeddBf/Pw+t9eSD5R6TC319L1D4Q== 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=mRTms3vDlp//iHJMJwmjjO6Q6Tpfjxc/VH6xBUnWDAg=; b=cS6V6nJUkKdFCZ6agxPg17FDxFUKKtYSHERtgHPqPZV5tzZHxuVnrad8G5GeICL93me1NOPn53OUq3poeV7WHvKUDMB2bOjhqIx+NmfS4TiTpEJDMJYiU0G8wF2fapWAnHv036i4fYnvIYcDwgUsedTwizOdP6crZQcTsk73kVsZXuhcu/swlDTw8nSii+GIDKmfD9gX3JTUgLDpC6HvqUgZ9AUSQpLo0C2bGbrciDp5MYhkO7VtTvX6y5OExWBXZ6zzNrOCJ7KOuw39fnYXUdgL+iHFJuDbG2If+EZARRQtHbvpztVEh0NraEBfI+CCegJTWBJU6ndZWg7nlNbeFQ== 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=mRTms3vDlp//iHJMJwmjjO6Q6Tpfjxc/VH6xBUnWDAg=; b=R1lsGQe3xpOlWlxfgKrURDLp4D0rBtTNdhHfndoV4MOnd0fkntmfYmf+KbKpoxN18ycE3Fz27UmczhXCSQgQJdv9wtW9IRube1r1qpdNOTWeYVjaWLM6KHyWy4EuuUoMXJqc06Rv0GI/VBu66IgWJ0tA4GyIZPw33P8GMG0mfbDQNWVbW2MAunexi2A/d99dEy2GtsjB1gjvhRPMaT1XxH1PuisaRguz/wiwvzOVReN9OtTm5LiJtBuvPmP+SNXQUEf3UDrXzobCMTVZhy8EA4bckcYGvMwwImKsSeYOe1VljnV+WIkbkW7vdsxLsYdOEd9bE50oTHpqjgDZdnDOVw== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEZPR06MB7187.apcprd06.prod.outlook.com (2603:1096:101:234::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7611.30; Tue, 4 Jun 2024 12:04:48 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca%4]) with mapi id 15.20.7633.021; Tue, 4 Jun 2024 12:04:48 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Tue, 4 Jun 2024 20:04:08 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240604120411.435626-1-nuomi2021@gmail.com> References: <20240604120411.435626-1-nuomi2021@gmail.com> X-TMN: [/Umao9eYpulxy5t5OSK+eruGXX/iQqVL] X-ClientProxiedBy: TYCP286CA0038.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:29d::9) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240604120411.435626-2-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEZPR06MB7187:EE_ X-MS-Office365-Filtering-Correlation-Id: 925309e8-2b92-4f53-a4b8-08dc848e8773 X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|440099019|3412199016|1710799017; X-Microsoft-Antispam-Message-Info: a7bVTctoKKWfpdMu9kqyYZFO0AgDDh0J7OL8j+CUGEMcl6i++4Oc8/icrgUgny4NBSNDrnzTNdGyNfc5PsJ0Q/efC2hT+jXVFxB63NtK0E11p+RmOAfbFWfgXQ1oYHleYOYkLOaJnrQ1BaWIDHeiL9E3Tn32lmksbygxAymgEuD9DPLcbqURAiiSnSh7Is6HRurmUqrlD6td28sf+CSLPtIjCyhRknSOAdct3fLwgS5d3KQ0/xH3OF5/54Xw9NcrofwEgM9ru7I+rQJNlr+eanyI7dPsvehFvHw9Mu5zFWOUeNZRNqocktL158LGV2IAGi8TMP5KssN0D6CiZg863b1ikZAG3sqYx3nwb5DCRehQCPb2+wne5BYwuvrd9Kv2ZGiJF4UMFOdKKMqoENcFa2w+IokWmizzdwcW128SY9xpgCoD49NTkH+jUiiKnu1E/UMnwAHWeHg+K6o1MnVdeqbtOl2Wql0n9mNIHHk1+RqNzCVmMdirGivzdKj3rHzAfpR6bEekqlnyXZcTOpudWo+OV2c5uRs7BtehHhdM404C88k8lSpKYDUQuJE8HeaesJ7OHX+Sk8BYQ/IWfhuBctHuiI5q5tOEbBaeClYq6zxdTpZaCt8Pf0pyDB8EW/y+ X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: nYT3peWpOwh296IGsm+ht8LLgYZhtd8gxe2nVcCLbBSEK7zOemw8jHmAk6FtOgHdbvV/nhE8Zi5+r1Ni9HU3s+wy5vSsOUQmIHO8VRUMhmhdcGmWaVSSuPhWdsJAsO26bfZ7co9rS2LlvZHBtnMRQhx0ZDdZzAdJAIAQy7r+d3n3xLSAhfutQa2jFT5vp23cgBo2XsDJh1zpmkTa4U+iMluIFWV7RDJ/wY9J4VZMWQUSJ9tEQBdq6cF6M7e8h4DZyb5TQFzOKSsJ3CRqhqEmTsooxt7bgS941U5VdBsQoRs1fI6PLPkstcPZgrrgV9fzKuIs+ML4L3tRKX0CtA4sAnEaspybDM1rnI0FobV1x/ZgTE8cUYA78HHH9fbSTunw32Yz0we3cRnIjU3yk1qZ9rZtTLD0bbW/m3nPKk9AK/ISzEGj37qFvCgOPbjYzpMPIWJhyDBwfYBEHEmUWXxQ3e9XzrkDrtE3RgFbQ3WbY1tS0fySQJNUXiMSe419kXQdeATUQrREgxyaA6e7d+Pd4o/ViUfFeXWcM+p7idWLKTwFMbU4rJqYg4qgo3xiT5Ehj9vyEcNgSsGHCF5bsbTqn+970mI6K+B92NO/YWJwrIuIRz1gI/15szswySjcj8LuE23j+KogkcOi+AlervJqABkvy14EkNpfkYIxM+2/4kVNs+Gf5Vbb1C5130lW7w9nVtTzK7mXn+ZS3TseKr/+uSP9Z2ADmhD3AoYSm/WV1MxBNTOPKwlFmy9aOXlJBmRa/RJW1jkr9wM8sAYzSVL2mxWRpTIIulEJAqVSBnP06NxPEtMBjZ1IQrLpcnt9hTX8CNVW7unYHsSt4rV419g/Tw0GZE6TDGuWZ2u5SHAmGfXBNFudm8RTWLt9ZjSxYyDVgbpoSljhcoOT8pe3kHlMb1un0WqdZrlBLlkxBSbGA5PBj8lurU7KIUuCNClPFzYM3S+gvuo176RWpzNn4oDteky5u4UkEKlwonjBjygQFFyz5Kl3eU1bzIlmHWcRWKrRC6itdKubfdpww2XobFn/6JRzgOuwJVJr8CDJi7dSUxDaR0pxh1lLi03dlxbP9bjpvx4UDPvRcosP2KpEhkVBY0fPm1TVflLB9XM7dnwwmM936yEQvFhbZRyEuGTuZv6pjnLGRtOf33vsDGVekyYYw7t3xHyK6vFEJqNq9WA+p7BRL1+zYA/1rOG1wEOdLPxPEkp5mzCQA76Eh8e39x/eJTsbSbTTeu7IOSzmtYLmrJUoeKB+gOIohgDZjMz0rJ/zNADaH/yOPU9pqGNeQTvftA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 925309e8-2b92-4f53-a4b8-08dc848e8773 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jun 2024 12:04:47.4606 (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: SEZPR06MB7187 Subject: [FFmpeg-devel] [PATCH v2 2/5] avcodec/vvcdec: misc, move src offset inside emulated_edge 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: benjamin.bross@hhi.fraunhofer.de, Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4GXEBop36zk0 --- libavcodec/vvc/inter.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/libavcodec/vvc/inter.c b/libavcodec/vvc/inter.c index 0843c99eb6..07b55c4bac 100644 --- a/libavcodec/vvc/inter.c +++ b/libavcodec/vvc/inter.c @@ -57,6 +57,8 @@ static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst, const int dmvr_clip = x_sb != x_off || y_sb != y_off; int pic_width, pic_height; + *src += y_off * *src_stride + (x_off * (1 << fc->ps.sps->pixel_shift)); + subpic_offset(&x_off, &y_off, sps, pps, subpic_idx, is_chroma); subpic_offset(&x_sb, &y_sb, sps, pps, subpic_idx, is_chroma); subpic_width_height(&pic_width, &pic_height, sps, pps, subpic_idx, is_chroma); @@ -170,7 +172,6 @@ static void mc(VVCLocalContext *lc, int16_t *dst, const VVCFrame *ref, const Mv x_off += mv->x >> (4 + hs); y_off += mv->y >> (4 + vs); - src += y_off * src_stride + (x_off * (1 << fc->ps.sps->pixel_shift)); MC_EMULATED_EDGE(lc->edge_emu_buffer, &src, &src_stride, x_off, y_off); fc->vvcdsp.inter.put[is_chroma][idx][!!my][!!mx](dst, src, src_stride, block_h, hf, vf, block_w); @@ -199,7 +200,6 @@ static void mc_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride x_off += mv->x >> (4 + hs); y_off += mv->y >> (4 + vs); - src += y_off * src_stride + (x_off * (1 << fc->ps.sps->pixel_shift)); MC_EMULATED_EDGE(lc->edge_emu_buffer, &src, &src_stride, x_off, y_off); if (derive_weight_uni(&denom, &wx, &ox, lc, mvf, c_idx)) { @@ -236,7 +236,7 @@ static void mc_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, const int oy = y_off + (mv->y >> (4 + vs)); const VVCFrame *ref = refs[i]; ptrdiff_t src_stride = ref->frame->linesize[c_idx]; - const uint8_t *src = ref->frame->data[c_idx] + oy * src_stride + (ox * (1 << fc->ps.sps->pixel_shift)); + const uint8_t *src = ref->frame->data[c_idx]; const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); const int8_t *vf = INTER_FILTER(hpel_if_idx, my); @@ -306,7 +306,6 @@ static void scaled_ref_pos_and_step(const VVCLocalContext *lc, const VVCRefPic * static void emulated_edge_scaled(VVCLocalContext *lc, const uint8_t **src, ptrdiff_t *src_stride, int *src_height, const VVCFrame *ref, const int x, const int y, const int dx, const int dy, const int w, const int h, const int is_chroma) { - const VVCFrameContext *fc = lc->fc; const int x_off = SCALED_INT(x); const int y_off = SCALED_INT(y); const int x_end = SCALED_INT(x + w * dx); @@ -316,8 +315,6 @@ static void emulated_edge_scaled(VVCLocalContext *lc, const uint8_t **src, ptrdi const int block_w = x_end - x_off + (x_end == x_last); const int block_h = *src_height = y_end - y_off + (y_end == y_last); - *src += y_off * *src_stride + (x_off * (1 << fc->ps.sps->pixel_shift)); - MC_EMULATED_EDGE(lc->edge_emu_buffer, src, src_stride, x_off, y_off); } @@ -414,7 +411,6 @@ static void luma_prof_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst x_off += mv->x >> 4; y_off += mv->y >> 4; - src += y_off * src_stride + (x_off * (1 << fc->ps.sps->pixel_shift)); MC_EMULATED_EDGE(lc->edge_emu_buffer, &src, &src_stride, x_off, y_off); if (cb_prof_flag) { @@ -444,8 +440,8 @@ static void luma_prof(VVCLocalContext *lc, int16_t *dst, const VVCFrame *ref, const int idx = av_log2(block_w) - 1; const int is_chroma = 0; uint16_t *prof_tmp = lc->tmp2 + PROF_TEMP_OFFSET; - ptrdiff_t src_stride = ref->frame->linesize[0]; - const uint8_t *src = ref->frame->data[0] + oy * src_stride + (ox * (1 << fc->ps.sps->pixel_shift)); + ptrdiff_t src_stride = ref->frame->linesize[LUMA]; + const uint8_t *src = ref->frame->data[LUMA]; const int8_t *hf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][mx]; const int8_t *vf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][my]; @@ -704,7 +700,7 @@ static void dmvr_mv_refine(VVCLocalContext *lc, MvField *mvf, MvField *orig_mv, const int oy = y_off + (mv->y >> 4) - sr_range; const VVCFrame *ref = refs[i]; ptrdiff_t src_stride = ref->frame->linesize[LUMA]; - const uint8_t *src = ref->frame->data[LUMA] + oy * src_stride + (ox * (1 << fc->ps.sps->pixel_shift)); + const uint8_t *src = ref->frame->data[LUMA]; MC_EMULATED_EDGE_BILINEAR(lc->edge_emu_buffer, &src, &src_stride, ox, oy); fc->vvcdsp.inter.dmvr[!!my][!!mx](tmp[i], src, src_stride, pred_h, mx, my, pred_w); } From patchwork Tue Jun 4 12:04:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 49541 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9183:0:b0:460:55fa:d5ed with SMTP id s3csp2646508vqg; Tue, 4 Jun 2024 05:24:07 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUBhrWD8svy48YIHvatyTF91+s+vAxD1/CyvPkctvFru+sBcrhnmWq/ekpHbV1uivrA1uC12+FlZg9w8+r3mZPFoAkGAY8iV76Vgw== X-Google-Smtp-Source: AGHT+IFDW8fF8ynOk5ifJRih9SvCJhwZsNEtl3DkQRhoC4An+ubdb110UyawT0qZ5BIfllIA0Oce X-Received: by 2002:ac2:4a9a:0:b0:51f:4096:dbca with SMTP id 2adb3069b0e04-52b896d8785mr7023042e87.62.1717503846819; Tue, 04 Jun 2024 05:24:06 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a68b66c0c04si361348566b.607.2024.06.04.05.24.06; Tue, 04 Jun 2024 05:24:06 -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=maqG1VA7; 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 7989C68D6FE; Tue, 4 Jun 2024 15:05:12 +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-psaapc01olkn2047.outbound.protection.outlook.com [40.92.52.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A8D7F68D704 for ; Tue, 4 Jun 2024 15:05:04 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SFfzQvN3U2Mn5KI1saTjZIi196NOxA1iVyJht+dgsWb1o7hBkP1hY9BNwVntB4OBHbRDe/RXPaF4KjZujIbCp/S/MK2ehzTIktyfxFXWN0BN+Rw/0QEdxl/JH6wBxlj0i65+3O2Lj1FxWaJLchc/SC9e2cj8e+2onyQxCdGbb9r7fZ/p5NOwfTuKbHWsr2F/aPaCPj4wyhbUTPsKHl5NGOrlDflXfWWCV7dJlvLi/OPDoCpbzdywJh0Lumspexno7ZDkhfkJoOvtc/j5T81F7W8CXm14548DebFoNdqV/U6NM2oNhFtVqSKbKinmhoxX3d6EZ7MfQO/lkb9nnULdhg== 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=qVpbwUlE3fleldlxP0d70VdN35qLkknFYb8g+rdf+nY=; b=bztKQG3c/EtsVB9p7JRq151NROLe86JzAfoAgAMa3vV0tbCUax/t165HNZB/NMxE/hVHVJsaXKODamZxExdH/pR7Mck4U2qU4ddxfRrBQKBerPJCv38JZd4FO6J7/MlwIIQEEwXF3i7vZiUPN3vXtgo3X1j3d8NMSSsFEp6J9RQQaR5mEPp8mCVqdRQl9plVvznvU70SJVqc0s9KQ14TZGWzNIXtwszm+RKZNPfawlauFxhdiOMrLBqRm64QgjaHr0OFRPfp0MYlFr5KqIbmpQ2FhEo6IbzQSsWTIOc4CpZjpHDq6G7HJoka09Wiop6J0scrLse4tPT4BOGWTd5fDw== 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=qVpbwUlE3fleldlxP0d70VdN35qLkknFYb8g+rdf+nY=; b=maqG1VA7HvhOfqekFR4t3Nus2OU65lT2sladZeHgjtqA8ntcRaKlcvUGZdWt9FI3UAWAlm3iJIYqvU7tOdkxbm+a8PISUJ7Cl9lkyYTAu/H8vniiy8HXnG96ltR3FKPrX1FdrRrc2gMKry+MH47K7bZ3qEJ6SGWBeBDGjYR25LsA3EImXYPyBz1AT0efZ4KhsaN9EEy8TJ8MVcx/L891Kg4X1oN+drlTu9qWZruT8D0RhsW2ZHW3L/r5tCYZ5jjADVCbGuyuZTLlyYCLTgXkwsrV5VF4wj9//V4WeitVGMEmOmvmsOF8dbvQvJ87vZI62tH6vEEG3HVNorloIFuxmA== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEZPR06MB7187.apcprd06.prod.outlook.com (2603:1096:101:234::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7611.30; Tue, 4 Jun 2024 12:04:48 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca%4]) with mapi id 15.20.7633.021; Tue, 4 Jun 2024 12:04:48 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Tue, 4 Jun 2024 20:04:09 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240604120411.435626-1-nuomi2021@gmail.com> References: <20240604120411.435626-1-nuomi2021@gmail.com> X-TMN: [Pv9VoAXglorHMRvGvNQQPEzRoefdmkhP] X-ClientProxiedBy: TYCP286CA0038.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:29d::9) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240604120411.435626-3-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEZPR06MB7187:EE_ X-MS-Office365-Filtering-Correlation-Id: 31cff5c2-bc9f-46df-230e-08dc848e87ea X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|440099019|3412199016|1710799017; X-Microsoft-Antispam-Message-Info: o2+LAGSDAjfjRqGt6xRqhmr9x3Dmss7AGhhS2Rjvy0RaGjrDMmruEGKRyYJf09cNuk2MZZZh4gnFZ7dBCUj7lJKLXoM9jqihVwBGRy2aGvUO6zZKqouXzYi5IR1y2ne49zVik8yzlSi+jhYbYQeUFd5/vg3DTLr8hGXtQLb2MXOEdc184kOgN8M1fLlxMzaCJ7jO3+j3EMCqxVulBZKw5xtD+Mu1mksA25YSvGQUnHjDgORP39HrJVWMRspZM6E29V2PIgRqj8VIMkDzxApgXXJuoTy8o8K9ozxbPe9TvDus6xBisLDT8Vrpr/uahYZaf93bsArOpYbzKOz/06O+QOUrb2Q0YUyma1klOp/Nv9qDRo1fR7qWW7e3o/+4Vvdc+zWmEYGk0Sxpujzt3PI43nMr4ZR8TllCiwsgS3MVJ8R8sv2QNvy+DNtnm9jUd8OMRLqdtu1jZ0wWrJ48Ycf9c/jKGUbaCZmrIDtqLbwQXsq6m+EaFkvy9W+X3/NsBEItwRvjW6QgC6LYRV8tT45Mpvy+js25Mc5M5OYLshPWhChRM6q48EUzpaJf2Hyt6YWJXLV2r2vbFPZagEJ6ky/Bdf1nZw1KaQGiO5V+JND51YJ+F2fyE2f81ZQVsqDej+6E X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: rsnzlrn2lzO3i1i9jbVIZtjd/3MRUfvTuDR/Se9+CwupanK9jSbDDfjKtI0RR/JOgsk7tgOgWzAW2+Qt9cClgnYrFhKn3qRD/p7CPUBhyXNOSOUa2OGgLVfxROfzMQ09FoNkgkRSv6k4OMtHbGkxJMqjr0ejqlTrkoE+D6FRu8RK/ovR+LW4YIvgtAS7P06pyboOuE9IwXvuuHOeyQ6imSZm3szssxWoaqjOCUOayW6iy28YxIsxnx0+4hOSAaClSfUwsRI2PSBQdsMiK+/vpCHcmkg4lrCmWnsYgl8MDBCa4fTkGAMZ1uO9jwYRfGywopC4cJVjL0Do15i6wHGZ/v0cMo0pmirdKNxxHCfbnQGIZXaUM2wy+Cko+ZfIKsLyjVhZrhJdF7D17U+2jDY6NrnVBjIfiQTeYd1nIfr3unkRfV+MjUIYmvWPM+SNOBswj1a0kUHioMQtb+ER2ckEXPXD90GazcTmW86o/DlxgsTOljoAOZ6cs9x7FanOr1R0dCUr8pSK2s3X4h2kJg0y5hf/cN+QdD0QJEapYjFOH8ktpRzAfgy4zvVsh5oHLBOE8fbAi4wNAaSLoxNim1SD/JaPugvrHsbmWUDoR2IkTFW4Yr86kIdu9j4ewhCKUhsTi9f7uQC9nGORcQJWsDt/jl9blXhv4ZAXdXmvkEaTipuITIdfmN6PSJCUXbLP2Jn2qnq1HAj3a3mt1j5dnBg7a+PuBsQPuBb2GDuYwh1Lm8baJeNXdT0RyraklgrZdWYdxbU9o/WpGAmp1UUiqswLczq5x+Wgs+gjkW2GLPkcpz5mAijbbvHlAdA6rlZn2F5fu+sloX94yfDBzOpHRWe+pEbABgLjmHdWZtIVDukn4qpe7+/ItXu4VkGH7xcoGBXgYNZl+PQlCV1QATgdBr+oYpjvRs/VqfN0kSXKoQG2W11sZhd2+TDAUK+8F8MEVJJHd8NseuRkJSnMRB9Rh5G7akdlJatGbKT/aBtlcWL24Pa+E+n1fWCrFiRCG6BxtQF+O19G48QtyILdlq3f0YItHzn48dkjadTdDTT5awaqHoHAVh1e70cbQrw//6GpNUE6x3Um0JY+4dsEpDSPsG0V+p2TlLJl1m5jSwnwcrtCEhiMC1oQGFDOsulxsYA2VPxgXgSgRQ4jNwB9LnDGWnKZAiz3OnC2Af0lvZT9JV+NIyTvuzKo0QelXzCnphK5zkZrvaKzAFm0g+uD5u/rGkkrrReG8y5yDu1phI7yNvzAKKrh16V6Jr85jF7B/KidP0e81ARFMo8QeMA6CVbUHU/Aag== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 31cff5c2-bc9f-46df-230e-08dc848e87ea X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jun 2024 12:04:48.2216 (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: SEZPR06MB7187 Subject: [FFmpeg-devel] [PATCH v2 3/5] avcodec/vvcdec: refact out emulated_edge_no_wrap 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: benjamin.bross@hhi.fraunhofer.de, Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: LGHYfEzWiwsi prepare for refrence wraparound --- libavcodec/vvc/inter.c | 91 ++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 30 deletions(-) diff --git a/libavcodec/vvc/inter.c b/libavcodec/vvc/inter.c index 07b55c4bac..aacd5d8da0 100644 --- a/libavcodec/vvc/inter.c +++ b/libavcodec/vvc/inter.c @@ -30,46 +30,53 @@ #define PROF_TEMP_OFFSET (MAX_PB_SIZE + 32) static const int bcw_w_lut[] = {4, 5, 3, 10, -2}; -static void subpic_offset(int *x_off, int *y_off, - const VVCSPS *sps, const VVCPPS *pps, const int subpic_idx, const int is_chroma) +typedef struct VVCRect { + int l; // left + int t; // top + int r; // right + int b; // bottom +} VVCRect; + +static void subpic_get_rect(VVCRect *r, const VVCFrame *src_frame, const int subpic_idx, const int is_chroma) { - *x_off -= pps->subpic_x[subpic_idx] >> sps->hshift[is_chroma]; - *y_off -= pps->subpic_y[subpic_idx] >> sps->vshift[is_chroma]; + const VVCSPS *sps = src_frame->sps; + const VVCPPS *pps = src_frame->pps; + const int hs = sps->hshift[is_chroma]; + const int vs = sps->vshift[is_chroma]; + + r->l = pps->subpic_x[subpic_idx] >> hs; + r->t = pps->subpic_y[subpic_idx] >> vs; + r->r = r->l + (pps->subpic_width[subpic_idx] >> hs); + r->b = r->t + (pps->subpic_height[subpic_idx] >> vs); } -static void subpic_width_height(int *pic_width, int *pic_height, - const VVCSPS *sps, const VVCPPS *pps, const int subpic_idx, const int is_chroma) +// clip to subblock and subpicture process in 8.5.6.3.2 Luma sample interpolation filtering process +static void clip_to_subpic(int *x_off, int *y_off, int *pic_width, int *pic_height, const VVCRect *subpic, const VVCRect *sb, const int dmvr_clip) { - *pic_width = pps->subpic_width[subpic_idx] >> sps->hshift[is_chroma]; - *pic_height = pps->subpic_height[subpic_idx] >> sps->vshift[is_chroma]; + const int l = dmvr_clip ? FFMIN(FFMAX(subpic->l, sb->l), subpic->r - 1) : subpic->l; + const int t = dmvr_clip ? FFMIN(FFMAX(subpic->t, sb->t), subpic->b - 1) : subpic->t; + const int r = dmvr_clip ? FFMAX(FFMIN(subpic->r, sb->r), subpic->l + 1) : subpic->r; + const int b = dmvr_clip ? FFMAX(FFMIN(subpic->b, sb->b), subpic->t + 1) : subpic->b; + + *x_off -= l; + *y_off -= t; + *pic_width = r - l; + *pic_height = b - t; } -static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst, - const uint8_t **src, ptrdiff_t *src_stride, const VVCFrame *src_frame, - int x_sb, int y_sb, int x_off, int y_off, const int block_w, const int block_h, - const int is_chroma, const int extra_before, const int extra_after) +static void emulated_edge_no_wrap(const VVCLocalContext *lc, uint8_t *dst, + const uint8_t **src, ptrdiff_t *src_stride, + int x_off, int y_off, const int block_w, const int block_h, + const int extra_before, const int extra_after, + const VVCRect *subpic, const VVCRect *sb, const int dmvr_clip) { const VVCFrameContext *fc = lc->fc; - const VVCSPS *sps = src_frame->sps; - const VVCPPS *pps = src_frame->pps; - const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; const int extra = extra_before + extra_after; - const int dmvr_clip = x_sb != x_off || y_sb != y_off; int pic_width, pic_height; *src += y_off * *src_stride + (x_off * (1 << fc->ps.sps->pixel_shift)); - subpic_offset(&x_off, &y_off, sps, pps, subpic_idx, is_chroma); - subpic_offset(&x_sb, &y_sb, sps, pps, subpic_idx, is_chroma); - subpic_width_height(&pic_width, &pic_height, sps, pps, subpic_idx, is_chroma); - if (dmvr_clip) { - const int start_x = FFMIN(FFMAX(x_sb - extra_before, 0), pic_width - 1); - const int start_y = FFMIN(FFMAX(y_sb - extra_before, 0), pic_height - 1); - pic_width = FFMAX(FFMIN(pic_width, x_sb + block_w + extra_after) - start_x, 1); - pic_height = FFMAX(FFMIN(pic_height, y_sb + block_h + extra_after) - start_y, 1); - x_off -= start_x; - y_off -= start_y; - } + clip_to_subpic(&x_off, &y_off, &pic_width, &pic_height, subpic, sb, dmvr_clip); if (dmvr_clip || x_off < extra_before || y_off < extra_before || x_off >= pic_width - block_w - extra_after || @@ -88,16 +95,32 @@ static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst, } } +static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst, + const uint8_t **src, ptrdiff_t *src_stride, const VVCFrame *src_frame, + int x_sb, int y_sb, int x_off, int y_off, int block_w, int block_h, const int wrap_enabled, + const int is_chroma, const int extra_before, const int extra_after) +{ + const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; + const int dmvr_clip = x_sb != x_off || y_sb != y_off; + VVCRect sb = { x_sb - extra_before, y_sb - extra_before, x_sb + block_w + extra_after, y_sb + block_h + extra_after }; + VVCRect subpic; + + subpic_get_rect(&subpic, src_frame, subpic_idx, is_chroma); + + return emulated_edge_no_wrap(lc, dst, src, src_stride, + x_off, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); +} + #define MC_EMULATED_EDGE(dst, src, src_stride, x_off, y_off) \ - emulated_edge(lc, dst, src, src_stride, ref, x_off, y_off, x_off, y_off, block_w, block_h, is_chroma, \ + emulated_edge(lc, dst, src, src_stride, ref, x_off, y_off, x_off, y_off, block_w, block_h, wrap_enabled, is_chroma, \ is_chroma ? CHROMA_EXTRA_BEFORE : LUMA_EXTRA_BEFORE, is_chroma ? CHROMA_EXTRA_AFTER : LUMA_EXTRA_AFTER) #define MC_EMULATED_EDGE_DMVR(dst, src, src_stride, x_sb, y_sb, x_off, y_off) \ - emulated_edge(lc, dst, src, src_stride, ref, x_sb, y_sb, x_off, y_off, block_w, block_h, is_chroma, \ + emulated_edge(lc, dst, src, src_stride, ref, x_sb, y_sb, x_off, y_off, block_w, block_h, wrap_enabled, is_chroma, \ is_chroma ? CHROMA_EXTRA_BEFORE : LUMA_EXTRA_BEFORE, is_chroma ? CHROMA_EXTRA_AFTER : LUMA_EXTRA_AFTER) #define MC_EMULATED_EDGE_BILINEAR(dst, src, src_stride, x_off, y_off) \ - emulated_edge(lc, dst, src, src_stride, ref, x_off, y_off, x_off, y_off, pred_w, pred_h, 0, \ + emulated_edge(lc, dst, src, src_stride, ref, x_off, y_off, x_off, y_off, pred_w, pred_h, wrap_enabled, 0, \ BILINEAR_EXTRA_BEFORE, BILINEAR_EXTRA_AFTER) // part of 8.5.6.6 Weighted sample prediction process @@ -169,6 +192,7 @@ static void mc(VVCLocalContext *lc, int16_t *dst, const VVCFrame *ref, const Mv const int hpel_if_idx = (is_chroma || pu->merge_gpm_flag) ? 0 : pu->mi.hpel_if_idx; const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); const int8_t *vf = INTER_FILTER(hpel_if_idx, my); + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; x_off += mv->x >> (4 + hs); y_off += mv->y >> (4 + vs); @@ -196,6 +220,7 @@ static void mc_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride const int hpel_if_idx = is_chroma ? 0 : pu->mi.hpel_if_idx; const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); const int8_t *vf = INTER_FILTER(hpel_if_idx, my); + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; int denom, wx, ox; x_off += mv->x >> (4 + hs); @@ -239,6 +264,7 @@ static void mc_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, const uint8_t *src = ref->frame->data[c_idx]; const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); const int8_t *vf = INTER_FILTER(hpel_if_idx, my); + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; if (pu->dmvr_flag) { const int x_sb = x_off + (orig_mv->mv[i].x >> (4 + hs)); @@ -314,6 +340,7 @@ static void emulated_edge_scaled(VVCLocalContext *lc, const uint8_t **src, ptrdi const int y_last = SCALED_INT(y + (h - 1) * dy); const int block_w = x_end - x_off + (x_end == x_last); const int block_h = *src_height = y_end - y_off + (y_end == y_last); + const int wrap_enabled = 0; MC_EMULATED_EDGE(lc->edge_emu_buffer, src, src_stride, x_off, y_off); } @@ -407,6 +434,7 @@ static void luma_prof_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst const int8_t *vf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][my]; int denom, wx, ox; const int weight_flag = derive_weight_uni(&denom, &wx, &ox, lc, mvf, LUMA); + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; const int is_chroma = 0; x_off += mv->x >> 4; @@ -444,6 +472,7 @@ static void luma_prof(VVCLocalContext *lc, int16_t *dst, const VVCFrame *ref, const uint8_t *src = ref->frame->data[LUMA]; const int8_t *hf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][mx]; const int8_t *vf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][my]; + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; MC_EMULATED_EDGE(lc->edge_emu_buffer, &src, &src_stride, ox, oy); if (!pu->cb_prof_flag[lx]) { @@ -701,6 +730,8 @@ static void dmvr_mv_refine(VVCLocalContext *lc, MvField *mvf, MvField *orig_mv, const VVCFrame *ref = refs[i]; ptrdiff_t src_stride = ref->frame->linesize[LUMA]; const uint8_t *src = ref->frame->data[LUMA]; + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; + MC_EMULATED_EDGE_BILINEAR(lc->edge_emu_buffer, &src, &src_stride, ox, oy); fc->vvcdsp.inter.dmvr[!!my][!!mx](tmp[i], src, src_stride, pred_h, mx, my, pred_w); } From patchwork Tue Jun 4 12:04:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 49539 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9183:0:b0:460:55fa:d5ed with SMTP id s3csp2635130vqg; Tue, 4 Jun 2024 05:05:36 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWoTcnWN8g5nZVPgd6o5URN4Sgdcrk0cozYc8YPqUQ9RlcZohkqIWpyK65c5tC6Eb8ToVXHMzxVpbJNKK9/b3qpOyPw6WFivadqiQ== X-Google-Smtp-Source: AGHT+IFKDE6efHE+P8+WMBR+CHHDiShLcwp9RHHdIbi2SVIaZKv0jtnRkXwfsEwF/wIrKa99P5c/ X-Received: by 2002:a17:906:260b:b0:a68:b0db:b536 with SMTP id a640c23a62f3a-a68b0dbce6emr573471166b.26.1717502736116; Tue, 04 Jun 2024 05:05:36 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a68e493eb1fsi283514866b.219.2024.06.04.05.05.35; Tue, 04 Jun 2024 05:05:36 -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=tbwCovE0; 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 8396F68D6FF; Tue, 4 Jun 2024 15:05:13 +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-psaapc01olkn2047.outbound.protection.outlook.com [40.92.52.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A900668D704 for ; Tue, 4 Jun 2024 15:05:10 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XvHFoMcSfjX5miQbzEUJ3bxVuHEBCzL04yTbRhDtx6kLdG5Sqfsis7zHoxF07jITZemTzR+9Owua88RMJyRg9kV39NlXfKstLcF0Z8x8qgndx9K6j54JMyR4Sb910BB1QechJMeiumZQiCnfb3ut6YXukwUa47WiV6thOsQ0p6YEOFcil4Tl7zhIvssxfzIeFLaz5Zjg/VrFy+rdPMxsD41d43fIO0UiLhi/Fh+ujOFDPz5f5tVjeVJGJ6Q8h88KossLCaOiVRLkWlFYrKMK+iZO9RSDVieKEkZ7bO03Z93qT7mEbcHI20+gooXt0yRZEi4zW1xqij/MiEM6oRwCCg== 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=NKVhYqCocRYmefb0bAW3VDNqDEnu1aMkVNnPvbrwCAY=; b=ZitIMyJiYfYP1ak0FpuxUOpEnPrtavD2jmcxh27cjeMB4Wf1PuBn0h+BDOpBg4NyYJvCpB0PbsbRQh34II9r1qabvjbQVdnZMbxThb3q/P0mfOk3WF2rSq6A9k14hO2N51GpnJXjk1IAbub35866Zs3z0Ot6KkeAhyowzG6sitRMOfYru0ofaYnzcGPS1Kr7snwDUExrL8CvWYI2A7n6KtjXEIAwQirfC2EuOEVUJLb1d1ILz81eN3wBN6tGXiPrOzjlcWJZYUYANt3u9bw6F9bepY5GX4rFRBG30P5xzh6VMldptt57j0ZxlnqWAbq0CjOnO9U0nPjWYYvIfiDhbA== 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=NKVhYqCocRYmefb0bAW3VDNqDEnu1aMkVNnPvbrwCAY=; b=tbwCovE0T3rToA45ddnODHalnlhzcUX40yrueY25qng29z6RJJ1Qk+/KGTgXRkG/7KnbJjaSbcNu5m/ZrxXkPXX8NS0qh543heZ6ggJqvZUWL+91mY/4AlExvSdusavPH/8LNPZfj1Gywf8BKF3oEEC1b8VWiYasyAN0pyJlunR7v+3LbMujyRxJUqhAwGr3y7DMk4gmBxb/M4G+Z/Fy89RF//CiooAKs2BakoKTqr4ZShEAsrM5wsC+3r1FV+A+CunBxkM8JzIh4SbxwTMzcws8NTIX8zHCe44MsQCiLNGQGNVvJfXCMCJIE89hPhs9SRIwHqKP9ipKZ6To2MRtVQ== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEZPR06MB7187.apcprd06.prod.outlook.com (2603:1096:101:234::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7611.30; Tue, 4 Jun 2024 12:04:49 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca%4]) with mapi id 15.20.7633.021; Tue, 4 Jun 2024 12:04:49 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Tue, 4 Jun 2024 20:04:10 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240604120411.435626-1-nuomi2021@gmail.com> References: <20240604120411.435626-1-nuomi2021@gmail.com> X-TMN: [Dge+qXIfymtUQOTNL8H39GKE+4Xx5yR7] X-ClientProxiedBy: TYCP286CA0038.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:29d::9) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240604120411.435626-4-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEZPR06MB7187:EE_ X-MS-Office365-Filtering-Correlation-Id: 04b25f29-fc55-45b6-770c-08dc848e885e X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|440099019|3412199016|1710799017; X-Microsoft-Antispam-Message-Info: JSkLjaWJesrfrgyKz4iLsJrWhCF0JabN++77vKorSuQKFEuHVZUJSz0I9hrw9WvzxTiB134QCeqtukBHJq1GoXE8WOAfQrdjQEXeRiUyIWKc/WF9/ZBHgG0qW0NwhRdEbvzsNhHQu8OrOlX4ba/59LxKQclwQvtjdcpepwB5gn/qjt1aeQr3limuEAEdLMb/bG2SVAmBuJXBmue4PahOMNEIYPXmDeWog0d/jHyNlVUTf6QEqc9P9bRJpeqPD0vnIdsxxExdl4+pHdvAl4DoOOlT6KADdXDYGU1YjpSt9sjtBuyVd74kEVc6/2ELUz+nOnT5ZcIW+avrNc0KDu/Ghr0EB9gXo2B2JkQ2GjtHslk6o1Ole+to46TL0+Bu9lSUjbJq1Cie/2ai2SRogdc+aSmIo+ysd6m10ExERV1WvRnrkJcC6w1BaevGKhdqYXJxqqeBEOMk6l08BecWkKUQXQ8KfaiIshvqw6i/vMVlqbbuNKYwcuI6yLFdRjpOwlfwWKkOj4lldgIEW2t8dFX3DKBxGO2NEfv8H117SyDfb3mFIhmVOO8uz8SakGlnJubm04KcQcn/wpgmX5IUh1KLYl4vS7eEdkNxZPjS7OFvz2CHKgIlW4vb13S2tl15KvX5 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: y1Rn+J0oii74Jw+V+hoz/HxrlJRPKPr2xpj1F0GOnufJtOj05Il+7PlgD2wNGKaMPqihbSihJUhMTmKgUgWTdHQCojJ5oEmPoqyMu71AUm8tpPCDkyPtIvhSJP129ujJbQpgKJArUdX0SnypzhqSRxiOZE4jIEKQTauUy3e4m5t5kcvob6h48uoUM8m9tvIyt7uEelBjHBtprNsUKYduCsr3I+W7aFMm58Ut9HfnMO4BotWaacdFProTEKhaGIxoCB+P0dMpbc+egX+z878l82yk9cbw0/ObLrme8MbEPMZLqBkLCEq9kg5+K96U6BY4cSpWKZLmgUtcz+uTQJzpTS/ON7z0L6pOijiDb7b/Acj2BsGWmZwHYYCY7UDE6G0BQvdWk6+r3sBPxI7GauBpo1FEHKoqEi3y+r3hgZzHRK3eyYwaQJjvnAnRHEbIqTnuPDc/2J52/Gm10iOpj3lJtLbmZX2MnQG8y4II+DnLVogd0J2fwBrMAwVvHAan78a5YjrblLXeFqEcfQmnHXXHpyplYIsP+5YBWA3KrOoEtYeU0d+ZSIc71LjuQiuY7UO+KXTOlpVu3pJGqbOesR10tW3ia6OBbOBuP9lKfAcGXOvUatDoU6MejLF4BByImXFblSGML1hnVSOI06uFqQyUygoyX8GfW5T4ztMS//f6e+veAh+55yYoFRyhKfGjzriVBBHlZ8UA5IulIfaVtoNjSvG4pQYzMuQrvpBRKUZG9uuJr58btn08a4GbY8mvz9C4W1cXpUQvQhuoRISNP19csrySXfLI56nydr6mFMiMpWT4lmXetKyS/UENLtH8IuksQBdl8kHFNbrFJEboMDbS7qZtZ6ubDERrJWaFAziN/pAczK6MEvfdJ66vsbU9WR6OnYe3Apj49fU4leVf80qAzuarT/fdklAhj/qYQ8Q+Nquddx9LefmF+qwfUH+V8FBnv7aNTKAviMnXd5AIiQtWtYQIMrI+AMgVNkdKGVlcaKzB2dhAgh+StALCFnZBLV4c9rZqXCXSaImhlc0y5UtCg6/cK+ut9DY87QWCd5nhBPu2QYZpRZU14cbBGuBiwesIg9CRaxSleu/0iEAH35L6vcDOQKRmWeXVhLNmEHCHnmWKmVR4TwB85LRSOpQ65wlkyhCXdu2MAu0BGSdbvhUrqIgTSH+oSnyqscaCAx8mwMLxjygL4baVL9jQCZQTGUrnJHyuoNE6lzTcePJbZLNatzBwbpN/a7bw1j5abVHR19CWZwvul7EVXTajLhIZFOVo/VgMZ2IIq7tvvyj9nb/r7g== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 04b25f29-fc55-45b6-770c-08dc848e885e X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jun 2024 12:04:49.1056 (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: SEZPR06MB7187 Subject: [FFmpeg-devel] [PATCH v2 4/5] avcodec/vvcdec: misc, reindent inter.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: benjamin.bross@hhi.fraunhofer.de, Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: EziadeEaPNut --- libavcodec/vvc/inter.c | 278 ++++++++++++++++++++--------------------- 1 file changed, 139 insertions(+), 139 deletions(-) diff --git a/libavcodec/vvc/inter.c b/libavcodec/vvc/inter.c index aacd5d8da0..09575eb2b4 100644 --- a/libavcodec/vvc/inter.c +++ b/libavcodec/vvc/inter.c @@ -127,14 +127,14 @@ static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst, static int derive_weight_uni(int *denom, int *wx, int *ox, const VVCLocalContext *lc, const MvField *mvf, const int c_idx) { - const VVCFrameContext *fc = lc->fc; - const VVCPPS *pps = fc->ps.pps; - const VVCSH *sh = &lc->sc->sh; - const int weight_flag = (IS_P(sh->r) && pps->r->pps_weighted_pred_flag) || + const VVCFrameContext *fc = lc->fc; + const VVCPPS *pps = fc->ps.pps; + const VVCSH *sh = &lc->sc->sh; + const int weight_flag = (IS_P(sh->r) && pps->r->pps_weighted_pred_flag) || (IS_B(sh->r) && pps->r->pps_weighted_bipred_flag); if (weight_flag) { - const int lx = mvf->pred_flag - PF_L0; - const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &fc->ps.ph.pwt : &sh->pwt; + const int lx = mvf->pred_flag - PF_L0; + const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &fc->ps.ph.pwt : &sh->pwt; *denom = w->log2_denom[c_idx > 0]; *wx = w->weight[lx][c_idx][mvf->ref_idx[lx]]; @@ -147,11 +147,11 @@ static int derive_weight_uni(int *denom, int *wx, int *ox, static int derive_weight(int *denom, int *w0, int *w1, int *o0, int *o1, const VVCLocalContext *lc, const MvField *mvf, const int c_idx, const int dmvr_flag) { - const VVCFrameContext *fc = lc->fc; - const VVCPPS *pps = fc->ps.pps; - const VVCSH *sh = &lc->sc->sh; - const int bcw_idx = mvf->bcw_idx; - const int weight_flag = (IS_P(sh->r) && pps->r->pps_weighted_pred_flag) || + const VVCFrameContext *fc = lc->fc; + const VVCPPS *pps = fc->ps.pps; + const VVCSH *sh = &lc->sc->sh; + const int bcw_idx = mvf->bcw_idx; + const int weight_flag = (IS_P(sh->r) && pps->r->pps_weighted_pred_flag) || (IS_B(sh->r) && pps->r->pps_weighted_bipred_flag && !dmvr_flag); if ((!weight_flag && !bcw_idx) || (bcw_idx && lc->cu->ciip_flag)) return 0; @@ -162,7 +162,7 @@ static int derive_weight(int *denom, int *w0, int *w1, int *o0, int *o1, *w0 = 8 - *w1; *o0 = *o1 = 0; } else { - const VVCPPS *pps = fc->ps.pps; + const VVCPPS *pps = fc->ps.pps; const PredWeightTable *w = pps->r->pps_wp_info_in_ph_flag ? &fc->ps.ph.pwt : &sh->pwt; *denom = w->log2_denom[c_idx > 0]; @@ -179,20 +179,20 @@ static int derive_weight(int *denom, int *w0, int *w1, int *o0, int *o1, static void mc(VVCLocalContext *lc, int16_t *dst, const VVCFrame *ref, const Mv *mv, int x_off, int y_off, const int block_w, const int block_h, const int c_idx) { - const VVCFrameContext *fc = lc->fc; - const PredictionUnit *pu = &lc->cu->pu; - const uint8_t *src = ref->frame->data[c_idx]; - ptrdiff_t src_stride = ref->frame->linesize[c_idx]; - const int is_chroma = !!c_idx; - const int hs = fc->ps.sps->hshift[c_idx]; - const int vs = fc->ps.sps->vshift[c_idx]; - const int idx = av_log2(block_w) - 1; - const intptr_t mx = av_mod_uintp2(mv->x, 4 + hs) << (is_chroma - hs); - const intptr_t my = av_mod_uintp2(mv->y, 4 + vs) << (is_chroma - vs); - const int hpel_if_idx = (is_chroma || pu->merge_gpm_flag) ? 0 : pu->mi.hpel_if_idx; - const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); - const int8_t *vf = INTER_FILTER(hpel_if_idx, my); - const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; + const VVCFrameContext *fc = lc->fc; + const PredictionUnit *pu = &lc->cu->pu; + const uint8_t *src = ref->frame->data[c_idx]; + ptrdiff_t src_stride = ref->frame->linesize[c_idx]; + const int is_chroma = !!c_idx; + const int hs = fc->ps.sps->hshift[c_idx]; + const int vs = fc->ps.sps->vshift[c_idx]; + const int idx = av_log2(block_w) - 1; + const intptr_t mx = av_mod_uintp2(mv->x, 4 + hs) << (is_chroma - hs); + const intptr_t my = av_mod_uintp2(mv->y, 4 + vs) << (is_chroma - vs); + const int hpel_if_idx = (is_chroma || pu->merge_gpm_flag) ? 0 : pu->mi.hpel_if_idx; + const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); + const int8_t *vf = INTER_FILTER(hpel_if_idx, my); + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; x_off += mv->x >> (4 + hs); y_off += mv->y >> (4 + vs); @@ -205,22 +205,22 @@ static void mc_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride const VVCFrame *ref, const MvField *mvf, int x_off, int y_off, const int block_w, const int block_h, const int c_idx) { - const VVCFrameContext *fc = lc->fc; - const PredictionUnit *pu = &lc->cu->pu; - const uint8_t *src = ref->frame->data[c_idx]; - ptrdiff_t src_stride = ref->frame->linesize[c_idx]; - const int lx = mvf->pred_flag - PF_L0; - const int hs = fc->ps.sps->hshift[c_idx]; - const int vs = fc->ps.sps->vshift[c_idx]; - const int idx = av_log2(block_w) - 1; - const Mv *mv = &mvf->mv[lx]; - const int is_chroma = !!c_idx; - const intptr_t mx = av_mod_uintp2(mv->x, 4 + hs) << (is_chroma - hs); - const intptr_t my = av_mod_uintp2(mv->y, 4 + vs) << (is_chroma - vs); - const int hpel_if_idx = is_chroma ? 0 : pu->mi.hpel_if_idx; - const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); - const int8_t *vf = INTER_FILTER(hpel_if_idx, my); - const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; + const VVCFrameContext *fc = lc->fc; + const PredictionUnit *pu = &lc->cu->pu; + const uint8_t *src = ref->frame->data[c_idx]; + ptrdiff_t src_stride = ref->frame->linesize[c_idx]; + const int lx = mvf->pred_flag - PF_L0; + const int hs = fc->ps.sps->hshift[c_idx]; + const int vs = fc->ps.sps->vshift[c_idx]; + const int idx = av_log2(block_w) - 1; + const Mv *mv = &mvf->mv[lx]; + const int is_chroma = !!c_idx; + const intptr_t mx = av_mod_uintp2(mv->x, 4 + hs) << (is_chroma - hs); + const intptr_t my = av_mod_uintp2(mv->y, 4 + vs) << (is_chroma - vs); + const int hpel_if_idx = is_chroma ? 0 : pu->mi.hpel_if_idx; + const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); + const int8_t *vf = INTER_FILTER(hpel_if_idx, my); + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; int denom, wx, ox; x_off += mv->x >> (4 + hs); @@ -241,30 +241,30 @@ static void mc_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, const int x_off, const int y_off, const int block_w, const int block_h, const int c_idx, const int sb_bdof_flag) { - const VVCFrameContext *fc = lc->fc; - const PredictionUnit *pu = &lc->cu->pu; - const int hs = fc->ps.sps->hshift[c_idx]; - const int vs = fc->ps.sps->vshift[c_idx]; - const int idx = av_log2(block_w) - 1; - const VVCFrame *refs[] = { ref0, ref1 }; - int16_t *tmp[] = { lc->tmp + sb_bdof_flag * PROF_TEMP_OFFSET, lc->tmp1 + sb_bdof_flag * PROF_TEMP_OFFSET }; + const VVCFrameContext *fc = lc->fc; + const PredictionUnit *pu = &lc->cu->pu; + const int hs = fc->ps.sps->hshift[c_idx]; + const int vs = fc->ps.sps->vshift[c_idx]; + const int idx = av_log2(block_w) - 1; + const VVCFrame *refs[] = { ref0, ref1 }; + int16_t *tmp[] = { lc->tmp + sb_bdof_flag * PROF_TEMP_OFFSET, lc->tmp1 + sb_bdof_flag * PROF_TEMP_OFFSET }; int denom, w0, w1, o0, o1; - const int weight_flag = derive_weight(&denom, &w0, &w1, &o0, &o1, lc, mvf, c_idx, pu->dmvr_flag); - const int is_chroma = !!c_idx; - const int hpel_if_idx = is_chroma ? 0 : pu->mi.hpel_if_idx; + const int weight_flag = derive_weight(&denom, &w0, &w1, &o0, &o1, lc, mvf, c_idx, pu->dmvr_flag); + const int is_chroma = !!c_idx; + const int hpel_if_idx = is_chroma ? 0 : pu->mi.hpel_if_idx; for (int i = L0; i <= L1; i++) { - const Mv *mv = mvf->mv + i; - const int mx = av_mod_uintp2(mv->x, 4 + hs) << (is_chroma - hs); - const int my = av_mod_uintp2(mv->y, 4 + vs) << (is_chroma - vs); - const int ox = x_off + (mv->x >> (4 + hs)); - const int oy = y_off + (mv->y >> (4 + vs)); - const VVCFrame *ref = refs[i]; - ptrdiff_t src_stride = ref->frame->linesize[c_idx]; - const uint8_t *src = ref->frame->data[c_idx]; - const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); - const int8_t *vf = INTER_FILTER(hpel_if_idx, my); - const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; + const Mv *mv = mvf->mv + i; + const int mx = av_mod_uintp2(mv->x, 4 + hs) << (is_chroma - hs); + const int my = av_mod_uintp2(mv->y, 4 + vs) << (is_chroma - vs); + const int ox = x_off + (mv->x >> (4 + hs)); + const int oy = y_off + (mv->y >> (4 + vs)); + const VVCFrame *ref = refs[i]; + ptrdiff_t src_stride = ref->frame->linesize[c_idx]; + const uint8_t *src = ref->frame->data[c_idx]; + const int8_t *hf = INTER_FILTER(hpel_if_idx, mx); + const int8_t *vf = INTER_FILTER(hpel_if_idx, my); + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; if (pu->dmvr_flag) { const int x_sb = x_off + (orig_mv->mv[i].x >> (4 + hs)); @@ -332,15 +332,15 @@ static void scaled_ref_pos_and_step(const VVCLocalContext *lc, const VVCRefPic * static void emulated_edge_scaled(VVCLocalContext *lc, const uint8_t **src, ptrdiff_t *src_stride, int *src_height, const VVCFrame *ref, const int x, const int y, const int dx, const int dy, const int w, const int h, const int is_chroma) { - const int x_off = SCALED_INT(x); - const int y_off = SCALED_INT(y); - const int x_end = SCALED_INT(x + w * dx); - const int y_end = SCALED_INT(y + h * dy); - const int x_last = SCALED_INT(x + (w - 1) * dx); - const int y_last = SCALED_INT(y + (h - 1) * dy); - const int block_w = x_end - x_off + (x_end == x_last); - const int block_h = *src_height = y_end - y_off + (y_end == y_last); - const int wrap_enabled = 0; + const int x_off = SCALED_INT(x); + const int y_off = SCALED_INT(y); + const int x_end = SCALED_INT(x + w * dx); + const int y_end = SCALED_INT(y + h * dy); + const int x_last = SCALED_INT(x + (w - 1) * dx); + const int y_last = SCALED_INT(y + (h - 1) * dy); + const int block_w = x_end - x_off + (x_end == x_last); + const int block_h = *src_height = y_end - y_off + (y_end == y_last); + const int wrap_enabled = 0; MC_EMULATED_EDGE(lc->edge_emu_buffer, src, src_stride, x_off, y_off); } @@ -421,21 +421,21 @@ static void luma_prof_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst const VVCFrame *ref, const MvField *mvf, int x_off, int y_off, const int block_w, const int block_h, const int cb_prof_flag, const int16_t *diff_mv_x, const int16_t *diff_mv_y) { - const VVCFrameContext *fc = lc->fc; - const uint8_t *src = ref->frame->data[LUMA]; - ptrdiff_t src_stride = ref->frame->linesize[LUMA]; - uint16_t *prof_tmp = lc->tmp + PROF_TEMP_OFFSET; - const int idx = av_log2(block_w) - 1; - const int lx = mvf->pred_flag - PF_L0; - const Mv *mv = mvf->mv + lx; - const int mx = mv->x & 0xf; - const int my = mv->y & 0xf; - const int8_t *hf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][mx]; - const int8_t *vf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][my]; + const VVCFrameContext *fc = lc->fc; + const uint8_t *src = ref->frame->data[LUMA]; + ptrdiff_t src_stride = ref->frame->linesize[LUMA]; + uint16_t *prof_tmp = lc->tmp + PROF_TEMP_OFFSET; + const int idx = av_log2(block_w) - 1; + const int lx = mvf->pred_flag - PF_L0; + const Mv *mv = mvf->mv + lx; + const int mx = mv->x & 0xf; + const int my = mv->y & 0xf; + const int8_t *hf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][mx]; + const int8_t *vf = ff_vvc_inter_luma_filters[VVC_INTER_LUMA_FILTER_TYPE_AFFINE][my]; int denom, wx, ox; - const int weight_flag = derive_weight_uni(&denom, &wx, &ox, lc, mvf, LUMA); - const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; - const int is_chroma = 0; + const int weight_flag = derive_weight_uni(&denom, &wx, &ox, lc, mvf, LUMA); + const int wrap_enabled = fc->ps.pps->r->pps_ref_wraparound_enabled_flag; + const int is_chroma = 0; x_off += mv->x >> 4; y_off += mv->y >> 4; @@ -488,11 +488,11 @@ static void luma_prof_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_ const VVCRefPic *ref0, const VVCRefPic *ref1, const MvField *mvf, const int x_off, const int y_off, const int block_w, const int block_h) { - const VVCFrameContext *fc = lc->fc; - const VVCRefPic *refps[] = { ref0, ref1 }; - int16_t *tmp[] = { lc->tmp, lc->tmp1 }; + const VVCFrameContext *fc = lc->fc; + const VVCRefPic *refps[] = { ref0, ref1 }; + int16_t *tmp[] = { lc->tmp, lc->tmp1 }; int denom, w0, w1, o0, o1; - const int weight_flag = derive_weight(&denom, &w0, &w1, &o0, &o1, lc, mvf, LUMA, 0); + const int weight_flag = derive_weight(&denom, &w0, &w1, &o0, &o1, lc, mvf, LUMA, 0); for (int i = L0; i <= L1; i++) { const VVCRefPic *refp = refps[i]; @@ -531,16 +531,16 @@ static int pred_get_refs(const VVCLocalContext *lc, VVCRefPic *refp[2], const Mv static void pred_gpm_blk(VVCLocalContext *lc) { - const VVCFrameContext *fc = lc->fc; - const CodingUnit *cu = lc->cu; - const PredictionUnit *pu = &cu->pu; + const VVCFrameContext *fc = lc->fc; + const CodingUnit *cu = lc->cu; + const PredictionUnit *pu = &cu->pu; const uint8_t angle_idx = ff_vvc_gpm_angle_idx[pu->gpm_partition_idx]; const uint8_t weights_idx = ff_vvc_gpm_angle_to_weights_idx[angle_idx]; - const int w = av_log2(cu->cb_width) - 3; - const int h = av_log2(cu->cb_height) - 3; - const uint8_t off_x = ff_vvc_gpm_weights_offset_x[pu->gpm_partition_idx][h][w]; - const uint8_t off_y = ff_vvc_gpm_weights_offset_y[pu->gpm_partition_idx][h][w]; + const int w = av_log2(cu->cb_width) - 3; + const int h = av_log2(cu->cb_height) - 3; + const uint8_t off_x = ff_vvc_gpm_weights_offset_x[pu->gpm_partition_idx][h][w]; + const uint8_t off_y = ff_vvc_gpm_weights_offset_y[pu->gpm_partition_idx][h][w]; const uint8_t mirror_type = ff_vvc_gpm_angle_to_mirror[angle_idx]; const uint8_t *weights; @@ -549,13 +549,13 @@ static void pred_gpm_blk(VVCLocalContext *lc) int16_t *tmp[2] = {lc->tmp, lc->tmp1}; for (int c_idx = 0; c_idx < c_end; c_idx++) { - const int hs = fc->ps.sps->hshift[c_idx]; - const int vs = fc->ps.sps->vshift[c_idx]; - const int x = lc->cu->x0 >> hs; - const int y = lc->cu->y0 >> vs; - const int width = cu->cb_width >> hs; - const int height = cu->cb_height >> vs; - uint8_t *dst = POS(c_idx, lc->cu->x0, lc->cu->y0); + const int hs = fc->ps.sps->hshift[c_idx]; + const int vs = fc->ps.sps->vshift[c_idx]; + const int x = lc->cu->x0 >> hs; + const int y = lc->cu->y0 >> vs; + const int width = cu->cb_width >> hs; + const int height = cu->cb_height >> vs; + uint8_t *dst = POS(c_idx, lc->cu->x0, lc->cu->y0); ptrdiff_t dst_stride = fc->frame->linesize[c_idx]; int step_x = 1 << hs; @@ -572,8 +572,9 @@ static void pred_gpm_blk(VVCLocalContext *lc) for (int i = 0; i < 2; i++) { const MvField *mv = pu->gpm_mv + i; - const int lx = mv->pred_flag - PF_L0; - VVCRefPic *refp = lc->sc->rpl[lx].refs + mv->ref_idx[lx]; + const int lx = mv->pred_flag - PF_L0; + VVCRefPic *refp = lc->sc->rpl[lx].refs + mv->ref_idx[lx]; + if (!refp->ref) return; if (refp->is_scaled) @@ -589,15 +590,14 @@ static void pred_gpm_blk(VVCLocalContext *lc) static int ciip_derive_intra_weight(const VVCLocalContext *lc, const int x0, const int y0, const int width, const int height) { - const VVCFrameContext *fc = lc->fc; - const VVCSPS *sps = fc->ps.sps; - const int x0b = av_mod_uintp2(x0, sps->ctb_log2_size_y); - const int y0b = av_mod_uintp2(y0, sps->ctb_log2_size_y); - const int available_l = lc->ctb_left_flag || x0b; - const int available_u = lc->ctb_up_flag || y0b; - const int min_pu_width = fc->ps.pps->min_pu_width; - - int w = 1; + const VVCFrameContext *fc = lc->fc; + const VVCSPS *sps = fc->ps.sps; + const int x0b = av_mod_uintp2(x0, sps->ctb_log2_size_y); + const int y0b = av_mod_uintp2(y0, sps->ctb_log2_size_y); + const int available_l = lc->ctb_left_flag || x0b; + const int available_u = lc->ctb_up_flag || y0b; + const int min_pu_width = fc->ps.pps->min_pu_width; + int w = 1; if (available_u &&fc->tab.mvf[((y0 - 1) >> MIN_PU_LOG2) * min_pu_width + ((x0 - 1 + width)>> MIN_PU_LOG2)].pred_flag == PF_INTRA) w++; @@ -709,10 +709,10 @@ static int parametric_mv_refine(const int *sad, const int stride) static void dmvr_mv_refine(VVCLocalContext *lc, MvField *mvf, MvField *orig_mv, int *sb_bdof_flag, const VVCFrame *ref0, const VVCFrame *ref1, const int x_off, const int y_off, const int block_w, const int block_h) { - const VVCFrameContext *fc = lc->fc; - const int sr_range = 2; - const VVCFrame *refs[] = { ref0, ref1 }; - int16_t *tmp[] = { lc->tmp, lc->tmp1 }; + const VVCFrameContext *fc = lc->fc; + const int sr_range = 2; + const VVCFrame *refs[] = { ref0, ref1 }; + int16_t *tmp[] = { lc->tmp, lc->tmp1 }; int sad[SAD_ARRAY_SIZE][SAD_ARRAY_SIZE]; int min_dx, min_dy, min_sad, dx, dy; @@ -808,9 +808,9 @@ static void derive_sb_mv(VVCLocalContext *lc, MvField *mv, MvField *orig_mv, int static void pred_regular_blk(VVCLocalContext *lc, const int skip_ciip) { - const CodingUnit *cu = lc->cu; - PredictionUnit *pu = &lc->cu->pu; - const MotionInfo *mi = &pu->mi; + const CodingUnit *cu = lc->cu; + PredictionUnit *pu = &lc->cu->pu; + const MotionInfo *mi = &pu->mi; MvField mv, orig_mv; int sbw, sbh, sb_bdof_flag = 0; @@ -854,17 +854,17 @@ static void derive_affine_mvc(MvField *mvc, const VVCFrameContext *fc, const MvF static void pred_affine_blk(VVCLocalContext *lc) { - const VVCFrameContext *fc = lc->fc; - const CodingUnit *cu = lc->cu; - const PredictionUnit *pu = &cu->pu; - const MotionInfo *mi = &pu->mi; - const int x0 = cu->x0; - const int y0 = cu->y0; - const int sbw = cu->cb_width / mi->num_sb_x; - const int sbh = cu->cb_height / mi->num_sb_y; - const int hs = fc->ps.sps->hshift[1]; - const int vs = fc->ps.sps->vshift[1]; - const int dst_stride = fc->frame->linesize[LUMA]; + const VVCFrameContext *fc = lc->fc; + const CodingUnit *cu = lc->cu; + const PredictionUnit *pu = &cu->pu; + const MotionInfo *mi = &pu->mi; + const int x0 = cu->x0; + const int y0 = cu->y0; + const int sbw = cu->cb_width / mi->num_sb_x; + const int sbh = cu->cb_height / mi->num_sb_y; + const int hs = fc->ps.sps->hshift[1]; + const int vs = fc->ps.sps->vshift[1]; + const int dst_stride = fc->frame->linesize[LUMA]; for (int sby = 0; sby < mi->num_sb_y; sby++) { for (int sbx = 0; sbx < mi->num_sb_x; sbx++) { @@ -905,9 +905,9 @@ static void pred_affine_blk(VVCLocalContext *lc) static void predict_inter(VVCLocalContext *lc) { - const VVCFrameContext *fc = lc->fc; - const CodingUnit *cu = lc->cu; - const PredictionUnit *pu = &cu->pu; + const VVCFrameContext *fc = lc->fc; + const CodingUnit *cu = lc->cu; + const PredictionUnit *pu = &cu->pu; if (pu->merge_gpm_flag) pred_gpm_blk(lc); @@ -929,9 +929,9 @@ static int has_inter_luma(const CodingUnit *cu) int ff_vvc_predict_inter(VVCLocalContext *lc, const int rs) { - const VVCFrameContext *fc = lc->fc; - const CTU *ctu = fc->tab.ctus + rs; - CodingUnit *cu = ctu->cus; + const VVCFrameContext *fc = lc->fc; + const CTU *ctu = fc->tab.ctus + rs; + CodingUnit *cu = ctu->cus; while (cu) { lc->cu = cu; From patchwork Tue Jun 4 12:04:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 49540 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9183:0:b0:460:55fa:d5ed with SMTP id s3csp2635269vqg; Tue, 4 Jun 2024 05:05:47 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCV+RCzE0pi+Iv/18dz0gVeseFM1fILvyImE48uqvgURHXGp/cldjjBtcDnGTczipIY2I7lwtRdENVe2OBGK7waJa9gvN54/OU/kUA== X-Google-Smtp-Source: AGHT+IEpdDbxtiqWHittorHohQpN8HfLOPGZ93CVoIqf9dO276+d5aMWOgbQFkwjfkkmRZJitqyH X-Received: by 2002:a17:906:3294:b0:a5a:89cf:489a with SMTP id a640c23a62f3a-a6822d09431mr799867966b.4.1717502746953; Tue, 04 Jun 2024 05:05:46 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6830ef1191si470377366b.960.2024.06.04.05.05.46; Tue, 04 Jun 2024 05:05:46 -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=nBmQznLc; 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 C6BE968D712; Tue, 4 Jun 2024 15:05:14 +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-psaapc01olkn2047.outbound.protection.outlook.com [40.92.52.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 62F3968D704 for ; Tue, 4 Jun 2024 15:05:11 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=I2WgmDzh3y79o7rU/hkJy+bsXqw4ZwymOfyEqnaYjbEc9bPKAhaowuhHOzThqJoZ/I2azFWtWep+HHgPnNAVldDrcqpHA/uTO6zKDNh4SK0MQMAAb71TFFpAkhHcsJmjZ7pjJMx3UCFAdE2VachHalY+K0M5AtfF02+yLcuPyDoE4XTCtpD3JfQuudNKYFFCrktcZZbHV7I/Fs/BiAMRclNWikLof/SYVXKH1Zig9e+txBDx1aBdPlddmnWoANH7WZT8cM7EBFBElydwGV33VAR9msMSdxjYxnNyRsMew54mO3axD8rWzibYTdsCDM2KqqRhwHwE7Rzh2XLHfh/4CA== 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=Izr84BhO1ZjAZKZy2atdYQNRXs1fwfH9GOmrd67JyQ4=; b=Femk+uIJjHsyqZ29k3Mh5O+SPFsZboA0rTxnGvtNpttoCZ0POK0ZsH2ow0FFy5SbX4XnWR81Y5VFHQPOjR0W/baDlz3pn783YUoql0qmvyK7ZD++izw2eq6OOA5lwglK/043CSYHNlEWnFNvo6jbQrOJsWXCLMTCYrRmARsJmFLjo2uVkZwEsrIRRlryk2wZYEvnM6UtiVqAzJ0fJj6nTRETym/y56S3D1pKEeK3nZKoHZfUMlwnnHiu1+DPqQUgOMD4vSC+hIGMFkC6A2CmyaAi8SXILm/D5T/k9/MO2lrDD3lwzdoft8zKITMb9PC+60jH29RfwQq6ws1mlheOKQ== 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=Izr84BhO1ZjAZKZy2atdYQNRXs1fwfH9GOmrd67JyQ4=; b=nBmQznLcifKXlTqJIkRSFJHMONpqid9T829ByhtOjHPKYIxGIy7wfw22vEfnitu/sB/dzYXIbSQrAXAiOSPCzvwGElrhrgg/ezM7tGWvjupuWoZGi+zmjD7YVoFQ+tauGMe5oOfFkm88T6z1LuJX/ZvMwdu7DLYf5GjJQHr6bDFWx5/aldj/EKi1QqpwaEw88bvaYNZbG6ZRCL/BAdh7MrLwD5H304/swalkRI6EWPdYECc3MR7DMEkbq+v9W+4BLM8RMb5MrV3OT6nlln4uBVLyKHRB4IkbuV5YJKJx/Z3/kO8P7ApMH2FU0aqe7XgCctXs5iTTl07jko82W/smtw== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by SEZPR06MB7187.apcprd06.prod.outlook.com (2603:1096:101:234::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7611.30; Tue, 4 Jun 2024 12:04:50 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::81f7:9125:583a:1cca%4]) with mapi id 15.20.7633.021; Tue, 4 Jun 2024 12:04:50 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Tue, 4 Jun 2024 20:04:11 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240604120411.435626-1-nuomi2021@gmail.com> References: <20240604120411.435626-1-nuomi2021@gmail.com> X-TMN: [1lCG1m/bq8FO8pEtO1Ko/SUGE3Jk2Adb] X-ClientProxiedBy: TYCP286CA0038.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:29d::9) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240604120411.435626-5-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|SEZPR06MB7187:EE_ X-MS-Office365-Filtering-Correlation-Id: c12a5550-e866-48f3-e88f-08dc848e88e7 X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|440099019|3412199016|1602099003|1710799017; X-Microsoft-Antispam-Message-Info: +ASIqHGvmt2+avgeF/5S7ZJ3gg7H1JwkxLESBju2Js1U7okNhSsyiQEDxxbX1IYb7VZWIa/lFD6imLaR4nTwibqOMZO9lrlAGzw0amJqFFYucGQvfPTtW2F4iIGh634+eLCdrIC6OgbXA+30r+P8yEtXhyTbjrzhv53SqR+5gbRVeuJop3rnp89gk4/QRnZ6KxikHCO5PF5SZTizVfe3pP3KM9ohJWrLvxTAUS5x9RB9k20qc3OEmX+DXPsFBw4h/115y9d/L9a0eh6AVQYa+H+6XZd2r/nPh1nuqWttQChDNOdL06t0rldsCPf09k1GyPCpR/+jRZGd6gcdY8HKzXzi29SYpDmcI4QZVDC8FR3sDPqqS+faqHlH94quuthRF7s/PWV/olnwQrE/sHMr+gDoD/kjDYbonLjrQIslCC8eqgjF/VxPXwAR3fheJpMVDNSQRvy7mB80c8ZT6XgbdKLAHFMBtpklfcgaKnMI6j202vNK6Yisyz1VbRu/WbuDWVOtpU0KFM1eD2uIlnsGU9JTcUZpjqAKDXrRTW64r31RsdW9j7rXxgt/4aatzgxE0fbfpzbMg4L5rccAwerk3qdZgcLHm7NsDaSjnfotEqEC0tBFWPF6iE8xzXCgHHTXWy+1EpiM6GXhR4lEi/tdHmq0p/82ScwaRiHW6QMXVPj4dAzwoABJy2QeT6sSIbe1/gK7Y6PxLXl3YJgHdtvsDAzJgz/PLCWisS64PWHzRO0aN1cVnIIB8a9060fpDd7p X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: PUf9gTLfp3mltJwHOtCzSaWHOZEwpwPQU4FHVNxu/F7tS9KelWYbHEY5MYBfJ3OD700A/MGF5PrPghNRKxZdlCsY1jIeKzxgu0JUkPGqm6Kt7xhC8PtOpSPPS+KFIH2Am0MpySEBU3zWNjVm61mx5qe4iMyMLISVUv3zdm7yJy1drjQDE7maVFP212On1OZEgIh087B8KFLiSop2mzmlrMSdKAllKpgCoY9r8Ehwd6VUlFL5mISFc0TeyFFercHA/cEMw24kMiFiZsO8oFsRwz9QYfIdjI1KGHPeK3oa4uQOdiwdy2NofPQ/z3wJiu0HqKLyNgfZcZFdMmTYaFETcJFsiaAfoyeKV/z0OHWuWZa9ujkRBP9Mu4XIQWYasJHTDi/w+qA3fV476cbtYafEVvXhwWYQEINpbHGfr70Df5hlj34YXDAr9xTc2JgIjkq7w9lnUANjo/CfWrcWcgtBjq/AOKpljjXHeo9AnEALC+JbwqUvMRGKYzcKSlMWPw88AAgnKEC4K3tyP+3ErsZjQEEuQFAWZtW7XrtMb9/Wvpq1xjc1KRUmMHIPdALt/egT+aln1CbKWC0yx+HcatK0QkCTYflIOl0h/X9kwxrOtbw47rFqyB1YYedpfW6lHYqBB9w3xhGuA7Qg4LvqfGNbzTx13WxTo+0HgabnL+hDep0tBKrSQA6aUp9KaaXG+3DmjwCuOSp91VG2Rjyr+X/RS+8L3hX68bV3DIh5RTtDJ/Aoza8svVDUV/cFUZ08UGJUsDDfIgdhISXH2E7Y7gzYQZCMeXuSYJuRQYHmS4w4a5J8F7NaWKSxpikvt/YUcMX6TZR4l4pAQOdv3jBzwP6UZq4coIWp+TyBX2wkWicBW/joQ9NhX+K9KdCekPWj41T8jWtf4tkch3FIz14JBWpk+3YRxmK2+p3QZdkIg7HvFdjpfVPJ/pQ+LLDIZr5ap7OEohttIXQZWUYKUpBRnZC/f+mlDR7XdY4yWx+hNMEWeVQFm/e5zPrYZTpjNldS4eQr1UJTKlO6qZdbbOYGv4swLh7vpvXn7uGMvRjI/yxDhDTCeLb2dHUX/Pdq6THY0G0ulJuvDhSrE9otV5Tjm63tJLuGM01/JjeZ6L8b+rYdxHJOp/3qhaYF1WKc+n9rObre/6DWiJXq5dOZFfBDF/pMWrpllU8jZ7huzL5HsXOWTN9+yGOpzcHJVW6qKtmZe3oO0nFUysLn5elbbvXHhjDTb/KRi8PKBHRSWK4dPAbtjaXFMMn6wEfg+Co944thNa30UhsDmW6+JO66wcNHxuNVRg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c12a5550-e866-48f3-e88f-08dc848e88e7 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jun 2024 12:04:49.8850 (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: SEZPR06MB7187 Subject: [FFmpeg-devel] [PATCH v2 5/5] avcodec/vvcdec: support mv wraparound 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: benjamin.bross@hhi.fraunhofer.de, Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: vs+IIbc3buhm A 360 video specific tool see https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9503377 passed files: DMVR_A_Huawei_3.bit WRAP_D_InterDigital_4.bit WRAP_A_InterDigital_4.bit WRAP_B_InterDigital_4.bit WRAP_C_InterDigital_4.bit ERP_A_MediaTek_3.bit --- libavcodec/vvc/inter.c | 81 ++++++++++++++++++++++++- tests/ref/fate/vvc-conformance-WRAP_A_4 | 16 ++--- 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/libavcodec/vvc/inter.c b/libavcodec/vvc/inter.c index 09575eb2b4..98cb43322f 100644 --- a/libavcodec/vvc/inter.c +++ b/libavcodec/vvc/inter.c @@ -95,20 +95,97 @@ static void emulated_edge_no_wrap(const VVCLocalContext *lc, uint8_t *dst, } } +static void emulated_half(const VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, + const uint8_t *src, const ptrdiff_t src_stride, const int ps, + int x_off, int y_off, const int block_w, const int block_h, + const VVCRect *subpic,const VVCRect *half_sb, const int dmvr_clip) +{ + const VVCFrameContext *fc = lc->fc; + int pic_width, pic_height; + + src += y_off * src_stride + x_off * (1 << ps); + + clip_to_subpic(&x_off, &y_off, &pic_width, &pic_height, subpic, half_sb, dmvr_clip); + + fc->vdsp.emulated_edge_mc(dst, src, dst_stride, src_stride, + block_w, block_h, x_off, y_off, pic_width, pic_height); +} + +static void sb_set_lr(VVCRect *sb, const int l, const int r) +{ + sb->l = l; + sb->r = r; +} + +static void sb_wrap(VVCRect *sb, const int wrap) +{ + sb_set_lr(sb, sb->l + wrap, sb->r + wrap); +} + static void emulated_edge(const VVCLocalContext *lc, uint8_t *dst, const uint8_t **src, ptrdiff_t *src_stride, const VVCFrame *src_frame, int x_sb, int y_sb, int x_off, int y_off, int block_w, int block_h, const int wrap_enabled, const int is_chroma, const int extra_before, const int extra_after) { + const VVCSPS *sps = src_frame->sps; + const VVCPPS *pps = src_frame->pps; + const int ps = sps->pixel_shift; const int subpic_idx = lc->sc->sh.r->curr_subpic_idx; + const int extra = extra_before + extra_after; const int dmvr_clip = x_sb != x_off || y_sb != y_off; + const int dmvr_left = FFMAX(x_off, x_sb) - extra_before; + const int dmvr_right = FFMIN(x_off, x_sb) + block_w + extra_after; + const int left = x_off - extra_before; + const int top = y_off - extra_before; + const int pic_width = pps->width >> sps->hshift[is_chroma]; + const int wrap = pps->ref_wraparound_offset << (sps->min_cb_log2_size_y - sps->hshift[is_chroma]); + const ptrdiff_t dst_stride = EDGE_EMU_BUFFER_STRIDE << ps; VVCRect sb = { x_sb - extra_before, y_sb - extra_before, x_sb + block_w + extra_after, y_sb + block_h + extra_after }; VVCRect subpic; subpic_get_rect(&subpic, src_frame, subpic_idx, is_chroma); - return emulated_edge_no_wrap(lc, dst, src, src_stride, - x_off, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); + if (!wrap_enabled || (dmvr_left >= 0 && dmvr_right <= pic_width)) { + return emulated_edge_no_wrap(lc, dst, src, src_stride, + x_off, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); + } + if (dmvr_right <= 0) { + sb_wrap(&sb, wrap); + return emulated_edge_no_wrap(lc, dst, src, src_stride, + x_off + wrap, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); + } + if (dmvr_left >= pic_width) { + sb_wrap(&sb, -wrap); + return emulated_edge_no_wrap(lc, dst, src, src_stride, + x_off - wrap, y_off, block_w, block_h, extra_before, extra_after, &subpic, &sb, dmvr_clip); + } + + block_w += extra; + block_h += extra; + + // half block are wrapped + if (dmvr_left < 0 ) { + const int w = -left; + VVCRect half_sb = { sb.l + wrap, sb.t, 0 + wrap, sb.b }; + emulated_half(lc, dst, dst_stride, *src, *src_stride, ps, + left + wrap, top, w, block_h, &subpic, &half_sb, dmvr_clip); + + sb_set_lr(&half_sb, 0, sb.r); + emulated_half(lc, dst + (w << ps), dst_stride, *src, *src_stride, ps, + 0, top, block_w - w, block_h, &subpic, &half_sb, dmvr_clip); + } else { + const int w = pic_width - left; + VVCRect half_sb = { sb.l, sb.t, pic_width, sb.b }; + emulated_half(lc, dst, dst_stride, *src, *src_stride, ps, + left, top, w, block_h, &subpic, &half_sb, dmvr_clip); + + sb_set_lr(&half_sb, pic_width - wrap, sb.r - wrap); + emulated_half(lc, dst + (w << ps), dst_stride, *src, *src_stride, ps, + pic_width - wrap , top, block_w - w, block_h, &subpic, &half_sb, dmvr_clip); + } + + *src = dst + extra_before * dst_stride + (extra_before << ps); + *src_stride = dst_stride; } #define MC_EMULATED_EDGE(dst, src, src_stride, x_off, y_off) \ diff --git a/tests/ref/fate/vvc-conformance-WRAP_A_4 b/tests/ref/fate/vvc-conformance-WRAP_A_4 index 7273880c2d..7f69d5e029 100644 --- a/tests/ref/fate/vvc-conformance-WRAP_A_4 +++ b/tests/ref/fate/vvc-conformance-WRAP_A_4 @@ -4,11 +4,11 @@ #dimensions 0: 1680x832 #sar 0: 0/1 0, 0, 0, 1, 4193280, 0xbd70f1b3 -0, 1, 1, 1, 4193280, 0x64e160d5 -0, 2, 2, 1, 4193280, 0xd20722ea -0, 3, 3, 1, 4193280, 0xa1d00055 -0, 4, 4, 1, 4193280, 0xe3dcb9cd -0, 5, 5, 1, 4193280, 0xcf97b6cf -0, 6, 6, 1, 4193280, 0xd87b73d0 -0, 7, 7, 1, 4193280, 0x0f8ee2bc -0, 8, 8, 1, 4193280, 0x76607ca4 +0, 1, 1, 1, 4193280, 0x491104c9 +0, 2, 2, 1, 4193280, 0xf600c2c1 +0, 3, 3, 1, 4193280, 0x1e3c8e2b +0, 4, 4, 1, 4193280, 0xad275e45 +0, 5, 5, 1, 4193280, 0xcd6103d7 +0, 6, 6, 1, 4193280, 0x0ec8cfbd +0, 7, 7, 1, 4193280, 0x2f664486 +0, 8, 8, 1, 4193280, 0x543eb3fc