From patchwork Sun Apr 21 14:52:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 48199 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c906:b0:1a9:af23:56c1 with SMTP id gx6csp1777708pzb; Sun, 21 Apr 2024 07:53:14 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUWtLIyFTCn7biOnGmwh4j4AzZl46tDUgRoyRePOVgtiantTV9iav7KwFTYcGwnbwRgVpuiE0PH+A46GnkKr2XHr0u7MreLKAchOQ== X-Google-Smtp-Source: AGHT+IHdyJRHJnKRrET2aHkWNaaoCBS0TGt3B7MBbPqAVN+/+Mal2QBF+AzUUusyerkV7wVbbNWc X-Received: by 2002:a17:906:b4c:b0:a55:b303:97d2 with SMTP id v12-20020a1709060b4c00b00a55b30397d2mr649310ejg.40.1713711194380; Sun, 21 Apr 2024 07:53:14 -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 i2-20020a1709063c4200b00a52537d50fcsi4547809ejg.331.2024.04.21.07.53.14; Sun, 21 Apr 2024 07:53:14 -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=ncBuHYjG; 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 2538068BAD8; Sun, 21 Apr 2024 17:53:11 +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-psaapc01olkn2074.outbound.protection.outlook.com [40.92.52.74]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4D57168BAD8 for ; Sun, 21 Apr 2024 17:53:04 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dMBnBwZSjCVLzrwWLkwXKaG7zbFHqsYFVTLvuSRYGfZQk4nFlkOzOmBwu3txeRXGvi7SSSCG9N9ZP6be0NWVYTdjZCkjE6bgz0UtVZerEyXdep7vj6j85JXcKolLyWuSDa4Ure04DTKdAudKX5G7pyXvu84CS68NSkN8UhU/L19DfJ5/Xg8FVbEbqNlLRQLPlaLcZRRnSaw/LCTTqIaLnGkvlF3CVL2VvWC0tbzkNv98kaBSsy10+TIHzQE0E+Wy3HVlUTV4kMXbcDwhHWaG423bRJIxTEU/omvTLUWEvfTNRqExtJhlwG018wHeAsWbIUh2bZ3Iu1xCSNx4mkpngQ== 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=VeFeHNeIZMW+iU5q5Y+C2HUNEkFXODyejW4tjqJcmnI=; b=BOX4Y0NM6juxZTNZONj5+Sn6kZX4Cs5CJZvXZHDgUgFe9mXRM103oljLrRPWynp+iR9FfrfMGenw7ikrtMDCnHnHyDJq4p2+DPg0tbyNEhiVqCvvJ91xK7b7P7jqbuZ4JmMu9knU6TyJpD0VnnqEsXW1dEs57FqqdJwxgOYtjXftTz6U8FRKGZhTe+5YKY0wDVo1VUyvcYPWH+Sy2EZUGm9HWNkXp/+PzFj/8B+mDUGmi1WYuEbbbY+gzI6UewUCjhCit1gOLYyucIOPnKhG9qfrxKLoKqL6VpJrXFi1JDu7kZR7/qr2asiWnumFR4y5xfHMqB+R5LqFPU7mP9Nsug== 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=VeFeHNeIZMW+iU5q5Y+C2HUNEkFXODyejW4tjqJcmnI=; b=ncBuHYjG461W518cO1BxQWd71PWVCA6Uvv+q4A5mKbC4zGahampCPJt0fkemXXnGjTYCR2ZmOA++YZholc4M5fItfbTpUSDudFCQPfyanIWge2ZMwd+6WqC/9kpeQUcVhPvwJDtlV9bd9n1Pw3QqS7/pX6x6U8n3C5NduGan8ytH4VgFfN58RkfFn/WVb2y/QW4y7qWdVVYAClM97Uzd7QSt5GWzgul3o71qkyPupcGVkyldK4KoShv86LxLnD/XudVNa//n/W+C9sotWNVgCckXqf8vfkdt5JpjAURMlTm1kveP4xon6Xljc0PBdvfr+Tkq5DEIgQ4HRfbQm/9/Nw== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by JH0PR06MB7106.apcprd06.prod.outlook.com (2603:1096:990:9c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.44; Sun, 21 Apr 2024 14:52:59 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::d001:da90:518b:ec1c]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::d001:da90:518b:ec1c%3]) with mapi id 15.20.7472.044; Sun, 21 Apr 2024 14:52:58 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Sun, 21 Apr 2024 22:52:27 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [S4hu85LsqPbDjItVK05f6XpUoli0gQ25] X-ClientProxiedBy: SG2PR01CA0195.apcprd01.prod.exchangelabs.com (2603:1096:4:189::17) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20240421145227.187311-1-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|JH0PR06MB7106:EE_ X-MS-Office365-Filtering-Correlation-Id: efee8fd8-88cb-4d8a-1cbf-08dc6212bbe1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dpwlet6c6mwmJ3tltmS3mzGbycnK4ueZbM3X7VJrXSTE3FrBENRp0m1UWT+NovvMBwoE6cn4a/j8OZhWK6OehKQdAVJCaZXf6DsYr5NjhK1bp9hXvy7QO1JT8wmChjmSpHFkH5nrZ1OLFNdOSYBY7PTxfaHaTL1ybCpuW16ufPRFzj/d2UaX/QGkh7nPrCuuuJP6ecvkFxUPJfY7jgwYL7teD1u78w5WfcWcCCK+B0WSbQxDLSPH+CMsWHdJNMfbM8iDBH7wVY8N26+2lohUM6oZrG+oULh4FO6DoIlWIqEoepYVKx+iAt3xonzjIYdvH8Ki9OckF7Z2f6Lg3pn1kfALQXD+lIdRDcooHRE94fDKEIH3SoaWoZTeVTh6Jmj0fSbREE0OGjyJerBkomPMaIINvczOfyGrUXQKKvSS9VLU0FEme1TyLsI/WzashRH0rlB6FMlYJrHE1Eha7Cc6M6moSbUfidxfJwCffz/G+Qw3v/VK5BNLvauN7caTjS+zlx0znFeMzxzT8pPxQ9Jdwn7pnzujDUW44ZLx8T0eKWxOGNAODUZnLdseaENyUyYUn9QrSaWNRAFclSvD2rz6Qncig5JyLwOWoGW9q0uoKYfikd040hAZ9sELZEWWyC6Y X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: /EfCBqmvcEGoVx9cSVBME+mcn3e9lX5+55gbaMmcefbq144W2LxAlg9G8c2iZfg6eWqJGqPRCOC/tBR60RG9BJmPUVOtJOjU1L1h6JqWk/rHJ+3qycMs/+pz1x1IDxKHzW+F0j6RQ9Fm5IB8wUx7lgSdu8DYzdMHpayaBGyXPP4742NM6TzeSQlf4jm0CXYIHYRlzFLR/LQGWXWoBN2xTbjpoXeDx5Dq+xFM6sAYoYEX77XAZjm6Jaky53oAkbAKWgdjTqiX7xbzTQTJEd2KYLtv74irBGiMUQLHhihySqh5X2uQIIHZ7c+1dkvrGvY1ysyP/oRbkkr1U3aDafrOm/4MP7Ek83YqHVuX1YV+wWb43KbVVk9AgGtEncjJdytZ7JyKmWSMneOWLSLHWpClk9Ld/YegdiIBE1ppJaBbrXWpDX/toGUxa9FS59WrtzQAg++U8tdOaUT3oDevXrh3ijXK8bedfJsMeM+U/pWNgnZXJKK6eMY+qdXu4B5bHfapJNW15xMEo4OsmLUJ7YJKXZt1pW/w12i5tEJGNwEteI4CWuGv7fDlZ7ehfxLHQ6DtvKzXKlr4ELDekly7ENp/b5+QggLOzGT50Q1dNjc+8grz2sOH4MDCItSAhugQvVUe/Wf7gDqLWreI73WtaL4Ce35vGCEVzxd4hodFTcG/oVvyl7fLieNN0SdOCAYF2H3Nd8keAEVpf5lacKTswtteKD0i86b9ZFL9Bkb1yEg2epKMkW4L4LFZA0ekvtr9BZ4grAj0LPZup9dMTwrcjew9Dd/mm+/qHyjHuFs1GeKlDarr8Q9LRu+sDUsCQ1awrM73e7h9G033je/ld/6nf1P0tUOeu0DiX7s8h5zdm4pOhQxWVKhoIq0PDcjJEHgejEglo7/xyfxB4lPK9acZXYmhpEiPQBskLnPLBTTczbFSxn1ZU7jILI9h9BYTSlfsHKrCaV6/aPXZfah5rKYnIWTe4XB9hHzuFEysX+oPeeF0b8kcm26S2WgHPAsVzJSfvhfUCvUcmGmHjGoI+R01LQ1vVqtuyrUi5Ht7ZtUydg4yEHqKuCdbbRjOZr7OhwOkNOTJbsdFecQTM6wbvKtukXSPs7TOTQUdCj9v4i8k2Hpk0GJMOfaDe1KM2UCcJJ8tkJ3VMFmpWNCBmAw90Oyns0k7LvtkoWrDkrBPkZljt8QyizpLfbYYSCVpCcYW+xmREYPvH9r/hSTuwuMXYhCha4/Rqfz4r6S4TtAZ2hTkjfP74xg3yCsOM/TQhxMCDoDz1E15jdW/mMssEXM4patmnOLPyQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: efee8fd8-88cb-4d8a-1cbf-08dc6212bbe1 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Apr 2024 14:52:58.3909 (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: JH0PR06MB7106 Subject: [FFmpeg-devel] [PATCH] avcodec/vvcdec: ff_vvc_frame_submit, avoid initializing task twice. 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: Frank Plowman , Nuo Mi Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: diu2Yona13J0 For some error bitstreams, a CTU belongs to two slices/entry points. If the decoder initializes and submmits the CTU task twice, it may crash the program or cause it to enter an infinite loop. Reported-by: Frank Plowman --- libavcodec/vvc/dec.c | 7 +++++-- libavcodec/vvc/thread.c | 43 ++++++++++++++++++++++++++++------------- libavcodec/vvc/thread.h | 2 +- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/libavcodec/vvc/dec.c b/libavcodec/vvc/dec.c index 6aeec27eaf..4f7d184e43 100644 --- a/libavcodec/vvc/dec.c +++ b/libavcodec/vvc/dec.c @@ -893,10 +893,13 @@ static int wait_delayed_frame(VVCContext *s, AVFrame *output, int *got_output) static int submit_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *output, int *got_output) { - int ret; + int ret = ff_vvc_frame_submit(s, fc); + if (ret < 0) + return ret; + s->nb_frames++; s->nb_delayed++; - ff_vvc_frame_submit(s, fc); + if (s->nb_delayed >= s->nb_fcs) { if ((ret = wait_delayed_frame(s, output, got_output)) < 0) return ret; diff --git a/libavcodec/vvc/thread.c b/libavcodec/vvc/thread.c index 01c3ff75b1..3b27811db2 100644 --- a/libavcodec/vvc/thread.c +++ b/libavcodec/vvc/thread.c @@ -124,11 +124,17 @@ static void task_init(VVCTask *t, VVCTaskStage stage, VVCFrameContext *fc, const atomic_store(&t->target_inter_score, 0); } -static void task_init_parse(VVCTask *t, SliceContext *sc, EntryPoint *ep, const int ctu_idx) +static int task_init_parse(VVCTask *t, SliceContext *sc, EntryPoint *ep, const int ctu_idx) { + if (t->sc) { + // the task already inited, error bitstream + return AVERROR_INVALIDDATA; + } t->sc = sc; t->ep = ep; t->ctu_idx = ctu_idx; + + return 0; } static uint8_t task_add_score(VVCTask *t, const VVCTaskStage stage) @@ -758,24 +764,35 @@ static void submit_entry_point(VVCContext *s, VVCFrameThread *ft, SliceContext * frame_thread_add_score(s, ft, t->rx, t->ry, VVC_TASK_STAGE_PARSE); } -void ff_vvc_frame_submit(VVCContext *s, VVCFrameContext *fc) +int ff_vvc_frame_submit(VVCContext *s, VVCFrameContext *fc) { VVCFrameThread *ft = fc->ft; - for (int i = 0; i < fc->nb_slices; i++) { - SliceContext *sc = fc->slices[i]; - for (int j = 0; j < sc->nb_eps; j++) { - EntryPoint *ep = sc->eps + j; - for (int k = ep->ctu_start; k < ep->ctu_end; k++) { - const int rs = sc->sh.ctb_addr_in_curr_slice[k]; - VVCTask *t = ft->tasks + rs; - - task_init_parse(t, sc, ep, k); - check_colocation(s, t); + // We'll handle this in two passes: + // Pass 0 to initialize tasks with parser, this will help detect bit stream error + // Pass 1 to shedule location check and submit the entry point + for (int pass = 0; pass < 2; pass++) { + for (int i = 0; i < fc->nb_slices; i++) { + SliceContext *sc = fc->slices[i]; + for (int j = 0; j < sc->nb_eps; j++) { + EntryPoint *ep = sc->eps + j; + for (int k = ep->ctu_start; k < ep->ctu_end; k++) { + const int rs = sc->sh.ctb_addr_in_curr_slice[k]; + VVCTask *t = ft->tasks + rs; + if (pass) { + check_colocation(s, t); + } else { + const int ret = task_init_parse(t, sc, ep, k); + if (ret < 0) + return ret; + } + } + if (pass) + submit_entry_point(s, ft, sc, ep); } - submit_entry_point(s, ft, sc, ep); } } + return 0; } int ff_vvc_frame_wait(VVCContext *s, VVCFrameContext *fc) diff --git a/libavcodec/vvc/thread.h b/libavcodec/vvc/thread.h index 55bb4ea244..8ac59b2ecf 100644 --- a/libavcodec/vvc/thread.h +++ b/libavcodec/vvc/thread.h @@ -30,7 +30,7 @@ void ff_vvc_executor_free(struct AVExecutor **e); int ff_vvc_frame_thread_init(VVCFrameContext *fc); void ff_vvc_frame_thread_free(VVCFrameContext *fc); -void ff_vvc_frame_submit(VVCContext *s, VVCFrameContext *fc); +int ff_vvc_frame_submit(VVCContext *s, VVCFrameContext *fc); int ff_vvc_frame_wait(VVCContext *s, VVCFrameContext *fc); #endif // AVCODEC_VVC_THREAD_H