From patchwork Sun May 19 13:27:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 49026 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:3a48:b0:1af:fc2d:ff5a with SMTP id zu8csp3927682pzb; Sun, 19 May 2024 06:50:11 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUXVY85FZ2z2Sk7igTEKoKvU/uEZptxuwmSfPlWpxbEcRHhqj5WTydYua2S7aaOJgKMJVZoU0PNDaPkuEIf6TS2TCnp2ucrmCEcJQ== X-Google-Smtp-Source: AGHT+IEfUOCOrCUFrFJJHTT9o5uPILPLouFWJ8OWcDqU1SBOeFbl4Z+jjeDai/mRQbd221vc+EAz X-Received: by 2002:a05:651c:b12:b0:2e3:9350:a7d2 with SMTP id 38308e7fff4ca-2e5205e273fmr199769111fa.52.1716126611398; Sun, 19 May 2024 06:50:11 -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-2e715fe49dbsi10006941fa.213.2024.05.19.06.50.10; Sun, 19 May 2024 06:50:11 -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=axiYnlTM; 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 8C0C968CFFE; Sun, 19 May 2024 16:40:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from HK2PR02CU002.outbound.protection.outlook.com (mail-eastasiaazolkn19010000.outbound.protection.outlook.com [52.103.64.0]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8ED2E68D011 for ; Sun, 19 May 2024 16:39:56 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LBD+zT0E0XvB2LOX4CM0kQvoSe1zaNWQ1mQ4R1g0v20esfqsp9GGLLWFBkAK2ZjOCuBf0liKVs55ZOsprHcghh65Tw0hYxrTzfa2yMm6+kjH5kxIt/lFXOIG6AV1/gA1LC38di6D+//nTx5+5fbHfmwBpuIU1x0pniZYWg/8rUYT+YrahvxUGn/hKl8+iwW5vk3NFbgwL83dojan30IdVpgpZvSyTVwH7t7o1GMjhiznhqAYZkM4iMfov09DOmbzxIKdXUElrnUY+HTnb06tBtJLOpBe4VdBAzLG6dr0mGw2DM6MXvYRAaejQx1WQkFe87VoJa5WfQKXwmBxGRezQQ== 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=HmV3cT1WCe4NXdE7XtV9FwVKy0EaYRnQjZWmm7fdwyk=; b=b7cdbBr9ypeWwL7t8qZaRm/CaIZtuG48eUe/5rUvPNGvFHZbxMLvCnT6QmiZN3FAZvZvmv5rrxWI1Edivfl1cQT7YtrzeQJaAufm/b7nxijES5qWYRw01w+kpwRjx6KjP+zGD2g1F/FEHCv1qTLST0TyYyJqr38Lb5vJ9zIyM65WdxLTjmsEPXZbmLz93NcQv/T37Gy5Y+cqRLV+rcrY3BvqhOdaoxeSuW8gGoe5pvO5SdVd1Bek45fEHfzN66cvVzrtkyjs4y872lKcehF6P9/MIYxNxugdFAnhZGTjGxCbVce/bXe7UJDx1AVpb7hYJQHEjSWBTwmCnAtpAsCq8w== 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=HmV3cT1WCe4NXdE7XtV9FwVKy0EaYRnQjZWmm7fdwyk=; b=axiYnlTM1TB+n/YIcE2RVzavRKQdVrLN6TuZzoZ3YUSmy1l/M6tSRB1sr5ombGjd4K9Cs9SptgisTFvUPx8yxc2uzlE8QKGAvKN+MmzNdyWCt1un2nesINSNBA4ZiPpf0m1R0SKJwXsQOuRrN0At1tqudwtVD1e9lJMfdkq2EMiqxfFKz3zvfi1lvYwn/VF5RqMWR9SaCMslODbUMWjepEQlIM/cVhQ1O/rXWqXy5s2mSHWgGhSQk0hrX/Y/oyDLVtSkVGS2CdKZoEJUDOFw9pc/Pb76rokg3HxVO0k4qWeabbTIrYUlS+i8Ru2D2aZXvfvJB99awkdnymhcouXqKQ== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by TYUPR06MB6098.apcprd06.prod.outlook.com (2603:1096:400:358::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.34; Sun, 19 May 2024 13:39:40 +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.7587.030; Sun, 19 May 2024 13:39:40 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Sun, 19 May 2024 21:27:41 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240519132749.790832-1-nuomi2021@gmail.com> References: <20240519132749.790832-1-nuomi2021@gmail.com> X-TMN: [QBPjeh3frtVgQPiq4OBWrRbJeJGc3u5g] X-ClientProxiedBy: TYCP301CA0017.JPNP301.PROD.OUTLOOK.COM (2603:1096:400:381::8) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240519132749.790832-10-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|TYUPR06MB6098:EE_ X-MS-Office365-Filtering-Correlation-Id: de613ec4-0637-428f-60e0-08dc780921fa X-Microsoft-Antispam: BCL:0; ARA:14566002|461199019|440099019|3412199016|1710799017; X-Microsoft-Antispam-Message-Info: ERTH1T2SLKUWbfvXiBnBU1YqDWuU2pYaahlyWKCth62CVdv9EL+VjQ3Hq8d+9PzCF1juyvlZkK+T3y7EvC4v4FwNuT+YALKzmZQZm5UcC0DpBY944iJgef1X7DJeQOz5A+v8fhbKiazKT0OZ2y8FVsfk+nGCYN0XfFLZFBGs9bs+RYJYPBOlUM3waqK4gEpq8Xqi+72L65e8xe4M97x0mpGnX1MzbomQdyiiEGqcmT+XZWBc1KftcBTpT7evE/CMJSluH36gOdtw33Fp54u+crT7wKNeZ48XgkJGVExvGLcKd9ROkjvzl82OF0AagqNxqZP/kM6AJL0LMxLNah9pN4FumNDokVL9FYR1yBh6uUkm6AIsyOGF8XXIIBaZFVjwh80bTbPG3szLeFknZqoZgjVy8ss0bIyDAh63rPAFBOsh3X89/X5k8g/00QL1EJpCXifOwMyu+JA5QpKPFzAdcuaHi8FiZhqSlvwLbvOkrR1N7P26dDvzNz4axPveiRmYiLzmRofz6e8pPkROm33MdIi2m3A3DJWmLGIcbXv21kCoh716zaz/MoZ/6xrf1zdqYjCKZQHWmP+cwJ6cmgsDSgT7Og+kJult7fRjSP+3zrMnZgtwncmuztVVKsudFPDK X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: oH4jrDN5aCr5i3AlchHQrApJsaZV2ieFN5mCG5aygMCrV43+E2wO91iLZ4xR+PmlOxmRJWS79snDlDpv5OQN9BNlvlYniE5CK6ZoZn9Kr6BIleyGPHhhR5nKDhTzecoSA8MbSeZW2/3Dzrc6lgpm3yHKM0P50ToUx0jKO4IAs7+TPcbvsL/0J67t3J0zl6IMwckzJmnbcddM9igydhm/oB60Od1LCudl1nawSyPJ430xwAVF9tE3qyt9P9TywOPYnFdm/xoufMxelJLH4Q7AG3SQ0h2YkTzmT/83Ii5oDwJ2cbVI5VT+ZSXQ9prX/ey/5XWX00j1RtkY5PDUAEIVozZlLhAXrB3i+ByvlaE9uxCMpmhDK3SOpqEMc5hBaCfzQ+gZAJX8imsoETw9zdt6tTSLaBp5tNl/3r5F0q17bvneX6MalgRowDOHcSk/vhvdeUDiPydKAmfu1eoKgAYJTD7is3NQzX9hudnmrmy9NnRFsBdHk6CM06zgbAv6Iw3ZDSxDXxwfbLQ+635maq2J5GUnzmYByVBgdmnlAUE2UPePQ+FhcVo5F3Kbxn6ZLMgRBLkK5AsBRlJ2pZh3aGm+eMDWYuP4xW+/W1QDcFMpdgGHxTtsnXl4XGBILlwixMYXfbkJ3Bepi6iNLB2i8BqhISopzqFA1U9ZMOotKZKAKblpC5B2GgkmV8Fxq6YtT8sURqB7QVhbDJRNq8e46p/twcpzFbu3rfQKjy4PFzPCbJh+DzDI9ScvfV5StIpzSx0KkCAe3VjHtAdAnByJY+IkubVaDStzSbhbtk9o30RLDF/E4+293Ov3WflBpbGkwvwQ+3h1KFeqD/xMXx9CU7vP6K9NKluLHOU8P8zZY39+9Zaf6v2zsvZNpb7VqW/tOx+rL6H9VeqABeYmIFywWJ58ZPmAc5ohZ5Qm+yZ+90r1dpwzxbl/LweAEeLYu3uHUZ6DI9iIY2tXuklZhTtKtYj2aAfWJ5naksivFjRgY5AdUTaweqmA9ohZGkYjUGT02g/vXgONdzBgP2xczIzLDrYR0fKizzJZK6HFp57y7zON1/EFmqCB+vsRJK5hX2Y/ewkkLOl4vz0SzjJQ1jpGakeaKGdmsQ9l1DvRtIubDgID78YEozXbCgJECN/b1Nh2C2oLc2HiD7vAAVRF0I6GvT4gia0OfopK99n7UUoRuQb4ZRiixgZejsl6hZeNMnb0GgAsdzU0XOABekJ5MY7F9ivqCz3rHlbF+nUB8e8LxZMlbWalYIWeCY2anzP75+eOvNlgmMKQcf05PSvXHsZ+L71BKw== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: de613ec4-0637-428f-60e0-08dc780921fa X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2024 13:39:40.1703 (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: TYUPR06MB6098 Subject: [FFmpeg-devel] [PATCH 10/18] avcodec/vvcdec: emulated_edge, use reference frame's sps and pps X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: dmo7kwWaAChZ a preparation for Reference Picture Resampling --- libavcodec/vvc/dec.c | 3 +++ libavcodec/vvc/dec.h | 2 ++ libavcodec/vvc/inter.c | 54 ++++++++++++++++++++++-------------------- libavcodec/vvc/refs.c | 5 ++++ 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/libavcodec/vvc/dec.c b/libavcodec/vvc/dec.c index b4c35330eb..3325133efb 100644 --- a/libavcodec/vvc/dec.c +++ b/libavcodec/vvc/dec.c @@ -560,6 +560,9 @@ static int ref_frame(VVCFrame *dst, const VVCFrame *src) if (ret < 0) return ret; + ff_refstruct_replace(&dst->sps, src->sps); + ff_refstruct_replace(&dst->pps, src->pps); + ff_refstruct_replace(&dst->progress, src->progress); ff_refstruct_replace(&dst->tab_dmvr_mvf, src->tab_dmvr_mvf); diff --git a/libavcodec/vvc/dec.h b/libavcodec/vvc/dec.h index 205427f681..6f14cc1860 100644 --- a/libavcodec/vvc/dec.h +++ b/libavcodec/vvc/dec.h @@ -60,6 +60,8 @@ typedef struct RefPicListTab { typedef struct VVCFrame { struct AVFrame *frame; + const VVCSPS *sps; ///< RefStruct reference + const VVCPPS *pps; ///< RefStruct reference struct MvField *tab_dmvr_mvf; ///< RefStruct reference RefPicListTab **rpl_tab; ///< RefStruct reference RefPicListTab *rpl; ///< RefStruct reference diff --git a/libavcodec/vvc/inter.c b/libavcodec/vvc/inter.c index 31c6f43916..f432a2dc3c 100644 --- a/libavcodec/vvc/inter.c +++ b/libavcodec/vvc/inter.c @@ -44,12 +44,12 @@ 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, +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) { const VVCFrameContext *fc = lc->fc; - const VVCSPS *sps = fc->ps.sps; - const VVCPPS *pps = fc->ps.pps; + 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; @@ -143,7 +143,7 @@ static void emulated_edge_bilinear(const VVCLocalContext *lc, uint8_t *dst, cons } #define MC_EMULATED_EDGE(dst, src, src_stride, x_off, y_off) \ - emulated_edge(lc, dst, src, src_stride, x_off, y_off, block_w, block_h, is_chroma) + emulated_edge(lc, dst, src, src_stride, ref, 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_dmvr(lc, dst, src, src_stride, x_sb, y_sb, x_off, y_off, block_w, block_h, is_chroma) @@ -204,12 +204,12 @@ static int derive_weight(int *denom, int *w0, int *w1, int *o0, int *o1, #define INTER_FILTER(t, frac) (is_chroma ? ff_vvc_inter_chroma_filters[t][frac] : ff_vvc_inter_luma_filters[t][frac]) -static void mc(VVCLocalContext *lc, int16_t *dst, const AVFrame *ref, const Mv *mv, +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 uint8_t *src = ref->data[c_idx]; - ptrdiff_t src_stride = ref->linesize[c_idx]; + 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]; @@ -228,12 +228,12 @@ static void mc(VVCLocalContext *lc, int16_t *dst, const AVFrame *ref, const Mv * } static void mc_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, - const AVFrame *ref, const MvField *mvf, int x_off, int y_off, const int block_w, const int block_h, + 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 int hf_idx, const int vf_idx) { const VVCFrameContext *fc = lc->fc; - const uint8_t *src = ref->data[c_idx]; - ptrdiff_t src_stride = ref->linesize[c_idx]; + 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]; @@ -261,7 +261,7 @@ static void mc_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride } static void mc_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, - const AVFrame *ref0, const AVFrame *ref1, const MvField *mvf, const MvField *orig_mv, + const VVCFrame *ref0, const VVCFrame *ref1, const MvField *mvf, const MvField *orig_mv, 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 int hf_idx, const int vf_idx) { @@ -270,7 +270,7 @@ static void mc_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, 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 AVFrame *ref[] = { ref0, ref1 }; + 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); @@ -282,8 +282,9 @@ static void mc_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, 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)); - ptrdiff_t src_stride = ref[i]->linesize[c_idx]; - const uint8_t *src = ref[i]->data[c_idx] + oy * src_stride + (ox * (1 << fc->ps.sps->pixel_shift)); + 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 int8_t *hf = INTER_FILTER(hf_idx, mx); const int8_t *vf = INTER_FILTER(vf_idx, my); @@ -308,12 +309,12 @@ static void mc_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, } static void luma_prof_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, - const AVFrame *ref, const MvField *mvf, int x_off, int y_off, const int block_w, const int block_h, + 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->data[0]; - ptrdiff_t src_stride = ref->linesize[0]; + 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; @@ -347,12 +348,12 @@ static void luma_prof_uni(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst } static void luma_prof_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_stride, - const AVFrame *ref0, const AVFrame *ref1, const MvField *mvf, const int x_off, const int y_off, + const VVCFrame *ref0, const VVCFrame *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 PredictionUnit *pu = &lc->cu->pu; - const AVFrame *ref[] = { ref0, ref1 }; + const VVCFrame *refs[] = { ref0, ref1 }; int16_t *tmp[] = { lc->tmp, lc->tmp1 }; uint16_t *prof_tmp = lc->tmp2 + PROF_TEMP_OFFSET; const int idx = av_log2(block_w) - 1; @@ -366,8 +367,9 @@ static void luma_prof_bi(VVCLocalContext *lc, uint8_t *dst, const ptrdiff_t dst_ const int my = mv->y & 0xf; const int ox = x_off + (mv->x >> 4); const int oy = y_off + (mv->y >> 4); - ptrdiff_t src_stride = ref[i]->linesize[0]; - const uint8_t *src = ref[i]->data[0] + 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)); 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]; @@ -453,7 +455,7 @@ static void pred_gpm_blk(VVCLocalContext *lc) VVCFrame *ref = lc->sc->rpl[lx].refs[mv->ref_idx[lx]].ref; if (!ref) return; - mc(lc, tmp[i], ref->frame, mv->mv + lx, x, y, width, height, c_idx); + mc(lc, tmp[i], ref, mv->mv + lx, x, y, width, height, c_idx); } fc->vvcdsp.inter.put_gpm(dst, dst_stride, width, height, tmp[0], tmp[1], weights, step_x, step_y); } @@ -511,10 +513,10 @@ static void pred_regular(VVCLocalContext *lc, const MvField *mvf, const MvField if (mvf->pred_flag != PF_BI) { const int lx = mvf->pred_flag - PF_L0; - mc_uni(lc, inter, inter_stride, refp[lx]->ref->frame, mvf, + mc_uni(lc, inter, inter_stride, refp[lx]->ref, mvf, x, y, w, h, c_idx, hf_idx, vf_idx); } else { - mc_bi(lc, inter, inter_stride, refp[L0]->ref->frame, refp[L1]->ref->frame, mvf, orig_mvf, + mc_bi(lc, inter, inter_stride, refp[L0]->ref, refp[L1]->ref, mvf, orig_mvf, x, y, w, h, c_idx, do_bdof, hf_idx, vf_idx); } if (do_ciip) { @@ -741,11 +743,11 @@ static void pred_affine_blk(VVCLocalContext *lc) if (mi->pred_flag != PF_BI) { const int lx = mi->pred_flag - PF_L0; - luma_prof_uni(lc, dst0, fc->frame->linesize[LUMA], refp[lx]->ref->frame, + luma_prof_uni(lc, dst0, fc->frame->linesize[LUMA], refp[lx]->ref, mv, x, y, sbw, sbh, pu->cb_prof_flag[lx], pu->diff_mv_x[lx], pu->diff_mv_y[lx]); } else { - luma_prof_bi(lc, dst0, fc->frame->linesize[LUMA], refp[L0]->ref->frame, refp[L1]->ref->frame, + luma_prof_bi(lc, dst0, fc->frame->linesize[LUMA], refp[L0]->ref, refp[L1]->ref, mv, x, y, sbw, sbh); } if (fc->ps.sps->r->sps_chroma_format_idc) { diff --git a/libavcodec/vvc/refs.c b/libavcodec/vvc/refs.c index 74c105b619..954db4a8c8 100644 --- a/libavcodec/vvc/refs.c +++ b/libavcodec/vvc/refs.c @@ -52,6 +52,8 @@ void ff_vvc_unref_frame(VVCFrameContext *fc, VVCFrame *frame, int flags) frame->flags &= ~flags; if (!frame->flags) { av_frame_unref(frame->frame); + ff_refstruct_unref(&frame->sps); + ff_refstruct_unref(&frame->pps); ff_refstruct_unref(&frame->progress); ff_refstruct_unref(&frame->tab_dmvr_mvf); @@ -119,6 +121,9 @@ static VVCFrame *alloc_frame(VVCContext *s, VVCFrameContext *fc) if (frame->frame->buf[0]) continue; + frame->sps = ff_refstruct_ref_c(fc->ps.sps); + frame->pps = ff_refstruct_ref_c(fc->ps.pps); + ret = ff_thread_get_buffer(s->avctx, frame->frame, AV_GET_BUFFER_FLAG_REF); if (ret < 0) return NULL;