From patchwork Thu Feb 22 07:14:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 46430 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:26a3:b0:19e:cdac:8cce with SMTP id h35csp173835pze; Wed, 21 Feb 2024 23:15:44 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCXt8D6DouyF6vH0RFUx1FMHcoQLVP7EbByYhEY2KjcsQA6CqxD8AxTR26yEjEGUjZ9lv8tpK52IphCDUw0Gb+DZJCpTGEUjxbWsNw== X-Google-Smtp-Source: AGHT+IHQmvfAd3BVl950hVAO6GRkWXokGeKwy6HyIAxGf5dA8MlwASQvy+l0mtjo6lri+X9+Zvu/ X-Received: by 2002:a17:906:f903:b0:a3f:302f:7753 with SMTP id lc3-20020a170906f90300b00a3f302f7753mr3657095ejb.21.1708586144400; Wed, 21 Feb 2024 23:15:44 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e12-20020a1709062c0c00b00a3bb4587162si4412646ejh.515.2024.02.21.23.15.43; Wed, 21 Feb 2024 23:15:44 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=V1Bt6wMX; 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 3D45768D212; Thu, 22 Feb 2024 09:15:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from APC01-SG2-obe.outbound.protection.outlook.com (mail-sgaapc01olkn2011.outbound.protection.outlook.com [40.92.53.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B03B168D18B for ; Thu, 22 Feb 2024 09:15:03 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=K0tYIDj8m3bi+rM809XMR+JbJSKKXWDyiOnQlv+6ztcHV/IB1DrJAfXY2+X0cndZropRo1u907UKYtT7SOz6hb5JC+VwR63BuMS2facb1Bc1vAhkTMDk+o66Lo8/AiE/0XkBdJzG2FyFg8kTH8gKzXrCLA8lnIGF+wmnH7WDea+Y8LWzQIB96jEZCDlg6Rf09PtTWOiqDkCRwz9zrsQ20PgVxjbfRUMMS84SnEfO3En+u2Yu6kQRc5N6UNZPcD9jEhmNR0VoPs1u/FsTKkU/MBDnxaujMW+wkR8MM0RS8tYTQ077IATMVyVgkygsYB1US0dOGwpKTWNPvhu/tp4Ukw== 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=xMHuSmaBcDiECzk8nDYris857jZHXEEbMlYxvz6pyyA=; b=FXQGPCeKKClwT6QnLLpyfarsjyZ/wkTf+ztVIVyGqg1ckHC94Wa/3XFJL4xcAz1GSaSgfqh2cb174HZ3gYiPJU7FJPHGCDDIc10Jgu+f5zW4ew3rm03WqjpdPhJ4QcXrsgem0X1lmw+vFYptxKaBG0kvNzNrMvsMtZWF8saHNiKKUczuikFr+1fly3rtgvdwAtzUl61zwNCCmURXofPVuDI5qHYRjZZp43jh9IDWQpZ5Y7rkqok3d+zbQVWJLmr8y0e7XsnMc+9F5OeS62VNhPxyY5ew+qBBCPm1rC5hPMUtyimAQbKQ3rWZr6sET1zt3kdMLUZwkk0/p08tj497bw== 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=xMHuSmaBcDiECzk8nDYris857jZHXEEbMlYxvz6pyyA=; b=V1Bt6wMX+ETF3Dtes4ZikKCs0ITRHidjJqK9AxoLHzCxN9YNoDv87jivvU7yXwkRjW54rTfWAoo9LWlIw8W8CkXtSq7UHxtClJWQdtjgQypD3A2tkOwyeA3nKklpEEu+S8SSzFkvzh0QyzMFt8EpuGfjHIzZuJL646yQ62yF4sBLcXX1HYWsV7rXIKJa8B08GipCxmCZenG16JnCQE6iu0cefyi6FHCLXXdyacgXzLkNhcTlAmqdJqwO4uQ+RLRFDnnpcVUkH3H2S0pwus280PCIyINBVmxxDpaOM9lqjun5AOMmjawEuuu8lLwvXVX1Zp8XGiplTHWLMPoPt8Q/Fw== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by TYUPR06MB6241.apcprd06.prod.outlook.com (2603:1096:400:358::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7292.38; Thu, 22 Feb 2024 07:14:53 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::e139:fd7a:1b66:a3f7%7]) with mapi id 15.20.7292.036; Thu, 22 Feb 2024 07:14:53 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Thu, 22 Feb 2024 15:14:05 +0800 Message-ID: X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240222071406.5714-1-nuomi2021@gmail.com> References: <20240222071406.5714-1-nuomi2021@gmail.com> X-TMN: [N+DPUqKOgtirNQwuwXej523jIt14wjKa] X-ClientProxiedBy: TYCP286CA0049.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b5::7) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240222071406.5714-11-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|TYUPR06MB6241:EE_ X-MS-Office365-Filtering-Correlation-Id: fcfb1c2d-fa23-4346-c753-08dc3375f774 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: si+75R8o1S+WfD0UN6QGfuo9Qq7HmVEWFF9sqbNvUeEIygt5pu3kK0c6mQ9txTQu2xkxhJr1nb1b7w0UCH+4MOSk8TQ4JrtHiUomTEg79BjCdCvXPI+aOc2HtT72ZrNQOqHOx4qSWi2CoaTlGUz8Yjv8Gj+kpavXK9IiwWuUIf7U+GLCfZDqyTHmP+bgQDVqjWQg48P0wEId2rIHJM3b/x4zEuudNCMkvabCNfSmJGH+FYVchzxE91vVJq3gO0T765fhLjFHxFMXtqJ8vG5Xnj9GbTPHNzHj7vmpPOVd0XglxgqfwzDfjI/FsEAssh2FFhSyHFeQfby+ZpPftCQdAXl6Q9V8AKseiiOiudIJ5UTbTGgh2qv6K8EJZfZlFKRz5ch99IkCmxMgNa05wkLn1h/PiYKGWUgmjW/uCkht6j1TKYt8ovLKfGtTa4PiBfiwFx6IaJk7OKVSFg6zCBYecjilbB6oO2EmY1vAnE2L50A5HuSVTZO/aupLMjwBjhAPpKloYyworpBRWkQdUYqfUxaDfO4GFckjpUrJLDMXMZStxA2eBYOBonnv3hZBebYhUYQiQdfyCYl3tyEVa7ucHN79LPgLraryt9ji05fODGEh3oxIBX/uAnmi+/HxZweQ X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: axAeiuaGKB1FpDbtvE0NFqeqRPGVGK6OnacgvjIAdyFaHBOA9vhlNM4iTpfhvdfJmoMMCuWGbw6pDHRoysHY/verylKctyH3i4FG2U420QNhekUizdgwVHmgQlJwk7xe/r0WBl72fCWzzLibxyLL7UQ8kXGQ8Y/H0qkCzgVqHj/uGhvUgR+p6/hRJeB9t+hQ7xgP3DvWcE4ZXv+AgHXZW9136kLv+fpw2ZwiVneTPD15Pl19JWCB7qmk7NC0qBtSJHEkdtakABJ15fd09DAYP5V5JDeXvPwACim5/spIhoqp4qPL13euYo61ACXFHU0RuztK3UkVI/KCTfemnW3XVsGH96utY8wif+rnZ/++2k3Mmv2MhIls1jH2H6qwHobdFbl12cX6JTCEAIb9rILCSucJ+7X9KYKHL1aCCoBEz7enOxTpAZtvkgalHO+JVdJT2cO0WImJ4NuenzsUX3t1ol1ylX5uWtCfpPjVQEGPKLu0C61oQDSiQi4ZMbxC7V0xSvNeRHGYSRJghRW0OiJL6ZrtvyotnpOvkoOupGRRqViBlsJCIXCe/rOf5yLj2+SC+xosh07asUYRAqjnujwdQGluOlx5H/tHLfTRqTN0CA+OU1yIXbz/lsgJv4WsMvcnmlswtmEZgMFvGgVzvu63rWl5GKvwdtFuBhSZ612E8dqWripj1pYoa1CU5nHtjEGBmBSkq2alwEDN/LQEaA7HAVCZCiPHzycQkPsZH2X5u1ml2/VwraelWRerxcIwoHmGmv5MoUgQbxjuCMRtDFwvEuKiuiZCrTUCn792xR564h4YfCKxheWVyb0iNeauRvbs0sV3HozUAD2MpaESl9+6uBM1+58kABKHDb2QjKPv2Q7ONPcUiayH2/TH0pQUNFTKQRZbgNrFsCCyJegcCInmlXPfHy14GzsuzO9aLpOh6fQklQk9IMisnhTgLpG26nSKTBHXFfko376H3Z1zFmAS7ln1mvaTFZYcid2obM1UYwxC57zMElsunryWt1rWmVqB7xSUkK5GdcYo0sFeRDIp0zF3vGydoiye87c0zrac2grIfSIieJIIEVpcmnP0CTqr6KDXTzzPwV0nAfLpFs1UD8xFkH4ZBR/I1NooJAYsomaS3iu2icHItmkri/X+jA4WLwC6FxXVYI6EWcB/CYw5QlLZ/HILtAy+b5XbAMNxOcMqFoA5R2/Cnuq2BoQftp8zQGAgr6M+FyvB3i2jX6DpkXJkhcB1TFOAonIn27Sl/ERk0A27f5QMzmr8Q3MC67DHFEVpMftDJ+VPhU3Gcflg6g== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: fcfb1c2d-fa23-4346-c753-08dc3375f774 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Feb 2024 07:14:53.8067 (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: TYUPR06MB6241 Subject: [FFmpeg-devel] [PATCH 10/11] avcodec/vvcdec: add Intra Block Copy parser 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 , Wu Jianhua Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: rwnx++91j9Vu From: Wu Jianhua Co-authored-by: Nuo Mi --- libavcodec/vvc/vvc_ctu.c | 76 +++++++++++++++++++++----- libavcodec/vvc/vvc_ctu.h | 1 + libavcodec/vvc/vvc_mvs.c | 113 ++++++++++++++++++++++++++++++++++++++- libavcodec/vvc/vvc_mvs.h | 2 + 4 files changed, 177 insertions(+), 15 deletions(-) diff --git a/libavcodec/vvc/vvc_ctu.c b/libavcodec/vvc/vvc_ctu.c index 2cf6e82f26..75b9e73ae3 100644 --- a/libavcodec/vvc/vvc_ctu.c +++ b/libavcodec/vvc/vvc_ctu.c @@ -1444,6 +1444,22 @@ static void merge_data_block(VVCLocalContext *lc) } } +static void merge_data_ibc(VVCLocalContext *lc) +{ + const VVCFrameContext* fc = lc->fc; + const VVCSPS* sps = fc->ps.sps; + MotionInfo *mi = &lc->cu->pu.mi; + int merge_idx = 0; + + mi->pred_flag = PF_IBC; + + if (sps->max_num_ibc_merge_cand > 1) + merge_idx = ff_vvc_merge_idx(lc); + + ff_vvc_luma_mv_merge_ibc(lc, merge_idx, &mi->mv[L0][0]); + ff_vvc_store_mv(lc, mi); +} + static int hls_merge_data(VVCLocalContext *lc) { const VVCFrameContext *fc = lc->fc; @@ -1454,8 +1470,7 @@ static int hls_merge_data(VVCLocalContext *lc) pu->merge_gpm_flag = 0; pu->mi.num_sb_x = pu->mi.num_sb_y = 1; if (cu->pred_mode == MODE_IBC) { - avpriv_report_missing_feature(fc->log_ctx, "Intra Block Copy"); - return AVERROR_PATCHWELCOME; + merge_data_ibc(lc); } else { if (ph->max_num_subblock_merge_cand > 0 && cu->cb_width >= 8 && cu->cb_height >= 8) pu->merge_subblock_flag = ff_vvc_merge_subblock_flag(lc); @@ -1571,6 +1586,33 @@ static void mvp_add_difference(MotionInfo *mi, const int num_cp_mv, } } +static int mvp_data_ibc(VVCLocalContext *lc) +{ + const VVCFrameContext *fc = lc->fc; + const CodingUnit *cu = lc->cu; + const PredictionUnit *pu = &lc->cu->pu; + const VVCSPS *sps = fc->ps.sps; + MotionInfo *mi = &lc->cu->pu.mi; + int mvp_l0_flag = 0; + int amvr_shift = 4; + Mv *mv = &mi->mv[L0][0]; + + mi->pred_flag = PF_IBC; + mi->num_sb_x = 1; + mi->num_sb_y = 1; + + hls_mvd_coding(lc, mv); + if (sps->max_num_ibc_merge_cand > 1) + mvp_l0_flag = ff_vvc_mvp_lx_flag(lc); + if (sps->r->sps_amvr_enabled_flag && (mv->x || mv->y)) + amvr_shift = ff_vvc_amvr_shift(lc, pu->inter_affine_flag, cu->pred_mode, 1); + + ff_vvc_mvp_ibc(lc, mvp_l0_flag, amvr_shift, mv); + ff_vvc_store_mv(lc, mi); + + return 0; +} + static int mvp_data(VVCLocalContext *lc) { const VVCFrameContext *fc = lc->fc; @@ -1691,17 +1733,24 @@ static void refine_regular_subblock(const VVCLocalContext *lc) } } -static void fill_dmvr_info(const VVCFrameContext *fc, const int x0, const int y0, - const int width, const int height) +static void fill_dmvr_info(const VVCLocalContext *lc) { - const VVCPPS *pps = fc->ps.pps; - const int w = width >> MIN_PU_LOG2; + const VVCFrameContext *fc = lc->fc; + const CodingUnit *cu = lc->cu; + + if (cu->pred_mode == MODE_IBC) { + ff_vvc_set_intra_mvf(lc, 1); + } else { + const VVCPPS *pps = fc->ps.pps; + const int w = cu->cb_width >> MIN_PU_LOG2; + + for (int y = cu->y0 >> MIN_PU_LOG2; y < (cu->y0 + cu->cb_height) >> MIN_PU_LOG2; y++) { + const int idx = pps->min_pu_width * y + (cu->x0 >> MIN_PU_LOG2); + const MvField *mvf = fc->tab.mvf + idx; + MvField *dmvr_mvf = fc->ref->tab_dmvr_mvf + idx; - for (int y = y0 >> MIN_PU_LOG2; y < (y0 + height) >> MIN_PU_LOG2; y++) { - const int idx = pps->min_pu_width * y + (x0 >> MIN_PU_LOG2); - const MvField *mvf = fc->tab.mvf + idx; - MvField *dmvr_mvf = fc->ref->tab_dmvr_mvf + idx; - memcpy(dmvr_mvf, mvf, sizeof(MvField) * w); + memcpy(dmvr_mvf, mvf, sizeof(MvField) * w); + } } } @@ -1719,8 +1768,7 @@ static int inter_data(VVCLocalContext *lc) if (pu->general_merge_flag) { hls_merge_data(lc); } else if (cu->pred_mode == MODE_IBC){ - avpriv_report_missing_feature(lc->fc->log_ctx, "Intra Block Copy"); - return AVERROR_PATCHWELCOME; + ret = mvp_data_ibc(lc); } else { ret = mvp_data(lc); } @@ -1734,7 +1782,7 @@ static int inter_data(VVCLocalContext *lc) } if (!pu->dmvr_flag) - fill_dmvr_info(lc->fc, cu->x0, cu->y0, cu->cb_width, cu->cb_height); + fill_dmvr_info(lc); return ret; } diff --git a/libavcodec/vvc/vvc_ctu.h b/libavcodec/vvc/vvc_ctu.h index 5ed331a831..8020e184c5 100644 --- a/libavcodec/vvc/vvc_ctu.h +++ b/libavcodec/vvc/vvc_ctu.h @@ -217,6 +217,7 @@ typedef enum PredFlag { PF_L0 = 0x1, PF_L1 = 0x2, PF_BI = 0x3, + PF_IBC = PF_L0 | 0x4, } PredFlag; typedef enum IntraPredMode { diff --git a/libavcodec/vvc/vvc_mvs.c b/libavcodec/vvc/vvc_mvs.c index 56e4009741..6398fd3571 100644 --- a/libavcodec/vvc/vvc_mvs.c +++ b/libavcodec/vvc/vvc_mvs.c @@ -589,6 +589,11 @@ static void init_neighbour_context(NeighbourContext *ctx, const VVCLocalContext ctx->lc = lc; } +static av_always_inline PredMode pred_flag_to_mode(PredFlag pred) +{ + return pred == PF_IBC ? MODE_IBC : (pred == PF_INTRA ? MODE_INTRA : MODE_INTER); +} + static int check_available(Neighbour *n, const VVCLocalContext *lc, const int check_mer) { const VVCFrameContext *fc = lc->fc; @@ -600,7 +605,7 @@ static int check_available(Neighbour *n, const VVCLocalContext *lc, const int ch if (!n->checked) { n->checked = 1; n->available = !sps->r->sps_entropy_coding_sync_enabled_flag || ((n->x >> sps->ctb_log2_size_y) <= (cu->x0 >> sps->ctb_log2_size_y)); - n->available &= TAB_MVF(n->x, n->y).pred_flag != PF_INTRA; + n->available &= cu->pred_mode == pred_flag_to_mode(TAB_MVF(n->x, n->y).pred_flag); if (check_mer) n->available &= !is_same_mer(fc, n->x, n->y, cu->x0, cu->y0); } @@ -1589,6 +1594,112 @@ void ff_vvc_mvp(VVCLocalContext *lc, const int *mvp_lx_flag, const int amvr_shif mvp(lc, mvp_lx_flag[L1], L1, mi->ref_idx, amvr_shift, &mi->mv[L1][0]); } +static int ibc_spatial_candidates(const VVCLocalContext *lc, const int merge_idx, Mv *const cand_list, int *nb_merge_cand) +{ + const CodingUnit *cu = lc->cu; + const VVCFrameContext *fc = lc->fc; + const int min_pu_width = fc->ps.pps->min_pu_width; + const MvField *tab_mvf = fc->tab.mvf; + const int is_gt4by4 = (cu->cb_width * cu->cb_height) > 16; + int num_cands = 0; + + NeighbourContext nctx; + Neighbour *a1 = &nctx.neighbours[A1]; + Neighbour *b1 = &nctx.neighbours[B1]; + + if (!is_gt4by4) { + *nb_merge_cand = 0; + return 0; + } + + init_neighbour_context(&nctx, lc); + + if (check_available(a1, lc, 1)) { + cand_list[num_cands++] = TAB_MVF(a1->x, a1->y).mv[L0]; + if (num_cands > merge_idx) + return 1; + } + if (check_available(b1, lc, 1)) { + const MvField *mvf = &TAB_MVF(b1->x, b1->y); + if (!num_cands || !IS_SAME_MV(&cand_list[0], mvf->mv)) { + cand_list[num_cands++] = mvf->mv[L0]; + if (num_cands > merge_idx) + return 1; + } + } + + *nb_merge_cand = num_cands; + return 0; +} + +static int ibc_history_candidates(const VVCLocalContext *lc, + const int merge_idx, Mv *cand_list, int *nb_merge_cand) +{ + const CodingUnit *cu = lc->cu; + const EntryPoint *ep = lc->ep; + const int is_gt4by4 = (cu->cb_width * cu->cb_height) > 16; + int num_cands = *nb_merge_cand; + + for (int i = 1; i <= ep->num_hmvp_ibc; i++) { + int same_motion = 0; + const MvField *mvf = &ep->hmvp_ibc[ep->num_hmvp_ibc - i]; + for (int j = 0; j < *nb_merge_cand; j++) { + same_motion = is_gt4by4 && i == 1 && IS_SAME_MV(&mvf->mv[L0], &cand_list[j]); + if (same_motion) + break; + } + if (!same_motion) { + cand_list[num_cands++] = mvf->mv[L0]; + if (num_cands > merge_idx) + return 1; + } + } + + *nb_merge_cand = num_cands; + return 0; +} + +#define MV_BITS 18 +#define IBC_SHIFT(v) ((v) >= (1 << (MV_BITS - 1)) ? ((v) - (1 << MV_BITS)) : (v)) + +static inline void ibc_add_mvp(Mv *mv, Mv *mvp, const int amvr_shift) +{ + ff_vvc_round_mv(mv, amvr_shift, 0); + ff_vvc_round_mv(mvp, amvr_shift, amvr_shift); + mv->x = IBC_SHIFT(mv->x + mvp->x); + mv->y = IBC_SHIFT(mv->y + mvp->y); +} + +static void ibc_merge_candidates(VVCLocalContext *lc, const int merge_idx, Mv *mv) +{ + const CodingUnit *cu = lc->cu; + LOCAL_ALIGNED_8(Mv, cand_list, [MRG_MAX_NUM_CANDS]); + int nb_cands; + + ff_vvc_set_neighbour_available(lc, cu->x0, cu->y0, cu->cb_width, cu->cb_height); + if (ibc_spatial_candidates(lc, merge_idx, cand_list, &nb_cands) || + ibc_history_candidates(lc, merge_idx, cand_list, &nb_cands)) { + *mv = cand_list[merge_idx]; + return; + } + + //zero mv + memset(mv, 0, sizeof(*mv)); +} + +void ff_vvc_mvp_ibc(VVCLocalContext *lc, const int mvp_l0_flag, const int amvr_shift, Mv *mv) +{ + LOCAL_ALIGNED_8(Mv, mvp, [1]); + + ibc_merge_candidates(lc, mvp_l0_flag, mvp); + ibc_add_mvp(mv, mvp, amvr_shift); +} + +void ff_vvc_luma_mv_merge_ibc(VVCLocalContext *lc, const int merge_idx, Mv *mv) +{ + ibc_merge_candidates(lc, merge_idx, mv); +} + static int affine_mvp_constructed_cp(NeighbourContext *ctx, const NeighbourIdx *neighbour, const int num_neighbour, const int lx, const int8_t ref_idx, const int amvr_shift, Mv *cp) diff --git a/libavcodec/vvc/vvc_mvs.h b/libavcodec/vvc/vvc_mvs.h index 358de5ec45..a546a324c2 100644 --- a/libavcodec/vvc/vvc_mvs.h +++ b/libavcodec/vvc/vvc_mvs.h @@ -30,7 +30,9 @@ void ff_vvc_clip_mv(Mv *mv); void ff_vvc_mv_scale(Mv *dst, const Mv *src, int td, int tb); void ff_vvc_luma_mv_merge_mode(VVCLocalContext *lc, int merge_idx, int ciip_flag, MvField *mv); void ff_vvc_luma_mv_merge_gpm(VVCLocalContext *lc, const int merge_gpm_idx[2], MvField *mv); +void ff_vvc_luma_mv_merge_ibc(VVCLocalContext *lc, int merge_idx, Mv *mv); void ff_vvc_mvp(VVCLocalContext *lc, const int *mvp_lx_flag, const int amvr_shift, MotionInfo *mi); +void ff_vvc_mvp_ibc(VVCLocalContext *lc, int mvp_l0_flag, int amvr_shift, Mv *mv); void ff_vvc_sb_mv_merge_mode(VVCLocalContext *lc, int merge_subblock_idx, PredictionUnit *pu); void ff_vvc_affine_mvp(VVCLocalContext *lc, const int *mvp_lx_flag, const int amvr_shift, MotionInfo* mi); void ff_vvc_store_sb_mvs(const VVCLocalContext *lc, PredictionUnit *pu);