From patchwork Thu Apr 25 14:01:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 48257 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:2d06:b0:1a9:af23:56c1 with SMTP id tw6csp1402247pzb; Thu, 25 Apr 2024 07:03:24 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVV1/IfggBtvcsF6Fycwt5aqF5LhlE3hOZiSkhP+WVRA/juPOQeb8e9eLbgqEKClNgpuGuD1PlQcdVaMsuWmc2iWdyYIKZsRBjTPQ== X-Google-Smtp-Source: AGHT+IGG3PdSjDkm0icWshwJb2O1TcE4aAZofcvnvJFh7OEn6FRoDBeWz7sO5LceCbCyUZ/fbHx+ X-Received: by 2002:a50:d543:0:b0:56d:fc50:ec50 with SMTP id f3-20020a50d543000000b0056dfc50ec50mr3007807edj.13.1714053804300; Thu, 25 Apr 2024 07:03:24 -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 i13-20020aa7c70d000000b0056c3f718c8fsi9634129edq.340.2024.04.25.07.03.23; Thu, 25 Apr 2024 07:03:24 -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=PnEvdiuA; 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 EC34968D3DD; Thu, 25 Apr 2024 17:03:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from SINPR02CU002.outbound.protection.outlook.com (mail-southeastasiaazolkn19011003.outbound.protection.outlook.com [52.103.65.3]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1464068D3A2 for ; Thu, 25 Apr 2024 17:03:03 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=A3Nf57XxF7JhUujTFF3Fq7y/mJEP3U+dAKiTjU49H0ATFuihf9b9nTrvZ+p5ky6IFacUMteqN6CE/SsVtsEcSj1KUIjmKJ31YvvEv5iUnGEc5DmydPeYn1Bup0z/HxmC9/F9Nt4UiOIUg+TlwVOU/5y6LDgjHf54BOm+3QaXqD2Kv9pP9MskY89qEHoqYtnFMMt8HOzGYFr0lKuTZSUcpzFW0Psb5uKJAKZUQN3LxeGUh7gS/tyK6JGjTVwB6sMaKrVKG39gq11lYRET4RvDnqZz2x1FYYKhKLfPsXGQTtGtexzeLfCfJ9iuPnpyr2AXGXY9m0HJi7SdOEN0dt/4jw== 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=dtGA1ckcZPHOoQKmu31xNiXVn04NygZpBsi9sBKUhg0=; b=TCWdAVjFnk25xBzhq2qrRDEhGLkNgfDyCyvgdpL10lcmesM6M0+hZUxuYncMqxcCp/jvD9RlWlxfs0qzwJQfOh8pOeYuCuknp2Avll+1kfT2Gx2r5W1/8a+Fy8o/LGn53rp++Oj0vdeiKBvCcslTCD8TBj+IZjcABOLqGHf+Uj/U8TNfBcowYefySliIWaIcUM3pjNM0r9Gn6OnfVuX+vSf7J4X3Ws6++jqe+iEcml/ljc0V+/a3nyIKYSl4r43ahJng6qLiqe3xNhS6xVFPQd0AAKxFxMDIFl7UE0LYmuVpCtq5ffC/X4vuhj79usmfFuKV0kifPodIVRxK7ZrirQ== 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=dtGA1ckcZPHOoQKmu31xNiXVn04NygZpBsi9sBKUhg0=; b=PnEvdiuAzEB8OhY15Yy/EKkcjicVRRQqqnMxep9fqCjJbxdvW3S+yDRh1Aygu7bhKMhfcwKXwghRaKVyQ9NRFxD3V+YTDr8vyw86DxX/K0MDfCHp1BZ2Gk7XiaSB2BYcIwJ3+WSNJAgwwemAEIpzzb2EMv/aWJ2IEtdQiIaeIZm5dBmcvIX/p45Nm+nRXwQ0UYv5UsLlrCTXKS9FgG/sQu8outuQ9Uk3GZg/QVCp3dI8PPvBeiDTYD9a3f8pxWRdCvlJW0g/R29/TasdPhUAzHhbL3IIzALSBRjAAeCpPp5l41T/mauWitazlRzzuH99ry87a5S6g8HZ/1kbwUR90g== Received: from KL1PR06MB6426.apcprd06.prod.outlook.com (2603:1096:820:f7::5) by TYSPR06MB6436.apcprd06.prod.outlook.com (2603:1096:400:475::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.44; Thu, 25 Apr 2024 14:02:54 +0000 Received: from KL1PR06MB6426.apcprd06.prod.outlook.com ([fe80::42d1:d71d:9f80:18af]) by KL1PR06MB6426.apcprd06.prod.outlook.com ([fe80::42d1:d71d:9f80:18af%5]) with mapi id 15.20.7472.044; Thu, 25 Apr 2024 14:02:53 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Thu, 25 Apr 2024 22:01:36 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240425140136.96867-1-nuomi2021@gmail.com> References: <20240425140136.96867-1-nuomi2021@gmail.com> X-TMN: [ZG/S0QdHZGSXxuY8IJbeG018a3IdC4/M] X-ClientProxiedBy: TYCP286CA0196.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:385::7) To KL1PR06MB6426.apcprd06.prod.outlook.com (2603:1096:820:f7::5) X-Microsoft-Original-Message-ID: <20240425140136.96867-2-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: KL1PR06MB6426:EE_|TYSPR06MB6436:EE_ X-MS-Office365-Filtering-Correlation-Id: 025b094a-0c07-4740-5c17-08dc653066b9 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: x8rkrBDwyZYdKj9+tLnSl73b+FcLVORJpWJUDq9q6aG6Ou/wtPpkp+0MOftaLW59SNJBK+yR80lvH0OBpHML0UfZnfqfeugkFAwThpTJbl6lzxWaiEfDIZh7esazojr+N/WA0+UwuAwWmG9lQ3uGHL1k2kTjrTfdxpA6A1ZnoUIAOv348tinzA0ukpEUDR3s0riRWCepnauqVpN30sNc+KEsipLkTxVa8dkzCPJqmy2bu8oEx8lvLeLCtVc+JbX4uasbILxuRIHOqFWTfg+0HRWfySThfoMonjGMGeHhVWu4XJroH5GqUIpvFGbzVkI0JJxrj2BUZcyhy4IIBfDESPPYhQfVJ6eLzpeW/GsY1y7OEM5uNffXokBKOUU3rPhsdP6WAcPa6cyO5kNcNsWKHi9+aMKFCZhQEV2mJdzOqz78ocJ6f8QwA7WXzh2zsDCP3ylBapA6lFwMIQT9SFdPASMz+kY+SIYnwnWzx4Lt7AbYfG9s7TSX272QseeYKGyWRU2JVJxLZWBP6Uq7nImWIg4yoFPe0dnIzLuaDYt7L+1x7TCC9ffxpsEamvyS+3okWDL1L5kt/J3jFjr9r8SbTRr2FsCQ97u/JDPI785tpv5IJH+WRx2hM3SgQKn/g3Ub X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: JPOeT/FBPtVLI5VrsB2KEP+LTYSlV1JKwwdJWKWLqsqmZ0c7y6xjkAKyXxhqRKM6Rwnk5aryjoFZ+TEn3KLzP6w3bG/dGFW/IhJZmQE4jaAQce3dJMGoh1aZItuN0Gs9wyQE29tY77YartVTzpwxu4lrm/0i5OLnKAaO9znwBS94ro6pQG3E9LZGlkeHdJmBxNBT43yTdg0+O0mSjAc2gMO8+NZdB1Wrdz1c+P3jRDCxm5rsqGwg9KR3Ty/pHWXfqnREQ7O0vMVzGth8KU2dQKWX6AjQ+AiiOAL3UmdrLHFv5gjFkxbPq9piWzy5queRQk6cLHAjLCDsvUri++r6lpOjmYOftrB1YNck21FmVrDCi2/hSuj/AmXVA/rwnnudYC2CTXqC+uvrkoQ9bdfP1KKHHA4L7slSDLWth1WdHYbHXQKdQ45XjtL41MiHAVO9WF2KyLjpqLuC16s9jrRx8L/1X9AZjTIC/C2oDlMG1GoWeeYwQjYw3cRw32s38jbPSij5VvEEPTfloBjVmUJfDlwMDJuzSjB/kk/kMUeT1Aipxlwf4xcax2p2XfRi83L2Bx7cyCnYhDjVMpTRPEZarIdxJ3BM3PvhIZEm+WAzolfiDd1DOcasO5u3gJTwToKw6TGMIWiYkOfbqmXBoVmsZAhjeH3Z5Cl9BmLpuuTzYJEtDns75AkkJRu+bk0rmzeVSSJK9TqoJGrauclrvm4Myhga/GMLXQmxsLjOFEIgaB8izpdNLqzvCCkO5ujAEoL9zFg6P1M9F/QwUUbfALP/ufdMwESOHA+BfU+gYrstG6OHhATpGi38HuOf/LyptHjijGyeBvkMNRTtwE8pJYHrHGrKZtoMfJ8BWnbIU3/UeKBUj3lgSftjJnVmfA9d2RcSJI1ShCTS64aaQac6zvhkFKUJQEPVDXMITS7xSpi3U8p/Wg0z1dcLOnJOkZTzWylFM02dVbl5rmaAIpImMYjDCGoMzt+Bw3dHynJXemZjednMfk0hE1YES8OC1I0KD55KhUKqkCEElHygicbK0l40RUNRLsNEQ+dNKlyn3sz8EnBMRaPKJfigpaszI4nDJ+Tl1KWoUs9rM8jDlN9OIiXePbLApAmw7HswXTrG3GgX48flHSa4F9FA+bezUpgEt53MzRP3PvONkJ9bzvwS0VRu9fgkf+alPwQ/y1RqNdcbKV/30KY3GduZGKuXHlYqJ4Wri6xMJEI9+JFRjT0+/I62WtHLdUlJJmQS2qbA9vcQM2LjNfgxl6fJm0SZ3jjd44AFjDLiOiy3R9EQFKIQ6un/Bw== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 025b094a-0c07-4740-5c17-08dc653066b9 X-MS-Exchange-CrossTenant-AuthSource: KL1PR06MB6426.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Apr 2024 14:02:53.8898 (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: TYSPR06MB6436 Subject: [FFmpeg-devel] [PATCH v2 2/2] 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: IfoieolBk6/K 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 | 10 ++++++++-- libavcodec/vvc/thread.c | 43 ++++++++++++++++++++++++++++------------- libavcodec/vvc/thread.h | 2 +- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/libavcodec/vvc/dec.c b/libavcodec/vvc/dec.c index 92999a3ce3..1b62f6199f 100644 --- a/libavcodec/vvc/dec.c +++ b/libavcodec/vvc/dec.c @@ -900,10 +900,16 @@ 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) { + ff_vvc_report_frame_finished(fc->ref); + 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