From patchwork Fri Jun 7 13:00:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49639 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1008262vqo; Fri, 7 Jun 2024 06:03:57 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWHdT/dHP7xGQ7PJiDv1/Fm+r1F26oWHXk7bFUjL/EwSL0ryya2sjLWW/+sJNcPl/xOyVzhcnzSXG3GIP3iqGRB1StHlGO9djMFzQ== X-Google-Smtp-Source: AGHT+IGwhSJU3DjP75f2WrwbdKdR1aH+ePkfkXpzAE3hThBkVzyAPCwyUjx6T08AfKzdQJgXYvlg X-Received: by 2002:a50:9559:0:b0:572:9b21:e0c9 with SMTP id 4fb4d7f45d1cf-57c508b0330mr1992580a12.14.1717765436722; Fri, 07 Jun 2024 06:03:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765436; cv=none; d=google.com; s=arc-20160816; b=dIPtTm7Y0PhkbD4sHXr12+KgvHjDMNmjs5WvUxv9vsn9U1jXZJ/+BexGOnEK4U7wDb aV3tDmARcObeexWhb8Ps+0pNzrH61iuY6KlCDeYthWZy0573++0tkzZmh+ikFuJQtFWT 1R22n2JXQ1AXnpR/u2On5Ai98edhcNxfpdxH7wjTP/VRtrc4TlInEGzNjdgU8eew5t3p S26Q6kfp+eQ2Ag8LgiBhZY78npWmEdqZNvIz2SnIrB67A5/0zMSV0GNMXcX928WTJ7Mf lE3LCGbP6KAP4+M/bzqozoVf25LFeWJfgAtgm1q0wKfNbGViV3/MfPPRp9cqZlPwyhch Y28A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=igEawNpgqrST8rYj+EZL1obqATuL8D1jBFF8BAs8ZLU=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=cin2AvGB6xdy1Vxs1FjA7ibEVzEH3Bi5sxOGwWvxFloiHS0bWefXXY1YUReNjGp3rV 4Q3rT5IZ/2SkBJTTbTMr2SlYFr17XSWAp7k2vzlCcaDZv0aLf6oquAMr7j89JZD3kpM1 +5j825DUGpwm3ghRZJsXDng183FBRtDERiYwv2Gv7CicKyf5Dh5B17xb9BSuFpdTb/GS D0qP+L2Mc02ITP9hEnhtT6ED2ovL78I5IeWDg5Vo8RLxmX/jg7kwjxuQuqwfnckSiNd2 KUv8X+JpE7Us0uFF1eGnNB5UgduvdPDza05i7NDioytOEhV7RWiANVAAmhKjpgON+rJv VVwA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=jz5iPJuw; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57aae0fa264si1861219a12.177.2024.06.07.06.03.56; Fri, 07 Jun 2024 06:03:56 -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=@khirnov.net header.s=mail header.b=jz5iPJuw; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C047368D761; Fri, 7 Jun 2024 16:03:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 68FA968D70F for ; Fri, 7 Jun 2024 16:03:44 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=jz5iPJuw; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id BAAED4D76 for ; Fri, 7 Jun 2024 15:03:43 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id VMyJwlf56tcC for ; Fri, 7 Jun 2024 15:03:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=jNKOsUuRYMiA9B+1Vicc1n2fWMdLosMc9c3f4XbS2bg=; h=From:To:Subject:Date:From; b=jz5iPJuw0lIn9W3aP0/K4h+tuAmhwYXkfGzvcy5euguJfv11fFvfL5pTa2FEuhaGZ eyJShmCBHHa7aN+V0F4dNjwB9ivfk1rBzc95TML0sn+xDFFtWwl8RI3brmujNa4cXN VjjxzC/bsUOSq+5fKdqRls38FzFyN7ju78WdyzL2q6tExQvD7XREb3ixSTNZ6FUgxY 3DQkmyz5I1VoeRNR0bUv5Rd0AoZeR+SOqXPKxbsY84kn/2u8KqEkyjJLdId8jG+Dvr ozjrj8blSteUydD34RrsIG+ogSG97zqFZwXOuRKqE0dhLbuL0bQ4OS2UKHRvGL9+3B emIhU5HU8DN/A== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 13E4D4D42 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 4E33F3A01C5 for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:00:57 +0200 Message-ID: <20240607130135.9088-1-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/39] lavc/hevcdec: do not free SliceHeader arrays in pic_arrays_free() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6+y5dwj6w6Un SliceHeader.{entry_point_offset,size,offset} are not derived from frame size and do not need to be freed here. --- libavcodec/hevc/hevcdec.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 4e0df4d033..d317c1471a 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -84,10 +84,6 @@ static void pic_arrays_free(HEVCContext *s) av_freep(&s->horizontal_bs); av_freep(&s->vertical_bs); - av_freep(&s->sh.entry_point_offset); - av_freep(&s->sh.size); - av_freep(&s->sh.offset); - ff_refstruct_pool_uninit(&s->tab_mvf_pool); ff_refstruct_pool_uninit(&s->rpl_tab_pool); } From patchwork Fri Jun 7 13:00:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49641 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1008597vqo; Fri, 7 Jun 2024 06:04:26 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUl7sgxX7pxPDNHZQYeA2DSGoJ2l0ZdqKUDggXnvp3rz2JhA1RsMlUrzf+mXAGAZITccSNtqBqMS7H2vQDlbPvloy/mC8zaJ18h4Q== X-Google-Smtp-Source: AGHT+IHpRQoVH6BpvHEeOuTJRVARyRFxQCRHuEGjyH7bWoyungd9Lf0NFkijvR6ZcW41Hhn9hoYF X-Received: by 2002:a17:906:714f:b0:a6d:f547:7029 with SMTP id a640c23a62f3a-a6df556b429mr126894466b.22.1717765466029; Fri, 07 Jun 2024 06:04:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765466; cv=none; d=google.com; s=arc-20160816; b=DY/3wGemFL0geIzupYmeiwXpCHm1/dHgx1xXlTRcNEDK+mf77BhPCV/bMj9dbCpNHS 17JOc9qVygdYDagszgDFEPwvyftrBNYqaMo1YBOfdIScRAFlSSXaJLC/g501R/Ebklwr eQzF061Z/kbb7AgATyh9Ujb4puTPhzwz1ndNTYNchKGRPf5zLnRJIlDk56AMPdpZi/hq IhQmnUAksmFOWl9xzd5Hg0MMrf+z/J8O5lXDXOkO/kHa1Ty+dgH9UGYFlqWLZtXr+fO2 59Gu6KIU54T2Ww6qMpjEAK5mPMatzlXxn/38/kSVr//4+OHpdpDrMj+VO6SHgzECwKu4 dSAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=e8pdzklWyiTrEOvVlUAQy63MC0e5PWNW2OCpATvJ1vo=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=JqnQrWBc1n8+djQuiQE7rbu+7efsAJq+C6Vsi0T/Q9XhMdh4wjAqzfIG/sw34b11dI l1G24hHd7nFENyNENtN5i7wVeW/WK7LN7s4LZhag3FtcBEOm1aTVkb25kSGo5DwRKm5B 0TPIncO12TCeeFD7t3dcaNsokhR+DH6vRm2zOxrRDVqIucN7Wwg2wHY14cnOj4Qk6Pic hjGuxjG6vju1fBev6cJNW08vvmjq9SXDUQfWsIzck1av7pLv9CcXfgfpA6PiKn8AJIcl uuapuIV2Mzd+GcVU2gCt86NvqDQHAHJSun7CnT1UzXbaayQT/XveL0WgznINDzLav+tS 8EwQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=R3sToDYn; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c807280d3si182505266b.774.2024.06.07.06.04.25; Fri, 07 Jun 2024 06:04:26 -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=@khirnov.net header.s=mail header.b=R3sToDYn; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 68B2F68D7D8; Fri, 7 Jun 2024 16:03:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6CBE868D759 for ; Fri, 7 Jun 2024 16:03:44 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=R3sToDYn; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 278124E12 for ; Fri, 7 Jun 2024 15:03:43 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id taQozSO5AsfD for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=Bi7ihegtPOkk6Xyy4MiO56+E5wxVasdIfXMiWPULUaA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=R3sToDYnDHhrZeH4uJdyGOR0PWTs7SrIfDOrHOrC4bWzONLyunilgHI5IfzGzq0Q4 m4IYjo26oKcx/yggXrY2rCaCsRe6JFc602606OYl+bDyQZBIepfBR4RRlNDmw29v6c qX2FYBkTzCmwbCXNYAM8sTTCRBeq53kXK3zmctIPePdZuzfnp4zUzJTEw0Frc1W2Bw 540/uzZ6ROpLDGMtgVhKoGks2TsyPyhYx9HuTS3UbzAYH7P1KzF9oUBczVPwlSCJPA 5r3DJpAYhw5aKMfnAoKGTVl3gx1FLYYBKUsF+SmbwS+8gzsgLCr7KxnItAzBAsEGN7 J04QkF0Z365wg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 154244D76 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 5AEB43A0552 for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:00:58 +0200 Message-ID: <20240607130135.9088-2-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/39] lavc/hevcdec: simplify condition 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: aHjmN3v5mePl --- libavcodec/hevc/hevcdec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index d317c1471a..43cbc45062 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3115,7 +3115,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) ctb_addr_ts = hls_slice_data_wpp(s, nal); else ctb_addr_ts = hls_decode_entry(s, &gb); - if (ctb_addr_ts >= (s->ps.sps->ctb_width * s->ps.sps->ctb_height)) { + if (ctb_addr_ts >= s->cur_frame->ctb_count) { ret = hevc_frame_end(s); if (ret < 0) goto fail; From patchwork Fri Jun 7 13:00:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49642 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1008814vqo; Fri, 7 Jun 2024 06:04:39 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUcliW46t0ttC2K7fCR7FVdJbdBP40tf7jJbkdiamKbdHiUiIRh3hyWhCG14EpNEzX5I5snnROG8x7fhXqgw29iT/8IfFiVMRaLSQ== X-Google-Smtp-Source: AGHT+IH/rZuAVO1wGRvyrErf2rWB+MrnnAso8oRLqrcM2yIWejBAYlVL1+c9v0/6JRoOlmEmCdqk X-Received: by 2002:a2e:bb86:0:b0:2ea:e98e:4395 with SMTP id 38308e7fff4ca-2eae98e4782mr7772471fa.32.1717765479313; Fri, 07 Jun 2024 06:04:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765479; cv=none; d=google.com; s=arc-20160816; b=nJEtVHQ6YRmw2lNvHrBv00OUioUBGzOqF3WpWKhPRoofR3lXtlLE1Bvx2qpoagSM2s WV16q7G6chuMLj7K/X89scNmG4WkY2YOwihTqtowKMDJjuKQQbeIB7bg9RjIYARi3+cy 3FgwyKtNRdLNlxh2JqiRNklHdfGxob59gXUzDUk3aqy5Q4vp2JBDTGfut71hsvfFUDXl lE+365Qp65JSZjNN5T+ZPc98IWKTyUk2b+kL0t6GRjdnz1GRfp56/paRNiFH2Il4gjUN Kf/VIb277Q5tBKuoI8G4x1l+4uKlaO8+Z8o6yJLthI3vEAgN8S6dQbXu0o0baAFBuu6U IY/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=UfHe3DSZRmMYKk8a6eRjk63BgNmVH/z/ALC0vzwYGOE=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=M4IWG2SwKqnBRa2N/6Mbq5gTnoSQuNBfahbx5SKyUDXdpjddB7YmAXDV5qggFwAMod KQIzDDdmhz3IA4m0QPpgqUT+bcnaUNBcIoLZJN/miinUbPhaVj/aD03nAd7woRD5HYlG iFb/A+kP0dcKSj90Ia+Yp1ifAPdn48MYGF6ZBLzT/TbNIIXFy/JKeVYU+STfr0xmZkAp hcdMuhdAMuvtMlAsYq+pXZ58Xu1SJYKCePXK9A28KdCup9eyrMYpd0AlpSI18+lCOPbQ Oi1FoHB45Fliy0LHdJoRc7CzWHyiTOOz/d2yETkWVJEptEFfwa7S+9UD9qk+wdVt2VKS ZqoA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=U32l3MmQ; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c80728776si178649166b.781.2024.06.07.06.04.38; Fri, 07 Jun 2024 06:04:39 -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=@khirnov.net header.s=mail header.b=U32l3MmQ; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C972968D7DF; Fri, 7 Jun 2024 16:03:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7335468D763 for ; Fri, 7 Jun 2024 16:03:44 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=U32l3MmQ; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 2A3EA4E13 for ; Fri, 7 Jun 2024 15:03:43 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id 1S-mBPC428RE for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=220zx5VGtLhns2hla/+QM5DxLudPfcr86M+OahMTX44=; h=From:To:Subject:Date:In-Reply-To:References:From; b=U32l3MmQVbMxj+wvhlkgEt0ZW6WK0c1+F7I+GyIEyBIUjb2BaM4ubLb9hFaz87smm GAHt4D7r6kHIZgXCF4mBOjDlakAQ/zdGj3ddVxtlewEmz/LXm/Xwa4CgpqwtMK/EjS 5Hvpnh6HPsuKmOc3Kl2wmfiDvfswttI8tpPVq4R7R/f69Tnw/x8RbmK0jiHTkmgp5Q a/c445FJcoLsn6scFBsQon+uqbEITt56gnHGe4h8LWaAVoN2weykx/T8luWFZqkK2Z V1qiGURHVtLqmiTv/zJEBbnMCiYyT+rj+XJc1mrRrRVEeKF5ep10m3NgSMFMTHoNws 91ozH1OXELhlw== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 175B04D9D for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 6616D3A059B for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:00:59 +0200 Message-ID: <20240607130135.9088-3-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/39] lavc/hevcdec: drop a redundant assignment in hevc_decode_frame() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: qOeB3IrnK+oi The exact same code is executed at the beginning of decode_nal_units() --- libavcodec/hevc/hevcdec.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 43cbc45062..46db7923fe 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3369,7 +3369,6 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe, old, s->dovi_ctx.cfg.dv_profile); } - s->cur_frame = s->collocated_ref = NULL; ret = decode_nal_units(s, avpkt->data, avpkt->size); if (ret < 0) return ret; From patchwork Fri Jun 7 13:01:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49640 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1008434vqo; Fri, 7 Jun 2024 06:04:12 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW4N+GQ+YGTmHyUg8CSAVnEwsCAlILDMFuHhFDKhtgLtZpdcJii4b0TkQRTBnk843e7+i5c9epr0tDNK8J6JxRjDWrfroj10j82GA== X-Google-Smtp-Source: AGHT+IH4GxLtJNIMFQvoePV5ixseSKqtZh6CIMAKk/bt2aBWFxnXa16iJ01+Y5xBoshJRzpL+ozl X-Received: by 2002:a50:cc92:0:b0:57c:60fe:96dc with SMTP id 4fb4d7f45d1cf-57c60fe9780mr515343a12.19.1717765452423; Fri, 07 Jun 2024 06:04:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765452; cv=none; d=google.com; s=arc-20160816; b=W8zLWWQmDBU2B4KwyvraEoIkdLRO03oEue8b5q0Wu3Ad1iZKgbEQuMLxAVoKn7OICi OTMJMpYzc/SGiJdl68E1XEQCfCpnmFs+Ahawy86N+y6SJM92EiWg9e55ZD+VwJEFqcEe YkFYjT3OZyxLjFa5aPXKq8S/f9aQEcrMFr5wHDbw0p4ViFtGTvs7yhP3TBegwlRWTuBX 0nT+fzVx5vyClPo17HSh7Yk7tg8+0nLl3Wk9kwz4sLEoPBfL354l2H7XhvyKDs7GPDdx Yo4W6j0zR9pbxMo8MJPjTDRyehPIsCL9mFo40/hw8kOo7tiTf+tf19Yj3q4HDaoVsboZ IOkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=iheBgqyLXEs1IVVEv42GLyVz1v/YZANr2cTJoRIFHbQ=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=ZWdn+Yjla0N55PhoIoSYJ5W8zB6gnxExw46r2GLLopuCBiUnirIQ7/BgJEFQSv+WVu ffGmDpSZ7tvMXqpvUV1TiHVwRDRuRzZFJppmDGkGvCTb0OKv5/Xj49GPo2wanrnOD6hm yIZO1KpvqnapiEhPuKNRN9tKKvlXKk20lrWE/Z9X/JO6awL4jXqfG8eJDE6WXv3VddT8 b9agDHtTVSfFoe6JdXtclxGSgsN7i4mwDKj11BfojhKame0EmzqQ3MuGs1wn/sjq0TEM kNJoveb6aU4dkiuzxsOKAsOwPXynSPmWAb6T1Kldq4iE9oD1sQ0d/3BYAhPSK3BGm4W9 wZzQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=YCbsaUOb; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57aae0c4c22si1856746a12.107.2024.06.07.06.04.11; Fri, 07 Jun 2024 06:04:12 -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=@khirnov.net header.s=mail header.b=YCbsaUOb; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2B0E468D776; Fri, 7 Jun 2024 16:03:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7016968D761 for ; Fri, 7 Jun 2024 16:03:44 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=YCbsaUOb; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id D82264D42 for ; Fri, 7 Jun 2024 15:03:43 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id uKS0oCrveeEK for ; Fri, 7 Jun 2024 15:03:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=2cbH0xSnNnvHnqmJP8liWIHG6QA0MCbL2zRjF9OoT8k=; h=From:To:Subject:Date:In-Reply-To:References:From; b=YCbsaUOb/oKQgcQNKKGBXvUjAdWiMcuXUIGu+IzScZafwKW9JuBXStIwW0NiYXMJ7 yeTa3thTL7FslAZpXby3D4HDezKO9gCb58uDRqJ+9gmuzPm8umEZB4HnFLvAtmwHkt 6HefUz+o+HHC+zPluqMT9Ps8btSaDDUs8pXZF7wmTCzj12XmcEsIMRJcHdDtVfs41p FbJIRXyY1yTEt8mWDlPUwHBV7FNqlKZyXz1yX1InaQD1HIZQS0yXgR9C1FE2sENClv E0PT30JRCpp0pCu4C5QGlmepa+w2MuYZX/ziV2Fob5cWwXYWImQ4DDb4iiDiD0QBZ/ xg4K5pI4SNt3Q== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 600094DA7 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 724573A065C for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:00 +0200 Message-ID: <20240607130135.9088-4-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/39] lavc/hevc_ps: make PPS hold a reference to its SPS 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: t1bwRYSiSkXU PPS depends on, and is parsed for, specific SPS data. This will be useful in following commits. --- libavcodec/hevc/hevcdec.c | 4 ++-- libavcodec/hevc/parser.c | 8 ++------ libavcodec/hevc/ps.c | 4 ++++ libavcodec/hevc/ps.h | 2 ++ 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 46db7923fe..ae4a5888e5 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -625,8 +625,8 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1) sh->no_output_of_prior_pics_flag = 1; - if (s->ps.sps != s->ps.sps_list[s->ps.pps->sps_id]) { - const HEVCSPS *sps = s->ps.sps_list[s->ps.pps->sps_id]; + if (s->ps.sps != s->ps.pps->sps) { + const HEVCSPS *sps = s->ps.pps->sps; enum AVPixelFormat pix_fmt; ff_hevc_clear_refs(s); diff --git a/libavcodec/hevc/parser.c b/libavcodec/hevc/parser.c index 056e1b4aa4..d0d5e7fbc2 100644 --- a/libavcodec/hevc/parser.c +++ b/libavcodec/hevc/parser.c @@ -80,12 +80,8 @@ static int hevc_parse_slice_header(AVCodecParserContext *s, H2645NAL *nal, } ps->pps = ps->pps_list[pps_id]; - if (ps->pps->sps_id >= HEVC_MAX_SPS_COUNT || !ps->sps_list[ps->pps->sps_id]) { - av_log(avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", ps->pps->sps_id); - return AVERROR_INVALIDDATA; - } - if (ps->sps != ps->sps_list[ps->pps->sps_id]) { - ps->sps = ps->sps_list[ps->pps->sps_id]; + if (ps->sps != ps->pps->sps) { + ps->sps = ps->pps->sps; ps->vps = ps->vps_list[ps->sps->vps_id]; } ow = &ps->sps->output_window; diff --git a/libavcodec/hevc/ps.c b/libavcodec/hevc/ps.c index 2dd4f834a4..98217e337b 100644 --- a/libavcodec/hevc/ps.c +++ b/libavcodec/hevc/ps.c @@ -1363,6 +1363,8 @@ static void hevc_pps_free(FFRefStructOpaque unused, void *obj) { HEVCPPS *pps = obj; + ff_refstruct_unref(&pps->sps); + av_freep(&pps->column_width); av_freep(&pps->row_height); av_freep(&pps->col_bd); @@ -1828,6 +1830,8 @@ int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, sps = ps->sps_list[pps->sps_id]; vps = ps->vps_list[sps->vps_id]; + pps->sps = ff_refstruct_ref_c(sps); + pps->dependent_slice_segments_enabled_flag = get_bits1(gb); pps->output_flag_present_flag = get_bits1(gb); pps->num_extra_slice_header_bits = get_bits(gb, 3); diff --git a/libavcodec/hevc/ps.h b/libavcodec/hevc/ps.h index 99d70cefd2..7c9aacf057 100644 --- a/libavcodec/hevc/ps.h +++ b/libavcodec/hevc/ps.h @@ -437,6 +437,8 @@ typedef struct HEVCPPS { uint8_t *data; int data_size; + + const HEVCSPS *sps; ///< RefStruct reference } HEVCPPS; typedef struct HEVCParamSets { From patchwork Fri Jun 7 13:01:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49643 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1009008vqo; Fri, 7 Jun 2024 06:04:52 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXt6DmtJDJ+VhaYBmrBgxGzxyohKfoDWLoXpWHEOCVagVUzJ6vHRUb4Hhag9YejJ+MDoYVwYufdGRIfTzlaGh/On3ryojo5sWFYOA== X-Google-Smtp-Source: AGHT+IHGTX0BthykbM9aYPx/U+nC2qZcv66pRKryhMu+a1i59P7+4z9awj73Z0T98roy5t006h3l X-Received: by 2002:ac2:488b:0:b0:52b:c10c:e9f7 with SMTP id 2adb3069b0e04-52bc10cee52mr747439e87.34.1717765492429; Fri, 07 Jun 2024 06:04:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765492; cv=none; d=google.com; s=arc-20160816; b=hCVO4y4lSKZrlQ37w9M5XRUzqMyOCWQ724WNrWmNMNK1hbTzMjBLeb4ct7Iqa30ryr 7mb27T7WJramPoZJSF1WM2GISXtfB8jeZhY7wO97e7GS+ETl1sm4KzhVSGt4Qn37Xnm8 2iJ5ccYpJEYrJlNWDo2OXhzOH3ZMJX3KPH+DBSPXlLJxIf7FmJqx7ytFnQudcvA3v6Lb TEQz6vhWJ9gv6xetWrkY9DBR2TopGZKqQ/Pn0uEu9FBLSlbgf36tQO9zTJdAJPmPATq2 ZOkQ6Qm8SVaPKlWi7tF9sA9T0LzFxrg+pB/Z0rtse6Mny7YTcvCqJRQvVKrMKKyiGSLl Vuvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=myAJRjRGQb4EqqtH+Ns1tf79Qtd21dC96Xtu67D115w=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=lU7lHhC18r9cJG/07+ox4w5bvExXTxORm8u2e6FFOdK+wnBnOeUbA1aIpMnR+3aUV7 j7edY8EKkIfIYq+sa6EFA8NdczdOI5S7Qx5XQ17/2BsD3Q8Cy8njUxwdn0vSVcLRwVvI jvPZ/Qm7S+cZVmkLl/Li6WDyeLxCSjUXmmitKM+gMv58ojzbfrn4M+JQFGdTKdHNyXAq ORoD7djSLtXVMGyiAHULpkS0a4Pp74Lr1Y7ras2Wcx1M0PyEbloFOcoKO4q9Dhkz9cl1 pbslpbnpZQYlGNws+m0k8yuOq/V8UWC/kQZ0MWOIWfxkXkXrJdcxhknLJ6t+yE/cLOhw kSeg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=mSxmEh1L; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6ed33b2423si30117866b.416.2024.06.07.06.04.51; Fri, 07 Jun 2024 06:04:52 -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=@khirnov.net header.s=mail header.b=mSxmEh1L; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0E94C68D7EB; Fri, 7 Jun 2024 16:03:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1588068D761 for ; Fri, 7 Jun 2024 16:03:45 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=mSxmEh1L; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 99F474DA7 for ; Fri, 7 Jun 2024 15:03:44 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id Vv2edk4L66UX for ; Fri, 7 Jun 2024 15:03:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=NTT34UJ+zWdgjl0dEDNscrplP25ToyoAHtKq0ynZmrE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=mSxmEh1L47G1xfG2Y3nBTuBH6zfMJZlnVrZZkMplV80087K5mhPys1TYEj1StHEGR uLe++MM+ieLvA790fgGU7EWJ+uxbcn9GbU3lojyffm2iVc6MKq4DeCBt2uO6NbwLVN f4snjyPlDg4d5hvv6w1Z4a2uLcOY0PlIJxWjTyEISBmXqgEZYrjDlfrsTrlIDjEn/U 5MsyYv3Juw/QiCvz+9wCobCsKhDM09YQMfU0scru2L8dbNN0f0kwEDSgMOIHJapo1N yRhO34/p4bjhs0YG0SPKblUUWvUEHAaO/lisGc+A0fzkv9PJxLbpyhEJd+OrhG9G1S fS3NutdDICkwQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 8224E4DBC for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 968303A074A for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:03 +0200 Message-ID: <20240607130135.9088-7-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/39] lavc/hevc/mvs: stop accessing parameter sets through HEVCParamSets 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: +KaxJr0nwwzt Instead, accept PPS as a function argument and retrieve SPS through it. Makes the code shorter and significantly reduces diff in future commits. --- libavcodec/hevc/hevcdec.c | 28 +++++---- libavcodec/hevc/hevcdec.h | 8 ++- libavcodec/hevc/mvs.c | 126 ++++++++++++++++++++------------------ 3 files changed, 87 insertions(+), 75 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 16c46997a8..5de229f78d 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -1158,7 +1158,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, if (lc->cu.pred_mode == MODE_INTRA) { int trafo_size = 1 << log2_trafo_size; - ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size); + ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size, s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size - 2](lc, x0, y0, 0); } @@ -1245,7 +1245,8 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, } for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) { if (lc->cu.pred_mode == MODE_INTRA) { - ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v); + ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c), + trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (i << log2_trafo_size_c), 1); } if (cbf_cb[i]) @@ -1275,7 +1276,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) { if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c), - trafo_size_h, trafo_size_v); + trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (i << log2_trafo_size_c), 2); } if (cbf_cr[i]) @@ -1304,7 +1305,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) { if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size), - trafo_size_h, trafo_size_v); + trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (i << log2_trafo_size), 1); } if (cbf_cb[i]) @@ -1314,7 +1315,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) { if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size), - trafo_size_h, trafo_size_v); + trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (i << log2_trafo_size), 2); } if (cbf_cr[i]) @@ -1326,12 +1327,13 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, if (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3) { int trafo_size_h = 1 << (log2_trafo_size_c + s->ps.sps->hshift[1]); int trafo_size_v = 1 << (log2_trafo_size_c + s->ps.sps->vshift[1]); - ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size_h, trafo_size_v); + ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size_h, trafo_size_v, + s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0, 1); s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0, 2); if (s->ps.sps->chroma_format_idc == 2) { ff_hevc_set_neighbour_available(lc, x0, y0 + (1 << log2_trafo_size_c), - trafo_size_h, trafo_size_v); + trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (1 << log2_trafo_size_c), 1); s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (1 << log2_trafo_size_c), 2); } @@ -1339,12 +1341,12 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, int trafo_size_h = 1 << (log2_trafo_size + 1); int trafo_size_v = 1 << (log2_trafo_size + s->ps.sps->vshift[1]); ff_hevc_set_neighbour_available(lc, xBase, yBase, - trafo_size_h, trafo_size_v); + trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase, 1); s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase, 2); if (s->ps.sps->chroma_format_idc == 2) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (1 << log2_trafo_size), - trafo_size_h, trafo_size_v); + trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (1 << log2_trafo_size), 1); s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (1 << log2_trafo_size), 2); } @@ -1880,7 +1882,7 @@ static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW enum InterPredIdc inter_pred_idc = PRED_L0; int mvp_flag; - ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH); + ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH, s->ps.sps->log2_ctb_size); mv->pred_flag = 0; if (s->sh.slice_type == HEVC_SLICE_B) inter_pred_idc = ff_hevc_inter_pred_idc_decode(lc, nPbW, nPbH); @@ -1892,7 +1894,7 @@ static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW mv->pred_flag = PF_L0; ff_hevc_hls_mvd_coding(lc, x0, y0, 0); mvp_flag = ff_hevc_mvp_lx_flag_decode(lc); - ff_hevc_luma_mv_mvp_mode(lc, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_mvp_mode(lc, s->ps.pps, x0, y0, nPbW, nPbH, log2_cb_size, part_idx, merge_idx, mv, mvp_flag, 0); mv->mv[0].x += lc->pu.mvd.x; mv->mv[0].y += lc->pu.mvd.y; @@ -1910,7 +1912,7 @@ static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW mv->pred_flag += PF_L1; mvp_flag = ff_hevc_mvp_lx_flag_decode(lc); - ff_hevc_luma_mv_mvp_mode(lc, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_mvp_mode(lc, s->ps.pps, x0, y0, nPbW, nPbH, log2_cb_size, part_idx, merge_idx, mv, mvp_flag, 1); mv->mv[1].x += lc->pu.mvd.x; mv->mv[1].y += lc->pu.mvd.y; @@ -1955,7 +1957,7 @@ static void hls_prediction_unit(HEVCLocalContext *lc, int x0, int y0, else merge_idx = 0; - ff_hevc_luma_mv_merge_mode(lc, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_merge_mode(lc, s->ps.pps, x0, y0, nPbW, nPbH, log2_cb_size, partIdx, merge_idx, ¤t_mv); } else { hevc_luma_mv_mvp_mode(lc, x0, y0, nPbW, nPbH, log2_cb_size, diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index 33ad4ac0aa..eef7d66204 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -645,11 +645,13 @@ void ff_hevc_bump_frame(HEVCContext *s); void ff_hevc_unref_frame(HEVCFrame *frame, int flags); void ff_hevc_set_neighbour_available(HEVCLocalContext *lc, int x0, int y0, - int nPbW, int nPbH); -void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, int x0, int y0, + int nPbW, int nPbH, int log2_ctb_size); +void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, const HEVCPPS *pps, + int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv); -void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, +void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, const HEVCPPS *pps, + int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv, int mvp_lx_flag, int LX); diff --git a/libavcodec/hevc/mvs.c b/libavcodec/hevc/mvs.c index b56f0bece5..3fd7be5b32 100644 --- a/libavcodec/hevc/mvs.c +++ b/libavcodec/hevc/mvs.c @@ -41,17 +41,16 @@ static const uint8_t l0_l1_cand_idx[12][2] = { }; void ff_hevc_set_neighbour_available(HEVCLocalContext *lc, int x0, int y0, - int nPbW, int nPbH) + int nPbW, int nPbH, int log2_ctb_size) { - const HEVCContext *const s = lc->parent; - int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size); - int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size); + int x0b = av_mod_uintp2(x0, log2_ctb_size); + int y0b = av_mod_uintp2(y0, log2_ctb_size); lc->na.cand_up = (lc->ctb_up_flag || y0b); lc->na.cand_left = (lc->ctb_left_flag || x0b); lc->na.cand_up_left = (x0b || y0b) ? lc->na.cand_left && lc->na.cand_up : lc->ctb_up_left_flag; lc->na.cand_up_right_sap = - (x0b + nPbW == 1 << s->ps.sps->log2_ctb_size) ? + (x0b + nPbW == 1 << log2_ctb_size) ? lc->ctb_up_right_flag && !y0b : lc->na.cand_up; lc->na.cand_up_right = lc->na.cand_up_right_sap @@ -62,31 +61,32 @@ void ff_hevc_set_neighbour_available(HEVCLocalContext *lc, int x0, int y0, /* * 6.4.1 Derivation process for z-scan order block availability */ -static av_always_inline int z_scan_block_avail(const HEVCContext *s, int xCurr, int yCurr, - int xN, int yN) +static av_always_inline int +z_scan_block_avail(const HEVCPPS *pps, const HEVCSPS *sps, + int xCurr, int yCurr, int xN, int yN) { #define MIN_TB_ADDR_ZS(x, y) \ - s->ps.pps->min_tb_addr_zs[(y) * (s->ps.sps->tb_mask+2) + (x)] + pps->min_tb_addr_zs[(y) * (sps->tb_mask+2) + (x)] - int xCurr_ctb = xCurr >> s->ps.sps->log2_ctb_size; - int yCurr_ctb = yCurr >> s->ps.sps->log2_ctb_size; - int xN_ctb = xN >> s->ps.sps->log2_ctb_size; - int yN_ctb = yN >> s->ps.sps->log2_ctb_size; + int xCurr_ctb = xCurr >> sps->log2_ctb_size; + int yCurr_ctb = yCurr >> sps->log2_ctb_size; + int xN_ctb = xN >> sps->log2_ctb_size; + int yN_ctb = yN >> sps->log2_ctb_size; if( yN_ctb < yCurr_ctb || xN_ctb < xCurr_ctb ) return 1; else { - int Curr = MIN_TB_ADDR_ZS((xCurr >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask, - (yCurr >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask); - int N = MIN_TB_ADDR_ZS((xN >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask, - (yN >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask); + int Curr = MIN_TB_ADDR_ZS((xCurr >> sps->log2_min_tb_size) & sps->tb_mask, + (yCurr >> sps->log2_min_tb_size) & sps->tb_mask); + int N = MIN_TB_ADDR_ZS((xN >> sps->log2_min_tb_size) & sps->tb_mask, + (yN >> sps->log2_min_tb_size) & sps->tb_mask); return N <= Curr; } } //check if the two luma locations belong to the same motion estimation region -static av_always_inline int is_diff_mer(const HEVCContext *s, int xN, int yN, int xP, int yP) +static av_always_inline int is_diff_mer(const HEVCPPS *pps, int xN, int yN, int xP, int yP) { - uint8_t plevel = s->ps.pps->log2_parallel_merge_level; + uint8_t plevel = pps->log2_parallel_merge_level; return xN >> plevel == xP >> plevel && yN >> plevel == yP >> plevel; @@ -205,8 +205,8 @@ static int derive_temporal_colocated_mvs(const HEVCContext *s, MvField temp_col, tab_mvf[(y) * min_pu_width + x] #define TAB_MVF_PU(v) \ - TAB_MVF(((x ## v) >> s->ps.sps->log2_min_pu_size), \ - ((y ## v) >> s->ps.sps->log2_min_pu_size)) + TAB_MVF(((x ## v) >> sps->log2_min_pu_size), \ + ((y ## v) >> sps->log2_min_pu_size)) #define DERIVE_TEMPORAL_COLOCATED_MVS \ derive_temporal_colocated_mvs(s, temp_col, \ @@ -216,14 +216,15 @@ static int derive_temporal_colocated_mvs(const HEVCContext *s, MvField temp_col, /* * 8.5.3.1.7 temporal luma motion vector prediction */ -static int temporal_luma_motion_vector(const HEVCContext *s, int x0, int y0, +static int temporal_luma_motion_vector(const HEVCContext *s, const HEVCSPS *sps, + int x0, int y0, int nPbW, int nPbH, int refIdxLx, Mv *mvLXCol, int X) { const MvField *tab_mvf; MvField temp_col; int x, y, x_pu, y_pu; - int min_pu_width = s->ps.sps->min_pu_width; + int min_pu_width = sps->min_pu_width; int availableFlagLXCol = 0; int colPic; @@ -242,15 +243,15 @@ static int temporal_luma_motion_vector(const HEVCContext *s, int x0, int y0, y = y0 + nPbH; if (tab_mvf && - (y0 >> s->ps.sps->log2_ctb_size) == (y >> s->ps.sps->log2_ctb_size) && - y < s->ps.sps->height && - x < s->ps.sps->width) { + (y0 >> sps->log2_ctb_size) == (y >> sps->log2_ctb_size) && + y < sps->height && + x < sps->width) { x &= ~15; y &= ~15; if (s->threads_type == FF_THREAD_FRAME) ff_progress_frame_await(&ref->tf, y); - x_pu = x >> s->ps.sps->log2_min_pu_size; - y_pu = y >> s->ps.sps->log2_min_pu_size; + x_pu = x >> sps->log2_min_pu_size; + y_pu = y >> sps->log2_min_pu_size; temp_col = TAB_MVF(x_pu, y_pu); availableFlagLXCol = DERIVE_TEMPORAL_COLOCATED_MVS; } @@ -263,8 +264,8 @@ static int temporal_luma_motion_vector(const HEVCContext *s, int x0, int y0, y &= ~15; if (s->threads_type == FF_THREAD_FRAME) ff_progress_frame_await(&ref->tf, y); - x_pu = x >> s->ps.sps->log2_min_pu_size; - y_pu = y >> s->ps.sps->log2_min_pu_size; + x_pu = x >> sps->log2_min_pu_size; + y_pu = y >> sps->log2_min_pu_size; temp_col = TAB_MVF(x_pu, y_pu); availableFlagLXCol = DERIVE_TEMPORAL_COLOCATED_MVS; } @@ -275,7 +276,7 @@ static int temporal_luma_motion_vector(const HEVCContext *s, int x0, int y0, (cand && !(TAB_MVF_PU(v).pred_flag == PF_INTRA)) #define PRED_BLOCK_AVAILABLE(v) \ - z_scan_block_avail(s, x0, y0, x ## v, y ## v) + z_scan_block_avail(pps, sps, x0, y0, x ## v, y ## v) #define COMPARE_MV_REFIDX(a, b) \ compare_mv_ref_idx(TAB_MVF_PU(a), TAB_MVF_PU(b)) @@ -284,6 +285,7 @@ static int temporal_luma_motion_vector(const HEVCContext *s, int x0, int y0, * 8.5.3.1.2 Derivation process for spatial merging candidates */ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCContext *s, + const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, @@ -294,7 +296,7 @@ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCCont const RefPicList *refPicList = s->cur_frame->refPicList; const MvField *tab_mvf = s->cur_frame->tab_mvf; - const int min_pu_width = s->ps.sps->min_pu_width; + const int min_pu_width = sps->min_pu_width; const int cand_bottom_left = lc->na.cand_bottom_left; const int cand_left = lc->na.cand_left; @@ -336,7 +338,7 @@ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCCont (lc->cu.part_mode == PART_Nx2N || lc->cu.part_mode == PART_nLx2N || lc->cu.part_mode == PART_nRx2N) || - is_diff_mer(s, xA1, yA1, x0, y0)) { + is_diff_mer(pps, xA1, yA1, x0, y0)) { is_available_a1 = 0; } else { is_available_a1 = AVAILABLE(cand_left, A1); @@ -352,7 +354,7 @@ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCCont (lc->cu.part_mode == PART_2NxN || lc->cu.part_mode == PART_2NxnU || lc->cu.part_mode == PART_2NxnD) || - is_diff_mer(s, xB1, yB1, x0, y0)) { + is_diff_mer(pps, xB1, yB1, x0, y0)) { is_available_b1 = 0; } else { is_available_b1 = AVAILABLE(cand_up, B1); @@ -367,9 +369,9 @@ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCCont // above right spatial merge candidate is_available_b0 = AVAILABLE(cand_up_right, B0) && - xB0 < s->ps.sps->width && + xB0 < sps->width && PRED_BLOCK_AVAILABLE(B0) && - !is_diff_mer(s, xB0, yB0, x0, y0); + !is_diff_mer(pps, xB0, yB0, x0, y0); if (is_available_b0 && !(is_available_b1 && COMPARE_MV_REFIDX(B0, B1))) { @@ -381,9 +383,9 @@ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCCont // left bottom spatial merge candidate is_available_a0 = AVAILABLE(cand_bottom_left, A0) && - yA0 < s->ps.sps->height && + yA0 < sps->height && PRED_BLOCK_AVAILABLE(A0) && - !is_diff_mer(s, xA0, yA0, x0, y0); + !is_diff_mer(pps, xA0, yA0, x0, y0); if (is_available_a0 && !(is_available_a1 && COMPARE_MV_REFIDX(A0, A1))) { @@ -395,7 +397,7 @@ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCCont // above left spatial merge candidate is_available_b2 = AVAILABLE(cand_up_left, B2) && - !is_diff_mer(s, xB2, yB2, x0, y0); + !is_diff_mer(pps, xB2, yB2, x0, y0); if (is_available_b2 && !(is_available_a1 && COMPARE_MV_REFIDX(B2, A1)) && @@ -411,10 +413,10 @@ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCCont if (s->sh.slice_temporal_mvp_enabled_flag && nb_merge_cand < s->sh.max_num_merge_cand) { Mv mv_l0_col = { 0 }, mv_l1_col = { 0 }; - int available_l0 = temporal_luma_motion_vector(s, x0, y0, nPbW, nPbH, + int available_l0 = temporal_luma_motion_vector(s, sps, x0, y0, nPbW, nPbH, 0, &mv_l0_col, 0); int available_l1 = (s->sh.slice_type == HEVC_SLICE_B) ? - temporal_luma_motion_vector(s, x0, y0, nPbW, nPbH, + temporal_luma_motion_vector(s, sps, x0, y0, nPbW, nPbH, 0, &mv_l1_col, 1) : 0; if (available_l0 || available_l1) { @@ -477,10 +479,12 @@ static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCCont /* * 8.5.3.1.1 Derivation process of luma Mvs for merge mode */ -void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW, +void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, const HEVCPPS *pps, + int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv) { + const HEVCSPS *const sps = pps->sps; const HEVCContext *const s = lc->parent; int singleMCLFlag = 0; int nCS = 1 << log2_cb_size; @@ -488,7 +492,7 @@ void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW, int nPbW2 = nPbW; int nPbH2 = nPbH; - if (s->ps.pps->log2_parallel_merge_level > 2 && nCS == 8) { + if (pps->log2_parallel_merge_level > 2 && nCS == 8) { singleMCLFlag = 1; x0 = lc->cu.x; y0 = lc->cu.y; @@ -497,8 +501,8 @@ void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW, part_idx = 0; } - ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH); - derive_spatial_merge_candidates(lc, s, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH, sps->log2_ctb_size); + derive_spatial_merge_candidates(lc, s, pps, sps, x0, y0, nPbW, nPbH, log2_cb_size, singleMCLFlag, part_idx, merge_idx, mergecand_list); @@ -527,11 +531,12 @@ static av_always_inline void dist_scale(const HEVCContext *s, Mv *mv, } } -static int mv_mp_mode_mx(const HEVCContext *s, int x, int y, int pred_flag_index, +static int mv_mp_mode_mx(const HEVCContext *s, const HEVCSPS *sps, + int x, int y, int pred_flag_index, Mv *mv, int ref_idx_curr, int ref_idx) { const MvField *tab_mvf = s->cur_frame->tab_mvf; - int min_pu_width = s->ps.sps->min_pu_width; + int min_pu_width = sps->min_pu_width; const RefPicList *refPicList = s->cur_frame->refPicList; @@ -543,11 +548,12 @@ static int mv_mp_mode_mx(const HEVCContext *s, int x, int y, int pred_flag_index return 0; } -static int mv_mp_mode_mx_lt(const HEVCContext *s, int x, int y, int pred_flag_index, +static int mv_mp_mode_mx_lt(const HEVCContext *s, const HEVCSPS *sps, + int x, int y, int pred_flag_index, Mv *mv, int ref_idx_curr, int ref_idx) { const MvField *tab_mvf = s->cur_frame->tab_mvf; - int min_pu_width = s->ps.sps->min_pu_width; + int min_pu_width = sps->min_pu_width; const RefPicList *refPicList = s->cur_frame->refPicList; @@ -569,29 +575,31 @@ static int mv_mp_mode_mx_lt(const HEVCContext *s, int x, int y, int pred_flag_in } #define MP_MX(v, pred, mx) \ - mv_mp_mode_mx(s, \ - (x ## v) >> s->ps.sps->log2_min_pu_size, \ - (y ## v) >> s->ps.sps->log2_min_pu_size, \ + mv_mp_mode_mx(s, sps, \ + (x ## v) >> sps->log2_min_pu_size, \ + (y ## v) >> sps->log2_min_pu_size, \ pred, &mx, ref_idx_curr, ref_idx) #define MP_MX_LT(v, pred, mx) \ - mv_mp_mode_mx_lt(s, \ - (x ## v) >> s->ps.sps->log2_min_pu_size, \ - (y ## v) >> s->ps.sps->log2_min_pu_size, \ + mv_mp_mode_mx_lt(s, sps, \ + (x ## v) >> sps->log2_min_pu_size, \ + (y ## v) >> sps->log2_min_pu_size, \ pred, &mx, ref_idx_curr, ref_idx) -void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW, +void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, const HEVCPPS *pps, + int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv, int mvp_lx_flag, int LX) { + const HEVCSPS *const sps = pps->sps; const HEVCContext *const s = lc->parent; const MvField *const tab_mvf = s->cur_frame->tab_mvf; int isScaledFlag_L0 = 0; int availableFlagLXA0 = 1; int availableFlagLXB0 = 1; int numMVPCandLX = 0; - int min_pu_width = s->ps.sps->min_pu_width; + int min_pu_width = sps->min_pu_width; int xA0, yA0; int is_available_a0; @@ -627,7 +635,7 @@ void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW, yA0 = y0 + nPbH; is_available_a0 = AVAILABLE(cand_bottom_left, A0) && - yA0 < s->ps.sps->height && + yA0 < sps->height && PRED_BLOCK_AVAILABLE(A0); //left spatial merge candidate @@ -682,7 +690,7 @@ b_candidates: yB0 = y0 - 1; is_available_b0 = AVAILABLE(cand_up_right, B0) && - xB0 < s->ps.sps->width && + xB0 < sps->width && PRED_BLOCK_AVAILABLE(B0); // above spatial merge candidate @@ -764,7 +772,7 @@ scalef: if (numMVPCandLX < 2 && s->sh.slice_temporal_mvp_enabled_flag && mvp_lx_flag == numMVPCandLX) { Mv mv_col; - int available_col = temporal_luma_motion_vector(s, x0, y0, nPbW, + int available_col = temporal_luma_motion_vector(s, sps, x0, y0, nPbW, nPbH, ref_idx, &mv_col, LX); if (available_col) From patchwork Fri Jun 7 13:01:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49665 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1012497vqo; Fri, 7 Jun 2024 06:09:49 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVy2zF2lBH1G4UPqVUBlun/yB6+NDoYWATSrPuurHtI9dBoyF1bjfcbC3WsJ8ZMuBZrb4pI3+jbPjg03VsFf5uGGz1sPJ04IXFRxg== X-Google-Smtp-Source: AGHT+IGB23CpyWo5Lcg3kKfdcfsBZMhbwGUsIQukrgMFJal1E+vi9kOlgbet4KjgQXep7JCBIHgK X-Received: by 2002:a05:6512:3682:b0:52b:c08d:2da4 with SMTP id 2adb3069b0e04-52bc08d2ed4mr916155e87.25.1717765789217; Fri, 07 Jun 2024 06:09:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765789; cv=none; d=google.com; s=arc-20160816; b=KyB6danxm96DpncMNFfgf3lHgzi2yTBGhrjz7hDy6mnkLP/f2C2+OkRwn5Oxz9BGKe e9cpG8UtaiQgJNOLlyw5T4tDq8MdowV8jiILwWIiwJH4ZMXBEUu5Z6oxDv4RN6kPgvAW FSkz6L2TmzfcNoC2InfGmPsI83ck3vAyUYSMgcGvenDdROVCTE/ahnEkgbcoyJrLIXZq 7x/ZrBU0/dGfPrCfu8h4nFO7kBfXCgWCuP2CM3tYX2U1muzXxreoZTL+3qAAI6H6Qbmy /3GOOA8sCJ4L6DbIu8WvT684P0f6PMPp4ieWQ6GhDGbHxN8ddhuXM66/PshpjL3K7SJC ATpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=L7Lr0Htr11FTNGUWWK3K/8AiFV9f9GyPJspJodz05GM=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=A2CfI1HTXrPHdHkA1ThkMW6lTfCwu4vx04/QeA5VJWSxWAHfw0Gsn5w1s2PaO91Tpe yUmzWAtIOKYtoOkMvWMCkF1wdOk+cbUUN9Jt2STBZd9NGetQSKWOpGb7ZlirC0TgZFd7 L2459EQ8smBVcN4jMgDH0oBuqHALj7rZefSJJzYgKe1hL2G1GmprvINCfPWmZ+RGPXfB Vb7PvJ+1WHxj2ujguG5HYe/j6VWLgnwDemKAF5Jp4RL055CqsGY3hYW8KJsLCL5cTWhm 7cFakoxI1mLQ4aMDG4FK9vCUHe+kPD+65vqZPl91D8Bopr5/5RlPBJouiv/SPPf5c9Vz stCA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=RvfE+Pkq; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c806dbbffsi173629066b.486.2024.06.07.06.09.47; Fri, 07 Jun 2024 06:09:49 -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=@khirnov.net header.s=mail header.b=RvfE+Pkq; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9130F68D865; Fri, 7 Jun 2024 16:04:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E6EC568D7E3 for ; Fri, 7 Jun 2024 16:03:49 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=RvfE+Pkq; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 1D3D14DE4 for ; Fri, 7 Jun 2024 15:03:46 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id s4FUC-SqGLaw for ; Fri, 7 Jun 2024 15:03:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=oqAylLPb+JQffNYnVJVrQhAXTfRehzxr4BgmZ8X0wyc=; h=From:To:Subject:Date:In-Reply-To:References:From; b=RvfE+PkqeC9lj1TP1ppR9e/FVQVC40HvBNn7K12X7YPXAu9qYKUmnftW4IJmFAe9N cXbOYSNlP/plcvPXxDsJd9le3DNhzx2Ipmt77FsLn5TG+yDdR49BjYKPSDRyM+0dQc lj2K1XP+dCVd60JEq+iZYdWoRIOx3q7eYloGVe72brJRDvEIzQHZxvsEyzn4GA8fjT XC6PU+uNbGyVyhm3sqYxk8+gnRPPU+l5eTOksaZ/iTyavj4co/leG0/Eflo1E/rPeT BG67dJzc+DbNCTgBNGb9E8yfggOeVP29aw7WjrJ0u+SG0y1X8xhpCrzU7pU3qlSViq LmVUQ9J0Z4cDQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 765B64DBA for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id A215F3A083F for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:04 +0200 Message-ID: <20240607130135.9088-8-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/39] lavc/hevc/filter: stop accessing parameter sets through HEVCParamSets 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: PXBT7qGnKd1h Instead, accept PPS as a function argument and retrieve SPS through it. Makes the code shorter and significantly reduces diff in future commits. --- libavcodec/hevc/filter.c | 311 ++++++++++++++++++++------------------ libavcodec/hevc/hevcdec.c | 20 +-- libavcodec/hevc/hevcdec.h | 14 +- 3 files changed, 186 insertions(+), 159 deletions(-) diff --git a/libavcodec/hevc/filter.c b/libavcodec/hevc/filter.c index db7525170d..081b3a3898 100644 --- a/libavcodec/hevc/filter.c +++ b/libavcodec/hevc/filter.c @@ -44,7 +44,8 @@ static const uint8_t betatable[52] = { 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64 // QP 38...51 }; -static int chroma_tc(const HEVCContext *s, int qp_y, int c_idx, int tc_offset) +static int chroma_tc(const HEVCPPS *pps, const HEVCSPS *sps, + int qp_y, int c_idx, int tc_offset) { static const int qp_c[] = { 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37 @@ -53,12 +54,12 @@ static int chroma_tc(const HEVCContext *s, int qp_y, int c_idx, int tc_offset) // slice qp offset is not used for deblocking if (c_idx == 1) - offset = s->ps.pps->cb_qp_offset; + offset = pps->cb_qp_offset; else - offset = s->ps.pps->cr_qp_offset; + offset = pps->cr_qp_offset; qp_i = av_clip(qp_y + offset, 0, 57); - if (s->ps.sps->chroma_format_idc == 1) { + if (sps->chroma_format_idc == 1) { if (qp_i < 30) qp = qp_i; else if (qp_i > 43) @@ -74,16 +75,17 @@ static int chroma_tc(const HEVCContext *s, int qp_y, int c_idx, int tc_offset) } static int get_qPy_pred(HEVCLocalContext *lc, const HEVCContext *s, + const HEVCPPS *pps, const HEVCSPS *sps, int xBase, int yBase, int log2_cb_size) { - int ctb_size_mask = (1 << s->ps.sps->log2_ctb_size) - 1; - int MinCuQpDeltaSizeMask = (1 << (s->ps.sps->log2_ctb_size - - s->ps.pps->diff_cu_qp_delta_depth)) - 1; + int ctb_size_mask = (1 << sps->log2_ctb_size) - 1; + int MinCuQpDeltaSizeMask = (1 << (sps->log2_ctb_size - + pps->diff_cu_qp_delta_depth)) - 1; int xQgBase = xBase - (xBase & MinCuQpDeltaSizeMask); int yQgBase = yBase - (yBase & MinCuQpDeltaSizeMask); - int min_cb_width = s->ps.sps->min_cb_width; - int x_cb = xQgBase >> s->ps.sps->log2_min_cb_size; - int y_cb = yQgBase >> s->ps.sps->log2_min_cb_size; + int min_cb_width = sps->min_cb_width; + int x_cb = xQgBase >> sps->log2_min_cb_size; + int y_cb = yQgBase >> sps->log2_min_cb_size; int availableA = (xBase & ctb_size_mask) && (xQgBase & ctb_size_mask); int availableB = (yBase & ctb_size_mask) && @@ -110,31 +112,33 @@ static int get_qPy_pred(HEVCLocalContext *lc, const HEVCContext *s, else qPy_b = s->qp_y_tab[x_cb + (y_cb - 1) * min_cb_width]; - av_assert2(qPy_a >= -s->ps.sps->qp_bd_offset && qPy_a < 52); - av_assert2(qPy_b >= -s->ps.sps->qp_bd_offset && qPy_b < 52); + av_assert2(qPy_a >= -sps->qp_bd_offset && qPy_a < 52); + av_assert2(qPy_b >= -sps->qp_bd_offset && qPy_b < 52); return (qPy_a + qPy_b + 1) >> 1; } -void ff_hevc_set_qPy(HEVCLocalContext *lc, int xBase, int yBase, int log2_cb_size) +void ff_hevc_set_qPy(HEVCLocalContext *lc, const HEVCPPS *pps, + int xBase, int yBase, int log2_cb_size) { + const HEVCSPS *const sps = pps->sps; const HEVCContext *const s = lc->parent; - int qp_y = get_qPy_pred(lc, s, xBase, yBase, log2_cb_size); + int qp_y = get_qPy_pred(lc, s, pps, sps, xBase, yBase, log2_cb_size); if (lc->tu.cu_qp_delta != 0) { - int off = s->ps.sps->qp_bd_offset; + int off = sps->qp_bd_offset; lc->qp_y = FFUMOD(qp_y + lc->tu.cu_qp_delta + 52 + 2 * off, 52 + off) - off; } else lc->qp_y = qp_y; } -static int get_qPy(const HEVCContext *s, int xC, int yC) +static int get_qPy(const HEVCSPS *sps, const int8_t *qp_y_tab, int xC, int yC) { - int log2_min_cb_size = s->ps.sps->log2_min_cb_size; + int log2_min_cb_size = sps->log2_min_cb_size; int x = xC >> log2_min_cb_size; int y = yC >> log2_min_cb_size; - return s->qp_y_tab[x + y * s->ps.sps->min_cb_width]; + return qp_y_tab[x + y * sps->min_cb_width]; } static void copy_CTB(uint8_t *dst, const uint8_t *src, int width, int height, @@ -198,13 +202,14 @@ static void copy_vert(uint8_t *dst, const uint8_t *src, } } -static void copy_CTB_to_hv(const HEVCContext *s, const uint8_t *src, +static void copy_CTB_to_hv(const HEVCContext *s, const HEVCSPS *sps, + const uint8_t *src, ptrdiff_t stride_src, int x, int y, int width, int height, int c_idx, int x_ctb, int y_ctb) { - int sh = s->ps.sps->pixel_shift; - int w = s->ps.sps->width >> s->ps.sps->hshift[c_idx]; - int h = s->ps.sps->height >> s->ps.sps->vshift[c_idx]; + int sh = sps->pixel_shift; + int w = sps->width >> sps->hshift[c_idx]; + int h = sps->height >> sps->vshift[c_idx]; /* copy horizontal edges */ memcpy(s->sao_pixel_buffer_h[c_idx] + (((2 * y_ctb) * w + x) << sh), @@ -219,27 +224,33 @@ static void copy_CTB_to_hv(const HEVCContext *s, const uint8_t *src, } static void restore_tqb_pixels(const HEVCContext *s, + const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *src1, const uint8_t *dst1, ptrdiff_t stride_src, ptrdiff_t stride_dst, int x0, int y0, int width, int height, int c_idx) { - if ( s->ps.pps->transquant_bypass_enable_flag || - (s->ps.sps->pcm_loop_filter_disabled && s->ps.sps->pcm_enabled)) { + if (pps->transquant_bypass_enable_flag || + (sps->pcm_loop_filter_disabled && sps->pcm_enabled)) { int x, y; - int min_pu_size = 1 << s->ps.sps->log2_min_pu_size; - int hshift = s->ps.sps->hshift[c_idx]; - int vshift = s->ps.sps->vshift[c_idx]; - int x_min = ((x0 ) >> s->ps.sps->log2_min_pu_size); - int y_min = ((y0 ) >> s->ps.sps->log2_min_pu_size); - int x_max = ((x0 + width ) >> s->ps.sps->log2_min_pu_size); - int y_max = ((y0 + height) >> s->ps.sps->log2_min_pu_size); - int len = (min_pu_size >> hshift) << s->ps.sps->pixel_shift; + int min_pu_size = 1 << sps->log2_min_pu_size; + int hshift = sps->hshift[c_idx]; + int vshift = sps->vshift[c_idx]; + int x_min = ((x0 ) >> sps->log2_min_pu_size); + int y_min = ((y0 ) >> sps->log2_min_pu_size); + int x_max = ((x0 + width ) >> sps->log2_min_pu_size); + int y_max = ((y0 + height) >> sps->log2_min_pu_size); + int len = (min_pu_size >> hshift) << sps->pixel_shift; for (y = y_min; y < y_max; y++) { for (x = x_min; x < x_max; x++) { - if (s->is_pcm[y * s->ps.sps->min_pu_width + x]) { + if (s->is_pcm[y * sps->min_pu_width + x]) { int n; - uint8_t *src = src1 + (((y << s->ps.sps->log2_min_pu_size) - y0) >> vshift) * stride_src + ((((x << s->ps.sps->log2_min_pu_size) - x0) >> hshift) << s->ps.sps->pixel_shift); - const uint8_t *dst = dst1 + (((y << s->ps.sps->log2_min_pu_size) - y0) >> vshift) * stride_dst + ((((x << s->ps.sps->log2_min_pu_size) - x0) >> hshift) << s->ps.sps->pixel_shift); + uint8_t *src = src1 + + (((y << sps->log2_min_pu_size) - y0) >> vshift) * stride_src + + ((((x << sps->log2_min_pu_size) - x0) >> hshift) << sps->pixel_shift); + const uint8_t *dst = dst1 + + (((y << sps->log2_min_pu_size) - y0) >> vshift) * stride_dst + + ((((x << sps->log2_min_pu_size) - x0) >> hshift) << sps->pixel_shift); + for (n = 0; n < (min_pu_size >> vshift); n++) { memcpy(src, dst, len); src += stride_src; @@ -251,25 +262,27 @@ static void restore_tqb_pixels(const HEVCContext *s, } } -#define CTB(tab, x, y) ((tab)[(y) * s->ps.sps->ctb_width + (x)]) +#define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)]) -static void sao_filter_CTB(HEVCLocalContext *lc, const HEVCContext *s, int x, int y) +static void sao_filter_CTB(HEVCLocalContext *lc, const HEVCContext *s, + const HEVCPPS *pps, const HEVCSPS *sps, + int x, int y) { static const uint8_t sao_tab[8] = { 0, 1, 2, 2, 3, 3, 4, 4 }; int c_idx; int edges[4]; // 0 left 1 top 2 right 3 bottom - int x_ctb = x >> s->ps.sps->log2_ctb_size; - int y_ctb = y >> s->ps.sps->log2_ctb_size; - int ctb_addr_rs = y_ctb * s->ps.sps->ctb_width + x_ctb; - int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs]; + int x_ctb = x >> sps->log2_ctb_size; + int y_ctb = y >> sps->log2_ctb_size; + int ctb_addr_rs = y_ctb * sps->ctb_width + x_ctb; + int ctb_addr_ts = pps->ctb_addr_rs_to_ts[ctb_addr_rs]; SAOParams *sao = &CTB(s->sao, x_ctb, y_ctb); // flags indicating unfilterable edges uint8_t vert_edge[] = { 0, 0 }; uint8_t horiz_edge[] = { 0, 0 }; uint8_t diag_edge[] = { 0, 0, 0, 0 }; uint8_t lfase = CTB(s->filter_slice_edges, x_ctb, y_ctb); - uint8_t no_tile_filter = s->ps.pps->tiles_enabled_flag && - !s->ps.pps->loop_filter_across_tiles_enabled_flag; + uint8_t no_tile_filter = pps->tiles_enabled_flag && + !pps->loop_filter_across_tiles_enabled_flag; uint8_t restore = no_tile_filter || !lfase; uint8_t left_tile_edge = 0; uint8_t right_tile_edge = 0; @@ -278,24 +291,24 @@ static void sao_filter_CTB(HEVCLocalContext *lc, const HEVCContext *s, int x, in edges[0] = x_ctb == 0; edges[1] = y_ctb == 0; - edges[2] = x_ctb == s->ps.sps->ctb_width - 1; - edges[3] = y_ctb == s->ps.sps->ctb_height - 1; + edges[2] = x_ctb == sps->ctb_width - 1; + edges[3] = y_ctb == sps->ctb_height - 1; if (restore) { if (!edges[0]) { - left_tile_edge = no_tile_filter && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs-1]]; + left_tile_edge = no_tile_filter && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs-1]]; vert_edge[0] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb - 1, y_ctb)) || left_tile_edge; } if (!edges[2]) { - right_tile_edge = no_tile_filter && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs+1]]; + right_tile_edge = no_tile_filter && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs+1]]; vert_edge[1] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb + 1, y_ctb)) || right_tile_edge; } if (!edges[1]) { - up_tile_edge = no_tile_filter && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->ps.sps->ctb_width]]; + up_tile_edge = no_tile_filter && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - sps->ctb_width]]; horiz_edge[0] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb, y_ctb - 1)) || up_tile_edge; } if (!edges[3]) { - bottom_tile_edge = no_tile_filter && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs + s->ps.sps->ctb_width]]; + bottom_tile_edge = no_tile_filter && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs + sps->ctb_width]]; horiz_edge[1] = (!lfase && CTB(s->tab_slice_address, x_ctb, y_ctb) != CTB(s->tab_slice_address, x_ctb, y_ctb + 1)) || bottom_tile_edge; } if (!edges[0] && !edges[1]) { @@ -312,32 +325,32 @@ static void sao_filter_CTB(HEVCLocalContext *lc, const HEVCContext *s, int x, in } } - for (c_idx = 0; c_idx < (s->ps.sps->chroma_format_idc ? 3 : 1); c_idx++) { - int x0 = x >> s->ps.sps->hshift[c_idx]; - int y0 = y >> s->ps.sps->vshift[c_idx]; + for (c_idx = 0; c_idx < (sps->chroma_format_idc ? 3 : 1); c_idx++) { + int x0 = x >> sps->hshift[c_idx]; + int y0 = y >> sps->vshift[c_idx]; ptrdiff_t stride_src = s->cur_frame->f->linesize[c_idx]; - int ctb_size_h = (1 << (s->ps.sps->log2_ctb_size)) >> s->ps.sps->hshift[c_idx]; - int ctb_size_v = (1 << (s->ps.sps->log2_ctb_size)) >> s->ps.sps->vshift[c_idx]; - int width = FFMIN(ctb_size_h, (s->ps.sps->width >> s->ps.sps->hshift[c_idx]) - x0); - int height = FFMIN(ctb_size_v, (s->ps.sps->height >> s->ps.sps->vshift[c_idx]) - y0); + int ctb_size_h = (1 << (sps->log2_ctb_size)) >> sps->hshift[c_idx]; + int ctb_size_v = (1 << (sps->log2_ctb_size)) >> sps->vshift[c_idx]; + int width = FFMIN(ctb_size_h, (sps->width >> sps->hshift[c_idx]) - x0); + int height = FFMIN(ctb_size_v, (sps->height >> sps->vshift[c_idx]) - y0); int tab = sao_tab[(FFALIGN(width, 8) >> 3) - 1]; - uint8_t *src = &s->cur_frame->f->data[c_idx][y0 * stride_src + (x0 << s->ps.sps->pixel_shift)]; + uint8_t *src = &s->cur_frame->f->data[c_idx][y0 * stride_src + (x0 << sps->pixel_shift)]; ptrdiff_t stride_dst; uint8_t *dst; switch (sao->type_idx[c_idx]) { case SAO_BAND: - copy_CTB_to_hv(s, src, stride_src, x0, y0, width, height, c_idx, + copy_CTB_to_hv(s, sps, src, stride_src, x0, y0, width, height, c_idx, x_ctb, y_ctb); - if (s->ps.pps->transquant_bypass_enable_flag || - (s->ps.sps->pcm_loop_filter_disabled && s->ps.sps->pcm_enabled)) { + if (pps->transquant_bypass_enable_flag || + (sps->pcm_loop_filter_disabled && sps->pcm_enabled)) { dst = lc->edge_emu_buffer; stride_dst = 2*MAX_PB_SIZE; - copy_CTB(dst, src, width << s->ps.sps->pixel_shift, height, stride_dst, stride_src); + copy_CTB(dst, src, width << sps->pixel_shift, height, stride_dst, stride_src); s->hevcdsp.sao_band_filter[tab](src, dst, stride_src, stride_dst, sao->offset_val[c_idx], sao->band_position[c_idx], width, height); - restore_tqb_pixels(s, src, dst, stride_src, stride_dst, + restore_tqb_pixels(s, pps, sps, src, dst, stride_src, stride_dst, x, y, width, height, c_idx); } else { s->hevcdsp.sao_band_filter[tab](src, src, stride_src, stride_src, @@ -348,13 +361,13 @@ static void sao_filter_CTB(HEVCLocalContext *lc, const HEVCContext *s, int x, in break; case SAO_EDGE: { - int w = s->ps.sps->width >> s->ps.sps->hshift[c_idx]; - int h = s->ps.sps->height >> s->ps.sps->vshift[c_idx]; + int w = sps->width >> sps->hshift[c_idx]; + int h = sps->height >> sps->vshift[c_idx]; int left_edge = edges[0]; int top_edge = edges[1]; int right_edge = edges[2]; int bottom_edge = edges[3]; - int sh = s->ps.sps->pixel_shift; + int sh = sps->pixel_shift; int left_pixels, right_pixels; stride_dst = 2*MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE; @@ -440,7 +453,7 @@ static void sao_filter_CTB(HEVCLocalContext *lc, const HEVCContext *s, int x, in (width + left_pixels + right_pixels) << sh, height, stride_dst, stride_src); - copy_CTB_to_hv(s, src, stride_src, x0, y0, width, height, c_idx, + copy_CTB_to_hv(s, sps, src, stride_src, x0, y0, width, height, c_idx, x_ctb, y_ctb); s->hevcdsp.sao_edge_filter[tab](src, dst, stride_src, sao->offset_val[c_idx], sao->eo_class[c_idx], width, height); @@ -452,7 +465,7 @@ static void sao_filter_CTB(HEVCLocalContext *lc, const HEVCContext *s, int x, in vert_edge, horiz_edge, diag_edge); - restore_tqb_pixels(s, src, dst, stride_src, stride_dst, + restore_tqb_pixels(s, pps, sps, src, dst, stride_src, stride_dst, x, y, width, height, c_idx); sao->type_idx[c_idx] = SAO_APPLIED; break; @@ -461,9 +474,9 @@ static void sao_filter_CTB(HEVCLocalContext *lc, const HEVCContext *s, int x, in } } -static int get_pcm(const HEVCContext *s, int x, int y) +static int get_pcm(const HEVCSPS *sps, const uint8_t *is_pcm, int x, int y) { - int log2_min_pu_size = s->ps.sps->log2_min_pu_size; + int log2_min_pu_size = sps->log2_min_pu_size; int x_pu, y_pu; if (x < 0 || y < 0) @@ -472,9 +485,9 @@ static int get_pcm(const HEVCContext *s, int x, int y) x_pu = x >> log2_min_pu_size; y_pu = y >> log2_min_pu_size; - if (x_pu >= s->ps.sps->min_pu_width || y_pu >= s->ps.sps->min_pu_height) + if (x_pu >= sps->min_pu_width || y_pu >= sps->min_pu_height) return 2; - return s->is_pcm[y_pu * s->ps.sps->min_pu_width + x_pu]; + return is_pcm[y_pu * sps->min_pu_width + x_pu]; } #define TC_CALC(qp, bs) \ @@ -482,7 +495,9 @@ static int get_pcm(const HEVCContext *s, int x, int y) (tc_offset & -2), \ 0, MAX_QP + DEFAULT_INTRA_TC_OFFSET)] -static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) +static void deblocking_filter_CTB(const HEVCContext *s, + const HEVCPPS *pps, const HEVCSPS *sps, + int x0, int y0) { uint8_t **data = s->cur_frame->f->data; int *linesize = s->cur_frame->f->linesize; @@ -494,18 +509,18 @@ static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) uint8_t no_p[2] = { 0 }; uint8_t no_q[2] = { 0 }; - int log2_ctb_size = s->ps.sps->log2_ctb_size; + int log2_ctb_size = sps->log2_ctb_size; int x_end, x_end2, y_end; int ctb_size = 1 << log2_ctb_size; int ctb = (x0 >> log2_ctb_size) + - (y0 >> log2_ctb_size) * s->ps.sps->ctb_width; + (y0 >> log2_ctb_size) * sps->ctb_width; int cur_tc_offset = s->deblock[ctb].tc_offset; int cur_beta_offset = s->deblock[ctb].beta_offset; int left_tc_offset, left_beta_offset; int tc_offset, beta_offset; - int pcmf = (s->ps.sps->pcm_enabled && - s->ps.sps->pcm_loop_filter_disabled) || - s->ps.pps->transquant_bypass_enable_flag; + int pcmf = (sps->pcm_enabled && + sps->pcm_loop_filter_disabled) || + pps->transquant_bypass_enable_flag; if (x0) { left_tc_offset = s->deblock[ctb - 1].tc_offset; @@ -516,17 +531,17 @@ static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) } x_end = x0 + ctb_size; - if (x_end > s->ps.sps->width) - x_end = s->ps.sps->width; + if (x_end > sps->width) + x_end = sps->width; y_end = y0 + ctb_size; - if (y_end > s->ps.sps->height) - y_end = s->ps.sps->height; + if (y_end > sps->height) + y_end = sps->height; tc_offset = cur_tc_offset; beta_offset = cur_beta_offset; x_end2 = x_end; - if (x_end2 != s->ps.sps->width) + if (x_end2 != sps->width) x_end2 -= 8; for (y = y0; y < y_end; y += 8) { // vertical filtering luma @@ -534,18 +549,19 @@ static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) const int bs0 = s->vertical_bs[(x + y * s->bs_width) >> 2]; const int bs1 = s->vertical_bs[(x + (y + 4) * s->bs_width) >> 2]; if (bs0 || bs1) { - const int qp = (get_qPy(s, x - 1, y) + get_qPy(s, x, y) + 1) >> 1; + const int qp = (get_qPy(sps, s->qp_y_tab, x - 1, y) + + get_qPy(sps, s->qp_y_tab, x, y) + 1) >> 1; beta = betatable[av_clip(qp + beta_offset, 0, MAX_QP)]; tc[0] = bs0 ? TC_CALC(qp, bs0) : 0; tc[1] = bs1 ? TC_CALC(qp, bs1) : 0; - src = &data[LUMA][y * linesize[LUMA] + (x << s->ps.sps->pixel_shift)]; + src = &data[LUMA][y * linesize[LUMA] + (x << sps->pixel_shift)]; if (pcmf) { - no_p[0] = get_pcm(s, x - 1, y); - no_p[1] = get_pcm(s, x - 1, y + 4); - no_q[0] = get_pcm(s, x, y); - no_q[1] = get_pcm(s, x, y + 4); + no_p[0] = get_pcm(sps, s->is_pcm, x - 1, y); + no_p[1] = get_pcm(sps, s->is_pcm, x - 1, y + 4); + no_q[0] = get_pcm(sps, s->is_pcm, x, y); + no_q[1] = get_pcm(sps, s->is_pcm, x, y + 4); s->hevcdsp.hevc_v_loop_filter_luma_c(src, linesize[LUMA], beta, tc, no_p, no_q); } else @@ -562,7 +578,8 @@ static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) const int bs0 = s->horizontal_bs[( x + y * s->bs_width) >> 2]; const int bs1 = s->horizontal_bs[((x + 4) + y * s->bs_width) >> 2]; if (bs0 || bs1) { - const int qp = (get_qPy(s, x, y - 1) + get_qPy(s, x, y) + 1) >> 1; + const int qp = (get_qPy(sps, s->qp_y_tab, x, y - 1) + + get_qPy(sps, s->qp_y_tab, x, y) + 1) >> 1; tc_offset = x >= x0 ? cur_tc_offset : left_tc_offset; beta_offset = x >= x0 ? cur_beta_offset : left_beta_offset; @@ -570,12 +587,12 @@ static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) beta = betatable[av_clip(qp + beta_offset, 0, MAX_QP)]; tc[0] = bs0 ? TC_CALC(qp, bs0) : 0; tc[1] = bs1 ? TC_CALC(qp, bs1) : 0; - src = &data[LUMA][y * linesize[LUMA] + (x << s->ps.sps->pixel_shift)]; + src = &data[LUMA][y * linesize[LUMA] + (x << sps->pixel_shift)]; if (pcmf) { - no_p[0] = get_pcm(s, x, y - 1); - no_p[1] = get_pcm(s, x + 4, y - 1); - no_q[0] = get_pcm(s, x, y); - no_q[1] = get_pcm(s, x + 4, y); + no_p[0] = get_pcm(sps, s->is_pcm, x, y - 1); + no_p[1] = get_pcm(sps, s->is_pcm, x + 4, y - 1); + no_q[0] = get_pcm(sps, s->is_pcm, x, y); + no_q[1] = get_pcm(sps, s->is_pcm, x + 4, y); s->hevcdsp.hevc_h_loop_filter_luma_c(src, linesize[LUMA], beta, tc, no_p, no_q); } else @@ -585,10 +602,10 @@ static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) } } - if (s->ps.sps->chroma_format_idc) { + if (sps->chroma_format_idc) { for (chroma = 1; chroma <= 2; chroma++) { - int h = 1 << s->ps.sps->hshift[chroma]; - int v = 1 << s->ps.sps->vshift[chroma]; + int h = 1 << sps->hshift[chroma]; + int v = 1 << sps->vshift[chroma]; // vertical filtering chroma for (y = y0; y < y_end; y += (8 * v)) { @@ -597,17 +614,19 @@ static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) const int bs1 = s->vertical_bs[(x + (y + (4 * v)) * s->bs_width) >> 2]; if ((bs0 == 2) || (bs1 == 2)) { - const int qp0 = (get_qPy(s, x - 1, y) + get_qPy(s, x, y) + 1) >> 1; - const int qp1 = (get_qPy(s, x - 1, y + (4 * v)) + get_qPy(s, x, y + (4 * v)) + 1) >> 1; + const int qp0 = (get_qPy(sps, s->qp_y_tab, x - 1, y) + + get_qPy(sps, s->qp_y_tab, x, y) + 1) >> 1; + const int qp1 = (get_qPy(sps, s->qp_y_tab, x - 1, y + (4 * v)) + + get_qPy(sps, s->qp_y_tab, x, y + (4 * v)) + 1) >> 1; - c_tc[0] = (bs0 == 2) ? chroma_tc(s, qp0, chroma, tc_offset) : 0; - c_tc[1] = (bs1 == 2) ? chroma_tc(s, qp1, chroma, tc_offset) : 0; - src = &data[chroma][(y >> s->ps.sps->vshift[chroma]) * linesize[chroma] + ((x >> s->ps.sps->hshift[chroma]) << s->ps.sps->pixel_shift)]; + c_tc[0] = (bs0 == 2) ? chroma_tc(pps, sps, qp0, chroma, tc_offset) : 0; + c_tc[1] = (bs1 == 2) ? chroma_tc(pps, sps, qp1, chroma, tc_offset) : 0; + src = &data[chroma][(y >> sps->vshift[chroma]) * linesize[chroma] + ((x >> sps->hshift[chroma]) << sps->pixel_shift)]; if (pcmf) { - no_p[0] = get_pcm(s, x - 1, y); - no_p[1] = get_pcm(s, x - 1, y + (4 * v)); - no_q[0] = get_pcm(s, x, y); - no_q[1] = get_pcm(s, x, y + (4 * v)); + no_p[0] = get_pcm(sps, s->is_pcm, x - 1, y); + no_p[1] = get_pcm(sps, s->is_pcm, x - 1, y + (4 * v)); + no_q[0] = get_pcm(sps, s->is_pcm, x, y); + no_q[1] = get_pcm(sps, s->is_pcm, x, y + (4 * v)); s->hevcdsp.hevc_v_loop_filter_chroma_c(src, linesize[chroma], c_tc, no_p, no_q); } else @@ -622,23 +641,25 @@ static void deblocking_filter_CTB(const HEVCContext *s, int x0, int y0) // horizontal filtering chroma tc_offset = x0 ? left_tc_offset : cur_tc_offset; x_end2 = x_end; - if (x_end != s->ps.sps->width) + if (x_end != sps->width) x_end2 = x_end - 8 * h; for (x = x0 ? x0 - 8 * h : 0; x < x_end2; x += (8 * h)) { const int bs0 = s->horizontal_bs[( x + y * s->bs_width) >> 2]; const int bs1 = s->horizontal_bs[((x + 4 * h) + y * s->bs_width) >> 2]; if ((bs0 == 2) || (bs1 == 2)) { - const int qp0 = bs0 == 2 ? (get_qPy(s, x, y - 1) + get_qPy(s, x, y) + 1) >> 1 : 0; - const int qp1 = bs1 == 2 ? (get_qPy(s, x + (4 * h), y - 1) + get_qPy(s, x + (4 * h), y) + 1) >> 1 : 0; + const int qp0 = bs0 == 2 ? (get_qPy(sps, s->qp_y_tab, x, y - 1) + + get_qPy(sps, s->qp_y_tab, x, y) + 1) >> 1 : 0; + const int qp1 = bs1 == 2 ? (get_qPy(sps, s->qp_y_tab, x + (4 * h), y - 1) + + get_qPy(sps, s->qp_y_tab, x + (4 * h), y) + 1) >> 1 : 0; - c_tc[0] = bs0 == 2 ? chroma_tc(s, qp0, chroma, tc_offset) : 0; - c_tc[1] = bs1 == 2 ? chroma_tc(s, qp1, chroma, cur_tc_offset) : 0; - src = &data[chroma][(y >> s->ps.sps->vshift[1]) * linesize[chroma] + ((x >> s->ps.sps->hshift[1]) << s->ps.sps->pixel_shift)]; + c_tc[0] = bs0 == 2 ? chroma_tc(pps, sps, qp0, chroma, tc_offset) : 0; + c_tc[1] = bs1 == 2 ? chroma_tc(pps, sps, qp1, chroma, cur_tc_offset) : 0; + src = &data[chroma][(y >> sps->vshift[1]) * linesize[chroma] + ((x >> sps->hshift[1]) << sps->pixel_shift)]; if (pcmf) { - no_p[0] = get_pcm(s, x, y - 1); - no_p[1] = get_pcm(s, x + (4 * h), y - 1); - no_q[0] = get_pcm(s, x, y); - no_q[1] = get_pcm(s, x + (4 * h), y); + no_p[0] = get_pcm(sps, s->is_pcm, x, y - 1); + no_p[1] = get_pcm(sps, s->is_pcm, x + (4 * h), y - 1); + no_q[0] = get_pcm(sps, s->is_pcm, x, y); + no_q[1] = get_pcm(sps, s->is_pcm, x + (4 * h), y); s->hevcdsp.hevc_h_loop_filter_chroma_c(src, linesize[chroma], c_tc, no_p, no_q); } else @@ -715,15 +736,16 @@ static int boundary_strength(const HEVCContext *s, const MvField *curr, const Mv return 1; } -void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, int x0, int y0, - int log2_trafo_size) +void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, const HEVCPPS *pps, + int x0, int y0, int log2_trafo_size) { + const HEVCSPS *const sps = pps->sps; const HEVCContext *s = lc->parent; const MvField *tab_mvf = s->cur_frame->tab_mvf; - int log2_min_pu_size = s->ps.sps->log2_min_pu_size; - int log2_min_tu_size = s->ps.sps->log2_min_tb_size; - int min_pu_width = s->ps.sps->min_pu_width; - int min_tu_width = s->ps.sps->min_tb_width; + int log2_min_pu_size = sps->log2_min_pu_size; + int log2_min_tu_size = sps->log2_min_tb_size; + int min_pu_width = sps->min_pu_width; + int min_tu_width = sps->min_tb_width; int is_intra = tab_mvf[(y0 >> log2_min_pu_size) * min_pu_width + (x0 >> log2_min_pu_size)].pred_flag == PF_INTRA; int boundary_upper, boundary_left; @@ -733,10 +755,10 @@ void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, int x0, int y0, if (boundary_upper && ((!s->sh.slice_loop_filter_across_slices_enabled_flag && lc->boundary_flags & BOUNDARY_UPPER_SLICE && - (y0 % (1 << s->ps.sps->log2_ctb_size)) == 0) || - (!s->ps.pps->loop_filter_across_tiles_enabled_flag && + (y0 % (1 << sps->log2_ctb_size)) == 0) || + (!pps->loop_filter_across_tiles_enabled_flag && lc->boundary_flags & BOUNDARY_UPPER_TILE && - (y0 % (1 << s->ps.sps->log2_ctb_size)) == 0))) + (y0 % (1 << sps->log2_ctb_size)) == 0))) boundary_upper = 0; if (boundary_upper) { @@ -771,10 +793,10 @@ void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, int x0, int y0, if (boundary_left && ((!s->sh.slice_loop_filter_across_slices_enabled_flag && lc->boundary_flags & BOUNDARY_LEFT_SLICE && - (x0 % (1 << s->ps.sps->log2_ctb_size)) == 0) || - (!s->ps.pps->loop_filter_across_tiles_enabled_flag && + (x0 % (1 << sps->log2_ctb_size)) == 0) || + (!pps->loop_filter_across_tiles_enabled_flag && lc->boundary_flags & BOUNDARY_LEFT_TILE && - (x0 % (1 << s->ps.sps->log2_ctb_size)) == 0))) + (x0 % (1 << sps->log2_ctb_size)) == 0))) boundary_left = 0; if (boundary_left) { @@ -843,10 +865,12 @@ void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, int x0, int y0, #undef CB #undef CR -void ff_hevc_hls_filter(HEVCLocalContext *lc, int x, int y, int ctb_size) +void ff_hevc_hls_filter(HEVCLocalContext *lc, const HEVCPPS *pps, + int x, int y, int ctb_size) { + const HEVCSPS *const sps = pps->sps; const HEVCContext *const s = lc->parent; - int x_end = x >= s->ps.sps->width - ctb_size; + int x_end = x >= sps->width - ctb_size; int skip = 0; if (s->avctx->skip_loop_filter >= AVDISCARD_ALL || (s->avctx->skip_loop_filter >= AVDISCARD_NONKEY && !IS_IDR(s)) || @@ -859,20 +883,20 @@ void ff_hevc_hls_filter(HEVCLocalContext *lc, int x, int y, int ctb_size) skip = 1; if (!skip) - deblocking_filter_CTB(s, x, y); - if (s->ps.sps->sao_enabled && !skip) { - int y_end = y >= s->ps.sps->height - ctb_size; + deblocking_filter_CTB(s, pps, sps, x, y); + if (sps->sao_enabled && !skip) { + int y_end = y >= sps->height - ctb_size; if (y && x) - sao_filter_CTB(lc, s, x - ctb_size, y - ctb_size); + sao_filter_CTB(lc, s, pps, sps, x - ctb_size, y - ctb_size); if (x && y_end) - sao_filter_CTB(lc, s, x - ctb_size, y); + sao_filter_CTB(lc, s, pps, sps, x - ctb_size, y); if (y && x_end) { - sao_filter_CTB(lc, s, x, y - ctb_size); + sao_filter_CTB(lc, s, pps, sps, x, y - ctb_size); if (s->threads_type & FF_THREAD_FRAME ) ff_progress_frame_report(&s->cur_frame->tf, y); } if (x_end && y_end) { - sao_filter_CTB(lc, s, x , y); + sao_filter_CTB(lc, s, pps, sps, x , y); if (s->threads_type & FF_THREAD_FRAME ) ff_progress_frame_report(&s->cur_frame->tf, y + ctb_size); } @@ -880,14 +904,15 @@ void ff_hevc_hls_filter(HEVCLocalContext *lc, int x, int y, int ctb_size) ff_progress_frame_report(&s->cur_frame->tf, y + ctb_size - 4); } -void ff_hevc_hls_filters(HEVCLocalContext *lc, int x_ctb, int y_ctb, int ctb_size) +void ff_hevc_hls_filters(HEVCLocalContext *lc, const HEVCPPS *pps, + int x_ctb, int y_ctb, int ctb_size) { - int x_end = x_ctb >= lc->parent->ps.sps->width - ctb_size; - int y_end = y_ctb >= lc->parent->ps.sps->height - ctb_size; + int x_end = x_ctb >= pps->sps->width - ctb_size; + int y_end = y_ctb >= pps->sps->height - ctb_size; if (y_ctb && x_ctb) - ff_hevc_hls_filter(lc, x_ctb - ctb_size, y_ctb - ctb_size, ctb_size); + ff_hevc_hls_filter(lc, pps, x_ctb - ctb_size, y_ctb - ctb_size, ctb_size); if (y_ctb && x_end) - ff_hevc_hls_filter(lc, x_ctb, y_ctb - ctb_size, ctb_size); + ff_hevc_hls_filter(lc, pps, x_ctb, y_ctb - ctb_size, ctb_size); if (x_ctb && y_end) - ff_hevc_hls_filter(lc, x_ctb - ctb_size, y_ctb, ctb_size); + ff_hevc_hls_filter(lc, pps, x_ctb - ctb_size, y_ctb, ctb_size); } diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 5de229f78d..eeeaae6e3a 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -1189,7 +1189,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, return AVERROR_INVALIDDATA; } - ff_hevc_set_qPy(lc, cb_xBase, cb_yBase, log2_cb_size); + ff_hevc_set_qPy(lc, s->ps.pps, cb_xBase, cb_yBase, log2_cb_size); } if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma && @@ -1485,7 +1485,7 @@ do { } } if (!s->sh.disable_deblocking_filter_flag) { - ff_hevc_deblocking_boundary_strengths(lc, x0, y0, log2_trafo_size); + ff_hevc_deblocking_boundary_strengths(lc, s->ps.pps, x0, y0, log2_trafo_size); if (s->ps.pps->transquant_bypass_enable_flag && lc->cu.cu_transquant_bypass_flag) set_deblocking_bypass(s, x0, y0, log2_trafo_size); @@ -1514,7 +1514,7 @@ static int hls_pcm_sample(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size int ret; if (!s->sh.disable_deblocking_filter_flag) - ff_hevc_deblocking_boundary_strengths(lc, x0, y0, log2_cb_size); + ff_hevc_deblocking_boundary_strengths(lc, s->ps.pps, x0, y0, log2_cb_size); ret = init_get_bits(&gb, pcm, length); if (ret < 0) @@ -2284,7 +2284,7 @@ static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, int x0, i intra_prediction_unit_default_value(lc, x0, y0, log2_cb_size); if (!s->sh.disable_deblocking_filter_flag) - ff_hevc_deblocking_boundary_strengths(lc, x0, y0, log2_cb_size); + ff_hevc_deblocking_boundary_strengths(lc, s->ps.pps, x0, y0, log2_cb_size); } else { int pcm_flag = 0; @@ -2372,13 +2372,13 @@ static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, int x0, i return ret; } else { if (!s->sh.disable_deblocking_filter_flag) - ff_hevc_deblocking_boundary_strengths(lc, x0, y0, log2_cb_size); + ff_hevc_deblocking_boundary_strengths(lc, s->ps.pps, x0, y0, log2_cb_size); } } } if (s->ps.pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0) - ff_hevc_set_qPy(lc, x0, y0, log2_cb_size); + ff_hevc_set_qPy(lc, s->ps.pps, x0, y0, log2_cb_size); x = y_cb * min_cb_width + x_cb; for (y = 0; y < length; y++) { @@ -2583,12 +2583,12 @@ static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) ctb_addr_ts++; ff_hevc_save_states(lc, ctb_addr_ts); - ff_hevc_hls_filters(lc, x_ctb, y_ctb, ctb_size); + ff_hevc_hls_filters(lc, s->ps.pps, x_ctb, y_ctb, ctb_size); } if (x_ctb + ctb_size >= s->ps.sps->width && y_ctb + ctb_size >= s->ps.sps->height) - ff_hevc_hls_filter(lc, x_ctb, y_ctb, ctb_size); + ff_hevc_hls_filter(lc, s->ps.pps, x_ctb, y_ctb, ctb_size); return ctb_addr_ts; } @@ -2644,7 +2644,7 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, ff_hevc_save_states(lc, ctb_addr_ts); ff_thread_report_progress2(s->avctx, ctb_row, thread, 1); - ff_hevc_hls_filters(lc, x_ctb, y_ctb, ctb_size); + ff_hevc_hls_filters(lc, s->ps.pps, x_ctb, y_ctb, ctb_size); if (!more_data && (x_ctb+ctb_size) < s->ps.sps->width && ctb_row != s->sh.num_entry_point_offsets) { /* Casting const away here is safe, because it is an atomic operation. */ @@ -2654,7 +2654,7 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, } if ((x_ctb+ctb_size) >= s->ps.sps->width && (y_ctb+ctb_size) >= s->ps.sps->height ) { - ff_hevc_hls_filter(lc, x_ctb, y_ctb, ctb_size); + ff_hevc_hls_filter(lc, s->ps.pps, x_ctb, y_ctb, ctb_size); ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP); return ctb_addr_ts; } diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index eef7d66204..8816ebe1f4 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -655,12 +655,14 @@ void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, const HEVCPPS *pps, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv, int mvp_lx_flag, int LX); -void ff_hevc_hls_filter(HEVCLocalContext *lc, int x, int y, int ctb_size); -void ff_hevc_hls_filters(HEVCLocalContext *lc, int x_ctb, int y_ctb, int ctb_size); -void ff_hevc_set_qPy(HEVCLocalContext *lc, int xBase, int yBase, - int log2_cb_size); -void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, int x0, int y0, - int log2_trafo_size); +void ff_hevc_hls_filter(HEVCLocalContext *lc, const HEVCPPS *pps, + int x, int y, int ctb_size); +void ff_hevc_hls_filters(HEVCLocalContext *lc, const HEVCPPS *pps, + int x_ctb, int y_ctb, int ctb_size); +void ff_hevc_set_qPy(HEVCLocalContext *lc, const HEVCPPS *pps, + int xBase, int yBase, int log2_cb_size); +void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, const HEVCPPS *pps, + int x0, int y0, int log2_trafo_size); int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc); int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc); int ff_hevc_cu_chroma_qp_offset_flag(HEVCLocalContext *lc); From patchwork Fri Jun 7 13:01:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49645 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1009271vqo; Fri, 7 Jun 2024 06:05:16 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVCuGCbiZOEQ5GNnoK7wp8XwITT+ktRoa41iu0EJ7uFyaPBeqxl5lzi2gNcsTib721dUhLiPq9GG4WtBZUjl3GJyXXkqAYs3XYtvg== X-Google-Smtp-Source: AGHT+IFsYHQa7D4K4SGzFTWMGD9Zm1wZksxkt5ph1hj52lm9Daq6QyR20Zz88bY+CQ5ZTknwevbK X-Received: by 2002:a17:906:f1c3:b0:a68:cf22:ebdb with SMTP id a640c23a62f3a-a6cd7891efdmr159754166b.43.1717765516226; Fri, 07 Jun 2024 06:05:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765516; cv=none; d=google.com; s=arc-20160816; b=AC6araZ1baGFV2c0MoUUDZbelr3jEbOJvLMKgn5loXpA0cTIIbVMFaJ4uA3Dc348pJ mJxwv+c/1l3sBDMO3wl9VdcUONZQlSiZJiO+7oHVb84X5hieXV/B5fPrxip/nrCHpbnG 1aKrfalGpuscQhEbmz6Kcw0opa/UGeIC+liMxjxzdp26+DLGmE1WlodUz7TkkQxge/qG 9/dzKb5K/uQ6bEZl6ysjCZNQNvs8aVQn/kzSH5jvU5DB7YFmQWp7SC2g7UGX/1xfWO3E 0MK65QMofPH+NHiF51gVlZVc5rs8TgelRxjnILKAlXplRNbNRIrcr+HUkW3K0rHcfcPz UxoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=ASFGPx/ZUH7+9lP9ARxgorImJZrHuOZSFROISGPvr50=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=eBV97mTV+blXkTGoSzAYV9hEN41dyeDAJVyT4HIP1JgiIc2+kAwZuUcLKcJQ9q+lus Bb38vJEHl5Swrat9dXcSFJ74EVjaW2xjMqZHgmeKQ0B5c6ZhKdx0YiECwVdNiUvu4Tbz kLwGgXdJKdYTZ9jGkTBU4cbb1KPBhxI3S+QDEyTYYMPi5xFgfEnvUaSVyZhk+HcGoFnL wZLLic33rGeuKuTDLC6L1hin19CGn00SYs2349tl2k9f0+LECKmb2xNJYjFIqHglaIFJ nJvIOC12/FruUPqfiebormiCNK5j4HbbxrEE04RAe/uBmaFxaO9i3WaOwQF5RAy6oMKV u+xA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=G2f7HpcY; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6ef542ba93si22594466b.756.2024.06.07.06.05.15; Fri, 07 Jun 2024 06: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=@khirnov.net header.s=mail header.b=G2f7HpcY; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D680D68D7A5; Fri, 7 Jun 2024 16:04:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1D82B68D763 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=G2f7HpcY; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 129AE4DE3 for ; Fri, 7 Jun 2024 15:03:47 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id JdQ8vBipOWwK for ; Fri, 7 Jun 2024 15:03:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=szlDvJyUC6yiZRSs9Runq3AifL5AiDFOWuLxvbmg9H0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=G2f7HpcYMQ9hCJT1Dz8rymhWbYedC6IKsRTNzN05iN17z5uVGcFcLoiQoEKU0070v xAcUjdXaLPsBleWuYETn0DLc1aYQKG8NYP1kI2wnEjqsK6ZM5UwzrLf4hD/+G8VeVG /jGs/wX6/6KHHJUmY7aY9QxiJ2hskFYeGeaYfQgCeqAaQYB0EwhV24g1Z2DRKpdIWz XBYkC1VLeKMjvfhfFBtVkP4w/C9XmCjkwMZVuEiK+yXg5keX1InhCI+Yqlzmn6Wy2H bKL1+T9dJgMAC1kfRNoGWoEpIu1G0dVWc1CJZsUIARsM7vfoXX4uidNIhkKrDRxwKk VwXX1Ubx1iqoA== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 9C3D84DE2 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id BBE5A3A09EE for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:06 +0200 Message-ID: <20240607130135.9088-10-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/39] lavc/hevc/pred: stop accessing parameter sets through HEVCParamSets 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: VQrJTtq7oBz0 Instead, accept PPS/SPS as function arguments. Makes the code shorter and significantly reduces diff in future commits. --- libavcodec/hevc/hevcdec.c | 26 +-- libavcodec/hevc/pred.h | 4 +- libavcodec/hevc/pred_template.c | 74 ++++---- libavcodec/mips/hevcpred_mips.h | 4 +- libavcodec/mips/hevcpred_msa.c | 291 ++++++++++++++++---------------- 5 files changed, 202 insertions(+), 197 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index cf972ed560..5e4e5776e0 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -1160,7 +1160,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, int trafo_size = 1 << log2_trafo_size; ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, x0, y0, 0); + s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, x0, y0, 0); } if (cbf_luma || cbf_cb[0] || cbf_cr[0] || @@ -1247,7 +1247,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (i << log2_trafo_size_c), 1); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0 + (i << log2_trafo_size_c), 1); } if (cbf_cb[i]) ff_hevc_hls_residual_coding(lc, s->ps.pps, x0, y0 + (i << log2_trafo_size_c), @@ -1277,7 +1277,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (i << log2_trafo_size_c), 2); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0 + (i << log2_trafo_size_c), 2); } if (cbf_cr[i]) ff_hevc_hls_residual_coding(lc, s->ps.pps, x0, y0 + (i << log2_trafo_size_c), @@ -1306,7 +1306,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size), trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (i << log2_trafo_size), 1); + s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase + (i << log2_trafo_size), 1); } if (cbf_cb[i]) ff_hevc_hls_residual_coding(lc, s->ps.pps, xBase, yBase + (i << log2_trafo_size), @@ -1316,7 +1316,7 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size), trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (i << log2_trafo_size), 2); + s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase + (i << log2_trafo_size), 2); } if (cbf_cr[i]) ff_hevc_hls_residual_coding(lc, s->ps.pps, xBase, yBase + (i << log2_trafo_size), @@ -1329,26 +1329,26 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, int trafo_size_v = 1 << (log2_trafo_size_c + s->ps.sps->vshift[1]); ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0, 1); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0, 2); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0, 1); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0, 2); if (s->ps.sps->chroma_format_idc == 2) { ff_hevc_set_neighbour_available(lc, x0, y0 + (1 << log2_trafo_size_c), trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (1 << log2_trafo_size_c), 1); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (1 << log2_trafo_size_c), 2); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0 + (1 << log2_trafo_size_c), 1); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0 + (1 << log2_trafo_size_c), 2); } } else if (blk_idx == 3) { int trafo_size_h = 1 << (log2_trafo_size + 1); int trafo_size_v = 1 << (log2_trafo_size + s->ps.sps->vshift[1]); ff_hevc_set_neighbour_available(lc, xBase, yBase, trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase, 1); - s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase, 2); + s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase, 1); + s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase, 2); if (s->ps.sps->chroma_format_idc == 2) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (1 << log2_trafo_size), trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (1 << log2_trafo_size), 1); - s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (1 << log2_trafo_size), 2); + s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase + (1 << log2_trafo_size), 1); + s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase + (1 << log2_trafo_size), 2); } } } diff --git a/libavcodec/hevc/pred.h b/libavcodec/hevc/pred.h index b60d8176ae..1ac8f9666b 100644 --- a/libavcodec/hevc/pred.h +++ b/libavcodec/hevc/pred.h @@ -27,9 +27,11 @@ #include struct HEVCLocalContext; +struct HEVCPPS; typedef struct HEVCPredContext { - void (*intra_pred[4])(struct HEVCLocalContext *lc, int x0, int y0, int c_idx); + void (*intra_pred[4])(struct HEVCLocalContext *lc, + const struct HEVCPPS *pps, int x0, int y0, int c_idx); void (*pred_planar[4])(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride); diff --git a/libavcodec/hevc/pred_template.c b/libavcodec/hevc/pred_template.c index fe9a22614a..ca21774f75 100644 --- a/libavcodec/hevc/pred_template.c +++ b/libavcodec/hevc/pred_template.c @@ -27,11 +27,13 @@ #define POS(x, y) src[(x) + stride * (y)] -static av_always_inline void FUNC(intra_pred)(HEVCLocalContext *lc, int x0, int y0, +static av_always_inline void FUNC(intra_pred)(HEVCLocalContext *lc, + const HEVCPPS *pps, + int x0, int y0, int log2_size, int c_idx) { #define PU(x) \ - ((x) >> s->ps.sps->log2_min_pu_size) + ((x) >> sps->log2_min_pu_size) #define MVF(x, y) \ (s->cur_frame->tab_mvf[(x) + (y) * min_pu_width]) #define MVF_PU(x, y) \ @@ -39,7 +41,7 @@ static av_always_inline void FUNC(intra_pred)(HEVCLocalContext *lc, int x0, int #define IS_INTRA(x, y) \ (MVF_PU(x, y).pred_flag == PF_INTRA) #define MIN_TB_ADDR_ZS(x, y) \ - s->ps.pps->min_tb_addr_zs[(y) * (s->ps.sps->tb_mask+2) + (x)] + pps->min_tb_addr_zs[(y) * (sps->tb_mask+2) + (x)] #define EXTEND(ptr, val, len) \ do { \ pixel4 pix = PIXEL_SPLAT_X4(val); \ @@ -70,27 +72,28 @@ do { \ else \ a = PIXEL_SPLAT_X4(ptr[i + 3]) + const HEVCSPS *const sps = pps->sps; const HEVCContext *const s = lc->parent; int i; - int hshift = s->ps.sps->hshift[c_idx]; - int vshift = s->ps.sps->vshift[c_idx]; + int hshift = sps->hshift[c_idx]; + int vshift = sps->vshift[c_idx]; int size = (1 << log2_size); int size_in_luma_h = size << hshift; - int size_in_tbs_h = size_in_luma_h >> s->ps.sps->log2_min_tb_size; + int size_in_tbs_h = size_in_luma_h >> sps->log2_min_tb_size; int size_in_luma_v = size << vshift; - int size_in_tbs_v = size_in_luma_v >> s->ps.sps->log2_min_tb_size; + int size_in_tbs_v = size_in_luma_v >> sps->log2_min_tb_size; int x = x0 >> hshift; int y = y0 >> vshift; - int x_tb = (x0 >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask; - int y_tb = (y0 >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask; - int spin = c_idx && !size_in_tbs_v && ((2 * y0) & (1 << s->ps.sps->log2_min_tb_size)); + int x_tb = (x0 >> sps->log2_min_tb_size) & sps->tb_mask; + int y_tb = (y0 >> sps->log2_min_tb_size) & sps->tb_mask; + int spin = c_idx && !size_in_tbs_v && ((2 * y0) & (1 << sps->log2_min_tb_size)); int cur_tb_addr = MIN_TB_ADDR_ZS(x_tb, y_tb); ptrdiff_t stride = s->cur_frame->f->linesize[c_idx] / sizeof(pixel); pixel *src = (pixel*)s->cur_frame->f->data[c_idx] + x + y * stride; - int min_pu_width = s->ps.sps->min_pu_width; + int min_pu_width = sps->min_pu_width; enum IntraPredMode mode = c_idx ? lc->tu.intra_pred_mode_c : lc->tu.intra_pred_mode; @@ -104,28 +107,28 @@ do { \ pixel *top = top_array + 1; pixel *filtered_left = filtered_left_array + 1; pixel *filtered_top = filtered_top_array + 1; - int cand_bottom_left = lc->na.cand_bottom_left && cur_tb_addr > MIN_TB_ADDR_ZS( x_tb - 1, (y_tb + size_in_tbs_v + spin) & s->ps.sps->tb_mask); + int cand_bottom_left = lc->na.cand_bottom_left && cur_tb_addr > MIN_TB_ADDR_ZS( x_tb - 1, (y_tb + size_in_tbs_v + spin) & sps->tb_mask); int cand_left = lc->na.cand_left; int cand_up_left = lc->na.cand_up_left; int cand_up = lc->na.cand_up; - int cand_up_right = lc->na.cand_up_right && !spin && cur_tb_addr > MIN_TB_ADDR_ZS((x_tb + size_in_tbs_h) & s->ps.sps->tb_mask, y_tb - 1); + int cand_up_right = lc->na.cand_up_right && !spin && cur_tb_addr > MIN_TB_ADDR_ZS((x_tb + size_in_tbs_h) & sps->tb_mask, y_tb - 1); - int bottom_left_size = (FFMIN(y0 + 2 * size_in_luma_v, s->ps.sps->height) - + int bottom_left_size = (FFMIN(y0 + 2 * size_in_luma_v, sps->height) - (y0 + size_in_luma_v)) >> vshift; - int top_right_size = (FFMIN(x0 + 2 * size_in_luma_h, s->ps.sps->width) - + int top_right_size = (FFMIN(x0 + 2 * size_in_luma_h, sps->width) - (x0 + size_in_luma_h)) >> hshift; - if (s->ps.pps->constrained_intra_pred_flag == 1) { + if (pps->constrained_intra_pred_flag == 1) { int size_in_luma_pu_v = PU(size_in_luma_v); int size_in_luma_pu_h = PU(size_in_luma_h); - int on_pu_edge_x = !av_mod_uintp2(x0, s->ps.sps->log2_min_pu_size); - int on_pu_edge_y = !av_mod_uintp2(y0, s->ps.sps->log2_min_pu_size); + int on_pu_edge_x = !av_mod_uintp2(x0, sps->log2_min_pu_size); + int on_pu_edge_y = !av_mod_uintp2(y0, sps->log2_min_pu_size); if (!size_in_luma_pu_h) size_in_luma_pu_h++; if (cand_bottom_left == 1 && on_pu_edge_x) { int x_left_pu = PU(x0 - 1); int y_bottom_pu = PU(y0 + size_in_luma_v); - int max = FFMIN(size_in_luma_pu_v, s->ps.sps->min_pu_height - y_bottom_pu); + int max = FFMIN(size_in_luma_pu_v, sps->min_pu_height - y_bottom_pu); cand_bottom_left = 0; for (i = 0; i < max; i += 2) cand_bottom_left |= (MVF(x_left_pu, y_bottom_pu + i).pred_flag == PF_INTRA); @@ -133,7 +136,7 @@ do { \ if (cand_left == 1 && on_pu_edge_x) { int x_left_pu = PU(x0 - 1); int y_left_pu = PU(y0); - int max = FFMIN(size_in_luma_pu_v, s->ps.sps->min_pu_height - y_left_pu); + int max = FFMIN(size_in_luma_pu_v, sps->min_pu_height - y_left_pu); cand_left = 0; for (i = 0; i < max; i += 2) cand_left |= (MVF(x_left_pu, y_left_pu + i).pred_flag == PF_INTRA); @@ -146,7 +149,7 @@ do { \ if (cand_up == 1 && on_pu_edge_y) { int x_top_pu = PU(x0); int y_top_pu = PU(y0 - 1); - int max = FFMIN(size_in_luma_pu_h, s->ps.sps->min_pu_width - x_top_pu); + int max = FFMIN(size_in_luma_pu_h, sps->min_pu_width - x_top_pu); cand_up = 0; for (i = 0; i < max; i += 2) cand_up |= (MVF(x_top_pu + i, y_top_pu).pred_flag == PF_INTRA); @@ -154,7 +157,7 @@ do { \ if (cand_up_right == 1 && on_pu_edge_y) { int y_top_pu = PU(y0 - 1); int x_right_pu = PU(x0 + size_in_luma_h); - int max = FFMIN(size_in_luma_pu_h, s->ps.sps->min_pu_width - x_right_pu); + int max = FFMIN(size_in_luma_pu_h, sps->min_pu_width - x_right_pu); cand_up_right = 0; for (i = 0; i < max; i += 2) cand_up_right |= (MVF(x_right_pu + i, y_top_pu).pred_flag == PF_INTRA); @@ -184,20 +187,20 @@ do { \ size - bottom_left_size); } - if (s->ps.pps->constrained_intra_pred_flag == 1) { + if (pps->constrained_intra_pred_flag == 1) { if (cand_bottom_left || cand_left || cand_up_left || cand_up || cand_up_right) { - int size_max_x = x0 + ((2 * size) << hshift) < s->ps.sps->width ? - 2 * size : (s->ps.sps->width - x0) >> hshift; - int size_max_y = y0 + ((2 * size) << vshift) < s->ps.sps->height ? - 2 * size : (s->ps.sps->height - y0) >> vshift; + int size_max_x = x0 + ((2 * size) << hshift) < sps->width ? + 2 * size : (sps->width - x0) >> hshift; + int size_max_y = y0 + ((2 * size) << vshift) < sps->height ? + 2 * size : (sps->height - y0) >> vshift; int j = size + (cand_bottom_left? bottom_left_size: 0) -1; if (!cand_up_right) { - size_max_x = x0 + ((size) << hshift) < s->ps.sps->width ? - size : (s->ps.sps->width - x0) >> hshift; + size_max_x = x0 + ((size) << hshift) < sps->width ? + size : (sps->width - x0) >> hshift; } if (!cand_bottom_left) { - size_max_y = y0 + (( size) << vshift) < s->ps.sps->height ? - size : (s->ps.sps->height - y0) >> vshift; + size_max_y = y0 + (( size) << vshift) < sps->height ? + size : (sps->height - y0) >> vshift; } if (cand_bottom_left || cand_left || cand_up_left) { while (j > -1 && !IS_INTRA(-1, j)) @@ -285,14 +288,14 @@ do { \ top[-1] = left[-1]; // Filtering process - if (!s->ps.sps->intra_smoothing_disabled && (c_idx == 0 || s->ps.sps->chroma_format_idc == 3)) { + if (!sps->intra_smoothing_disabled && (c_idx == 0 || sps->chroma_format_idc == 3)) { if (mode != INTRA_DC && size != 4){ int intra_hor_ver_dist_thresh[] = { 7, 1, 0 }; int min_dist_vert_hor = FFMIN(FFABS((int)(mode - 26U)), FFABS((int)(mode - 10U))); if (min_dist_vert_hor > intra_hor_ver_dist_thresh[log2_size - 3]) { int threshold = 1 << (BIT_DEPTH - 5); - if (s->ps.sps->strong_intra_smoothing_enabled && c_idx == 0 && + if (sps->strong_intra_smoothing_enabled && c_idx == 0 && log2_size == 5 && FFABS(top[-1] + top[63] - 2 * top[31]) < threshold && FFABS(left[-1] + left[63] - 2 * left[31]) < threshold) { @@ -343,9 +346,10 @@ do { \ } #define INTRA_PRED(size) \ -static void FUNC(intra_pred_ ## size)(HEVCLocalContext *lc, int x0, int y0, int c_idx) \ +static void FUNC(intra_pred_ ## size)(HEVCLocalContext *lc, const HEVCPPS *pps, \ + int x0, int y0, int c_idx) \ { \ - FUNC(intra_pred)(lc, x0, y0, size, c_idx); \ + FUNC(intra_pred)(lc, pps, x0, y0, size, c_idx); \ } INTRA_PRED(2) diff --git a/libavcodec/mips/hevcpred_mips.h b/libavcodec/mips/hevcpred_mips.h index 220ab307af..692a162151 100644 --- a/libavcodec/mips/hevcpred_mips.h +++ b/libavcodec/mips/hevcpred_mips.h @@ -67,7 +67,7 @@ void ff_pred_intra_pred_angular_3_msa(uint8_t *dst, const uint8_t *src_left, ptrdiff_t stride, int c_idx, int mode); -void ff_intra_pred_8_16x16_msa(struct HEVCLocalContext *s, int x0, int y0, int c_idx); -void ff_intra_pred_8_32x32_msa(struct HEVCLocalContext *s, int x0, int y0, int c_idx); +void ff_intra_pred_8_16x16_msa(struct HEVCLocalContext *s, const struct HEVCPPS *pps, int x0, int y0, int c_idx); +void ff_intra_pred_8_32x32_msa(struct HEVCLocalContext *s, const struct HEVCPPS *pps, int x0, int y0, int c_idx); #endif // #ifndef AVCODEC_MIPS_HEVCPRED_MIPS_H diff --git a/libavcodec/mips/hevcpred_msa.c b/libavcodec/mips/hevcpred_msa.c index ef70d6b2e5..a6824712a2 100644 --- a/libavcodec/mips/hevcpred_msa.c +++ b/libavcodec/mips/hevcpred_msa.c @@ -1903,29 +1903,31 @@ void ff_pred_intra_pred_angular_3_msa(uint8_t *dst, } } -void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) +void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, const HEVCPPS *pps, + int x0, int y0, int c_idx) { v16u8 vec0; + const HEVCSPS *const sps = pps->sps; const HEVCContext *const s = lc->parent; int i; - int hshift = s->ps.sps->hshift[c_idx]; - int vshift = s->ps.sps->vshift[c_idx]; + int hshift = sps->hshift[c_idx]; + int vshift = sps->vshift[c_idx]; int size_in_luma_h = 16 << hshift; - int size_in_tbs_h = size_in_luma_h >> s->ps.sps->log2_min_tb_size; + int size_in_tbs_h = size_in_luma_h >> sps->log2_min_tb_size; int size_in_luma_v = 16 << vshift; - int size_in_tbs_v = size_in_luma_v >> s->ps.sps->log2_min_tb_size; + int size_in_tbs_v = size_in_luma_v >> sps->log2_min_tb_size; int x = x0 >> hshift; int y = y0 >> vshift; - int x_tb = (x0 >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask; - int y_tb = (y0 >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask; + int x_tb = (x0 >> sps->log2_min_tb_size) & sps->tb_mask; + int y_tb = (y0 >> sps->log2_min_tb_size) & sps->tb_mask; int cur_tb_addr = - s->ps.pps->min_tb_addr_zs[(y_tb) * (s->ps.sps->tb_mask + 2) + (x_tb)]; + pps->min_tb_addr_zs[(y_tb) * (sps->tb_mask + 2) + (x_tb)]; ptrdiff_t stride = s->frame->linesize[c_idx] / sizeof(uint8_t); uint8_t *src = (uint8_t *) s->frame->data[c_idx] + x + y * stride; - int min_pu_width = s->ps.sps->min_pu_width; + int min_pu_width = sps->min_pu_width; enum IntraPredMode mode = c_idx ? lc->tu.intra_pred_mode_c : lc->tu.intra_pred_mode; @@ -1941,41 +1943,41 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) uint8_t *filtered_top = filtered_top_array + 1; int cand_bottom_left = lc->na.cand_bottom_left && cur_tb_addr > - s->ps.pps->min_tb_addr_zs[((y_tb + size_in_tbs_v) & s->ps.sps->tb_mask) * - (s->ps.sps->tb_mask + 2) + (x_tb - 1)]; + pps->min_tb_addr_zs[((y_tb + size_in_tbs_v) & sps->tb_mask) * + (sps->tb_mask + 2) + (x_tb - 1)]; int cand_left = lc->na.cand_left; int cand_up_left = lc->na.cand_up_left; int cand_up = lc->na.cand_up; int cand_up_right = lc->na.cand_up_right && cur_tb_addr > - s->ps.pps->min_tb_addr_zs[(y_tb - 1) * (s->ps.sps->tb_mask + 2) + - ((x_tb + size_in_tbs_h) & s->ps.sps->tb_mask)]; + pps->min_tb_addr_zs[(y_tb - 1) * (sps->tb_mask + 2) + + ((x_tb + size_in_tbs_h) & sps->tb_mask)]; int bottom_left_size = (((y0 + 2 * size_in_luma_v) > - (s->ps.sps->height) ? (s->ps.sps->height) : (y0 + + (sps->height) ? (sps->height) : (y0 + 2 * size_in_luma_v)) - (y0 + size_in_luma_v)) >> vshift; int top_right_size = (((x0 + 2 * size_in_luma_h) > - (s->ps.sps->width) ? (s->ps.sps->width) : (x0 + 2 * size_in_luma_h)) - + (sps->width) ? (sps->width) : (x0 + 2 * size_in_luma_h)) - (x0 + size_in_luma_h)) >> hshift; - if (s->ps.pps->constrained_intra_pred_flag == 1) { - int size_in_luma_pu_v = ((size_in_luma_v) >> s->ps.sps->log2_min_pu_size); - int size_in_luma_pu_h = ((size_in_luma_h) >> s->ps.sps->log2_min_pu_size); - int on_pu_edge_x = !(x0 & ((1 << s->ps.sps->log2_min_pu_size) - 1)); - int on_pu_edge_y = !(y0 & ((1 << s->ps.sps->log2_min_pu_size) - 1)); + if (pps->constrained_intra_pred_flag == 1) { + int size_in_luma_pu_v = ((size_in_luma_v) >> sps->log2_min_pu_size); + int size_in_luma_pu_h = ((size_in_luma_h) >> sps->log2_min_pu_size); + int on_pu_edge_x = !(x0 & ((1 << sps->log2_min_pu_size) - 1)); + int on_pu_edge_y = !(y0 & ((1 << sps->log2_min_pu_size) - 1)); if (!size_in_luma_pu_h) size_in_luma_pu_h++; if (cand_bottom_left == 1 && on_pu_edge_x) { - int x_left_pu = ((x0 - 1) >> s->ps.sps->log2_min_pu_size); + int x_left_pu = ((x0 - 1) >> sps->log2_min_pu_size); int y_bottom_pu = - ((y0 + size_in_luma_v) >> s->ps.sps->log2_min_pu_size); + ((y0 + size_in_luma_v) >> sps->log2_min_pu_size); int max = ((size_in_luma_pu_v) > - (s->ps.sps->min_pu_height - - y_bottom_pu) ? (s->ps.sps->min_pu_height - + (sps->min_pu_height - + y_bottom_pu) ? (sps->min_pu_height - y_bottom_pu) : (size_in_luma_pu_v)); cand_bottom_left = 0; for (i = 0; i < max; i += 2) @@ -1986,12 +1988,12 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) PF_INTRA); } if (cand_left == 1 && on_pu_edge_x) { - int x_left_pu = ((x0 - 1) >> s->ps.sps->log2_min_pu_size); - int y_left_pu = ((y0) >> s->ps.sps->log2_min_pu_size); + int x_left_pu = ((x0 - 1) >> sps->log2_min_pu_size); + int y_left_pu = ((y0) >> sps->log2_min_pu_size); int max = ((size_in_luma_pu_v) > - (s->ps.sps->min_pu_height - - y_left_pu) ? (s->ps.sps->min_pu_height - + (sps->min_pu_height - + y_left_pu) ? (sps->min_pu_height - y_left_pu) : (size_in_luma_pu_v)); cand_left = 0; for (i = 0; i < max; i += 2) @@ -2002,20 +2004,20 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) PF_INTRA); } if (cand_up_left == 1) { - int x_left_pu = ((x0 - 1) >> s->ps.sps->log2_min_pu_size); - int y_top_pu = ((y0 - 1) >> s->ps.sps->log2_min_pu_size); + int x_left_pu = ((x0 - 1) >> sps->log2_min_pu_size); + int y_top_pu = ((y0 - 1) >> sps->log2_min_pu_size); cand_up_left = (s->cur_frame->tab_mvf[(x_left_pu) + (y_top_pu) * min_pu_width]).pred_flag == PF_INTRA; } if (cand_up == 1 && on_pu_edge_y) { - int x_top_pu = ((x0) >> s->ps.sps->log2_min_pu_size); - int y_top_pu = ((y0 - 1) >> s->ps.sps->log2_min_pu_size); + int x_top_pu = ((x0) >> sps->log2_min_pu_size); + int y_top_pu = ((y0 - 1) >> sps->log2_min_pu_size); int max = ((size_in_luma_pu_h) > - (s->ps.sps->min_pu_width - - x_top_pu) ? (s->ps.sps->min_pu_width - + (sps->min_pu_width - + x_top_pu) ? (sps->min_pu_width - x_top_pu) : (size_in_luma_pu_h)); cand_up = 0; for (i = 0; i < max; i += 2) @@ -2025,13 +2027,13 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) min_pu_width]).pred_flag == PF_INTRA); } if (cand_up_right == 1 && on_pu_edge_y) { - int y_top_pu = ((y0 - 1) >> s->ps.sps->log2_min_pu_size); + int y_top_pu = ((y0 - 1) >> sps->log2_min_pu_size); int x_right_pu = - ((x0 + size_in_luma_h) >> s->ps.sps->log2_min_pu_size); + ((x0 + size_in_luma_h) >> sps->log2_min_pu_size); int max = ((size_in_luma_pu_h) > - (s->ps.sps->min_pu_width - - x_right_pu) ? (s->ps.sps->min_pu_width - + (sps->min_pu_width - + x_right_pu) ? (sps->min_pu_width - x_right_pu) : (size_in_luma_pu_h)); cand_up_right = 0; for (i = 0; i < max; i += 2) @@ -2086,56 +2088,55 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) } while (0); } - if (s->ps.pps->constrained_intra_pred_flag == 1) { + if (pps->constrained_intra_pred_flag == 1) { if (cand_bottom_left || cand_left || cand_up_left || cand_up || cand_up_right) { int size_max_x = x0 + ((2 * 16) << hshift) < - s->ps.sps->width ? 2 * 16 : (s->ps.sps->width - x0) >> hshift; + sps->width ? 2 * 16 : (sps->width - x0) >> hshift; int size_max_y = y0 + ((2 * 16) << vshift) < - s->ps.sps->height ? 2 * 16 : (s->ps.sps->height - y0) >> vshift; + sps->height ? 2 * 16 : (sps->height - y0) >> vshift; int j = 16 + (cand_bottom_left ? bottom_left_size : 0) - 1; if (!cand_up_right) { - size_max_x = x0 + ((16) << hshift) < s->ps.sps->width ? - 16 : (s->ps.sps->width - x0) >> hshift; + size_max_x = x0 + ((16) << hshift) < sps->width ? + 16 : (sps->width - x0) >> hshift; } if (!cand_bottom_left) { - size_max_y = y0 + ((16) << vshift) < s->ps.sps->height ? - 16 : (s->ps.sps->height - y0) >> vshift; + size_max_y = y0 + ((16) << vshift) < sps->height ? + 16 : (sps->height - y0) >> vshift; } if (cand_bottom_left || cand_left || cand_up_left) { while (j > -1 && !((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((j) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) j--; if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((j) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) { j = 0; while (j < size_max_x && !((s->cur_frame->tab_mvf[(((x0 + - ((j) << hshift)) >> s->ps.sps-> + ((j) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s-> - ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2144,12 +2145,11 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) if (! ((s->cur_frame->tab_mvf[(((x0 + ((i - - 1) << hshift)) >> s->ps.sps-> + 1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s-> - ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2161,11 +2161,11 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) while (j < size_max_x && !((s->cur_frame->tab_mvf[(((x0 + - ((j) << hshift)) >> s->ps.sps-> + ((j) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2177,11 +2177,11 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) ((s->cur_frame->tab_mvf[(((x0 + ((i - 1) << hshift)) >> - s->ps.sps->log2_min_pu_size)) + sps->log2_min_pu_size)) + (((y0 + ((-1) << vshift)) >> - s->ps.sps->log2_min_pu_size)) + sps->log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2192,11 +2192,11 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) ((s->cur_frame->tab_mvf[(((x0 + ((i - 1) << hshift)) >> - s->ps.sps->log2_min_pu_size)) + sps->log2_min_pu_size)) + (((y0 + ((-1) << vshift)) >> - s->ps.sps->log2_min_pu_size)) + sps->log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2211,11 +2211,11 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) for (i = 0; i < (0) + (size_max_y); i += 4) if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((i) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2240,12 +2240,12 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) i > (size_max_y - 1) - (size_max_y); i -= 4) if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((i - 3) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2254,11 +2254,11 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) a = ((left[i - 3]) * 0x01010101U); if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) left[-1] = left[0]; @@ -2274,12 +2274,12 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) i > (size_max_y - 1) - (size_max_y); i -= 4) if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((i - 3) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2293,11 +2293,11 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) for (i = 0; i < (0) + (size_max_x); i += 4) if (! ((s->cur_frame->tab_mvf[(((x0 + - ((i) << hshift)) >> s->ps.sps-> + ((i) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2369,8 +2369,8 @@ void ff_intra_pred_8_16x16_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) top[-1] = left[-1]; - if (!s->ps.sps->intra_smoothing_disabled - && (c_idx == 0 || s->ps.sps->chroma_format_idc == 3)) { + if (!sps->intra_smoothing_disabled + && (c_idx == 0 || sps->chroma_format_idc == 3)) { if (mode != INTRA_DC && 16 != 4) { int intra_hor_ver_dist_thresh[] = { 7, 1, 0 }; int min_dist_vert_hor = @@ -2423,26 +2423,27 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) v8i16 res0, res1, res2, res3; v8i16 mul_val0 = { 63, 62, 61, 60, 59, 58, 57, 56 }; v8i16 mul_val1 = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const HEVCSPS *const sps = pps->sps; const HEVCContext *const s = lc->parent; int i; - int hshift = s->ps.sps->hshift[c_idx]; - int vshift = s->ps.sps->vshift[c_idx]; + int hshift = sps->hshift[c_idx]; + int vshift = sps->vshift[c_idx]; int size_in_luma_h = 32 << hshift; - int size_in_tbs_h = size_in_luma_h >> s->ps.sps->log2_min_tb_size; + int size_in_tbs_h = size_in_luma_h >> sps->log2_min_tb_size; int size_in_luma_v = 32 << vshift; - int size_in_tbs_v = size_in_luma_v >> s->ps.sps->log2_min_tb_size; + int size_in_tbs_v = size_in_luma_v >> sps->log2_min_tb_size; int x = x0 >> hshift; int y = y0 >> vshift; - int x_tb = (x0 >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask; - int y_tb = (y0 >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask; + int x_tb = (x0 >> sps->log2_min_tb_size) & sps->tb_mask; + int y_tb = (y0 >> sps->log2_min_tb_size) & sps->tb_mask; int cur_tb_addr = - s->ps.pps->min_tb_addr_zs[(y_tb) * (s->ps.sps->tb_mask + 2) + (x_tb)]; + pps->min_tb_addr_zs[(y_tb) * (sps->tb_mask + 2) + (x_tb)]; ptrdiff_t stride = s->frame->linesize[c_idx] / sizeof(uint8_t); uint8_t *src = (uint8_t *) s->frame->data[c_idx] + x + y * stride; - int min_pu_width = s->ps.sps->min_pu_width; + int min_pu_width = sps->min_pu_width; enum IntraPredMode mode = c_idx ? lc->tu.intra_pred_mode_c : lc->tu.intra_pred_mode; @@ -2458,41 +2459,41 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) uint8_t *filtered_top = filtered_top_array + 1; int cand_bottom_left = lc->na.cand_bottom_left && cur_tb_addr > - s->ps.pps->min_tb_addr_zs[((y_tb + size_in_tbs_v) & s->ps.sps->tb_mask) * - (s->ps.sps->tb_mask + 2) + (x_tb - 1)]; + pps->min_tb_addr_zs[((y_tb + size_in_tbs_v) & sps->tb_mask) * + (sps->tb_mask + 2) + (x_tb - 1)]; int cand_left = lc->na.cand_left; int cand_up_left = lc->na.cand_up_left; int cand_up = lc->na.cand_up; int cand_up_right = lc->na.cand_up_right && cur_tb_addr > - s->ps.pps->min_tb_addr_zs[(y_tb - 1) * (s->ps.sps->tb_mask + 2) + - ((x_tb + size_in_tbs_h) & s->ps.sps->tb_mask)]; + pps->min_tb_addr_zs[(y_tb - 1) * (sps->tb_mask + 2) + + ((x_tb + size_in_tbs_h) & sps->tb_mask)]; int bottom_left_size = (((y0 + 2 * size_in_luma_v) > - (s->ps.sps->height) ? (s->ps.sps->height) : (y0 + + (sps->height) ? (sps->height) : (y0 + 2 * size_in_luma_v)) - (y0 + size_in_luma_v)) >> vshift; int top_right_size = (((x0 + 2 * size_in_luma_h) > - (s->ps.sps->width) ? (s->ps.sps->width) : (x0 + 2 * size_in_luma_h)) - + (sps->width) ? (sps->width) : (x0 + 2 * size_in_luma_h)) - (x0 + size_in_luma_h)) >> hshift; - if (s->ps.pps->constrained_intra_pred_flag == 1) { - int size_in_luma_pu_v = ((size_in_luma_v) >> s->ps.sps->log2_min_pu_size); - int size_in_luma_pu_h = ((size_in_luma_h) >> s->ps.sps->log2_min_pu_size); - int on_pu_edge_x = !(x0 & ((1 << s->ps.sps->log2_min_pu_size) - 1)); - int on_pu_edge_y = !(y0 & ((1 << s->ps.sps->log2_min_pu_size) - 1)); + if (pps->constrained_intra_pred_flag == 1) { + int size_in_luma_pu_v = ((size_in_luma_v) >> sps->log2_min_pu_size); + int size_in_luma_pu_h = ((size_in_luma_h) >> sps->log2_min_pu_size); + int on_pu_edge_x = !(x0 & ((1 << sps->log2_min_pu_size) - 1)); + int on_pu_edge_y = !(y0 & ((1 << sps->log2_min_pu_size) - 1)); if (!size_in_luma_pu_h) size_in_luma_pu_h++; if (cand_bottom_left == 1 && on_pu_edge_x) { - int x_left_pu = ((x0 - 1) >> s->ps.sps->log2_min_pu_size); + int x_left_pu = ((x0 - 1) >> sps->log2_min_pu_size); int y_bottom_pu = - ((y0 + size_in_luma_v) >> s->ps.sps->log2_min_pu_size); + ((y0 + size_in_luma_v) >> sps->log2_min_pu_size); int max = ((size_in_luma_pu_v) > - (s->ps.sps->min_pu_height - - y_bottom_pu) ? (s->ps.sps->min_pu_height - + (sps->min_pu_height - + y_bottom_pu) ? (sps->min_pu_height - y_bottom_pu) : (size_in_luma_pu_v)); cand_bottom_left = 0; for (i = 0; i < max; i += 2) @@ -2503,12 +2504,12 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) PF_INTRA); } if (cand_left == 1 && on_pu_edge_x) { - int x_left_pu = ((x0 - 1) >> s->ps.sps->log2_min_pu_size); - int y_left_pu = ((y0) >> s->ps.sps->log2_min_pu_size); + int x_left_pu = ((x0 - 1) >> sps->log2_min_pu_size); + int y_left_pu = ((y0) >> sps->log2_min_pu_size); int max = ((size_in_luma_pu_v) > - (s->ps.sps->min_pu_height - - y_left_pu) ? (s->ps.sps->min_pu_height - + (sps->min_pu_height - + y_left_pu) ? (sps->min_pu_height - y_left_pu) : (size_in_luma_pu_v)); cand_left = 0; for (i = 0; i < max; i += 2) @@ -2519,20 +2520,20 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) PF_INTRA); } if (cand_up_left == 1) { - int x_left_pu = ((x0 - 1) >> s->ps.sps->log2_min_pu_size); - int y_top_pu = ((y0 - 1) >> s->ps.sps->log2_min_pu_size); + int x_left_pu = ((x0 - 1) >> sps->log2_min_pu_size); + int y_top_pu = ((y0 - 1) >> sps->log2_min_pu_size); cand_up_left = (s->cur_frame->tab_mvf[(x_left_pu) + (y_top_pu) * min_pu_width]).pred_flag == PF_INTRA; } if (cand_up == 1 && on_pu_edge_y) { - int x_top_pu = ((x0) >> s->ps.sps->log2_min_pu_size); - int y_top_pu = ((y0 - 1) >> s->ps.sps->log2_min_pu_size); + int x_top_pu = ((x0) >> sps->log2_min_pu_size); + int y_top_pu = ((y0 - 1) >> sps->log2_min_pu_size); int max = ((size_in_luma_pu_h) > - (s->ps.sps->min_pu_width - - x_top_pu) ? (s->ps.sps->min_pu_width - + (sps->min_pu_width - + x_top_pu) ? (sps->min_pu_width - x_top_pu) : (size_in_luma_pu_h)); cand_up = 0; for (i = 0; i < max; i += 2) @@ -2542,13 +2543,13 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) min_pu_width]).pred_flag == PF_INTRA); } if (cand_up_right == 1 && on_pu_edge_y) { - int y_top_pu = ((y0 - 1) >> s->ps.sps->log2_min_pu_size); + int y_top_pu = ((y0 - 1) >> sps->log2_min_pu_size); int x_right_pu = - ((x0 + size_in_luma_h) >> s->ps.sps->log2_min_pu_size); + ((x0 + size_in_luma_h) >> sps->log2_min_pu_size); int max = ((size_in_luma_pu_h) > - (s->ps.sps->min_pu_width - - x_right_pu) ? (s->ps.sps->min_pu_width - + (sps->min_pu_width - + x_right_pu) ? (sps->min_pu_width - x_right_pu) : (size_in_luma_pu_h)); cand_up_right = 0; for (i = 0; i < max; i += 2) @@ -2601,56 +2602,55 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) } while (0); } - if (s->ps.pps->constrained_intra_pred_flag == 1) { + if (pps->constrained_intra_pred_flag == 1) { if (cand_bottom_left || cand_left || cand_up_left || cand_up || cand_up_right) { int size_max_x = x0 + ((2 * 32) << hshift) < - s->ps.sps->width ? 2 * 32 : (s->ps.sps->width - x0) >> hshift; + sps->width ? 2 * 32 : (sps->width - x0) >> hshift; int size_max_y = y0 + ((2 * 32) << vshift) < - s->ps.sps->height ? 2 * 32 : (s->ps.sps->height - y0) >> vshift; + sps->height ? 2 * 32 : (sps->height - y0) >> vshift; int j = 32 + (cand_bottom_left ? bottom_left_size : 0) - 1; if (!cand_up_right) { - size_max_x = x0 + ((32) << hshift) < s->ps.sps->width ? - 32 : (s->ps.sps->width - x0) >> hshift; + size_max_x = x0 + ((32) << hshift) < sps->width ? + 32 : (sps->width - x0) >> hshift; } if (!cand_bottom_left) { - size_max_y = y0 + ((32) << vshift) < s->ps.sps->height ? - 32 : (s->ps.sps->height - y0) >> vshift; + size_max_y = y0 + ((32) << vshift) < sps->height ? + 32 : (sps->height - y0) >> vshift; } if (cand_bottom_left || cand_left || cand_up_left) { while (j > -1 && !((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((j) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) j--; if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((j) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) { j = 0; while (j < size_max_x && !((s->cur_frame->tab_mvf[(((x0 + - ((j) << hshift)) >> s->ps.sps-> + ((j) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s-> - ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2659,12 +2659,11 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) if (! ((s->cur_frame->tab_mvf[(((x0 + ((i - - 1) << hshift)) >> s->ps.sps-> + 1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s-> - ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2676,11 +2675,11 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) while (j < size_max_x && !((s->cur_frame->tab_mvf[(((x0 + - ((j) << hshift)) >> s->ps.sps-> + ((j) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2692,11 +2691,11 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) ((s->cur_frame->tab_mvf[(((x0 + ((i - 1) << hshift)) >> - s->ps.sps->log2_min_pu_size)) + sps->log2_min_pu_size)) + (((y0 + ((-1) << vshift)) >> - s->ps.sps->log2_min_pu_size)) + sps->log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2707,11 +2706,11 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) ((s->cur_frame->tab_mvf[(((x0 + ((i - 1) << hshift)) >> - s->ps.sps->log2_min_pu_size)) + sps->log2_min_pu_size)) + (((y0 + ((-1) << vshift)) >> - s->ps.sps->log2_min_pu_size)) + sps->log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2726,11 +2725,11 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) for (i = 0; i < (0) + (size_max_y); i += 4) if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((i) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2754,12 +2753,12 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) i > (size_max_y - 1) - (size_max_y); i -= 4) if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((i - 3) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2768,11 +2767,11 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) a = ((left[i - 3]) * 0x01010101U); if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) left[-1] = left[0]; @@ -2788,12 +2787,12 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) i > (size_max_y - 1) - (size_max_y); i -= 4) if (! ((s->cur_frame->tab_mvf[(((x0 + - ((-1) << hshift)) >> s->ps.sps-> + ((-1) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((i - 3) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2807,11 +2806,11 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) for (i = 0; i < (0) + (size_max_x); i += 4) if (! ((s->cur_frame->tab_mvf[(((x0 + - ((i) << hshift)) >> s->ps.sps-> + ((i) << hshift)) >> sps-> log2_min_pu_size)) + (((y0 + ((-1) << vshift)) - >> s->ps.sps-> + >> sps-> log2_min_pu_size)) * min_pu_width]).pred_flag == PF_INTRA)) @@ -2886,8 +2885,8 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) top[-1] = left[-1]; - if (!s->ps.sps->intra_smoothing_disabled - && (c_idx == 0 || s->ps.sps->chroma_format_idc == 3)) { + if (!sps->intra_smoothing_disabled + && (c_idx == 0 || sps->chroma_format_idc == 3)) { if (mode != INTRA_DC && 32 != 4) { int intra_hor_ver_dist_thresh[] = { 7, 1, 0 }; int min_dist_vert_hor = @@ -2901,7 +2900,7 @@ void ff_intra_pred_8_32x32_msa(HEVCLocalContext *lc, int x0, int y0, int c_idx) 0 ? ((int) (mode - 26U)) : (-((int) (mode - 26U)))))); if (min_dist_vert_hor > intra_hor_ver_dist_thresh[5 - 3]) { int threshold = 1 << (8 - 5); - if (s->ps.sps->strong_intra_smoothing_enabled + if (sps->strong_intra_smoothing_enabled && c_idx == 0 && ((top[-1] + top[63] - 2 * top[31]) >= 0 ? (top[-1] + top[63] - From patchwork Fri Jun 7 13:01:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49647 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1009580vqo; Fri, 7 Jun 2024 06:05:39 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXXU4fDaKNjE0BHO+mp6rGKJmzwPZWfWTUQRIBomLjObIhIhCJJv/SxtKQ8KI9Vum1Epr7Dt07i00ITj87yRPE2NDNcPm6NdTfN8g== X-Google-Smtp-Source: AGHT+IGzRGk60rN6S850PLZQ2dpX1UVkb6Emt6E6cT9+AgPloHlNyDKMjkMKnXgemcD5MRBE9Une X-Received: by 2002:a17:906:e285:b0:a69:a66:75fe with SMTP id a640c23a62f3a-a6cd561c475mr146098866b.11.1717765539152; Fri, 07 Jun 2024 06:05:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765539; cv=none; d=google.com; s=arc-20160816; b=zaimoPWP51ERPzfVJItC99Q1snA1vcYp6TpPmr5qbs3Tv5GwdghoOhlPA8fs5Q7O0g WCV103S9BwYTLUJKaKJE3mmEstU8+asUcXMdKcW/3BiuaiaCbtrwg2f9C8Qexyx4DuBP bIQSFcwf+ogdqHfXbsf9e1kl5zszzxd+B0y+xcdwBTf3cfe83uPIB6Osl5Imy/pRVOcM Z5j+lEQB/L0LH5+bompUOy87Qx153U6NGlsmIqCq1tDKahQhd48SeDEi1Nv5SbKoaqDe LiLXLiwePqbUydEX/9CAhnPgYRo+cHB49/yIkkc3n02Oq9tk2yRxYGEKBM8SqnSG0hoO 0hbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=2QqmJawDGYjUsRwbjK7CSXQ6ib1cfn2OKlQnbptnzoQ=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=G6Ty98KLFAgz4jzX4Aikh9yjltkAwHBieh9xyPdOzCLqpCj30hj7OhG0B8llCW9gSm IiZQsEC/Rkfyclc0Mj05T1n06NYfJ9z5dI8DhXlru0lIQ06EJT4xVZyxVioE3keeL+I1 LB1HqPS4PRc4CW2fEbwGfubbaiBYUmgnIID4zueCm2/pYxSaJ4Nw2VTqTVm+2B/hIexI dhkOtFh+Sv5E2mef8FtlvGjP0Lu4MQd0fzvYT8Y+pfPOqo7Tu8YaSbMT+UAq2PJg3EP8 NZJzj9j1N98n8HIyws28v+Iq0C8T9KXuU3pd/oXD3/3S++Hp9fWBoB8A9e8vZ7KMg7MY +wDw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=hN9RTLVj; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c80728bddsi182351466b.845.2024.06.07.06.05.38; Fri, 07 Jun 2024 06:05:39 -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=@khirnov.net header.s=mail header.b=hN9RTLVj; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8992B68D7B2; Fri, 7 Jun 2024 16:04:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4214B68D775 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=hN9RTLVj; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 6B21C4DE2 for ; Fri, 7 Jun 2024 15:03:48 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id ca5WRR8F4yUi for ; Fri, 7 Jun 2024 15:03:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=VzEAfdKFC4E5fm20UwFtFbDe4GtURwxlF84xlZZyBEg=; h=From:To:Subject:Date:In-Reply-To:References:From; b=hN9RTLVjUlXLzE2d2b54jULAh7hRx+uX3xB6aA9/BB0pfGwS8/XVySCCeWebTyxkh AIK55hDMvYaTblUCMG1JJf4f0sd0HThaCjcB28RApsC0x99qzob7ZdO0jRcRCnAZ3f Xm+EEN0y7LyGJkO+lazkOvOP2ie5s0XQhA82orRLGiBGi8vQnO9H9YS41b8D2JpfUi 3TKE79onGugZqyoKlpv4o1Hl8Dkjjjet96kw/nRr7hUB4o8LfLVChavBkf3c6Qq1W0 GUzl7ftpZBhARGiq+1Ksd1Ct32z+XqDiEGrHjdC49ZMc2uq+AbBl/PD2HCa5RTp/y8 IqNRa/DGHRG+g== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 9C4F84DE7 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id CA45B3A0A94 for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:07 +0200 Message-ID: <20240607130135.9088-11-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/39] lavc/hevcdec: stop accessing parameter sets through HEVCParamSets 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: vfvqNGifu61d Instead, accept PPS/SPS as function arguments. Makes the code shorter and significantly reduces diff in future commits. --- libavcodec/hevc/hevcdec.c | 876 ++++++++++++++++++++------------------ 1 file changed, 469 insertions(+), 407 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 5e4e5776e0..14b9a2a844 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -143,7 +143,7 @@ fail: return AVERROR(ENOMEM); } -static int pred_weight_table(HEVCContext *s, GetBitContext *gb) +static int pred_weight_table(HEVCContext *s, const HEVCSPS *sps, GetBitContext *gb) { int i = 0; int j = 0; @@ -159,7 +159,7 @@ static int pred_weight_table(HEVCContext *s, GetBitContext *gb) return AVERROR_INVALIDDATA; } s->sh.luma_log2_weight_denom = av_clip_uintp2(luma_log2_weight_denom, 3); - if (s->ps.sps->chroma_format_idc != 0) { + if (sps->chroma_format_idc != 0) { int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)get_se_golomb(gb); if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) { av_log(s->avctx, AV_LOG_ERROR, "chroma_log2_weight_denom %"PRId64" is invalid\n", chroma_log2_weight_denom); @@ -175,7 +175,7 @@ static int pred_weight_table(HEVCContext *s, GetBitContext *gb) s->sh.luma_offset_l0[i] = 0; } } - if (s->ps.sps->chroma_format_idc != 0) { + if (sps->chroma_format_idc != 0) { for (i = 0; i < s->sh.nb_refs[L0]; i++) chroma_weight_l0_flag[i] = get_bits1(gb); } else { @@ -219,7 +219,7 @@ static int pred_weight_table(HEVCContext *s, GetBitContext *gb) s->sh.luma_offset_l1[i] = 0; } } - if (s->ps.sps->chroma_format_idc != 0) { + if (sps->chroma_format_idc != 0) { for (i = 0; i < s->sh.nb_refs[L1]; i++) chroma_weight_l1_flag[i] = get_bits1(gb); } else { @@ -259,9 +259,9 @@ static int pred_weight_table(HEVCContext *s, GetBitContext *gb) return 0; } -static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb) +static int decode_lt_rps(HEVCContext *s, const HEVCSPS *sps, LongTermRPS *rps, + GetBitContext *gb) { - const HEVCSPS *sps = s->ps.sps; int max_poc_lsb = 1 << sps->log2_max_poc_lsb; int prev_delta_msb = 0; unsigned int nb_sps = 0, nb_sh; @@ -591,6 +591,8 @@ fail: static int hls_slice_header(HEVCContext *s, GetBitContext *gb) { SliceHeader *sh = &s->sh; + const HEVCPPS *pps; + const HEVCSPS *sps; int i, ret; // Coded parameters @@ -621,11 +623,13 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) return AVERROR_INVALIDDATA; } s->ps.pps = s->ps.pps_list[sh->pps_id]; + pps = s->ps.pps; + sps = pps->sps; + if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1) sh->no_output_of_prior_pics_flag = 1; - if (s->ps.sps != s->ps.pps->sps) { - const HEVCSPS *sps = s->ps.pps->sps; + if (s->ps.sps != sps) { enum AVPixelFormat pix_fmt; ff_hevc_clear_refs(s); @@ -651,13 +655,13 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if (!sh->first_slice_in_pic_flag) { int slice_address_length; - if (s->ps.pps->dependent_slice_segments_enabled_flag) + if (pps->dependent_slice_segments_enabled_flag) sh->dependent_slice_segment_flag = get_bits1(gb); - slice_address_length = av_ceil_log2(s->ps.sps->ctb_width * - s->ps.sps->ctb_height); + slice_address_length = av_ceil_log2(sps->ctb_width * + sps->ctb_height); sh->slice_segment_addr = get_bitsz(gb, slice_address_length); - if (sh->slice_segment_addr >= s->ps.sps->ctb_width * s->ps.sps->ctb_height) { + if (sh->slice_segment_addr >= sps->ctb_width * sps->ctb_height) { av_log(s->avctx, AV_LOG_ERROR, "Invalid slice segment address: %u.\n", sh->slice_segment_addr); @@ -677,7 +681,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if (!sh->dependent_slice_segment_flag) { s->slice_initialized = 0; - for (i = 0; i < s->ps.pps->num_extra_slice_header_bits; i++) + for (i = 0; i < pps->num_extra_slice_header_bits; i++) skip_bits(gb, 1); // slice_reserved_undetermined_flag[] sh->slice_type = get_ue_golomb_long(gb); @@ -689,24 +693,24 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) return AVERROR_INVALIDDATA; } if (IS_IRAP(s) && sh->slice_type != HEVC_SLICE_I && - !s->ps.pps->pps_curr_pic_ref_enabled_flag) { + !pps->pps_curr_pic_ref_enabled_flag) { av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n"); return AVERROR_INVALIDDATA; } // when flag is not present, picture is inferred to be output sh->pic_output_flag = 1; - if (s->ps.pps->output_flag_present_flag) + if (pps->output_flag_present_flag) sh->pic_output_flag = get_bits1(gb); - if (s->ps.sps->separate_colour_plane) + if (sps->separate_colour_plane) sh->colour_plane_id = get_bits(gb, 2); if (!IS_IDR(s)) { int poc, pos; - sh->pic_order_cnt_lsb = get_bits(gb, s->ps.sps->log2_max_poc_lsb); - poc = ff_hevc_compute_poc(s->ps.sps, s->pocTid0, sh->pic_order_cnt_lsb, s->nal_unit_type); + sh->pic_order_cnt_lsb = get_bits(gb, sps->log2_max_poc_lsb); + poc = ff_hevc_compute_poc(sps, s->pocTid0, sh->pic_order_cnt_lsb, s->nal_unit_type); if (!sh->first_slice_in_pic_flag && poc != s->poc) { av_log(s->avctx, AV_LOG_WARNING, "Ignoring POC change between slices: %d -> %d\n", s->poc, poc); @@ -719,7 +723,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->short_term_ref_pic_set_sps_flag = get_bits1(gb); pos = get_bits_left(gb); if (!sh->short_term_ref_pic_set_sps_flag) { - ret = ff_hevc_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, s->ps.sps, 1); + ret = ff_hevc_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, sps, 1); if (ret < 0) return ret; @@ -727,19 +731,19 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) } else { int numbits, rps_idx; - if (!s->ps.sps->nb_st_rps) { + if (!sps->nb_st_rps) { av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n"); return AVERROR_INVALIDDATA; } - numbits = av_ceil_log2(s->ps.sps->nb_st_rps); + numbits = av_ceil_log2(sps->nb_st_rps); rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0; - sh->short_term_rps = &s->ps.sps->st_rps[rps_idx]; + sh->short_term_rps = &sps->st_rps[rps_idx]; } sh->short_term_ref_pic_set_size = pos - get_bits_left(gb); pos = get_bits_left(gb); - ret = decode_lt_rps(s, &sh->long_term_rps, gb); + ret = decode_lt_rps(s, sps, &sh->long_term_rps, gb); if (ret < 0) { av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n"); if (s->avctx->err_recognition & AV_EF_EXPLODE) @@ -747,7 +751,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) } sh->long_term_ref_pic_set_size = pos - get_bits_left(gb); - if (s->ps.sps->temporal_mvp_enabled) + if (sps->temporal_mvp_enabled) sh->slice_temporal_mvp_enabled_flag = get_bits1(gb); else sh->slice_temporal_mvp_enabled_flag = 0; @@ -772,9 +776,9 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) s->nal_unit_type != HEVC_NAL_RASL_R) s->pocTid0 = s->poc; - if (s->ps.sps->sao_enabled) { + if (sps->sao_enabled) { sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb); - if (s->ps.sps->chroma_format_idc) { + if (sps->chroma_format_idc) { sh->slice_sample_adaptive_offset_flag[1] = sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb); } @@ -788,9 +792,9 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if (sh->slice_type == HEVC_SLICE_P || sh->slice_type == HEVC_SLICE_B) { int nb_refs; - sh->nb_refs[L0] = s->ps.pps->num_ref_idx_l0_default_active; + sh->nb_refs[L0] = pps->num_ref_idx_l0_default_active; if (sh->slice_type == HEVC_SLICE_B) - sh->nb_refs[L1] = s->ps.pps->num_ref_idx_l1_default_active; + sh->nb_refs[L1] = pps->num_ref_idx_l1_default_active; if (get_bits1(gb)) { // num_ref_idx_active_override_flag sh->nb_refs[L0] = get_ue_golomb_31(gb) + 1; @@ -811,7 +815,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) return AVERROR_INVALIDDATA; } - if (s->ps.pps->lists_modification_present_flag && nb_refs > 1) { + if (pps->lists_modification_present_flag && nb_refs > 1) { sh->rpl_modification_flag[0] = get_bits1(gb); if (sh->rpl_modification_flag[0]) { for (i = 0; i < sh->nb_refs[L0]; i++) @@ -829,7 +833,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if (sh->slice_type == HEVC_SLICE_B) sh->mvd_l1_zero_flag = get_bits1(gb); - if (s->ps.pps->cabac_init_present_flag) + if (pps->cabac_init_present_flag) sh->cabac_init_flag = get_bits1(gb); else sh->cabac_init_flag = 0; @@ -851,9 +855,9 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) } } - if ((s->ps.pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) || - (s->ps.pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) { - int ret = pred_weight_table(s, gb); + if ((pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) || + (pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) { + int ret = pred_weight_table(s, sps, gb); if (ret < 0) return ret; } @@ -867,17 +871,17 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) } // Syntax in 7.3.6.1 - if (s->ps.sps->motion_vector_resolution_control_idc == 2) + if (sps->motion_vector_resolution_control_idc == 2) sh->use_integer_mv_flag = get_bits1(gb); else // Inferred to be equal to motion_vector_resolution_control_idc if not present - sh->use_integer_mv_flag = s->ps.sps->motion_vector_resolution_control_idc; + sh->use_integer_mv_flag = sps->motion_vector_resolution_control_idc; } sh->slice_qp_delta = get_se_golomb(gb); - if (s->ps.pps->pic_slice_level_chroma_qp_offsets_present_flag) { + if (pps->pic_slice_level_chroma_qp_offsets_present_flag) { sh->slice_cb_qp_offset = get_se_golomb(gb); sh->slice_cr_qp_offset = get_se_golomb(gb); if (sh->slice_cb_qp_offset < -12 || sh->slice_cb_qp_offset > 12 || @@ -890,21 +894,21 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->slice_cr_qp_offset = 0; } - if (s->ps.pps->pps_slice_act_qp_offsets_present_flag) { + if (pps->pps_slice_act_qp_offsets_present_flag) { sh->slice_act_y_qp_offset = get_se_golomb(gb); sh->slice_act_cb_qp_offset = get_se_golomb(gb); sh->slice_act_cr_qp_offset = get_se_golomb(gb); } - if (s->ps.pps->chroma_qp_offset_list_enabled_flag) + if (pps->chroma_qp_offset_list_enabled_flag) sh->cu_chroma_qp_offset_enabled_flag = get_bits1(gb); else sh->cu_chroma_qp_offset_enabled_flag = 0; - if (s->ps.pps->deblocking_filter_control_present_flag) { + if (pps->deblocking_filter_control_present_flag) { int deblocking_filter_override_flag = 0; - if (s->ps.pps->deblocking_filter_override_enabled_flag) + if (pps->deblocking_filter_override_enabled_flag) deblocking_filter_override_flag = get_bits1(gb); if (deblocking_filter_override_flag) { @@ -923,9 +927,9 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->tc_offset = tc_offset_div2 * 2; } } else { - sh->disable_deblocking_filter_flag = s->ps.pps->disable_dbf; - sh->beta_offset = s->ps.pps->beta_offset; - sh->tc_offset = s->ps.pps->tc_offset; + sh->disable_deblocking_filter_flag = pps->disable_dbf; + sh->beta_offset = pps->beta_offset; + sh->tc_offset = pps->tc_offset; } } else { sh->disable_deblocking_filter_flag = 0; @@ -933,13 +937,13 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->tc_offset = 0; } - if (s->ps.pps->seq_loop_filter_across_slices_enabled_flag && + if (pps->seq_loop_filter_across_slices_enabled_flag && (sh->slice_sample_adaptive_offset_flag[0] || sh->slice_sample_adaptive_offset_flag[1] || !sh->disable_deblocking_filter_flag)) { sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb); } else { - sh->slice_loop_filter_across_slices_enabled_flag = s->ps.pps->seq_loop_filter_across_slices_enabled_flag; + sh->slice_loop_filter_across_slices_enabled_flag = pps->seq_loop_filter_across_slices_enabled_flag; } } else if (!s->slice_initialized) { av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n"); @@ -947,7 +951,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) } sh->num_entry_point_offsets = 0; - if (s->ps.pps->tiles_enabled_flag || s->ps.pps->entropy_coding_sync_enabled_flag) { + if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) { unsigned num_entry_point_offsets = get_ue_golomb_long(gb); // It would be possible to bound this tighter but this here is simpler if (num_entry_point_offsets > get_bits_left(gb)) { @@ -980,7 +984,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) unsigned val = get_bits_long(gb, offset_len); sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size } - if (s->threads_number > 1 && (s->ps.pps->num_tile_rows > 1 || s->ps.pps->num_tile_columns > 1)) { + if (s->threads_number > 1 && (pps->num_tile_rows > 1 || pps->num_tile_columns > 1)) { s->enable_parallel_tiles = 0; // TODO: you can enable tiles in parallel here s->threads_number = 1; } else @@ -989,7 +993,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) s->enable_parallel_tiles = 0; } - if (s->ps.pps->slice_header_extension_present_flag) { + if (pps->slice_header_extension_present_flag) { unsigned int length = get_ue_golomb_long(gb); if (length*8LL > get_bits_left(gb)) { av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n"); @@ -1007,14 +1011,14 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->data_offset = align_get_bits(gb) - gb->buffer; // Inferred parameters - sh->slice_qp = 26U + s->ps.pps->pic_init_qp_minus26 + sh->slice_qp_delta; + sh->slice_qp = 26U + pps->pic_init_qp_minus26 + sh->slice_qp_delta; if (sh->slice_qp > 51 || - sh->slice_qp < -s->ps.sps->qp_bd_offset) { + sh->slice_qp < -sps->qp_bd_offset) { av_log(s->avctx, AV_LOG_ERROR, "The slice_qp %d is outside the valid range " "[%d, 51].\n", sh->slice_qp, - -s->ps.sps->qp_bd_offset); + -sps->qp_bd_offset); return AVERROR_INVALIDDATA; } @@ -1033,7 +1037,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) s->local_ctx[0].first_qp_group = !s->sh.dependent_slice_segment_flag; - if (!s->ps.pps->cu_qp_delta_enabled_flag) + if (!pps->cu_qp_delta_enabled_flag) s->local_ctx[0].qp_y = s->sh.slice_qp; s->slice_initialized = 1; @@ -1043,7 +1047,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) return 0; } -#define CTB(tab, x, y) ((tab)[(y) * s->ps.sps->ctb_width + (x)]) +#define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)]) #define SET_SAO(elem, value) \ do { \ @@ -1057,7 +1061,9 @@ do { \ sao->elem = 0; \ } while (0) -static void hls_sao_param(HEVCLocalContext *lc, int rx, int ry) +static void hls_sao_param(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + int rx, int ry) { const HEVCContext *const s = lc->parent; int sao_merge_left_flag = 0; @@ -1077,9 +1083,9 @@ static void hls_sao_param(HEVCLocalContext *lc, int rx, int ry) } } - for (c_idx = 0; c_idx < (s->ps.sps->chroma_format_idc ? 3 : 1); c_idx++) { - int log2_sao_offset_scale = c_idx == 0 ? s->ps.pps->log2_sao_offset_scale_luma : - s->ps.pps->log2_sao_offset_scale_chroma; + for (c_idx = 0; c_idx < (sps->chroma_format_idc ? 3 : 1); c_idx++) { + int log2_sao_offset_scale = c_idx == 0 ? pps->log2_sao_offset_scale_luma : + pps->log2_sao_offset_scale_chroma; if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) { sao->type_idx[c_idx] = SAO_NOT_APPLIED; @@ -1097,7 +1103,7 @@ static void hls_sao_param(HEVCLocalContext *lc, int rx, int ry) continue; for (i = 0; i < 4; i++) - SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(lc, s->ps.sps->bit_depth)); + SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(lc, sps->bit_depth)); if (sao->type_idx[c_idx] == SAO_BAND) { for (i = 0; i < 4; i++) { @@ -1147,49 +1153,51 @@ static int hls_cross_component_pred(HEVCLocalContext *lc, int idx) return 0; } -static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, +static int hls_transform_unit(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + int x0, int y0, int xBase, int yBase, int cb_xBase, int cb_yBase, int log2_cb_size, int log2_trafo_size, int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr) { const HEVCContext *const s = lc->parent; - const int log2_trafo_size_c = log2_trafo_size - s->ps.sps->hshift[1]; + const int log2_trafo_size_c = log2_trafo_size - sps->hshift[1]; int i; if (lc->cu.pred_mode == MODE_INTRA) { int trafo_size = 1 << log2_trafo_size; - ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size, s->ps.sps->log2_ctb_size); + ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size, sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, x0, y0, 0); + s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, x0, y0, 0); } if (cbf_luma || cbf_cb[0] || cbf_cr[0] || - (s->ps.sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) { + (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) { int scan_idx = SCAN_DIAG; int scan_idx_c = SCAN_DIAG; int cbf_chroma = cbf_cb[0] || cbf_cr[0] || - (s->ps.sps->chroma_format_idc == 2 && + (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1])); - if (s->ps.pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) { + if (pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) { lc->tu.cu_qp_delta = ff_hevc_cu_qp_delta_abs(lc); if (lc->tu.cu_qp_delta != 0) if (ff_hevc_cu_qp_delta_sign_flag(lc) == 1) lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta; lc->tu.is_cu_qp_delta_coded = 1; - if (lc->tu.cu_qp_delta < -(26 + s->ps.sps->qp_bd_offset / 2) || - lc->tu.cu_qp_delta > (25 + s->ps.sps->qp_bd_offset / 2)) { + if (lc->tu.cu_qp_delta < -(26 + sps->qp_bd_offset / 2) || + lc->tu.cu_qp_delta > (25 + sps->qp_bd_offset / 2)) { av_log(s->avctx, AV_LOG_ERROR, "The cu_qp_delta %d is outside the valid range " "[%d, %d].\n", lc->tu.cu_qp_delta, - -(26 + s->ps.sps->qp_bd_offset / 2), - (25 + s->ps.sps->qp_bd_offset / 2)); + -(26 + sps->qp_bd_offset / 2), + (25 + sps->qp_bd_offset / 2)); return AVERROR_INVALIDDATA; } - ff_hevc_set_qPy(lc, s->ps.pps, cb_xBase, cb_yBase, log2_cb_size); + ff_hevc_set_qPy(lc, pps, cb_xBase, cb_yBase, log2_cb_size); } if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma && @@ -1197,13 +1205,13 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(lc); if (cu_chroma_qp_offset_flag) { int cu_chroma_qp_offset_idx = 0; - if (s->ps.pps->chroma_qp_offset_list_len_minus1 > 0) { - cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(lc, s->ps.pps->chroma_qp_offset_list_len_minus1); + if (pps->chroma_qp_offset_list_len_minus1 > 0) { + cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(lc, pps->chroma_qp_offset_list_len_minus1); av_log(s->avctx, AV_LOG_ERROR, "cu_chroma_qp_offset_idx not yet tested.\n"); } - lc->tu.cu_qp_offset_cb = s->ps.pps->cb_qp_offset_list[cu_chroma_qp_offset_idx]; - lc->tu.cu_qp_offset_cr = s->ps.pps->cr_qp_offset_list[cu_chroma_qp_offset_idx]; + lc->tu.cu_qp_offset_cb = pps->cb_qp_offset_list[cu_chroma_qp_offset_idx]; + lc->tu.cu_qp_offset_cr = pps->cr_qp_offset_list[cu_chroma_qp_offset_idx]; } else { lc->tu.cu_qp_offset_cb = 0; lc->tu.cu_qp_offset_cr = 0; @@ -1232,37 +1240,37 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, lc->tu.cross_pf = 0; if (cbf_luma) - ff_hevc_hls_residual_coding(lc, s->ps.pps, x0, y0, log2_trafo_size, scan_idx, 0); - if (s->ps.sps->chroma_format_idc && (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3)) { - int trafo_size_h = 1 << (log2_trafo_size_c + s->ps.sps->hshift[1]); - int trafo_size_v = 1 << (log2_trafo_size_c + s->ps.sps->vshift[1]); - lc->tu.cross_pf = (s->ps.pps->cross_component_prediction_enabled_flag && cbf_luma && + ff_hevc_hls_residual_coding(lc, pps, x0, y0, log2_trafo_size, scan_idx, 0); + if (sps->chroma_format_idc && (log2_trafo_size > 2 || sps->chroma_format_idc == 3)) { + int trafo_size_h = 1 << (log2_trafo_size_c + sps->hshift[1]); + int trafo_size_v = 1 << (log2_trafo_size_c + sps->vshift[1]); + lc->tu.cross_pf = (pps->cross_component_prediction_enabled_flag && cbf_luma && (lc->cu.pred_mode == MODE_INTER || (lc->tu.chroma_mode_c == 4))); if (lc->tu.cross_pf) { hls_cross_component_pred(lc, 0); } - for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) { + for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) { if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c), - trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0 + (i << log2_trafo_size_c), 1); + trafo_size_h, trafo_size_v, sps->log2_ctb_size); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (i << log2_trafo_size_c), 1); } if (cbf_cb[i]) - ff_hevc_hls_residual_coding(lc, s->ps.pps, x0, y0 + (i << log2_trafo_size_c), + ff_hevc_hls_residual_coding(lc, pps, x0, y0 + (i << log2_trafo_size_c), log2_trafo_size_c, scan_idx_c, 1); else if (lc->tu.cross_pf) { ptrdiff_t stride = s->cur_frame->f->linesize[1]; - int hshift = s->ps.sps->hshift[1]; - int vshift = s->ps.sps->vshift[1]; + int hshift = sps->hshift[1]; + int vshift = sps->vshift[1]; const int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer; int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2; int size = 1 << log2_trafo_size_c; uint8_t *dst = &s->cur_frame->f->data[1][(y0 >> vshift) * stride + - ((x0 >> hshift) << s->ps.sps->pixel_shift)]; + ((x0 >> hshift) << sps->pixel_shift)]; for (i = 0; i < (size * size); i++) { coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3); } @@ -1273,82 +1281,82 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, if (lc->tu.cross_pf) { hls_cross_component_pred(lc, 1); } - for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) { + for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) { if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c), - trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0 + (i << log2_trafo_size_c), 2); + trafo_size_h, trafo_size_v, sps->log2_ctb_size); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (i << log2_trafo_size_c), 2); } if (cbf_cr[i]) - ff_hevc_hls_residual_coding(lc, s->ps.pps, x0, y0 + (i << log2_trafo_size_c), + ff_hevc_hls_residual_coding(lc, pps, x0, y0 + (i << log2_trafo_size_c), log2_trafo_size_c, scan_idx_c, 2); else if (lc->tu.cross_pf) { ptrdiff_t stride = s->cur_frame->f->linesize[2]; - int hshift = s->ps.sps->hshift[2]; - int vshift = s->ps.sps->vshift[2]; + int hshift = sps->hshift[2]; + int vshift = sps->vshift[2]; const int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer; int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2; int size = 1 << log2_trafo_size_c; uint8_t *dst = &s->cur_frame->f->data[2][(y0 >> vshift) * stride + - ((x0 >> hshift) << s->ps.sps->pixel_shift)]; + ((x0 >> hshift) << sps->pixel_shift)]; for (i = 0; i < (size * size); i++) { coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3); } s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride); } } - } else if (s->ps.sps->chroma_format_idc && blk_idx == 3) { + } else if (sps->chroma_format_idc && blk_idx == 3) { int trafo_size_h = 1 << (log2_trafo_size + 1); - int trafo_size_v = 1 << (log2_trafo_size + s->ps.sps->vshift[1]); - for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) { + int trafo_size_v = 1 << (log2_trafo_size + sps->vshift[1]); + for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) { if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size), - trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase + (i << log2_trafo_size), 1); + trafo_size_h, trafo_size_v, sps->log2_ctb_size); + s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (i << log2_trafo_size), 1); } if (cbf_cb[i]) - ff_hevc_hls_residual_coding(lc, s->ps.pps, xBase, yBase + (i << log2_trafo_size), + ff_hevc_hls_residual_coding(lc, pps, xBase, yBase + (i << log2_trafo_size), log2_trafo_size, scan_idx_c, 1); } - for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) { + for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) { if (lc->cu.pred_mode == MODE_INTRA) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size), - trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase + (i << log2_trafo_size), 2); + trafo_size_h, trafo_size_v, sps->log2_ctb_size); + s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (i << log2_trafo_size), 2); } if (cbf_cr[i]) - ff_hevc_hls_residual_coding(lc, s->ps.pps, xBase, yBase + (i << log2_trafo_size), + ff_hevc_hls_residual_coding(lc, pps, xBase, yBase + (i << log2_trafo_size), log2_trafo_size, scan_idx_c, 2); } } - } else if (s->ps.sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) { - if (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3) { - int trafo_size_h = 1 << (log2_trafo_size_c + s->ps.sps->hshift[1]); - int trafo_size_v = 1 << (log2_trafo_size_c + s->ps.sps->vshift[1]); + } else if (sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) { + if (log2_trafo_size > 2 || sps->chroma_format_idc == 3) { + int trafo_size_h = 1 << (log2_trafo_size_c + sps->hshift[1]); + int trafo_size_v = 1 << (log2_trafo_size_c + sps->vshift[1]); ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size_h, trafo_size_v, - s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0, 1); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0, 2); - if (s->ps.sps->chroma_format_idc == 2) { + sps->log2_ctb_size); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0, 1); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0, 2); + if (sps->chroma_format_idc == 2) { ff_hevc_set_neighbour_available(lc, x0, y0 + (1 << log2_trafo_size_c), - trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0 + (1 << log2_trafo_size_c), 1); - s->hpc.intra_pred[log2_trafo_size_c - 2](lc, s->ps.pps, x0, y0 + (1 << log2_trafo_size_c), 2); + trafo_size_h, trafo_size_v, sps->log2_ctb_size); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (1 << log2_trafo_size_c), 1); + s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (1 << log2_trafo_size_c), 2); } } else if (blk_idx == 3) { int trafo_size_h = 1 << (log2_trafo_size + 1); - int trafo_size_v = 1 << (log2_trafo_size + s->ps.sps->vshift[1]); + int trafo_size_v = 1 << (log2_trafo_size + sps->vshift[1]); ff_hevc_set_neighbour_available(lc, xBase, yBase, - trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase, 1); - s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase, 2); - if (s->ps.sps->chroma_format_idc == 2) { + trafo_size_h, trafo_size_v, sps->log2_ctb_size); + s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase, 1); + s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase, 2); + if (sps->chroma_format_idc == 2) { ff_hevc_set_neighbour_available(lc, xBase, yBase + (1 << log2_trafo_size), - trafo_size_h, trafo_size_v, s->ps.sps->log2_ctb_size); - s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase + (1 << log2_trafo_size), 1); - s->hpc.intra_pred[log2_trafo_size - 2](lc, s->ps.pps, xBase, yBase + (1 << log2_trafo_size), 2); + trafo_size_h, trafo_size_v, sps->log2_ctb_size); + s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (1 << log2_trafo_size), 1); + s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (1 << log2_trafo_size), 2); } } } @@ -1356,14 +1364,15 @@ static int hls_transform_unit(HEVCLocalContext *lc, int x0, int y0, return 0; } -static void set_deblocking_bypass(const HEVCContext *s, int x0, int y0, int log2_cb_size) +static void set_deblocking_bypass(const HEVCContext *s, const HEVCSPS *sps, + int x0, int y0, int log2_cb_size) { int cb_size = 1 << log2_cb_size; - int log2_min_pu_size = s->ps.sps->log2_min_pu_size; + int log2_min_pu_size = sps->log2_min_pu_size; - int min_pu_width = s->ps.sps->min_pu_width; - int x_end = FFMIN(x0 + cb_size, s->ps.sps->width); - int y_end = FFMIN(y0 + cb_size, s->ps.sps->height); + int min_pu_width = sps->min_pu_width; + int x_end = FFMIN(x0 + cb_size, sps->width); + int y_end = FFMIN(y0 + cb_size, sps->height); int i, j; for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++) @@ -1371,7 +1380,9 @@ static void set_deblocking_bypass(const HEVCContext *s, int x0, int y0, int log2 s->is_pcm[i + j * min_pu_width] = 2; } -static int hls_transform_tree(HEVCLocalContext *lc, int x0, int y0, +static int hls_transform_tree(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + int x0, int y0, int xBase, int yBase, int cb_xBase, int cb_yBase, int log2_cb_size, int log2_trafo_size, int trafo_depth, int blk_idx, @@ -1391,7 +1402,7 @@ static int hls_transform_tree(HEVCLocalContext *lc, int x0, int y0, if (lc->cu.intra_split_flag) { if (trafo_depth == 1) { lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx]; - if (s->ps.sps->chroma_format_idc == 3) { + if (sps->chroma_format_idc == 3) { lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx]; lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx]; } else { @@ -1405,33 +1416,33 @@ static int hls_transform_tree(HEVCLocalContext *lc, int x0, int y0, lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0]; } - if (log2_trafo_size <= s->ps.sps->log2_max_trafo_size && - log2_trafo_size > s->ps.sps->log2_min_tb_size && + if (log2_trafo_size <= sps->log2_max_trafo_size && + log2_trafo_size > sps->log2_min_tb_size && trafo_depth < lc->cu.max_trafo_depth && !(lc->cu.intra_split_flag && trafo_depth == 0)) { split_transform_flag = ff_hevc_split_transform_flag_decode(lc, log2_trafo_size); } else { - int inter_split = s->ps.sps->max_transform_hierarchy_depth_inter == 0 && + int inter_split = sps->max_transform_hierarchy_depth_inter == 0 && lc->cu.pred_mode == MODE_INTER && lc->cu.part_mode != PART_2Nx2N && trafo_depth == 0; - split_transform_flag = log2_trafo_size > s->ps.sps->log2_max_trafo_size || + split_transform_flag = log2_trafo_size > sps->log2_max_trafo_size || (lc->cu.intra_split_flag && trafo_depth == 0) || inter_split; } - if (s->ps.sps->chroma_format_idc && (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3)) { + if (sps->chroma_format_idc && (log2_trafo_size > 2 || sps->chroma_format_idc == 3)) { if (trafo_depth == 0 || cbf_cb[0]) { cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth); - if (s->ps.sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) { + if (sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) { cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth); } } if (trafo_depth == 0 || cbf_cr[0]) { cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth); - if (s->ps.sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) { + if (sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) { cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth); } } @@ -1444,7 +1455,8 @@ static int hls_transform_tree(HEVCLocalContext *lc, int x0, int y0, #define SUBDIVIDE(x, y, idx) \ do { \ - ret = hls_transform_tree(lc, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size,\ + ret = hls_transform_tree(lc, pps, sps, \ + x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \ log2_trafo_size - 1, trafo_depth + 1, idx, \ cbf_cb, cbf_cr); \ if (ret < 0) \ @@ -1458,18 +1470,19 @@ do { #undef SUBDIVIDE } else { - int min_tu_size = 1 << s->ps.sps->log2_min_tb_size; - int log2_min_tu_size = s->ps.sps->log2_min_tb_size; - int min_tu_width = s->ps.sps->min_tb_width; + int min_tu_size = 1 << sps->log2_min_tb_size; + int log2_min_tu_size = sps->log2_min_tb_size; + int min_tu_width = sps->min_tb_width; int cbf_luma = 1; if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 || cbf_cb[0] || cbf_cr[0] || - (s->ps.sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) { + (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) { cbf_luma = ff_hevc_cbf_luma_decode(lc, trafo_depth); } - ret = hls_transform_unit(lc, x0, y0, xBase, yBase, cb_xBase, cb_yBase, + ret = hls_transform_unit(lc, pps, sps, + x0, y0, xBase, yBase, cb_xBase, cb_yBase, log2_cb_size, log2_trafo_size, blk_idx, cbf_luma, cbf_cb, cbf_cr); if (ret < 0) @@ -1485,51 +1498,53 @@ do { } } if (!s->sh.disable_deblocking_filter_flag) { - ff_hevc_deblocking_boundary_strengths(lc, s->ps.pps, x0, y0, log2_trafo_size); - if (s->ps.pps->transquant_bypass_enable_flag && + ff_hevc_deblocking_boundary_strengths(lc, pps, x0, y0, log2_trafo_size); + if (pps->transquant_bypass_enable_flag && lc->cu.cu_transquant_bypass_flag) - set_deblocking_bypass(s, x0, y0, log2_trafo_size); + set_deblocking_bypass(s, sps, x0, y0, log2_trafo_size); } } return 0; } -static int hls_pcm_sample(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size) +static int hls_pcm_sample(HEVCLocalContext *lc, const HEVCPPS *pps, + int x0, int y0, int log2_cb_size) { const HEVCContext *const s = lc->parent; + const HEVCSPS *const sps = pps->sps; GetBitContext gb; int cb_size = 1 << log2_cb_size; ptrdiff_t stride0 = s->cur_frame->f->linesize[0]; ptrdiff_t stride1 = s->cur_frame->f->linesize[1]; ptrdiff_t stride2 = s->cur_frame->f->linesize[2]; - uint8_t *dst0 = &s->cur_frame->f->data[0][y0 * stride0 + (x0 << s->ps.sps->pixel_shift)]; - uint8_t *dst1 = &s->cur_frame->f->data[1][(y0 >> s->ps.sps->vshift[1]) * stride1 + ((x0 >> s->ps.sps->hshift[1]) << s->ps.sps->pixel_shift)]; - uint8_t *dst2 = &s->cur_frame->f->data[2][(y0 >> s->ps.sps->vshift[2]) * stride2 + ((x0 >> s->ps.sps->hshift[2]) << s->ps.sps->pixel_shift)]; + uint8_t *dst0 = &s->cur_frame->f->data[0][y0 * stride0 + (x0 << sps->pixel_shift)]; + uint8_t *dst1 = &s->cur_frame->f->data[1][(y0 >> sps->vshift[1]) * stride1 + ((x0 >> sps->hshift[1]) << sps->pixel_shift)]; + uint8_t *dst2 = &s->cur_frame->f->data[2][(y0 >> sps->vshift[2]) * stride2 + ((x0 >> sps->hshift[2]) << sps->pixel_shift)]; - int length = cb_size * cb_size * s->ps.sps->pcm.bit_depth + - (((cb_size >> s->ps.sps->hshift[1]) * (cb_size >> s->ps.sps->vshift[1])) + - ((cb_size >> s->ps.sps->hshift[2]) * (cb_size >> s->ps.sps->vshift[2]))) * - s->ps.sps->pcm.bit_depth_chroma; + int length = cb_size * cb_size * sps->pcm.bit_depth + + (((cb_size >> sps->hshift[1]) * (cb_size >> sps->vshift[1])) + + ((cb_size >> sps->hshift[2]) * (cb_size >> sps->vshift[2]))) * + sps->pcm.bit_depth_chroma; const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3); int ret; if (!s->sh.disable_deblocking_filter_flag) - ff_hevc_deblocking_boundary_strengths(lc, s->ps.pps, x0, y0, log2_cb_size); + ff_hevc_deblocking_boundary_strengths(lc, pps, x0, y0, log2_cb_size); ret = init_get_bits(&gb, pcm, length); if (ret < 0) return ret; - s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, s->ps.sps->pcm.bit_depth); - if (s->ps.sps->chroma_format_idc) { + s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, sps->pcm.bit_depth); + if (sps->chroma_format_idc) { s->hevcdsp.put_pcm(dst1, stride1, - cb_size >> s->ps.sps->hshift[1], - cb_size >> s->ps.sps->vshift[1], - &gb, s->ps.sps->pcm.bit_depth_chroma); + cb_size >> sps->hshift[1], + cb_size >> sps->vshift[1], + &gb, sps->pcm.bit_depth_chroma); s->hevcdsp.put_pcm(dst2, stride2, - cb_size >> s->ps.sps->hshift[2], - cb_size >> s->ps.sps->vshift[2], - &gb, s->ps.sps->pcm.bit_depth_chroma); + cb_size >> sps->hshift[2], + cb_size >> sps->vshift[2], + &gb, sps->pcm.bit_depth_chroma); } return 0; @@ -1551,32 +1566,34 @@ static int hls_pcm_sample(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size * @param luma_offset additive offset applied to the luma prediction value */ -static void luma_mc_uni(HEVCLocalContext *lc, uint8_t *dst, ptrdiff_t dststride, +static void luma_mc_uni(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + uint8_t *dst, ptrdiff_t dststride, const AVFrame *ref, const Mv *mv, int x_off, int y_off, int block_w, int block_h, int luma_weight, int luma_offset) { const HEVCContext *const s = lc->parent; const uint8_t *src = ref->data[0]; ptrdiff_t srcstride = ref->linesize[0]; - int pic_width = s->ps.sps->width; - int pic_height = s->ps.sps->height; + int pic_width = sps->width; + int pic_height = sps->height; int mx = mv->x & 3; int my = mv->y & 3; - int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) || - (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag); + int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) || + (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag); int idx = hevc_pel_weight[block_w]; x_off += mv->x >> 2; y_off += mv->y >> 2; - src += y_off * srcstride + (x_off * (1 << s->ps.sps->pixel_shift)); + src += y_off * srcstride + (x_off * (1 << sps->pixel_shift)); if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER || x_off >= pic_width - block_w - QPEL_EXTRA_AFTER || y_off >= pic_height - block_h - QPEL_EXTRA_AFTER || ref == s->cur_frame->f) { - const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift; - int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift); - int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift); + const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift; + int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << sps->pixel_shift); + int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift); s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset, edge_emu_stride, srcstride, @@ -1613,7 +1630,9 @@ static void luma_mc_uni(HEVCLocalContext *lc, uint8_t *dst, ptrdiff_t dststride, * @param mv1 motion vector1 (relative to block position) to get pixel data from * @param current_mv current motion vector structure */ - static void luma_mc_bi(HEVCLocalContext *lc, uint8_t *dst, ptrdiff_t dststride, +static void luma_mc_bi(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + uint8_t *dst, ptrdiff_t dststride, const AVFrame *ref0, const Mv *mv0, int x_off, int y_off, int block_w, int block_h, const AVFrame *ref1, const Mv *mv1, struct MvField *current_mv) @@ -1621,29 +1640,29 @@ static void luma_mc_uni(HEVCLocalContext *lc, uint8_t *dst, ptrdiff_t dststride, const HEVCContext *const s = lc->parent; ptrdiff_t src0stride = ref0->linesize[0]; ptrdiff_t src1stride = ref1->linesize[0]; - int pic_width = s->ps.sps->width; - int pic_height = s->ps.sps->height; + int pic_width = sps->width; + int pic_height = sps->height; int mx0 = mv0->x & 3; int my0 = mv0->y & 3; int mx1 = mv1->x & 3; int my1 = mv1->y & 3; - int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) || - (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag); + int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) || + (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag); int x_off0 = x_off + (mv0->x >> 2); int y_off0 = y_off + (mv0->y >> 2); int x_off1 = x_off + (mv1->x >> 2); int y_off1 = y_off + (mv1->y >> 2); int idx = hevc_pel_weight[block_w]; - const uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << s->ps.sps->pixel_shift); - const uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << s->ps.sps->pixel_shift); + const uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << sps->pixel_shift); + const uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << sps->pixel_shift); if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER || x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER || y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) { - const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift; - int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift); - int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift); + const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift; + int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift); + int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift); s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset, edge_emu_stride, src0stride, @@ -1658,9 +1677,9 @@ static void luma_mc_uni(HEVCLocalContext *lc, uint8_t *dst, ptrdiff_t dststride, if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER || x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER || y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) { - const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift; - int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift); - int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift); + const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift; + int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift); + int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift); s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset, edge_emu_stride, src1stride, @@ -1705,20 +1724,22 @@ static void luma_mc_uni(HEVCLocalContext *lc, uint8_t *dst, ptrdiff_t dststride, * @param chroma_offset additive offset applied to the chroma prediction value */ -static void chroma_mc_uni(HEVCLocalContext *lc, uint8_t *dst0, +static void chroma_mc_uni(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + uint8_t *dst0, ptrdiff_t dststride, const uint8_t *src0, ptrdiff_t srcstride, int reflist, int x_off, int y_off, int block_w, int block_h, const struct MvField *current_mv, int chroma_weight, int chroma_offset) { const HEVCContext *const s = lc->parent; - int pic_width = s->ps.sps->width >> s->ps.sps->hshift[1]; - int pic_height = s->ps.sps->height >> s->ps.sps->vshift[1]; + int pic_width = sps->width >> sps->hshift[1]; + int pic_height = sps->height >> sps->vshift[1]; const Mv *mv = ¤t_mv->mv[reflist]; - int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) || - (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag); + int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) || + (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag); int idx = hevc_pel_weight[block_w]; - int hshift = s->ps.sps->hshift[1]; - int vshift = s->ps.sps->vshift[1]; + int hshift = sps->hshift[1]; + int vshift = sps->vshift[1]; intptr_t mx = av_mod_uintp2(mv->x, 2 + hshift); intptr_t my = av_mod_uintp2(mv->y, 2 + vshift); intptr_t _mx = mx << (1 - hshift); @@ -1727,16 +1748,16 @@ static void chroma_mc_uni(HEVCLocalContext *lc, uint8_t *dst0, x_off += mv->x >> (2 + hshift); y_off += mv->y >> (2 + vshift); - src0 += y_off * srcstride + (x_off * (1 << s->ps.sps->pixel_shift)); + src0 += y_off * srcstride + (x_off * (1 << sps->pixel_shift)); if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER || x_off >= pic_width - block_w - EPEL_EXTRA_AFTER || y_off >= pic_height - block_h - EPEL_EXTRA_AFTER || emu) { - const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift; - int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << s->ps.sps->pixel_shift)); + const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift; + int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << sps->pixel_shift)); int buf_offset0 = EPEL_EXTRA_BEFORE * - (edge_emu_stride + (1 << s->ps.sps->pixel_shift)); + (edge_emu_stride + (1 << sps->pixel_shift)); s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0, edge_emu_stride, srcstride, block_w + EPEL_EXTRA, block_h + EPEL_EXTRA, @@ -1773,7 +1794,9 @@ static void chroma_mc_uni(HEVCLocalContext *lc, uint8_t *dst0, * @param current_mv current motion vector structure * @param cidx chroma component(cb, cr) */ -static void chroma_mc_bi(HEVCLocalContext *lc, uint8_t *dst0, ptrdiff_t dststride, +static void chroma_mc_bi(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + uint8_t *dst0, ptrdiff_t dststride, const AVFrame *ref0, const AVFrame *ref1, int x_off, int y_off, int block_w, int block_h, const MvField *current_mv, int cidx) { @@ -1782,14 +1805,14 @@ static void chroma_mc_bi(HEVCLocalContext *lc, uint8_t *dst0, ptrdiff_t dststrid const uint8_t *src2 = ref1->data[cidx+1]; ptrdiff_t src1stride = ref0->linesize[cidx+1]; ptrdiff_t src2stride = ref1->linesize[cidx+1]; - int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) || - (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag); - int pic_width = s->ps.sps->width >> s->ps.sps->hshift[1]; - int pic_height = s->ps.sps->height >> s->ps.sps->vshift[1]; + int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) || + (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag); + int pic_width = sps->width >> sps->hshift[1]; + int pic_height = sps->height >> sps->vshift[1]; const Mv *const mv0 = ¤t_mv->mv[0]; const Mv *const mv1 = ¤t_mv->mv[1]; - int hshift = s->ps.sps->hshift[1]; - int vshift = s->ps.sps->vshift[1]; + int hshift = sps->hshift[1]; + int vshift = sps->vshift[1]; intptr_t mx0 = av_mod_uintp2(mv0->x, 2 + hshift); intptr_t my0 = av_mod_uintp2(mv0->y, 2 + vshift); @@ -1805,16 +1828,16 @@ static void chroma_mc_bi(HEVCLocalContext *lc, uint8_t *dst0, ptrdiff_t dststrid int x_off1 = x_off + (mv1->x >> (2 + hshift)); int y_off1 = y_off + (mv1->y >> (2 + vshift)); int idx = hevc_pel_weight[block_w]; - src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << s->ps.sps->pixel_shift); - src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << s->ps.sps->pixel_shift); + src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << sps->pixel_shift); + src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << sps->pixel_shift); if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER || x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER || y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) { - const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift; - int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->ps.sps->pixel_shift)); + const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift; + int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << sps->pixel_shift)); int buf_offset1 = EPEL_EXTRA_BEFORE * - (edge_emu_stride + (1 << s->ps.sps->pixel_shift)); + (edge_emu_stride + (1 << sps->pixel_shift)); s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1, edge_emu_stride, src1stride, @@ -1830,10 +1853,10 @@ static void chroma_mc_bi(HEVCLocalContext *lc, uint8_t *dst0, ptrdiff_t dststrid if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER || x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER || y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) { - const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift; - int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->ps.sps->pixel_shift)); + const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift; + int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << sps->pixel_shift)); int buf_offset1 = EPEL_EXTRA_BEFORE * - (edge_emu_stride + (1 << s->ps.sps->pixel_shift)); + (edge_emu_stride + (1 << sps->pixel_shift)); s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1, edge_emu_stride, src2stride, @@ -1874,7 +1897,9 @@ static void hevc_await_progress(const HEVCContext *s, const HEVCFrame *ref, } } -static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW, +static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv) { @@ -1882,7 +1907,7 @@ static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW enum InterPredIdc inter_pred_idc = PRED_L0; int mvp_flag; - ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH, s->ps.sps->log2_ctb_size); + ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH, sps->log2_ctb_size); mv->pred_flag = 0; if (s->sh.slice_type == HEVC_SLICE_B) inter_pred_idc = ff_hevc_inter_pred_idc_decode(lc, nPbW, nPbH); @@ -1894,7 +1919,7 @@ static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW mv->pred_flag = PF_L0; ff_hevc_hls_mvd_coding(lc, x0, y0, 0); mvp_flag = ff_hevc_mvp_lx_flag_decode(lc); - ff_hevc_luma_mv_mvp_mode(lc, s->ps.pps, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_mvp_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size, part_idx, merge_idx, mv, mvp_flag, 0); mv->mv[0].x += lc->pu.mvd.x; mv->mv[0].y += lc->pu.mvd.y; @@ -1912,25 +1937,26 @@ static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW mv->pred_flag += PF_L1; mvp_flag = ff_hevc_mvp_lx_flag_decode(lc); - ff_hevc_luma_mv_mvp_mode(lc, s->ps.pps, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_mvp_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size, part_idx, merge_idx, mv, mvp_flag, 1); mv->mv[1].x += lc->pu.mvd.x; mv->mv[1].y += lc->pu.mvd.y; } } -static void hls_prediction_unit(HEVCLocalContext *lc, int x0, int y0, - int nPbW, int nPbH, +static void hls_prediction_unit(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int partIdx, int idx) { #define POS(c_idx, x, y) \ - &s->cur_frame->f->data[c_idx][((y) >> s->ps.sps->vshift[c_idx]) * linesize[c_idx] + \ - (((x) >> s->ps.sps->hshift[c_idx]) << s->ps.sps->pixel_shift)] + &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \ + (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] const HEVCContext *const s = lc->parent; int merge_idx = 0; struct MvField current_mv = {{{ 0 }}}; - int min_pu_width = s->ps.sps->min_pu_width; + int min_pu_width = sps->min_pu_width; MvField *tab_mvf = s->cur_frame->tab_mvf; const RefPicList *refPicList = s->cur_frame->refPicList; @@ -1939,8 +1965,8 @@ static void hls_prediction_unit(HEVCLocalContext *lc, int x0, int y0, uint8_t *dst0 = POS(0, x0, y0); uint8_t *dst1 = POS(1, x0, y0); uint8_t *dst2 = POS(2, x0, y0); - int log2_min_cb_size = s->ps.sps->log2_min_cb_size; - int min_cb_width = s->ps.sps->min_cb_width; + int log2_min_cb_size = sps->log2_min_cb_size; + int min_cb_width = sps->min_cb_width; int x_cb = x0 >> log2_min_cb_size; int y_cb = y0 >> log2_min_cb_size; int x_pu, y_pu; @@ -1957,18 +1983,18 @@ static void hls_prediction_unit(HEVCLocalContext *lc, int x0, int y0, else merge_idx = 0; - ff_hevc_luma_mv_merge_mode(lc, s->ps.pps, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_merge_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size, partIdx, merge_idx, ¤t_mv); } else { - hevc_luma_mv_mvp_mode(lc, x0, y0, nPbW, nPbH, log2_cb_size, + hevc_luma_mv_mvp_mode(lc, pps, sps, x0, y0, nPbW, nPbH, log2_cb_size, partIdx, merge_idx, ¤t_mv); } - x_pu = x0 >> s->ps.sps->log2_min_pu_size; - y_pu = y0 >> s->ps.sps->log2_min_pu_size; + x_pu = x0 >> sps->log2_min_pu_size; + y_pu = y0 >> sps->log2_min_pu_size; - for (j = 0; j < nPbH >> s->ps.sps->log2_min_pu_size; j++) - for (i = 0; i < nPbW >> s->ps.sps->log2_min_pu_size; i++) + for (j = 0; j < nPbH >> sps->log2_min_pu_size; j++) + for (i = 0; i < nPbW >> sps->log2_min_pu_size; i++) tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv; if (current_mv.pred_flag & PF_L0) { @@ -1985,59 +2011,59 @@ static void hls_prediction_unit(HEVCLocalContext *lc, int x0, int y0, } if (current_mv.pred_flag == PF_L0) { - int x0_c = x0 >> s->ps.sps->hshift[1]; - int y0_c = y0 >> s->ps.sps->vshift[1]; - int nPbW_c = nPbW >> s->ps.sps->hshift[1]; - int nPbH_c = nPbH >> s->ps.sps->vshift[1]; + int x0_c = x0 >> sps->hshift[1]; + int y0_c = y0 >> sps->vshift[1]; + int nPbW_c = nPbW >> sps->hshift[1]; + int nPbH_c = nPbH >> sps->vshift[1]; - luma_mc_uni(lc, dst0, linesize[0], ref0->f, + luma_mc_uni(lc, pps, sps, dst0, linesize[0], ref0->f, ¤t_mv.mv[0], x0, y0, nPbW, nPbH, s->sh.luma_weight_l0[current_mv.ref_idx[0]], s->sh.luma_offset_l0[current_mv.ref_idx[0]]); - if (s->ps.sps->chroma_format_idc) { - chroma_mc_uni(lc, dst1, linesize[1], ref0->f->data[1], ref0->f->linesize[1], + if (sps->chroma_format_idc) { + chroma_mc_uni(lc, pps, sps, dst1, linesize[1], ref0->f->data[1], ref0->f->linesize[1], 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]); - chroma_mc_uni(lc, dst2, linesize[2], ref0->f->data[2], ref0->f->linesize[2], + chroma_mc_uni(lc, pps, sps, dst2, linesize[2], ref0->f->data[2], ref0->f->linesize[2], 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]); } } else if (current_mv.pred_flag == PF_L1) { - int x0_c = x0 >> s->ps.sps->hshift[1]; - int y0_c = y0 >> s->ps.sps->vshift[1]; - int nPbW_c = nPbW >> s->ps.sps->hshift[1]; - int nPbH_c = nPbH >> s->ps.sps->vshift[1]; + int x0_c = x0 >> sps->hshift[1]; + int y0_c = y0 >> sps->vshift[1]; + int nPbW_c = nPbW >> sps->hshift[1]; + int nPbH_c = nPbH >> sps->vshift[1]; - luma_mc_uni(lc, dst0, linesize[0], ref1->f, + luma_mc_uni(lc, pps, sps, dst0, linesize[0], ref1->f, ¤t_mv.mv[1], x0, y0, nPbW, nPbH, s->sh.luma_weight_l1[current_mv.ref_idx[1]], s->sh.luma_offset_l1[current_mv.ref_idx[1]]); - if (s->ps.sps->chroma_format_idc) { - chroma_mc_uni(lc, dst1, linesize[1], ref1->f->data[1], ref1->f->linesize[1], + if (sps->chroma_format_idc) { + chroma_mc_uni(lc, pps, sps, dst1, linesize[1], ref1->f->data[1], ref1->f->linesize[1], 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]); - chroma_mc_uni(lc, dst2, linesize[2], ref1->f->data[2], ref1->f->linesize[2], + chroma_mc_uni(lc, pps, sps, dst2, linesize[2], ref1->f->data[2], ref1->f->linesize[2], 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]); } } else if (current_mv.pred_flag == PF_BI) { - int x0_c = x0 >> s->ps.sps->hshift[1]; - int y0_c = y0 >> s->ps.sps->vshift[1]; - int nPbW_c = nPbW >> s->ps.sps->hshift[1]; - int nPbH_c = nPbH >> s->ps.sps->vshift[1]; + int x0_c = x0 >> sps->hshift[1]; + int y0_c = y0 >> sps->vshift[1]; + int nPbW_c = nPbW >> sps->hshift[1]; + int nPbH_c = nPbH >> sps->vshift[1]; - luma_mc_bi(lc, dst0, linesize[0], ref0->f, + luma_mc_bi(lc, pps, sps, dst0, linesize[0], ref0->f, ¤t_mv.mv[0], x0, y0, nPbW, nPbH, ref1->f, ¤t_mv.mv[1], ¤t_mv); - if (s->ps.sps->chroma_format_idc) { - chroma_mc_bi(lc, dst1, linesize[1], ref0->f, ref1->f, + if (sps->chroma_format_idc) { + chroma_mc_bi(lc, pps, sps, dst1, linesize[1], ref0->f, ref1->f, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0); - chroma_mc_bi(lc, dst2, linesize[2], ref0->f, ref1->f, + chroma_mc_bi(lc, pps, sps, dst2, linesize[2], ref0->f, ref1->f, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1); } } @@ -2046,23 +2072,24 @@ static void hls_prediction_unit(HEVCLocalContext *lc, int x0, int y0, /** * 8.4.1 */ -static int luma_intra_pred_mode(HEVCLocalContext *lc, int x0, int y0, int pu_size, +static int luma_intra_pred_mode(HEVCLocalContext *lc, const HEVCSPS *sps, + int x0, int y0, int pu_size, int prev_intra_luma_pred_flag) { const HEVCContext *const s = lc->parent; - int x_pu = x0 >> s->ps.sps->log2_min_pu_size; - int y_pu = y0 >> s->ps.sps->log2_min_pu_size; - int min_pu_width = s->ps.sps->min_pu_width; - int size_in_pus = pu_size >> s->ps.sps->log2_min_pu_size; - int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size); - int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size); + int x_pu = x0 >> sps->log2_min_pu_size; + int y_pu = y0 >> sps->log2_min_pu_size; + int min_pu_width = sps->min_pu_width; + int size_in_pus = pu_size >> sps->log2_min_pu_size; + int x0b = av_mod_uintp2(x0, sps->log2_ctb_size); + int y0b = av_mod_uintp2(y0, sps->log2_ctb_size); int cand_up = (lc->ctb_up_flag || y0b) ? s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC; int cand_left = (lc->ctb_left_flag || x0b) ? s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC; - int y_ctb = (y0 >> (s->ps.sps->log2_ctb_size)) << (s->ps.sps->log2_ctb_size); + int y_ctb = (y0 >> (sps->log2_ctb_size)) << (sps->log2_ctb_size); MvField *tab_mvf = s->cur_frame->tab_mvf; int intra_pred_mode; @@ -2126,16 +2153,17 @@ static int luma_intra_pred_mode(HEVCLocalContext *lc, int x0, int y0, int pu_siz return intra_pred_mode; } -static av_always_inline void set_ct_depth(const HEVCContext *s, int x0, int y0, +static av_always_inline void set_ct_depth(const HEVCSPS *sps, uint8_t *tab_ct_depth, + int x0, int y0, int log2_cb_size, int ct_depth) { - int length = (1 << log2_cb_size) >> s->ps.sps->log2_min_cb_size; - int x_cb = x0 >> s->ps.sps->log2_min_cb_size; - int y_cb = y0 >> s->ps.sps->log2_min_cb_size; + int length = (1 << log2_cb_size) >> sps->log2_min_cb_size; + int x_cb = x0 >> sps->log2_min_cb_size; + int y_cb = y0 >> sps->log2_min_cb_size; int y; for (y = 0; y < length; y++) - memset(&s->tab_ct_depth[(y_cb + y) * s->ps.sps->min_cb_width + x_cb], + memset(&tab_ct_depth[(y_cb + y) * sps->min_cb_width + x_cb], ct_depth, length); } @@ -2143,10 +2171,10 @@ static const uint8_t tab_mode_idx[] = { 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31}; -static void intra_prediction_unit(HEVCLocalContext *lc, int x0, int y0, +static void intra_prediction_unit(HEVCLocalContext *lc, const HEVCSPS *sps, + int x0, int y0, int log2_cb_size) { - const HEVCContext *const s = lc->parent; static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 }; uint8_t prev_intra_luma_pred_flag[4]; int split = lc->cu.part_mode == PART_NxN; @@ -2167,12 +2195,12 @@ static void intra_prediction_unit(HEVCLocalContext *lc, int x0, int y0, lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(lc); lc->pu.intra_pred_mode[2 * i + j] = - luma_intra_pred_mode(lc, x0 + pb_size * j, y0 + pb_size * i, pb_size, + luma_intra_pred_mode(lc, sps, x0 + pb_size * j, y0 + pb_size * i, pb_size, prev_intra_luma_pred_flag[2 * i + j]); } } - if (s->ps.sps->chroma_format_idc == 3) { + if (sps->chroma_format_idc == 3) { for (i = 0; i < side; i++) { for (j = 0; j < side; j++) { lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc); @@ -2186,7 +2214,7 @@ static void intra_prediction_unit(HEVCLocalContext *lc, int x0, int y0, } } } - } else if (s->ps.sps->chroma_format_idc == 2) { + } else if (sps->chroma_format_idc == 2) { int mode_idx; lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc); if (chroma_mode != 4) { @@ -2198,7 +2226,7 @@ static void intra_prediction_unit(HEVCLocalContext *lc, int x0, int y0, mode_idx = lc->pu.intra_pred_mode[0]; } lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx]; - } else if (s->ps.sps->chroma_format_idc != 0) { + } else if (sps->chroma_format_idc != 0) { chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc); if (chroma_mode != 4) { if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode]) @@ -2212,16 +2240,17 @@ static void intra_prediction_unit(HEVCLocalContext *lc, int x0, int y0, } static void intra_prediction_unit_default_value(HEVCLocalContext *lc, + const HEVCSPS *sps, int x0, int y0, int log2_cb_size) { const HEVCContext *const s = lc->parent; int pb_size = 1 << log2_cb_size; - int size_in_pus = pb_size >> s->ps.sps->log2_min_pu_size; - int min_pu_width = s->ps.sps->min_pu_width; + int size_in_pus = pb_size >> sps->log2_min_pu_size; + int min_pu_width = sps->min_pu_width; MvField *tab_mvf = s->cur_frame->tab_mvf; - int x_pu = x0 >> s->ps.sps->log2_min_pu_size; - int y_pu = y0 >> s->ps.sps->log2_min_pu_size; + int x_pu = x0 >> sps->log2_min_pu_size; + int y_pu = y0 >> sps->log2_min_pu_size; int j, k; if (size_in_pus == 0) @@ -2234,16 +2263,18 @@ static void intra_prediction_unit_default_value(HEVCLocalContext *lc, tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA; } -static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, int x0, int y0, int log2_cb_size) +static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, + const HEVCPPS *pps, const HEVCSPS *sps, + int x0, int y0, int log2_cb_size) { int cb_size = 1 << log2_cb_size; - int log2_min_cb_size = s->ps.sps->log2_min_cb_size; + int log2_min_cb_size = sps->log2_min_cb_size; int length = cb_size >> log2_min_cb_size; - int min_cb_width = s->ps.sps->min_cb_width; + int min_cb_width = sps->min_cb_width; int x_cb = x0 >> log2_min_cb_size; int y_cb = y0 >> log2_min_cb_size; int idx = log2_cb_size - 2; - int qp_block_mask = (1<<(s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth)) - 1; + int qp_block_mask = (1 << (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth)) - 1; int x, y, ret; lc->cu.x = x0; @@ -2255,16 +2286,16 @@ static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, int x0, i SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0; for (x = 0; x < 4; x++) lc->pu.intra_pred_mode[x] = 1; - if (s->ps.pps->transquant_bypass_enable_flag) { + if (pps->transquant_bypass_enable_flag) { lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(lc); if (lc->cu.cu_transquant_bypass_flag) - set_deblocking_bypass(s, x0, y0, log2_cb_size); + set_deblocking_bypass(s, sps, x0, y0, log2_cb_size); } else lc->cu.cu_transquant_bypass_flag = 0; if (s->sh.slice_type != HEVC_SLICE_I) { - const int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size); - const int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size); + const int x0b = av_mod_uintp2(x0, sps->log2_ctb_size); + const int y0b = av_mod_uintp2(y0, sps->log2_ctb_size); uint8_t skip_flag = ff_hevc_skip_flag_decode(lc, x0b, y0b, x_cb, y_cb, min_cb_width); @@ -2283,75 +2314,93 @@ static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, int x0, i } if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) { - hls_prediction_unit(lc, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx); - intra_prediction_unit_default_value(lc, x0, y0, log2_cb_size); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size, cb_size, log2_cb_size, 0, idx); + intra_prediction_unit_default_value(lc, sps, x0, y0, log2_cb_size); if (!s->sh.disable_deblocking_filter_flag) - ff_hevc_deblocking_boundary_strengths(lc, s->ps.pps, x0, y0, log2_cb_size); + ff_hevc_deblocking_boundary_strengths(lc, pps, x0, y0, log2_cb_size); } else { int pcm_flag = 0; if (s->sh.slice_type != HEVC_SLICE_I) lc->cu.pred_mode = ff_hevc_pred_mode_decode(lc); if (lc->cu.pred_mode != MODE_INTRA || - log2_cb_size == s->ps.sps->log2_min_cb_size) { - lc->cu.part_mode = ff_hevc_part_mode_decode(lc, s->ps.sps, log2_cb_size); + log2_cb_size == sps->log2_min_cb_size) { + lc->cu.part_mode = ff_hevc_part_mode_decode(lc, sps, log2_cb_size); lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN && lc->cu.pred_mode == MODE_INTRA; } if (lc->cu.pred_mode == MODE_INTRA) { - if (lc->cu.part_mode == PART_2Nx2N && s->ps.sps->pcm_enabled && - log2_cb_size >= s->ps.sps->pcm.log2_min_pcm_cb_size && - log2_cb_size <= s->ps.sps->pcm.log2_max_pcm_cb_size) { + if (lc->cu.part_mode == PART_2Nx2N && sps->pcm_enabled && + log2_cb_size >= sps->pcm.log2_min_pcm_cb_size && + log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) { pcm_flag = ff_hevc_pcm_flag_decode(lc); } if (pcm_flag) { - intra_prediction_unit_default_value(lc, x0, y0, log2_cb_size); - ret = hls_pcm_sample(lc, x0, y0, log2_cb_size); - if (s->ps.sps->pcm_loop_filter_disabled) - set_deblocking_bypass(s, x0, y0, log2_cb_size); + intra_prediction_unit_default_value(lc, sps, x0, y0, log2_cb_size); + ret = hls_pcm_sample(lc, pps, x0, y0, log2_cb_size); + if (sps->pcm_loop_filter_disabled) + set_deblocking_bypass(s, sps, x0, y0, log2_cb_size); if (ret < 0) return ret; } else { - intra_prediction_unit(lc, x0, y0, log2_cb_size); + intra_prediction_unit(lc, sps, x0, y0, log2_cb_size); } } else { - intra_prediction_unit_default_value(lc, x0, y0, log2_cb_size); + intra_prediction_unit_default_value(lc, sps, x0, y0, log2_cb_size); switch (lc->cu.part_mode) { case PART_2Nx2N: - hls_prediction_unit(lc, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size, cb_size, log2_cb_size, 0, idx); break; case PART_2NxN: - hls_prediction_unit(lc, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx); - hls_prediction_unit(lc, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx); + hls_prediction_unit(lc, pps, sps, + x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx); break; case PART_Nx2N: - hls_prediction_unit(lc, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1); - hls_prediction_unit(lc, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1); + hls_prediction_unit(lc, pps, sps, + x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1); break; case PART_2NxnU: - hls_prediction_unit(lc, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx); - hls_prediction_unit(lc, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx); + hls_prediction_unit(lc, pps, sps, + x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx); break; case PART_2NxnD: - hls_prediction_unit(lc, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx); - hls_prediction_unit(lc, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx); + hls_prediction_unit(lc, pps, sps, + x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx); break; case PART_nLx2N: - hls_prediction_unit(lc, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2); - hls_prediction_unit(lc, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2); + hls_prediction_unit(lc, pps, sps, + x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2); break; case PART_nRx2N: - hls_prediction_unit(lc, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2); - hls_prediction_unit(lc, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2); + hls_prediction_unit(lc, pps, sps, + x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2); break; case PART_NxN: - hls_prediction_unit(lc, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1); - hls_prediction_unit(lc, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1); - hls_prediction_unit(lc, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1); - hls_prediction_unit(lc, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1); + hls_prediction_unit(lc, pps, sps, + x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1); + hls_prediction_unit(lc, pps, sps, + x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1); + hls_prediction_unit(lc, pps, sps, + x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1); + hls_prediction_unit(lc, pps, sps, + x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1); break; } } @@ -2366,22 +2415,22 @@ static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, int x0, i if (rqt_root_cbf) { const static int cbf[2] = { 0 }; lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ? - s->ps.sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag : - s->ps.sps->max_transform_hierarchy_depth_inter; - ret = hls_transform_tree(lc, x0, y0, x0, y0, x0, y0, + sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag : + sps->max_transform_hierarchy_depth_inter; + ret = hls_transform_tree(lc, pps, sps, x0, y0, x0, y0, x0, y0, log2_cb_size, log2_cb_size, 0, 0, cbf, cbf); if (ret < 0) return ret; } else { if (!s->sh.disable_deblocking_filter_flag) - ff_hevc_deblocking_boundary_strengths(lc, s->ps.pps, x0, y0, log2_cb_size); + ff_hevc_deblocking_boundary_strengths(lc, pps, x0, y0, log2_cb_size); } } } - if (s->ps.pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0) - ff_hevc_set_qPy(lc, s->ps.pps, x0, y0, log2_cb_size); + if (pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0) + ff_hevc_set_qPy(lc, pps, x0, y0, log2_cb_size); x = y_cb * min_cb_width + x_cb; for (y = 0; y < length; y++) { @@ -2394,12 +2443,14 @@ static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, int x0, i lc->qPy_pred = lc->qp_y; } - set_ct_depth(s, x0, y0, log2_cb_size, lc->ct_depth); + set_ct_depth(sps, s->tab_ct_depth, x0, y0, log2_cb_size, lc->ct_depth); return 0; } -static int hls_coding_quadtree(HEVCLocalContext *lc, int x0, int y0, +static int hls_coding_quadtree(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + int x0, int y0, int log2_cb_size, int cb_depth) { const HEVCContext *const s = lc->parent; @@ -2408,49 +2459,49 @@ static int hls_coding_quadtree(HEVCLocalContext *lc, int x0, int y0, int split_cu; lc->ct_depth = cb_depth; - if (x0 + cb_size <= s->ps.sps->width && - y0 + cb_size <= s->ps.sps->height && - log2_cb_size > s->ps.sps->log2_min_cb_size) { - split_cu = ff_hevc_split_coding_unit_flag_decode(lc, s->ps.sps, cb_depth, x0, y0); + if (x0 + cb_size <= sps->width && + y0 + cb_size <= sps->height && + log2_cb_size > sps->log2_min_cb_size) { + split_cu = ff_hevc_split_coding_unit_flag_decode(lc, sps, cb_depth, x0, y0); } else { - split_cu = (log2_cb_size > s->ps.sps->log2_min_cb_size); + split_cu = (log2_cb_size > sps->log2_min_cb_size); } - if (s->ps.pps->cu_qp_delta_enabled_flag && - log2_cb_size >= s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth) { + if (pps->cu_qp_delta_enabled_flag && + log2_cb_size >= sps->log2_ctb_size - pps->diff_cu_qp_delta_depth) { lc->tu.is_cu_qp_delta_coded = 0; lc->tu.cu_qp_delta = 0; } if (s->sh.cu_chroma_qp_offset_enabled_flag && - log2_cb_size >= s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_chroma_qp_offset_depth) { + log2_cb_size >= sps->log2_ctb_size - pps->diff_cu_chroma_qp_offset_depth) { lc->tu.is_cu_chroma_qp_offset_coded = 0; } if (split_cu) { - int qp_block_mask = (1<<(s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth)) - 1; + int qp_block_mask = (1 << (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth)) - 1; const int cb_size_split = cb_size >> 1; const int x1 = x0 + cb_size_split; const int y1 = y0 + cb_size_split; int more_data = 0; - more_data = hls_coding_quadtree(lc, x0, y0, log2_cb_size - 1, cb_depth + 1); + more_data = hls_coding_quadtree(lc, pps, sps, x0, y0, log2_cb_size - 1, cb_depth + 1); if (more_data < 0) return more_data; - if (more_data && x1 < s->ps.sps->width) { - more_data = hls_coding_quadtree(lc, x1, y0, log2_cb_size - 1, cb_depth + 1); + if (more_data && x1 < sps->width) { + more_data = hls_coding_quadtree(lc, pps, sps, x1, y0, log2_cb_size - 1, cb_depth + 1); if (more_data < 0) return more_data; } - if (more_data && y1 < s->ps.sps->height) { - more_data = hls_coding_quadtree(lc, x0, y1, log2_cb_size - 1, cb_depth + 1); + if (more_data && y1 < sps->height) { + more_data = hls_coding_quadtree(lc, pps, sps, x0, y1, log2_cb_size - 1, cb_depth + 1); if (more_data < 0) return more_data; } - if (more_data && x1 < s->ps.sps->width && - y1 < s->ps.sps->height) { - more_data = hls_coding_quadtree(lc, x1, y1, log2_cb_size - 1, cb_depth + 1); + if (more_data && x1 < sps->width && + y1 < sps->height) { + more_data = hls_coding_quadtree(lc, pps, sps, x1, y1, log2_cb_size - 1, cb_depth + 1); if (more_data < 0) return more_data; } @@ -2460,20 +2511,20 @@ static int hls_coding_quadtree(HEVCLocalContext *lc, int x0, int y0, lc->qPy_pred = lc->qp_y; if (more_data) - return ((x1 + cb_size_split) < s->ps.sps->width || - (y1 + cb_size_split) < s->ps.sps->height); + return ((x1 + cb_size_split) < sps->width || + (y1 + cb_size_split) < sps->height); else return 0; } else { - ret = hls_coding_unit(lc, s, x0, y0, log2_cb_size); + ret = hls_coding_unit(lc, s, pps, sps, x0, y0, log2_cb_size); if (ret < 0) return ret; if ((!((x0 + cb_size) % - (1 << (s->ps.sps->log2_ctb_size))) || - (x0 + cb_size >= s->ps.sps->width)) && + (1 << (sps->log2_ctb_size))) || + (x0 + cb_size >= sps->width)) && (!((y0 + cb_size) % - (1 << (s->ps.sps->log2_ctb_size))) || - (y0 + cb_size >= s->ps.sps->height))) { + (1 << (sps->log2_ctb_size))) || + (y0 + cb_size >= sps->height))) { int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(lc); return !end_of_slice_flag; } else { @@ -2484,65 +2535,68 @@ static int hls_coding_quadtree(HEVCLocalContext *lc, int x0, int y0, return 0; } -static void hls_decode_neighbour(HEVCLocalContext *lc, int x_ctb, int y_ctb, - int ctb_addr_ts) +static void hls_decode_neighbour(HEVCLocalContext *lc, + const HEVCPPS *pps, const HEVCSPS *sps, + int x_ctb, int y_ctb, int ctb_addr_ts) { const HEVCContext *const s = lc->parent; - int ctb_size = 1 << s->ps.sps->log2_ctb_size; - int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts]; + int ctb_size = 1 << sps->log2_ctb_size; + int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts]; int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr; s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr; - if (s->ps.pps->entropy_coding_sync_enabled_flag) { + if (pps->entropy_coding_sync_enabled_flag) { if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0) lc->first_qp_group = 1; - lc->end_of_tiles_x = s->ps.sps->width; - } else if (s->ps.pps->tiles_enabled_flag) { - if (ctb_addr_ts && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]) { - int idxX = s->ps.pps->col_idxX[x_ctb >> s->ps.sps->log2_ctb_size]; - lc->end_of_tiles_x = x_ctb + (s->ps.pps->column_width[idxX] << s->ps.sps->log2_ctb_size); + lc->end_of_tiles_x = sps->width; + } else if (pps->tiles_enabled_flag) { + if (ctb_addr_ts && pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]) { + int idxX = pps->col_idxX[x_ctb >> sps->log2_ctb_size]; + lc->end_of_tiles_x = x_ctb + (pps->column_width[idxX] << sps->log2_ctb_size); lc->first_qp_group = 1; } } else { - lc->end_of_tiles_x = s->ps.sps->width; + lc->end_of_tiles_x = sps->width; } - lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->ps.sps->height); + lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, sps->height); lc->boundary_flags = 0; - if (s->ps.pps->tiles_enabled_flag) { - if (x_ctb > 0 && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]]) + if (pps->tiles_enabled_flag) { + if (x_ctb > 0 && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]]) lc->boundary_flags |= BOUNDARY_LEFT_TILE; if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1]) lc->boundary_flags |= BOUNDARY_LEFT_SLICE; - if (y_ctb > 0 && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->ps.sps->ctb_width]]) + if (y_ctb > 0 && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - sps->ctb_width]]) lc->boundary_flags |= BOUNDARY_UPPER_TILE; - if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - s->ps.sps->ctb_width]) + if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - sps->ctb_width]) lc->boundary_flags |= BOUNDARY_UPPER_SLICE; } else { if (ctb_addr_in_slice <= 0) lc->boundary_flags |= BOUNDARY_LEFT_SLICE; - if (ctb_addr_in_slice < s->ps.sps->ctb_width) + if (ctb_addr_in_slice < sps->ctb_width) lc->boundary_flags |= BOUNDARY_UPPER_SLICE; } lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE)); - lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->ps.sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE)); - lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - s->ps.sps->ctb_width]])); - lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - s->ps.sps->ctb_width]])); + lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE)); + lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= sps->ctb_width) && (pps->tile_id[ctb_addr_ts] == pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - sps->ctb_width]])); + lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= sps->ctb_width) && (pps->tile_id[ctb_addr_ts] == pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - sps->ctb_width]])); } static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) { HEVCLocalContext *const lc = &s->local_ctx[0]; + const HEVCPPS *const pps = s->ps.pps; + const HEVCSPS *const sps = pps->sps; const uint8_t *slice_data = gb->buffer + s->sh.data_offset; const size_t slice_size = gb->buffer_end - gb->buffer - s->sh.data_offset; - int ctb_size = 1 << s->ps.sps->log2_ctb_size; + int ctb_size = 1 << sps->log2_ctb_size; int more_data = 1; int x_ctb = 0; int y_ctb = 0; - int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; + int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; int ret; if (!ctb_addr_ts && s->sh.dependent_slice_segment_flag) { @@ -2551,33 +2605,34 @@ static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) } if (s->sh.dependent_slice_segment_flag) { - int prev_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1]; + int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1]; if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) { av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n"); return AVERROR_INVALIDDATA; } } - while (more_data && ctb_addr_ts < s->ps.sps->ctb_size) { - int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts]; + while (more_data && ctb_addr_ts < sps->ctb_size) { + int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts]; - x_ctb = (ctb_addr_rs % ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size; - y_ctb = (ctb_addr_rs / ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size; - hls_decode_neighbour(lc, x_ctb, y_ctb, ctb_addr_ts); + x_ctb = (ctb_addr_rs % ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size; + y_ctb = (ctb_addr_rs / ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size; + hls_decode_neighbour(lc, pps, sps, x_ctb, y_ctb, ctb_addr_ts); - ret = ff_hevc_cabac_init(lc, s->ps.pps, ctb_addr_ts, slice_data, slice_size); + ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, slice_data, slice_size); if (ret < 0) { s->tab_slice_address[ctb_addr_rs] = -1; return ret; } - hls_sao_param(lc, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size); + hls_sao_param(lc, pps, sps, + x_ctb >> sps->log2_ctb_size, y_ctb >> sps->log2_ctb_size); s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset; s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset; s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag; - more_data = hls_coding_quadtree(lc, x_ctb, y_ctb, s->ps.sps->log2_ctb_size, 0); + more_data = hls_coding_quadtree(lc, pps, sps, x_ctb, y_ctb, sps->log2_ctb_size, 0); if (more_data < 0) { s->tab_slice_address[ctb_addr_rs] = -1; return more_data; @@ -2585,13 +2640,13 @@ static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) ctb_addr_ts++; - ff_hevc_save_states(lc, s->ps.pps, ctb_addr_ts); - ff_hevc_hls_filters(lc, s->ps.pps, x_ctb, y_ctb, ctb_size); + ff_hevc_save_states(lc, pps, ctb_addr_ts); + ff_hevc_hls_filters(lc, pps, x_ctb, y_ctb, ctb_size); } - if (x_ctb + ctb_size >= s->ps.sps->width && - y_ctb + ctb_size >= s->ps.sps->height) - ff_hevc_hls_filter(lc, s->ps.pps, x_ctb, y_ctb, ctb_size); + if (x_ctb + ctb_size >= sps->width && + y_ctb + ctb_size >= sps->height) + ff_hevc_hls_filter(lc, pps, x_ctb, y_ctb, ctb_size); return ctb_addr_ts; } @@ -2601,11 +2656,13 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, { HEVCLocalContext *lc = &((HEVCLocalContext*)hevc_lclist)[self_id]; const HEVCContext *const s = lc->parent; - int ctb_size = 1 << s->ps.sps->log2_ctb_size; + const HEVCPPS *const pps = s->ps.pps; + const HEVCSPS *const sps = pps->sps; + int ctb_size = 1 << sps->log2_ctb_size; int more_data = 1; int ctb_row = job; - int ctb_addr_rs = s->sh.slice_ctb_addr_rs + ctb_row * ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size); - int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs]; + int ctb_addr_rs = s->sh.slice_ctb_addr_rs + ctb_row * ((sps->width + ctb_size - 1) >> sps->log2_ctb_size); + int ctb_addr_ts = pps->ctb_addr_rs_to_ts[ctb_addr_rs]; int thread = ctb_row % s->threads_number; const uint8_t *data = s->data + s->sh.offset[ctb_row]; @@ -2616,11 +2673,11 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, if (ctb_row) ff_init_cabac_decoder(&lc->cc, data, data_size); - while(more_data && ctb_addr_ts < s->ps.sps->ctb_size) { - int x_ctb = (ctb_addr_rs % s->ps.sps->ctb_width) << s->ps.sps->log2_ctb_size; - int y_ctb = (ctb_addr_rs / s->ps.sps->ctb_width) << s->ps.sps->log2_ctb_size; + while(more_data && ctb_addr_ts < sps->ctb_size) { + int x_ctb = (ctb_addr_rs % sps->ctb_width) << sps->log2_ctb_size; + int y_ctb = (ctb_addr_rs / sps->ctb_width) << sps->log2_ctb_size; - hls_decode_neighbour(lc, x_ctb, y_ctb, ctb_addr_ts); + hls_decode_neighbour(lc, pps, sps, x_ctb, y_ctb, ctb_addr_ts); ff_thread_await_progress2(s->avctx, ctb_row, thread, SHIFT_CTB_WPP); @@ -2632,11 +2689,12 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, return 0; } - ret = ff_hevc_cabac_init(lc, s->ps.pps, ctb_addr_ts, data, data_size); + ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, data, data_size); if (ret < 0) goto error; - hls_sao_param(lc, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size); - more_data = hls_coding_quadtree(lc, x_ctb, y_ctb, s->ps.sps->log2_ctb_size, 0); + hls_sao_param(lc, pps, sps, + x_ctb >> sps->log2_ctb_size, y_ctb >> sps->log2_ctb_size); + more_data = hls_coding_quadtree(lc, pps, sps, x_ctb, y_ctb, sps->log2_ctb_size, 0); if (more_data < 0) { ret = more_data; @@ -2645,26 +2703,26 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, ctb_addr_ts++; - ff_hevc_save_states(lc, s->ps.pps, ctb_addr_ts); + ff_hevc_save_states(lc, pps, ctb_addr_ts); ff_thread_report_progress2(s->avctx, ctb_row, thread, 1); - ff_hevc_hls_filters(lc, s->ps.pps, x_ctb, y_ctb, ctb_size); + ff_hevc_hls_filters(lc, pps, x_ctb, y_ctb, ctb_size); - if (!more_data && (x_ctb+ctb_size) < s->ps.sps->width && ctb_row != s->sh.num_entry_point_offsets) { + if (!more_data && (x_ctb+ctb_size) < sps->width && ctb_row != s->sh.num_entry_point_offsets) { /* Casting const away here is safe, because it is an atomic operation. */ atomic_store((atomic_int*)&s->wpp_err, 1); ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP); return 0; } - if ((x_ctb+ctb_size) >= s->ps.sps->width && (y_ctb+ctb_size) >= s->ps.sps->height ) { - ff_hevc_hls_filter(lc, s->ps.pps, x_ctb, y_ctb, ctb_size); + if ((x_ctb+ctb_size) >= sps->width && (y_ctb+ctb_size) >= sps->height ) { + ff_hevc_hls_filter(lc, pps, x_ctb, y_ctb, ctb_size); ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP); return ctb_addr_ts; } - ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts]; + ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts]; x_ctb+=ctb_size; - if(x_ctb >= s->ps.sps->width) { + if(x_ctb >= sps->width) { break; } } @@ -2681,6 +2739,8 @@ error: static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) { + const HEVCPPS *const pps = s->ps.pps; + const HEVCSPS *const sps = pps->sps; const uint8_t *data = nal->data; int length = nal->size; int *ret; @@ -2688,10 +2748,10 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) int64_t startheader, cmpt = 0; int i, j, res = 0; - if (s->sh.slice_ctb_addr_rs + s->sh.num_entry_point_offsets * s->ps.sps->ctb_width >= s->ps.sps->ctb_width * s->ps.sps->ctb_height) { + if (s->sh.slice_ctb_addr_rs + s->sh.num_entry_point_offsets * sps->ctb_width >= sps->ctb_width * sps->ctb_height) { av_log(s->avctx, AV_LOG_ERROR, "WPP ctb addresses are wrong (%d %d %d %d)\n", s->sh.slice_ctb_addr_rs, s->sh.num_entry_point_offsets, - s->ps.sps->ctb_width, s->ps.sps->ctb_height + sps->ctb_width, sps->ctb_height ); return AVERROR_INVALIDDATA; } @@ -2769,7 +2829,7 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) if (!ret) return AVERROR(ENOMEM); - if (s->ps.pps->entropy_coding_sync_enabled_flag) + if (pps->entropy_coding_sync_enabled_flag) s->avctx->execute2(s->avctx, hls_decode_entry_wpp, s->local_ctx, ret, s->sh.num_entry_point_offsets + 1); for (i = 0; i <= s->sh.num_entry_point_offsets; i++) @@ -2868,14 +2928,16 @@ static int set_side_data(HEVCContext *s) static int hevc_frame_start(HEVCContext *s) { - int pic_size_in_ctb = ((s->ps.sps->width >> s->ps.sps->log2_min_cb_size) + 1) * - ((s->ps.sps->height >> s->ps.sps->log2_min_cb_size) + 1); + const HEVCPPS *const pps = s->ps.pps; + const HEVCSPS *const sps = pps->sps; + int pic_size_in_ctb = ((sps->width >> sps->log2_min_cb_size) + 1) * + ((sps->height >> sps->log2_min_cb_size) + 1); int ret; memset(s->horizontal_bs, 0, s->bs_width * s->bs_height); memset(s->vertical_bs, 0, s->bs_width * s->bs_height); - memset(s->cbf_luma, 0, s->ps.sps->min_tb_width * s->ps.sps->min_tb_height); - memset(s->is_pcm, 0, (s->ps.sps->min_pu_width + 1) * (s->ps.sps->min_pu_height + 1)); + memset(s->cbf_luma, 0, sps->min_tb_width * sps->min_tb_height); + memset(s->is_pcm, 0, (sps->min_pu_width + 1) * (sps->min_pu_height + 1)); memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address)); s->is_decoded = 0; @@ -2883,8 +2945,8 @@ static int hevc_frame_start(HEVCContext *s) s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) || (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos); - if (s->ps.pps->tiles_enabled_flag) - s->local_ctx[0].end_of_tiles_x = s->ps.pps->column_width[0] << s->ps.sps->log2_ctb_size; + if (pps->tiles_enabled_flag) + s->local_ctx[0].end_of_tiles_x = pps->column_width[0] << sps->log2_ctb_size; ret = ff_hevc_set_new_ref(s, s->poc); if (ret < 0) From patchwork Fri Jun 7 13:01:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49655 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1010596vqo; Fri, 7 Jun 2024 06:07:04 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUsYM7pgDyK3INysXYhwgZHHxY79mPd1xRrgGeZ3sAeEub1wzRhumcLwCJOslOlTv1WGwxZa/i9/tlC75Sz2KzrG+M0Argl5Cemcg== X-Google-Smtp-Source: AGHT+IHJ0CYXN5JY/JdOKNyDpFV5WnBr/UyzvVne+4d4w0zPR4YNSdtUA9jD/O0H1+vjTk5kjUZ5 X-Received: by 2002:a17:906:c302:b0:a59:c833:d274 with SMTP id a640c23a62f3a-a6cd76a92f2mr243333566b.37.1717765624009; Fri, 07 Jun 2024 06:07:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765623; cv=none; d=google.com; s=arc-20160816; b=ViGVp9pItw98CZ2OQn+2Iw1rFko6KtrSwNQPXTcOalmrZh2RRP4OFJl6u1LUxRsyg/ sip3qS5Wa6j6ThrEqpTZcXtLBuYoLrNn8s48YhvnVXY/TKnh+hFuxOT7t9w9dlpz7pmh YtM6cXRSOVSkKPGH7vK4X4y4U5J0Ia68wLgZPCiXpa2L8UOs0Q0BNBoKKUxfdSsuLP7n +UbD3aj72J2kymLJ2otList0tg8W9Um87qqq2MrPiqKPibuYSSpERFYMGuyOrnpTIzOJ mdqglLgLdHfFA4v2a2fawtlyCTNIEFp0Jrc3dgYcC+Szs/S5JxRsMtNtpZaYi/ksxIwV 2BRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=lS3jJaHwSvQ/7BWP/e48K0DMm0i5wOelHRnlxHk5Pxk=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=gQ8S9K6R8zJsHTt9zhav/2+bZJKMaZ3DuN6zx4CiKLSzssxomzFeOvQX26NBpaI8xa Cw23iwXEXCz9yLsSGZN2Ak6rnAxXKmrs3AKz0pXxotrTUEt4R4VZzDnXPGCx4K+IH2xM 3hNiyntvnNdUBBZ6iGWCqyCzp9Gd/ue5ZVKawDO+rEDgRG9+knSllxeS2a8Dml/MpNuF OUC+xZ7jSmTITutTvYGcKvof8m/ZsG/83gRhFeDXvcksKFigeWJXLt9p+ek+aoxHSheq NWzXvCz5wVMllLeMlq0rLDSWXST9liRz9gGGl0jDVaDHp2SRNQoh1MepLbYkhl0ucI/U sI6w==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=bkJqky2O; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c8070c11fsi186295266b.586.2024.06.07.06.07.03; Fri, 07 Jun 2024 06:07:03 -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=@khirnov.net header.s=mail header.b=bkJqky2O; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 49FA768D811; Fri, 7 Jun 2024 16:04:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8A8EA68D791 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=bkJqky2O; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 1F2B94DF3 for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id k-gIMQqJ9kfp for ; Fri, 7 Jun 2024 15:03:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=0X5bkfmUqQJjLcTOOvYtVtfwXDwh4Ow+19vaE4LB13s=; h=From:To:Subject:Date:In-Reply-To:References:From; b=bkJqky2Okdn9AB2hmIvtAhgOL73pKccBtBmwQK0v/hY4RAmSZykr16NWbS9/qG1AY TGXLy2W9ejJ9AnLgBAWEEnzChQkQpVu+ZaSI8dpbJH4Edq7qShOPDrgOJhpC3igQlv pLFfGwyjOoo6wTpn4Um8M5WWo4TfkluZ8AIi6uwHQMwWjNCRVP6eu5Ts+sStW6ScRX 5/hkKhE94IIJvTZpNDdhI9Vaa0qSmJdcdjVZ6GsS+obe8v3cKcdzx2v3/lOQvFYqqZ T4U9jnXFRcBqkM3VuJxwYUqo7nw9DenFAGBw2r5C6NQGFidTQzDLbV3AjpEyd+X2bX 2vafJxkmyVDAA== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id AA85B4DE9 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id DA5DA3A0AA5 for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:08 +0200 Message-ID: <20240607130135.9088-12-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/39] lavc/hevcdec: move active PPS from HEVCParamSets to HEVCContext 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 15xaAE3fRJ65 "Currently active PPS" is a property of the decoding process, not of the list of available parameter sets. --- libavcodec/dxva2_hevc.c | 8 ++++---- libavcodec/hevc/hevcdec.c | 19 ++++++++++++------- libavcodec/hevc/hevcdec.h | 1 + libavcodec/hevc/ps.c | 12 ++---------- libavcodec/hevc/ps.h | 1 - libavcodec/hevc/refs.c | 12 ++++++------ libavcodec/nvdec_hevc.c | 10 +++++----- libavcodec/vaapi_hevc.c | 12 ++++++------ libavcodec/vdpau_hevc.c | 4 ++-- libavcodec/videotoolbox.c | 6 +++--- libavcodec/vulkan_hevc.c | 8 ++++---- 11 files changed, 45 insertions(+), 48 deletions(-) diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c index 2f4073edd6..bd2c6f72a4 100644 --- a/libavcodec/dxva2_hevc.c +++ b/libavcodec/dxva2_hevc.c @@ -62,8 +62,8 @@ void ff_dxva2_hevc_fill_picture_parameters(const AVCodecContext *avctx, AVDXVACo { const HEVCContext *h = avctx->priv_data; const HEVCFrame *current_picture = h->cur_frame; - const HEVCSPS *sps = h->ps.sps; - const HEVCPPS *pps = h->ps.pps; + const HEVCPPS *pps = h->pps; + const HEVCSPS *sps = pps->sps; int i, j; memset(pp, 0, sizeof(*pp)); @@ -205,8 +205,8 @@ void ff_dxva2_hevc_fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext { const HEVCContext *h = avctx->priv_data; unsigned i, j, pos; - const ScalingList *sl = h->ps.pps->scaling_list_data_present_flag ? - &h->ps.pps->scaling_list : &h->ps.sps->scaling_list; + const ScalingList *sl = h->pps->scaling_list_data_present_flag ? + &h->pps->scaling_list : &h->pps->sps->scaling_list; memset(qm, 0, sizeof(*qm)); for (i = 0; i < 6; i++) { diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 14b9a2a844..6dda923df5 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -618,12 +618,12 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) return AVERROR_INVALIDDATA; } if (!sh->first_slice_in_pic_flag && - s->ps.pps != s->ps.pps_list[sh->pps_id]) { + s->pps != s->ps.pps_list[sh->pps_id]) { av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n"); return AVERROR_INVALIDDATA; } - s->ps.pps = s->ps.pps_list[sh->pps_id]; - pps = s->ps.pps; + ff_refstruct_replace(&s->pps, s->ps.pps_list[sh->pps_id]); + pps = s->pps; sps = pps->sps; if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1) @@ -2588,7 +2588,7 @@ static void hls_decode_neighbour(HEVCLocalContext *lc, static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) { HEVCLocalContext *const lc = &s->local_ctx[0]; - const HEVCPPS *const pps = s->ps.pps; + const HEVCPPS *const pps = s->pps; const HEVCSPS *const sps = pps->sps; const uint8_t *slice_data = gb->buffer + s->sh.data_offset; const size_t slice_size = gb->buffer_end - gb->buffer - s->sh.data_offset; @@ -2656,7 +2656,7 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, { HEVCLocalContext *lc = &((HEVCLocalContext*)hevc_lclist)[self_id]; const HEVCContext *const s = lc->parent; - const HEVCPPS *const pps = s->ps.pps; + const HEVCPPS *const pps = s->pps; const HEVCSPS *const sps = pps->sps; int ctb_size = 1 << sps->log2_ctb_size; int more_data = 1; @@ -2739,7 +2739,7 @@ error: static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) { - const HEVCPPS *const pps = s->ps.pps; + const HEVCPPS *const pps = s->pps; const HEVCSPS *const sps = pps->sps; const uint8_t *data = nal->data; int length = nal->size; @@ -2928,7 +2928,7 @@ static int set_side_data(HEVCContext *s) static int hevc_frame_start(HEVCContext *s) { - const HEVCPPS *const pps = s->ps.pps; + const HEVCPPS *const pps = s->pps; const HEVCSPS *const sps = pps->sps; int pic_size_in_ctb = ((sps->width >> sps->log2_min_cb_size) + 1) * ((sps->height >> sps->log2_min_cb_size) + 1); @@ -3510,6 +3510,8 @@ static av_cold int hevc_decode_free(AVCodecContext *avctx) pic_arrays_free(s); + ff_refstruct_unref(&s->pps); + ff_dovi_ctx_unref(&s->dovi_ctx); av_buffer_unref(&s->rpu_buf); @@ -3611,6 +3613,9 @@ static int hevc_update_thread_context(AVCodecContext *dst, for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++) ff_refstruct_replace(&s->ps.pps_list[i], s0->ps.pps_list[i]); + // PPS do not persist between frames + ff_refstruct_unref(&s->pps); + if (s->ps.sps != s0->ps.sps) if ((ret = set_sps(s, s0->ps.sps, src->pix_fmt)) < 0) return ret; diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index 3d1a36ecd4..3b7442e5c1 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -473,6 +473,7 @@ typedef struct HEVCContext { ///< candidate references for the current frame RefPicList rps[5]; + const HEVCPPS *pps; ///< RefStruct reference SliceHeader sh; SAOParams *sao; DBParams *deblock; diff --git a/libavcodec/hevc/ps.c b/libavcodec/hevc/ps.c index eabed69b94..c02fc8b6c3 100644 --- a/libavcodec/hevc/ps.c +++ b/libavcodec/hevc/ps.c @@ -61,13 +61,6 @@ static const uint8_t hevc_sub_height_c[] = { 1, 2, 1, 1 }; -static void remove_pps(HEVCParamSets *s, int id) -{ - if (s->pps == s->pps_list[id]) - s->pps = NULL; - ff_refstruct_unref(&s->pps_list[id]); -} - static void remove_sps(HEVCParamSets *s, int id) { int i; @@ -78,7 +71,7 @@ static void remove_sps(HEVCParamSets *s, int id) /* drop all PPS that depend on this SPS */ for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) if (s->pps_list[i] && s->pps_list[i]->sps_id == id) - remove_pps(s, i); + ff_refstruct_unref(&s->pps_list[i]); av_assert0(!(s->sps_list[id] && s->sps == s->sps_list[id])); ff_refstruct_unref(&s->sps_list[id]); @@ -2035,7 +2028,7 @@ int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, "Overread PPS by %d bits\n", -get_bits_left(gb)); } - remove_pps(ps, pps_id); + ff_refstruct_unref(&ps->pps_list[pps_id]); ps->pps_list[pps_id] = pps; return 0; @@ -2057,7 +2050,6 @@ void ff_hevc_ps_uninit(HEVCParamSets *ps) ff_refstruct_unref(&ps->pps_list[i]); ps->sps = NULL; - ps->pps = NULL; ps->vps = NULL; } diff --git a/libavcodec/hevc/ps.h b/libavcodec/hevc/ps.h index fc10876756..17395c5510 100644 --- a/libavcodec/hevc/ps.h +++ b/libavcodec/hevc/ps.h @@ -451,7 +451,6 @@ typedef struct HEVCParamSets { /* currently active parameter sets */ const HEVCVPS *vps; const HEVCSPS *sps; - const HEVCPPS *pps; } HEVCParamSets; /** diff --git a/libavcodec/hevc/refs.c b/libavcodec/hevc/refs.c index 39ce70ca39..31fcd49d69 100644 --- a/libavcodec/hevc/refs.c +++ b/libavcodec/hevc/refs.c @@ -54,7 +54,7 @@ const RefPicList *ff_hevc_get_ref_list(const HEVCContext *s, int x_cb = x0 >> s->ps.sps->log2_ctb_size; int y_cb = y0 >> s->ps.sps->log2_ctb_size; int pic_width_cb = s->ps.sps->ctb_width; - int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[y_cb * pic_width_cb + x_cb]; + int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[y_cb * pic_width_cb + x_cb]; return &ref->rpl_tab[ctb_addr_ts]->refPicList[0]; } @@ -283,7 +283,7 @@ static int init_slice_rpl(HEVCContext *s) { HEVCFrame *frame = s->cur_frame; int ctb_count = frame->ctb_count; - int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr]; + int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr]; int i; if (s->slice_idx >= frame->nb_rpl_elems) @@ -310,7 +310,7 @@ int ff_hevc_slice_rpl(HEVCContext *s) return ret; if (!(s->rps[ST_CURR_BEF].nb_refs + s->rps[ST_CURR_AFT].nb_refs + - s->rps[LT_CURR].nb_refs) && !s->ps.pps->pps_curr_pic_ref_enabled_flag) { + s->rps[LT_CURR].nb_refs) && !s->pps->pps_curr_pic_ref_enabled_flag) { av_log(s->avctx, AV_LOG_ERROR, "Zero refs in the frame RPS.\n"); return AVERROR_INVALIDDATA; } @@ -338,7 +338,7 @@ int ff_hevc_slice_rpl(HEVCContext *s) } } // Construct RefPicList0, RefPicList1 (8-8, 8-10) - if (s->ps.pps->pps_curr_pic_ref_enabled_flag && rpl_tmp.nb_refs < HEVC_MAX_REFS) { + if (s->pps->pps_curr_pic_ref_enabled_flag && rpl_tmp.nb_refs < HEVC_MAX_REFS) { rpl_tmp.list[rpl_tmp.nb_refs] = s->cur_frame->poc; rpl_tmp.ref[rpl_tmp.nb_refs] = s->cur_frame; rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = 1; @@ -367,7 +367,7 @@ int ff_hevc_slice_rpl(HEVCContext *s) } // 8-9 - if (s->ps.pps->pps_curr_pic_ref_enabled_flag && + if (s->pps->pps_curr_pic_ref_enabled_flag && !sh->rpl_modification_flag[list_idx] && rpl_tmp.nb_refs > sh->nb_refs[L0]) { rpl->list[sh->nb_refs[L0] - 1] = s->cur_frame->poc; @@ -545,7 +545,7 @@ int ff_hevc_frame_nb_refs(const HEVCContext *s) ret += !!long_rps->used[i]; } - if (s->ps.pps->pps_curr_pic_ref_enabled_flag) + if (s->pps->pps_curr_pic_ref_enabled_flag) ret++; return ret; diff --git a/libavcodec/nvdec_hevc.c b/libavcodec/nvdec_hevc.c index 1d23f2ab56..0bebca7568 100644 --- a/libavcodec/nvdec_hevc.c +++ b/libavcodec/nvdec_hevc.c @@ -44,8 +44,8 @@ static void dpb_add(CUVIDHEVCPICPARAMS *pp, int idx, const HEVCFrame *src) static void fill_scaling_lists(CUVIDHEVCPICPARAMS *ppc, const HEVCContext *s) { - const ScalingList *sl = s->ps.pps->scaling_list_data_present_flag ? - &s->ps.pps->scaling_list : &s->ps.sps->scaling_list; + const ScalingList *sl = s->pps->scaling_list_data_present_flag ? + &s->pps->scaling_list : &s->pps->sps->scaling_list; int i, j, pos; for (i = 0; i < 6; i++) { @@ -73,8 +73,8 @@ static int nvdec_hevc_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) { const HEVCContext *s = avctx->priv_data; - const HEVCPPS *pps = s->ps.pps; - const HEVCSPS *sps = s->ps.sps; + const HEVCPPS *pps = s->pps; + const HEVCSPS *sps = pps->sps; NVDECContext *ctx = avctx->internal->hwaccel_priv_data; CUVIDPICPARAMS *pp = &ctx->pic_params; @@ -300,7 +300,7 @@ static int nvdec_hevc_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) { const HEVCContext *s = avctx->priv_data; - const HEVCSPS *sps = s->ps.sps; + const HEVCSPS *sps = s->pps->sps; return ff_nvdec_frame_params(avctx, hw_frames_ctx, sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering + 1, 1); } diff --git a/libavcodec/vaapi_hevc.c b/libavcodec/vaapi_hevc.c index 051762bfef..ad4cd35b26 100644 --- a/libavcodec/vaapi_hevc.c +++ b/libavcodec/vaapi_hevc.c @@ -90,7 +90,7 @@ static int find_frame_rps_type(const HEVCContext *h, const HEVCFrame *pic) return VA_PICTURE_HEVC_RPS_LT_CURR; } - if (h->ps.pps->pps_curr_pic_ref_enabled_flag && current_picture->poc == pic->poc) + if (h->pps->pps_curr_pic_ref_enabled_flag && current_picture->poc == pic->poc) return VA_PICTURE_HEVC_LONG_TERM_REFERENCE; return 0; @@ -105,7 +105,7 @@ static void fill_vaapi_reference_frames(const HEVCContext *h, VAPictureParameter const HEVCFrame *frame = NULL; while (!frame && j < FF_ARRAY_ELEMS(h->DPB)) { - if ((&h->DPB[j] != current_picture || h->ps.pps->pps_curr_pic_ref_enabled_flag) && + if ((&h->DPB[j] != current_picture || h->pps->pps_curr_pic_ref_enabled_flag) && (h->DPB[j].flags & (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF))) frame = &h->DPB[j]; j++; @@ -126,8 +126,8 @@ static int vaapi_hevc_start_frame(AVCodecContext *avctx, { const HEVCContext *h = avctx->priv_data; VAAPIDecodePictureHEVC *pic = h->cur_frame->hwaccel_picture_private; - const HEVCSPS *sps = h->ps.sps; - const HEVCPPS *pps = h->ps.pps; + const HEVCPPS *pps = h->pps; + const HEVCSPS *sps = pps->sps; const ScalingList *scaling_list = NULL; int pic_param_size, err, i; @@ -399,8 +399,8 @@ static void fill_pred_weight_table(AVCodecContext *avctx, slice_param->luma_log2_weight_denom = 0; if (sh->slice_type == HEVC_SLICE_I || - (sh->slice_type == HEVC_SLICE_P && !h->ps.pps->weighted_pred_flag) || - (sh->slice_type == HEVC_SLICE_B && !h->ps.pps->weighted_bipred_flag)) + (sh->slice_type == HEVC_SLICE_P && !h->pps->weighted_pred_flag) || + (sh->slice_type == HEVC_SLICE_B && !h->pps->weighted_bipred_flag)) return; slice_param->luma_log2_weight_denom = sh->luma_log2_weight_denom; diff --git a/libavcodec/vdpau_hevc.c b/libavcodec/vdpau_hevc.c index f7cf1bd9c0..3db7ec156a 100644 --- a/libavcodec/vdpau_hevc.c +++ b/libavcodec/vdpau_hevc.c @@ -43,8 +43,8 @@ static int vdpau_hevc_start_frame(AVCodecContext *avctx, VdpPictureInfoHEVC444 *info2 = &pic_ctx->info.hevc_444; #endif - const HEVCSPS *sps = h->ps.sps; - const HEVCPPS *pps = h->ps.pps; + const HEVCPPS *pps = h->pps; + const HEVCSPS *sps = pps->sps; const SliceHeader *sh = &h->sh; const ScalingList *sl = pps->scaling_list_data_present_flag ? &pps->scaling_list : &sps->scaling_list; diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c index dcaddf944e..8e50bbb422 100644 --- a/libavcodec/videotoolbox.c +++ b/libavcodec/videotoolbox.c @@ -233,9 +233,9 @@ CFDataRef ff_videotoolbox_hvcc_extradata_create(AVCodecContext *avctx) { HEVCContext *h = avctx->priv_data; int i, num_vps = 0, num_sps = 0, num_pps = 0; - const HEVCVPS *vps = h->ps.vps; - const HEVCSPS *sps = h->ps.sps; - const HEVCPPS *pps = h->ps.pps; + const HEVCPPS *pps = h->pps; + const HEVCSPS *sps = pps->sps; + const HEVCVPS *vps = sps->vps; PTLCommon ptlc = vps->ptl.general_ptl; VUI vui = sps->vui; uint8_t parallelismType; diff --git a/libavcodec/vulkan_hevc.c b/libavcodec/vulkan_hevc.c index aa721493b0..33a6326297 100644 --- a/libavcodec/vulkan_hevc.c +++ b/libavcodec/vulkan_hevc.c @@ -735,8 +735,8 @@ static int vk_hevc_start_frame(AVCodecContext *avctx, FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; HEVCVulkanDecodePicture *hp = pic->hwaccel_picture_private; FFVulkanDecodePicture *vp = &hp->vp; - const HEVCSPS *sps = h->ps.sps; - const HEVCPPS *pps = h->ps.pps; + const HEVCPPS *pps = h->pps; + const HEVCSPS *sps = pps->sps; int nb_refs = 0; if (!dec->session_params) { @@ -878,8 +878,8 @@ static int vk_hevc_end_frame(AVCodecContext *avctx) return 0; if (!dec->session_params) { - const HEVCSPS *sps = h->ps.sps; - const HEVCPPS *pps = h->ps.pps; + const HEVCPPS *pps = h->pps; + const HEVCSPS *sps = pps->sps; if (!pps) { unsigned int pps_id = h->sh.pps_id; From patchwork Fri Jun 7 13:01:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49667 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1012595vqo; Fri, 7 Jun 2024 06:09:58 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWw/abj/x1RkxaxQS9zxSNWvQaelHTcF9hU5EWsSvb7FfAEPPFBqfABjC/ELW7ZtCzRzgRoPc88knUT9ro6nYGezyNc+z1FK1jm0Q== X-Google-Smtp-Source: AGHT+IH5wOn3VP6TpyVDjPgIuwZxaY/LjEM94pKeyiYeMnY7KR938+t2i3erQAnhbgvQqu6yNtQq X-Received: by 2002:a50:ab1b:0:b0:57c:5764:15e7 with SMTP id 4fb4d7f45d1cf-57c576416ccmr1141229a12.36.1717765798155; Fri, 07 Jun 2024 06:09:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765798; cv=none; d=google.com; s=arc-20160816; b=FeKZVnQVgELEOE5JYtQtKG/FXFrbMSKYB70QQeBMnMyMxc2G3Fw9CTKXvwpV2lmf97 aD54zltocVJjH7ynmWHOlJClMHYspJnOcPFmztIJHSyQE1lrl17B+FSzm/LTJlxe9VzM kQYlmbH67uxcZIylbGLq22pUPVGV8tOKesdgpVNXx7mtSiMzo7zo8ZKIimPIGsoGWlDr 2VaAQpgDvP9mLOD6X+2LTgS8ujmyqiLZLifpBbZ8pB8V/COxpF54eMOVYQ06itPPxnqV 2RjQj+3ckbk5hpM86gZA8tv102ZGEU+X0GSVTdJVR0O4Leda5vFcKd5sguEiaij2oTJF pIKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=KQfDf2IL5HshzBtcXY+hN+1gnmBexmFXkthJPFm/IMg=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=yFLh6rQDR/swJFfbsWyYrc62xiyWrOZJ/7Wv+vC/d4/G/vrU3qaDUA0ILKTOyofZsc Iv+5VE423Mo4v0chH6HdHOsGDHWFnvDegOYdm7SbabsKiEYvRbdmUppCsBGOAtKMyayH xcTufPxsxtLqE3I2HSkUpJZNqjfMZX+BGifoe/9eEe1ONIO411gQXtbfUj7SGoBf17wj aXKwVVKr5yIdqa0hA8WNu7adT9cNvcs5o3PEv6ZZaxsB4NVhKpzS+LgXkEXF5b2qxMa3 tEhyHkjL1Dqm722l/q33QVsdw+KhBVNGlbTHKBNPET1UUTl0YL0b1DFcf/yRpZhN5+HM fsjw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=fm+L7mKP; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57aae260c5bsi1824696a12.492.2024.06.07.06.09.57; Fri, 07 Jun 2024 06:09:58 -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=@khirnov.net header.s=mail header.b=fm+L7mKP; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0578A68D86A; Fri, 7 Jun 2024 16:04:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0E7DB68D7DD for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=fm+L7mKP; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 6EDC54DBA for ; Fri, 7 Jun 2024 15:03:46 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id w_-Lec-Yy-66 for ; Fri, 7 Jun 2024 15:03:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765421; bh=hrlMtgDR5cXtxq6dl4fjhXanHRhIXE14jc/r8VBsw7Y=; h=From:To:Subject:Date:In-Reply-To:References:From; b=fm+L7mKP1zIh1ULFT/FN70p0aVM6ZVtT7c3YmketJhDVjPJiQ/2N10cVPqthWtA/a 746gIsjxbc8x04PGJA5fxV8eJ8kyEbbwwYMhdpGqiDajm2NT92S/a8s8YVGWXLisNc 89PRG2oSGGs4lduOyqIeUJhgQPU0S1ODuZ1GzjEHpZZ/RIy2ChZPm+KqBUbl0g24EL 939TnDKdIXAZamCLOQyG2bWQOXAgqf+FLtPfhL0IBmvB5p5Av0YV3k/AwLidBsAeCG hVphxYBKxpU3vwDE/yQIjl5XRdjrFpPHY7lbhGEuqM7W5dvFO8DtL7qHsAqBgi0II/ 9jvyzDIMv/pfQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id B5EF24DEC for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id E5D0A3A0BB7 for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:09 +0200 Message-ID: <20240607130135.9088-13-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/39] lavc/hevcdec: drop an always-zero variable 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: kPzsUc+KjyTz --- libavcodec/hevc/hevcdec.c | 9 ++------- libavcodec/hevc/hevcdec.h | 1 - 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 6dda923df5..d599373c9d 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -984,13 +984,9 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) unsigned val = get_bits_long(gb, offset_len); sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size } - if (s->threads_number > 1 && (pps->num_tile_rows > 1 || pps->num_tile_columns > 1)) { - s->enable_parallel_tiles = 0; // TODO: you can enable tiles in parallel here + if (s->threads_number > 1 && (pps->num_tile_rows > 1 || pps->num_tile_columns > 1)) s->threads_number = 1; - } else - s->enable_parallel_tiles = 0; - } else - s->enable_parallel_tiles = 0; + } } if (pps->slice_header_extension_present_flag) { @@ -3697,7 +3693,6 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) if (ret < 0) return ret; - s->enable_parallel_tiles = 0; s->sei.picture_timing.picture_struct = 0; s->eos = 1; diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index 3b7442e5c1..c58ce05639 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -532,7 +532,6 @@ typedef struct HEVCContext { /** The target for the common_cabac_state of the local contexts. */ HEVCCABACState cabac; - int enable_parallel_tiles; atomic_int wpp_err; const uint8_t *data; From patchwork Fri Jun 7 13:01:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49648 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1009708vqo; Fri, 7 Jun 2024 06:05:51 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWDD4b7FDxzmtk5jLMLMlkKfosMPwgKDcu8Y3TY/tZwvkwbR/ksGpwKSUyNWAJxanFKRUawe3otFOBqPmWleMlRvRzWZxZIGMjfgA== X-Google-Smtp-Source: AGHT+IETfMmlhZLkxUIbEok9XtY3wfodDQqA+ES92wbuy3fo2D695Ft3HYgitjcgqmzA71dPUaFA X-Received: by 2002:a50:8d03:0:b0:57c:563b:f37f with SMTP id 4fb4d7f45d1cf-57c563bf694mr1116493a12.19.1717765551183; Fri, 07 Jun 2024 06:05:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765551; cv=none; d=google.com; s=arc-20160816; b=zZ0fR0ZmDAPDJdSy1YFWk6GKgj2MVeICOwShvC6Z9WBdClGI2twvEUDMdFI+HYZirz kkngPbHGgwlO3GcQVBIabL6yjts0sNsXJllzXwN1DprFWAJYCHI+B+jaKA5zlH7O5/aH yMmPt1ujxr8Mdo6ENwtuWKqwefAItnL0acLSJlGiY+w5XIC99hjKYNtAAr4gZosWCb/l n+OqrS4/4NLfOm2bf/LHBRtlswzwbm/Fuv8hPE4fBsHBsYZZ8Z7mmTUc12jgJJNKQtGr H7zItOcC1SuDjsBTmNPdJcdDAtFEbG+jY0rByC+u9CwdiLLnDdl1KgN/X3oOVidc7cmE jy9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=xQ4EUZ5lhPOR3r6tREPZdiKcva7NstX2efh1ngszy9A=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=ktfUteVv47yuVz8S+LYRYP2HjmbZVqZs32Duq1z7hk32zn0dCBKOYBMRQA3TyceGnh 4IoR/UcKXg/QJi0n2s/ogBqqMvQNuBraC73RnxnTc+DIge/a97QZJRRcwAmNJPucSqoH Ez5+YNOmKBXvbiGYwRsOxoN1Nx7lcUvPJqPnckfqkBP8ZIO6ACbWoI3Y8iQ3BkdRWeQw SrX7J1QCOo0dJi3yjUhnSO47e4W68Vt3FDyGR5YbnKYDMYbLNzZy0DJqEFvHTJ5rwNoK n9ZIwOIPf91k2QmYBdtD7fB8aMTVv/QUzLLejZEcxZp+OPRfOJgnlSLgZ3O21rD3hNYF 3SNg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=Nt+JnxyD; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57aae202937si1804384a12.267.2024.06.07.06.05.50; Fri, 07 Jun 2024 06:05:51 -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=@khirnov.net header.s=mail header.b=Nt+JnxyD; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AD9D368D780; Fri, 7 Jun 2024 16:04:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6B8CB68D77C for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=Nt+JnxyD; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 7A1E14E02 for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id yeWvAa1oSYea for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=RFp6NoS2jinXUC+/qDOxdV9rJcJkfcAAWSDDZr1oQkA=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Nt+JnxyDw6d5dD32dxLff6NYhRqgePKJQM3B+VpsHL/Z7D0an0qp6SkgaGrHmRAAO 5I9td6L8o0wNk3GcnZPxi/Ke8ib/pxZEEqhfX9LMOBUFC3uZBDIXkbz6Ek1caFXwzF av5+teWFoXWSn6n5pxY5wO3uMrxMbfUjQRWnr28EkelLOVI3VOk+JH5QGTmWW5yU/G zHxBh9TAshk8HrKk3V4v8RWs3NM+DtIsJurGw9fQ7liP6MBF3AOvoM/zDaKopBIhsE 0tGuMHsarK69BTphTfYiMyusDSFlbwwm0svRdKiTQCLXGX2rUdeQvpChynmLZjpAhf KNclfHI99Ip4w== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 062294DEE for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id F0E6D3A0D94 for ; Fri, 07 Jun 2024 15:03:34 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:10 +0200 Message-ID: <20240607130135.9088-14-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 14/39] lavc/hevcdec: only ignore INVALIDDATA in decode_nal_unit() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: XFPWxGMrMeKO All other errors should cause a failure, regardless of the value of err_recognition. Also, print a warning message when skipping invalid NAL units. --- libavcodec/hevc/hevcdec.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index d599373c9d..2c26d397df 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3206,9 +3206,13 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) return 0; fail: - if (s->avctx->err_recognition & AV_EF_EXPLODE) - return ret; - return 0; + if (ret == AVERROR_INVALIDDATA && + !(s->avctx->err_recognition & AV_EF_EXPLODE)) { + av_log(s->avctx, AV_LOG_WARNING, + "Skipping invalid undecodable NALU: %d\n", s->nal_unit_type); + return 0; + } + return ret; } static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) From patchwork Fri Jun 7 13:01:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49644 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1009135vqo; Fri, 7 Jun 2024 06:05:04 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCU6kWpecvFwm6M/HUlIpeVpY0s0OkFE7GqryQQ0rRk3WlBsCWXQ8oQmFAwVmQVusFWzqWGN26CVuFh9+2kKi4SG69NF1oYrip69IQ== X-Google-Smtp-Source: AGHT+IGTW5eQsMMUQPBK/asHMJKTg9Nxc3y212gL0IWJ9n98oleMtmn2k1zBUeonaWS6XyHbhcp0 X-Received: by 2002:a17:906:aec4:b0:a68:a811:d18b with SMTP id a640c23a62f3a-a6cdb9dc920mr157845566b.5.1717765504507; Fri, 07 Jun 2024 06:05:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765504; cv=none; d=google.com; s=arc-20160816; b=bN0wGu6+ANo31NvTWMw9je4tRTp5NqRrFrx6AAsQPy+864V+9sFaiE40lcuRt9HN3D sj72vw2wPNObExPwgkGblldr95NhDS11XJYIcsb3cfgErql5giCoUOzCrin1NtDcM2GH ek+f818VSuwWKVZ14SkhmTH8443kWH8zWvfoXOk0MQagw0Ng3NxIui1q0ESI9eM+e3HJ DRckyW7JnUYYfPLQA/AsoV8NfB5Ll/bXInys5P6eExO02zHsuGijAYr6F4Qtr6weItkS gcsuj7Gd/CPU8NqUMzuCL5oK6Hg8zFkipwvtiGQz/zz65q6QEMFqATjrhj05svvzOc73 nzyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=EE54r4WtEhok/4/2y9NPGUG2zrIIinM+cyy1YlLVB8U=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Lwdp3qp8Z+dEZZcqn7hNtQh277dgHldA2Kytb2DKrRqNUd+UgMjS9v4w1hzELii5Lu lQemeluYb3q6Sdk0HBmMlrz7BDKMdU7J9FqpgWi9frfvDUBI/QUpqJ7w0SijtWgQRfpE MIceKuUYoZirr2pe/6i+MwRH5svPQpKRPcofqqvpvtMe14uB4IWKAQROhqXADbUj7EDh RcerrpsHV3j2IOPscZZrMj+5i+gMLhTe/vVi1CmXpRhkE0wvKFo5u4XiEiyvthIskUlp zwMEcD3eOJlQTwETwmjEtd0bp8NdRRm/oGuDtHORa6aBS72JWPQ4hDDxSbnEgPKpgYSS /MmA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=T7ysK0u6; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c806db07dsi173408466b.446.2024.06.07.06.05.03; Fri, 07 Jun 2024 06: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=@khirnov.net header.s=mail header.b=T7ysK0u6; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4B72368D70F; Fri, 7 Jun 2024 16:03:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2157068D76E for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=T7ysK0u6; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 80A6B4DE6 for ; Fri, 7 Jun 2024 15:03:47 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id 0f_vR2CQ1prL for ; Fri, 7 Jun 2024 15:03:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=tBb/a32JZxRSzIW3a02v3Jj5s+4yhB/yzl3JmkhNac8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=T7ysK0u6ty02vo9r/1KMBxoPHcIgDat5yKurBlHq2XrgX/6rYfh3ChsyyhOuOkQQK GC05GDl/AWGQt/4Z9iTond3WGzGzxsbA7zxoVHjvu8uhz0Fmmrf1Dk/RyO8huF8Wdz qUb6ycVhklU/9PytkZ9+b8i1AIFGiDnwSCQkZsMnViaialJx/9YV/7/+396mdW93R9 Kn8Wtwh+3nJYJjUm1oULDz4FUJpeLUs7PKoWhfe4esxiRG1QCnmod+gzmP/owi+a1s QqIPB+NwO3Wn2pL/l3yurEu4nzCdNO/Gur/giR64D1xJ47pHyHyTy6/RNLtNFIlagW sy0nkTJdex1ag== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 063514DF2 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 086F83A0DB2 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:11 +0200 Message-ID: <20240607130135.9088-15-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 15/39] lavc/hevcdec: pass SliceHeader explicitly to pred_weight_table() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: at3eWIlmyXL7 And replace the HEVCContext* parameter by void *logctx. Makes it clear that only SliceHeader is modified by this function. --- libavcodec/hevc/hevcdec.c | 75 ++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 2c26d397df..6a9de79dcd 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -143,7 +143,8 @@ fail: return AVERROR(ENOMEM); } -static int pred_weight_table(HEVCContext *s, const HEVCSPS *sps, GetBitContext *gb) +static int pred_weight_table(SliceHeader *sh, void *logctx, + const HEVCSPS *sps, GetBitContext *gb) { int i = 0; int j = 0; @@ -155,40 +156,40 @@ static int pred_weight_table(HEVCContext *s, const HEVCSPS *sps, GetBitContext * luma_log2_weight_denom = get_ue_golomb_long(gb); if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) { - av_log(s->avctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom); + av_log(logctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom); return AVERROR_INVALIDDATA; } - s->sh.luma_log2_weight_denom = av_clip_uintp2(luma_log2_weight_denom, 3); + sh->luma_log2_weight_denom = av_clip_uintp2(luma_log2_weight_denom, 3); if (sps->chroma_format_idc != 0) { int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)get_se_golomb(gb); if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) { - av_log(s->avctx, AV_LOG_ERROR, "chroma_log2_weight_denom %"PRId64" is invalid\n", chroma_log2_weight_denom); + av_log(logctx, AV_LOG_ERROR, "chroma_log2_weight_denom %"PRId64" is invalid\n", chroma_log2_weight_denom); return AVERROR_INVALIDDATA; } - s->sh.chroma_log2_weight_denom = chroma_log2_weight_denom; + sh->chroma_log2_weight_denom = chroma_log2_weight_denom; } - for (i = 0; i < s->sh.nb_refs[L0]; i++) { + for (i = 0; i < sh->nb_refs[L0]; i++) { luma_weight_l0_flag[i] = get_bits1(gb); if (!luma_weight_l0_flag[i]) { - s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom; - s->sh.luma_offset_l0[i] = 0; + sh->luma_weight_l0[i] = 1 << sh->luma_log2_weight_denom; + sh->luma_offset_l0[i] = 0; } } if (sps->chroma_format_idc != 0) { - for (i = 0; i < s->sh.nb_refs[L0]; i++) + for (i = 0; i < sh->nb_refs[L0]; i++) chroma_weight_l0_flag[i] = get_bits1(gb); } else { - for (i = 0; i < s->sh.nb_refs[L0]; i++) + for (i = 0; i < sh->nb_refs[L0]; i++) chroma_weight_l0_flag[i] = 0; } - for (i = 0; i < s->sh.nb_refs[L0]; i++) { + for (i = 0; i < sh->nb_refs[L0]; i++) { if (luma_weight_l0_flag[i]) { int delta_luma_weight_l0 = get_se_golomb(gb); if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0) return AVERROR_INVALIDDATA; - s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0; - s->sh.luma_offset_l0[i] = get_se_golomb(gb); + sh->luma_weight_l0[i] = (1 << sh->luma_log2_weight_denom) + delta_luma_weight_l0; + sh->luma_offset_l0[i] = get_se_golomb(gb); } if (chroma_weight_l0_flag[i]) { for (j = 0; j < 2; j++) { @@ -200,39 +201,39 @@ static int pred_weight_table(HEVCContext *s, const HEVCSPS *sps, GetBitContext * return AVERROR_INVALIDDATA; } - s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0; - s->sh.chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j]) - >> s->sh.chroma_log2_weight_denom) + 128), -128, 127); + sh->chroma_weight_l0[i][j] = (1 << sh->chroma_log2_weight_denom) + delta_chroma_weight_l0; + sh->chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * sh->chroma_weight_l0[i][j]) + >> sh->chroma_log2_weight_denom) + 128), -128, 127); } } else { - s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom; - s->sh.chroma_offset_l0[i][0] = 0; - s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom; - s->sh.chroma_offset_l0[i][1] = 0; + sh->chroma_weight_l0[i][0] = 1 << sh->chroma_log2_weight_denom; + sh->chroma_offset_l0[i][0] = 0; + sh->chroma_weight_l0[i][1] = 1 << sh->chroma_log2_weight_denom; + sh->chroma_offset_l0[i][1] = 0; } } - if (s->sh.slice_type == HEVC_SLICE_B) { - for (i = 0; i < s->sh.nb_refs[L1]; i++) { + if (sh->slice_type == HEVC_SLICE_B) { + for (i = 0; i < sh->nb_refs[L1]; i++) { luma_weight_l1_flag[i] = get_bits1(gb); if (!luma_weight_l1_flag[i]) { - s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom; - s->sh.luma_offset_l1[i] = 0; + sh->luma_weight_l1[i] = 1 << sh->luma_log2_weight_denom; + sh->luma_offset_l1[i] = 0; } } if (sps->chroma_format_idc != 0) { - for (i = 0; i < s->sh.nb_refs[L1]; i++) + for (i = 0; i < sh->nb_refs[L1]; i++) chroma_weight_l1_flag[i] = get_bits1(gb); } else { - for (i = 0; i < s->sh.nb_refs[L1]; i++) + for (i = 0; i < sh->nb_refs[L1]; i++) chroma_weight_l1_flag[i] = 0; } - for (i = 0; i < s->sh.nb_refs[L1]; i++) { + for (i = 0; i < sh->nb_refs[L1]; i++) { if (luma_weight_l1_flag[i]) { int delta_luma_weight_l1 = get_se_golomb(gb); if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1) return AVERROR_INVALIDDATA; - s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1; - s->sh.luma_offset_l1[i] = get_se_golomb(gb); + sh->luma_weight_l1[i] = (1 << sh->luma_log2_weight_denom) + delta_luma_weight_l1; + sh->luma_offset_l1[i] = get_se_golomb(gb); } if (chroma_weight_l1_flag[i]) { for (j = 0; j < 2; j++) { @@ -244,15 +245,15 @@ static int pred_weight_table(HEVCContext *s, const HEVCSPS *sps, GetBitContext * return AVERROR_INVALIDDATA; } - s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1; - s->sh.chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j]) - >> s->sh.chroma_log2_weight_denom) + 128), -128, 127); + sh->chroma_weight_l1[i][j] = (1 << sh->chroma_log2_weight_denom) + delta_chroma_weight_l1; + sh->chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * sh->chroma_weight_l1[i][j]) + >> sh->chroma_log2_weight_denom) + 128), -128, 127); } } else { - s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom; - s->sh.chroma_offset_l1[i][0] = 0; - s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom; - s->sh.chroma_offset_l1[i][1] = 0; + sh->chroma_weight_l1[i][0] = 1 << sh->chroma_log2_weight_denom; + sh->chroma_offset_l1[i][0] = 0; + sh->chroma_weight_l1[i][1] = 1 << sh->chroma_log2_weight_denom; + sh->chroma_offset_l1[i][1] = 0; } } } @@ -857,7 +858,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if ((pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) || (pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) { - int ret = pred_weight_table(s, sps, gb); + int ret = pred_weight_table(sh, s->avctx, sps, gb); if (ret < 0) return ret; } From patchwork Fri Jun 7 13:01:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49656 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1010711vqo; Fri, 7 Jun 2024 06:07:15 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUqzRyp5P303zI5HxFuX/pyqLZpunXGULaxRzlmjqRwrxa2NkQvwf+uqXKZhO4YQ1K1YIA6dD4ttlC2oW0ElagMUgEZYEmQt8SzeQ== X-Google-Smtp-Source: AGHT+IEiBqNoTRanP8Nc61TImBgbHuXFQspY2ND4HPOiskfcLOFZvlIiyVegXEA9DSQQQj3kweRT X-Received: by 2002:a17:907:7f93:b0:a68:f7e8:fc1 with SMTP id a640c23a62f3a-a6cd665e5e2mr187719866b.30.1717765634978; Fri, 07 Jun 2024 06:07:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765634; cv=none; d=google.com; s=arc-20160816; b=piIXonl9JrUUpbbh2EcZECxV/n6TwdRstjtcrM92f22ZauT76P0eE7ywKVOxB8ReFL w5p/S6goOSorYxqpWhm3JNH6mTRyxZRpLS0skEfEVFy4i4ZfWz+eVHL32Rl8t3NdCcrd TyXXc2xVY7vOB8maWSTP/WXn+USbTbjEO6zHr16A5YKIOyzO78c9xFlspocV1ysTWG8L pWqjNaAYcb8ioj8qpfRnww84AViyvDsMWpyPeCQm5x7xdXEJNDYJq6hPMCoBJF6J/ma9 r5YM0Ty4tYlXhhZtsSW6Gp8XYY07N64gKSiUwSvmtdxWNHY6DYKAZZNakfO2EZUsRDaT 9xOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=BHpM5rbPdOf5lRcF/4zzfBoTKgpt6jA5ZRsz+kLZUEY=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=zeBBJBPR6HDCfjowke+bN1D30ndoDUvn6TJJNCv3bEVFV2l85OrpHaRCwlZlB7aJc5 59hNrU/hXVRnQZm3AVa6O6+2TGsVlVVVr+B6EU9CBLOiS+v4DkKA1vkFZNKEdbfWdLUV GTDiOaDY28jC/P91K19xdXCleviAEaFPr4m00SZwb55CTG5rKHM3nWbK17cY5dROfFPi x0bth2U33+muP6nx/SzOzckY7cGKJYxBblFJ1LRYzWp/rDZZNWG54/3OhDprilNE3S5K GmwaOw5ppZoCcmN8n4cvxZxSMqQd3qq7Jc2QUVfb9+y+gVMcbp9bcBmuKluf9CqX/jBt ynCw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=Pk54RQhU; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c80591c56si177972266b.48.2024.06.07.06.07.14; Fri, 07 Jun 2024 06:07: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=@khirnov.net header.s=mail header.b=Pk54RQhU; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 90C9968D810; Fri, 7 Jun 2024 16:04:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9979068D79D for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=Pk54RQhU; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 8257C4DE6 for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id 55uI3hrXtW9g for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=K2UZV27ouY7a5+GEWssTrMVUzUFZlP3Qy2Cdz49IQ8Y=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Pk54RQhU8tTt/uIW4NNe0ybDrX7LVXcjA6z4pgBDE1EBCfoU+6stfoCf6KfPMzKi0 l0YRRqDQwcs3gqFo0rZh62AFVd4cNnwKLtKiZwRUP0nfWtk3Bgca1pz0brEykGRnnE CuiNrIG/uQwH4LUl56c6Pn4YCMkxfhM8RG3s6ocGUU1pR7rtaLSbfBh5KvYKpWKB1B ucaWoQJh3YD8uw5CdAcKEDNp2rt+lGmOScPU0Ul925UbwkXJZLlRmsrl04vDH/KBDe S40fxU5KaCQRU3DCxnHU4C1WvzW1P5lltpRP/pZQMOz/0JzHpyizc9sFPUb+GPPhpu B4faGwRWNLhfg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 0630E4DF1 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 140243A0E0A for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:12 +0200 Message-ID: <20240607130135.9088-16-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 16/39] lavc/hevcdec: do not pass HEVCContext to decode_lt_rps() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: VIcDS2UusNy9 Pass the two numbers needed from it explicitly. Makes it clear that HEVCContext is not modified by this function. --- libavcodec/hevc/hevcdec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 6a9de79dcd..960a06c773 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -260,8 +260,8 @@ static int pred_weight_table(SliceHeader *sh, void *logctx, return 0; } -static int decode_lt_rps(HEVCContext *s, const HEVCSPS *sps, LongTermRPS *rps, - GetBitContext *gb) +static int decode_lt_rps(const HEVCSPS *sps, LongTermRPS *rps, + GetBitContext *gb, int cur_poc, int poc_lsb) { int max_poc_lsb = 1 << sps->log2_max_poc_lsb; int prev_delta_msb = 0; @@ -306,7 +306,7 @@ static int decode_lt_rps(HEVCContext *s, const HEVCSPS *sps, LongTermRPS *rps, if (i && i != nb_sps) delta += prev_delta_msb; - poc = rps->poc[i] + s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb; + poc = rps->poc[i] + cur_poc - delta * max_poc_lsb - poc_lsb; if (poc != (int32_t)poc) return AVERROR_INVALIDDATA; rps->poc[i] = poc; @@ -744,7 +744,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->short_term_ref_pic_set_size = pos - get_bits_left(gb); pos = get_bits_left(gb); - ret = decode_lt_rps(s, sps, &sh->long_term_rps, gb); + ret = decode_lt_rps(sps, &sh->long_term_rps, gb, s->poc, sh->pic_order_cnt_lsb); if (ret < 0) { av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n"); if (s->avctx->err_recognition & AV_EF_EXPLODE) From patchwork Fri Jun 7 13:01:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49650 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1009985vqo; Fri, 7 Jun 2024 06:06:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW0+2HTJ37JZBXJIRx+nyf8cJxWH0XhCXXOBPa8BGNwhwmWc0w93IRKIQLlAu67cQ+zGK64CJmvJ7s2nQVRjYDe0g3BXu4XDR0DeQ== X-Google-Smtp-Source: AGHT+IHDzZ+iKG2STzS6f0KQiR35Xw+6WNP8QGipF8kkE3m6rFaB+ELS3TBLD1L0ebmv0ccSpmMg X-Received: by 2002:a2e:2ac2:0:b0:2ea:cd8e:2119 with SMTP id 38308e7fff4ca-2eadce1e77cmr16097521fa.1.1717765572713; Fri, 07 Jun 2024 06:06:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765572; cv=none; d=google.com; s=arc-20160816; b=rjXfNdLgE/Ra0DuNAoQopxe/ca1b/kFr7ZGesYNVfUvY60GZbjCtsovDPclF1+/BJb qnSF7UChhYMQNxa+sTUvacVZQZVt81dCAiX5deZ1+ldXyAjKFbRjYneMoh4q7QotMjKi Sbx+iLIFisjLYaJDKSpPgWcGOUjPYv5YxVCmKNSLoVsnFMdagWgvZBLaIHCRkErDY0lt kRBinD9UqAb8gz2Bhy+7XglW7UOjWNtF6Xd0RBV0Ebd2OHCcEEr1PuIxZHoZe6hD1Ajd G+lFzEGHDvnfk1Ub8tCtqnlyAgR067zELGbLtzYv2ALqdby1t8skksgsI726Q4MvTjJc RgEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=BQjLGqxXA3h8kglX/ij0fLkDAvKDSKOYIFg6q+c/cxM=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=jz/aPWmiX6IuTGFMBPDY2mZZZVpRAqCjg8/qRkLo1vzLfnGpVVZzb7y12uJkmqbC1U +KuUn0VII+BQs06fAQbmzDUkxBUAK7iSKvAdorMNqZ1/oGHiidl9G5JDPs8PJHnvQYp2 Vx5GClXJ7aqJmWdBXArWYX9IiwnsZ97g7WGTGev+CUUdHhsFkP2noBA+q/RQ+1ss0UjB 3DegIPbNmzeQ7RmF91sgOWhkuA03TvQycZMNYmuQwhoTfyxXaXRjpZKEzLehFtxtjEdz yjpajqKkEHDW21FS0m0Gl7MSqannPU9GVLUXFoWaOPUCgMb8ObX2XYtlKfYpHegLn0vB s4Bg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=mj9h5+cc; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 38308e7fff4ca-2ead41682bdsi9637731fa.350.2024.06.07.06.06.12; Fri, 07 Jun 2024 06:06:12 -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=@khirnov.net header.s=mail header.b=mj9h5+cc; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1868F68D6D2; Fri, 7 Jun 2024 16:04:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6CA8068D77E for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=mj9h5+cc; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 859FD4DE9 for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id uqbJZp9Sj2lM for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=eO2n0goeaxSBqHo29iV307YATpMzChq6hGwCLPD7420=; h=From:To:Subject:Date:In-Reply-To:References:From; b=mj9h5+ccK563leXz1MSRUahEZrWgAo5C8dWBPUAm5gnzIRi6vAL0GAaoEMo8vinIZ e9STtnsujayjkVU3gSP4Cpv+HyVEIEMCNcKRtAHPk0bMjv052Gzdd7eEEjpZbvi+Wh dGp2f0a1fXhUwSJo7zXzOkv5HHumbbDqbvo1+xP/ZwjHoibTX0bvWu7DQqbbJYoq3o 2oWWQInDD9qSiNUpbvcoqCYscHTH6LBXBwmsKTWExbxFCPTlhA0P3HUEqee1f0kOB5 /SGJaRERhf/rSZQvaaiJGO9tGVWyi0lZUxfoABgMfFLw0tS9ho6Xj8AdJWPNyP+sVz K8RKkXoQLf0Xg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 064CD4DF8 for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 1FBC93A0E8F for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:13 +0200 Message-ID: <20240607130135.9088-17-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 17/39] lavc/hevcdec: move pocTid0 computation to hevc_frame_start() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ZLbhh0z7D5kc It is only done once per frame. Also, rename the variable to poc_tid0 to be consistent with our naming conventions. --- libavcodec/hevc/hevcdec.c | 26 +++++++++++++------------- libavcodec/hevc/hevcdec.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 960a06c773..dd3c188418 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -711,7 +711,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) int poc, pos; sh->pic_order_cnt_lsb = get_bits(gb, sps->log2_max_poc_lsb); - poc = ff_hevc_compute_poc(sps, s->pocTid0, sh->pic_order_cnt_lsb, s->nal_unit_type); + poc = ff_hevc_compute_poc(sps, s->poc_tid0, sh->pic_order_cnt_lsb, s->nal_unit_type); if (!sh->first_slice_in_pic_flag && poc != s->poc) { av_log(s->avctx, AV_LOG_WARNING, "Ignoring POC change between slices: %d -> %d\n", s->poc, poc); @@ -766,17 +766,6 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->slice_temporal_mvp_enabled_flag = 0; } - /* 8.3.1 */ - if (sh->first_slice_in_pic_flag && s->temporal_id == 0 && - s->nal_unit_type != HEVC_NAL_TRAIL_N && - s->nal_unit_type != HEVC_NAL_TSA_N && - s->nal_unit_type != HEVC_NAL_STSA_N && - s->nal_unit_type != HEVC_NAL_RADL_N && - s->nal_unit_type != HEVC_NAL_RADL_R && - s->nal_unit_type != HEVC_NAL_RASL_N && - s->nal_unit_type != HEVC_NAL_RASL_R) - s->pocTid0 = s->poc; - if (sps->sao_enabled) { sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb); if (sps->chroma_format_idc) { @@ -2942,6 +2931,17 @@ static int hevc_frame_start(HEVCContext *s) s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) || (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos); + /* 8.3.1 */ + if (s->temporal_id == 0 && + s->nal_unit_type != HEVC_NAL_TRAIL_N && + s->nal_unit_type != HEVC_NAL_TSA_N && + s->nal_unit_type != HEVC_NAL_STSA_N && + s->nal_unit_type != HEVC_NAL_RADL_N && + s->nal_unit_type != HEVC_NAL_RADL_R && + s->nal_unit_type != HEVC_NAL_RASL_N && + s->nal_unit_type != HEVC_NAL_RASL_R) + s->poc_tid0 = s->poc; + if (pps->tiles_enabled_flag) s->local_ctx[0].end_of_tiles_x = pps->column_width[0] << sps->log2_ctb_size; @@ -3623,7 +3623,7 @@ static int hevc_update_thread_context(AVCodecContext *dst, s->seq_decode = s0->seq_decode; s->seq_output = s0->seq_output; - s->pocTid0 = s0->pocTid0; + s->poc_tid0 = s0->poc_tid0; s->max_ra = s0->max_ra; s->eos = s0->eos; s->no_rasl_output_flag = s0->no_rasl_output_flag; diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index c58ce05639..4b28494366 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -483,7 +483,7 @@ typedef struct HEVCContext { HEVCFrame *collocated_ref; HEVCFrame DPB[32]; int poc; - int pocTid0; + int poc_tid0; int slice_idx; ///< number of the slice being currently decoded int eos; ///< current packet contains an EOS/EOB NAL int last_eos; ///< last packet contains an EOS/EOB NAL From patchwork Fri Jun 7 13:01:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49649 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1009847vqo; Fri, 7 Jun 2024 06:06:02 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXYhcqH0SmTuN2jpz9ltGwCFo8MH3al1wR6uxyCbfAXUwV63alyom/N4m80nqobrHq+Mkv9Z9hfJkYUXdKaDf7SpdQzfwk/i2h26w== X-Google-Smtp-Source: AGHT+IE1sw+BMp6/QfP+mr8TKSjkXFTb+HOwl1emjNnF3n0PA8G4zLIL04e841CD61ntl719FrU6 X-Received: by 2002:a17:906:a45:b0:a62:cf3b:77af with SMTP id a640c23a62f3a-a6cdaa0f8dcmr157280566b.52.1717765561790; Fri, 07 Jun 2024 06:06:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765561; cv=none; d=google.com; s=arc-20160816; b=CjsNRlXCFBHlmjJJr3tPm4PHRfvZk9p8FnPcUO932OdZDApBMvB6ORwTNfx/jrViEm ELcR7Y8JovKewLbX3ff7uWI80YAX3Fut3lVd3VQTyA32xNRuWdlgH/VjyL+wCns1r9ri TcBxB5xgm0/nRwYR5ijYUpmhSS/iiO/fHIJk/xY0+3umVLrLBkl3sLDAhfZma3fn/A/4 LM9hIDyU8qKeLGFSs7ekKRlFJrSt6KyU5A4+3HE2wX1tV5Bd+v9TzzV5neoR7/PAIDv5 +7Aw6bbodpJCtoBt5YsnXarr98j7YAJOqToMzqYTFof0+MScHoRcghKkEv9zKKu6ypSa b+WA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=AHm8CsQBlsXjtxOu0Qdw6fh+YIAYKSLzAC0wpi4EkYo=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=SvYkRLjUF9XjFclzQmlBFtq4dNYA2Z18MzCdCqmmgVqKDLtr3Wys2MwD/P2Ay8SUyp WPQZbmvYIEg240mFaV7jVFntWd6DaiI68ErYQepG6hTvVWtJlYKQKPBn47MtevuYzp+e 1CpK+/4ASeTCNK6IrV1tiVJmi8fVFz0G/lIw/RWkSy/utsQPiMOWCPXhIwSpDRAonovA 0oAsBy6qa4gvhU3XPxz0mseJVvllAUU5u1EbPf9aPl93iWzyxlnr4tJ0xSzNqiXiqug/ N5FQx8Ve/wAG9J3AHlNCkwCxRhefOD/I6JTt4GBEq0Sca/UbzC8k5fN+Sud6C/Bw/WkN RubA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=hT9l5yny; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c80725051si186737066b.700.2024.06.07.06.06.00; Fri, 07 Jun 2024 06:06:01 -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=@khirnov.net header.s=mail header.b=hT9l5yny; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D4F1868D800; Fri, 7 Jun 2024 16:04:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 65FA368D763 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=hT9l5yny; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id D2D9E4DEC for ; Fri, 7 Jun 2024 15:03:47 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id a1dizetQ7SF2 for ; Fri, 7 Jun 2024 15:03:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=FaAK4XC/6gFRponO31vY86ahc+x6hCCK6Vq6npRSv/o=; h=From:To:Subject:Date:In-Reply-To:References:From; b=hT9l5yny1n/wBTXiZI7gsjFudT2vkoA+fVudhlLTEsDXCeWA3AdXpql0mWtZi12pR hEkVH8lISyS2Zon1pOTJW1U8t+0oqBeCI/7Qmu4+ySP+SPJLGtP9r81JaYv4PD5fCv WnalUnEoWmIU9BstO+7f9JVpTece7X19H6cSgORZHsTWzie0lCHrekt3AFOzQdKQ+8 ba3xqWt/EoIAWMSn653ZfvXV2tTX3smLNlRP1I20jlTVrKl6dCceFSc/OuSsaGCU0F A4xF9h3UPX7eDvbJJu4vgv/IQeXGQaNN50ZHmeNaunZKiaAGTtEZ5DLB34fWVtEj2F srvxwTCIwWdIA== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 063D84DF3 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 2BCBD3A0FB4 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:14 +0200 Message-ID: <20240607130135.9088-18-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 18/39] lavc/hevcdec: only call export_stream_params_from_sei() once per frame 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 1cTqrFtquSPo Not once per each slice header, as it makes no sense and may cause races with frame threading. --- libavcodec/hevc/hevcdec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index dd3c188418..bf6e93ba1b 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -648,10 +648,6 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) s->max_ra = INT_MAX; } - ret = export_stream_params_from_sei(s); - if (ret < 0) - return ret; - sh->dependent_slice_segment_flag = 0; if (!sh->first_slice_in_pic_flag) { int slice_address_length; @@ -2965,6 +2961,10 @@ static int hevc_frame_start(HEVCContext *s) !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) && !s->avctx->hwaccel; + ret = export_stream_params_from_sei(s); + if (ret < 0) + return ret; + ret = set_side_data(s); if (ret < 0) goto fail; From patchwork Fri Jun 7 13:01:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49651 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1010130vqo; Fri, 7 Jun 2024 06:06:22 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWDZAEOVDxkhJwAt5owiN+1D8tIst0K40QEmW+HNPwtL8TZRXPTapy0z7Ch6zwTK1Cii26mLHm55PdAOWLP3uFyO8/LkUH+HwE6GA== X-Google-Smtp-Source: AGHT+IEHJ6BnL1+lUxGW6ED1eYSheiosdfy02q8xWRL9xP6RYb5zMj5rb7uTspqipswdIok0ybsI X-Received: by 2002:a05:6512:2211:b0:52b:bf92:bcd with SMTP id 2adb3069b0e04-52bbf920ca9mr1539720e87.22.1717765582548; Fri, 07 Jun 2024 06:06:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765582; cv=none; d=google.com; s=arc-20160816; b=qZnFsnGbFnU+qQf3NGquWi+9jbtDh9TTdYvL/uKFpSlBM5vQvu3hDHG/pXL5xwRPGi 5nNm8TXEbnLgJSKvF+4u0woRuvKXreVHLReEYtD6O4dv81hTK6+f5lOwk8V4e3ypQpK7 hnCPeiTdsPOxLrOS0Sr7uEcNxmGeGVZkZL0je2EbKQ89KtpW52JehNIv0n0OASMfpzOz CTa4QbsoBzjlXmUWotiBzUC0mPsBhrqPHz1xbz90h29wvok1xTJYQUTqNrNMYrdvIKMD Eoa+Jx/cfajR7V0L+incHRuDJP6Ki6KQ6wRudUvMbB4LAlKCOFNoms4adToKDKBonyOC mAMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=isfsAjID50987MnzjNKB0bRTwHxpukC/km8/yXC6iGM=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=PEfL+txmVmMe/3CMIvuTZYDRwXhBFuXz22ms9XS5f4I+YXneWmGXDNoK/suaZX0mB3 rOoCQ3+QpuKLXalBfyGvrw7uElTf8zfBf0e29FUnwbNngMK+5/JQITBnkKnKY3r11+ql XqdcD8SMedTjNdqbIscQon4X4Gk10HQrORnn6EoUp27c5b/NF7Hr8Zm2nWioPdiv/guv ooKBbeTRXEej7yFvb2kY+d4OgKVbfv1dGiLim3/fOpqLdq8eTflpm5LdpkI6Vo6v9sP/ jXfYjRDryT+6hI5vpUnjNYHrOKp5a9h96rAM1Twmhc+h64T5sxrIMuH41GHal0WUk2jI 1ing==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=grx3cuyu; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6e448710ccsi52442866b.401.2024.06.07.06.06.21; Fri, 07 Jun 2024 06:06:22 -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=@khirnov.net header.s=mail header.b=grx3cuyu; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2850968D7AF; Fri, 7 Jun 2024 16:04:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 725CD68D782 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=grx3cuyu; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 3CA764DF2 for ; Fri, 7 Jun 2024 15:03:48 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id Mk4BdSRIGllS for ; Fri, 7 Jun 2024 15:03:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=kXL7ou06MZalsHE5CvfLjYkQ4JYpQXT3hMUg3tJzhMI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=grx3cuyuE/NEesaX4645qkt9hOq0VbzkJrUGWnA/ueKVr06rJdI7xNKW621WCtuxF EQiypK3OTJ2KXvAe2li9wz+Xx5v/CY6B32oGMIMYohyHmiAHo6Lhw859hoMve5QSuH Z1GmCh8gL1qDIK2aGUxbzIiVNbXF/z3aGQvY1ynxTPvOKyZ9HPwYOYfvK7RuEjBWi+ 9lOJI9tyWp/xz0kv9ZvG3kRx1aAxszoHbl54sXkuwjsWpJGovijDgSZYfmxBfddY0k azQAhbDuD7Kfn0qBQtyCEXBBXFYjNYxhq9FM4vnBP9QMh4Zd+GFpN+w3HuG0L19kLH LMrgU06pDht8Q== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 064364DF4 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 374873A1513 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:15 +0200 Message-ID: <20240607130135.9088-19-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 19/39] lavc/hevcdec: do not pass HEVCContext to ff_hevc_frame_nb_refs() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: dY74nrAsr7Co Pass the only things required from it - slice header and PPS - explicitly. Will be useful in the following commits to avoid mofiying HEVCContext in hls_slice_header(). --- libavcodec/hevc/hevcdec.c | 2 +- libavcodec/hevc/hevcdec.h | 2 +- libavcodec/hevc/refs.c | 8 ++++---- libavcodec/nvdec_hevc.c | 2 +- libavcodec/vdpau_hevc.c | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index bf6e93ba1b..585a066426 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -795,7 +795,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->rpl_modification_flag[0] = 0; sh->rpl_modification_flag[1] = 0; - nb_refs = ff_hevc_frame_nb_refs(s); + nb_refs = ff_hevc_frame_nb_refs(sh, pps); if (!nb_refs) { av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n"); return AVERROR_INVALIDDATA; diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index 4b28494366..5eaebd3584 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -614,7 +614,7 @@ int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx); /** * Get the number of candidate references for the current frame. */ -int ff_hevc_frame_nb_refs(const HEVCContext *s); +int ff_hevc_frame_nb_refs(const SliceHeader *sh, const HEVCPPS *pps); int ff_hevc_set_new_ref(HEVCContext *s, int poc); diff --git a/libavcodec/hevc/refs.c b/libavcodec/hevc/refs.c index 31fcd49d69..5bd5eab9f1 100644 --- a/libavcodec/hevc/refs.c +++ b/libavcodec/hevc/refs.c @@ -526,12 +526,12 @@ fail: return ret; } -int ff_hevc_frame_nb_refs(const HEVCContext *s) +int ff_hevc_frame_nb_refs(const SliceHeader *sh, const HEVCPPS *pps) { int ret = 0; int i; - const ShortTermRPS *rps = s->sh.short_term_rps; - const LongTermRPS *long_rps = &s->sh.long_term_rps; + const ShortTermRPS *rps = sh->short_term_rps; + const LongTermRPS *long_rps = &sh->long_term_rps; if (rps) { for (i = 0; i < rps->num_negative_pics; i++) @@ -545,7 +545,7 @@ int ff_hevc_frame_nb_refs(const HEVCContext *s) ret += !!long_rps->used[i]; } - if (s->pps->pps_curr_pic_ref_enabled_flag) + if (pps->pps_curr_pic_ref_enabled_flag) ret++; return ret; diff --git a/libavcodec/nvdec_hevc.c b/libavcodec/nvdec_hevc.c index 0bebca7568..ce66ddcfb7 100644 --- a/libavcodec/nvdec_hevc.c +++ b/libavcodec/nvdec_hevc.c @@ -187,7 +187,7 @@ static int nvdec_hevc_start_frame(AVCodecContext *avctx, .NumBitsForShortTermRPSInSlice = s->sh.short_term_rps ? s->sh.short_term_ref_pic_set_size : 0, .NumDeltaPocsOfRefRpsIdx = s->sh.short_term_rps ? s->sh.short_term_rps->rps_idx_num_delta_pocs : 0, - .NumPocTotalCurr = ff_hevc_frame_nb_refs(s), + .NumPocTotalCurr = ff_hevc_frame_nb_refs(&s->sh, pps), .NumPocStCurrBefore = s->rps[ST_CURR_BEF].nb_refs, .NumPocStCurrAfter = s->rps[ST_CURR_AFT].nb_refs, .NumPocLtCurr = s->rps[LT_CURR].nb_refs, diff --git a/libavcodec/vdpau_hevc.c b/libavcodec/vdpau_hevc.c index 3db7ec156a..b9e922ecfc 100644 --- a/libavcodec/vdpau_hevc.c +++ b/libavcodec/vdpau_hevc.c @@ -205,7 +205,7 @@ static int vdpau_hevc_start_frame(AVCodecContext *avctx, } } /* See section 7.4.7.2 of the specification. */ - info->NumPocTotalCurr = ff_hevc_frame_nb_refs(h); + info->NumPocTotalCurr = ff_hevc_frame_nb_refs(&h->sh, pps); if (sh->short_term_ref_pic_set_sps_flag == 0 && sh->short_term_rps) { /* Corresponds to specification field, NumDeltaPocs[RefRpsIdx]. Only applicable when short_term_ref_pic_set_sps_flag == 0. From patchwork Fri Jun 7 13:01:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49654 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1010479vqo; Fri, 7 Jun 2024 06:06:53 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUe6Zb4iF9yxSYZdsCXSqNgo42+WKKSwk518W3qxGOYvaqGKn+X3ao+lzIX2MN/o0rOw9ofWmgCuRfTQ1YU0DG6ZgAZR0OWdB487w== X-Google-Smtp-Source: AGHT+IGyHSD+1u5aZGJGu/Ui8PHepKYJJMv+15kKYRfyooks0LKMUbPhV7N7hyXxxlKBxUdxsmMI X-Received: by 2002:a17:906:a455:b0:a68:cb91:1b91 with SMTP id a640c23a62f3a-a6cd73c985emr154425366b.36.1717765613588; Fri, 07 Jun 2024 06:06:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765613; cv=none; d=google.com; s=arc-20160816; b=UZo+9hSDbW1dHkTtZ+wrsf2EG9hcOhTBjWHKzd3sh+NsLoZEGjgmk7VwHY3lK2Op6S c+QZk7f/S8t22w1/kkp6dloDPASkFjTVwOH8m9XD4f4ZKwYUdMOI2YrqflO7FhDMUFLx q8CDBRWUD/fvaKsxDN4R3J8pZFSFtFeC7E17OtReWDbE3HtSdKjjiMNXaBLa2V6y6THQ xCR661Uh23X2xQWvmBYpyUQBgFTMJoBbvnVhaDH/xi9RUZbao01aI2SGuwdeLpdNPNKJ U6ngs6bq08iLQ/K4an8lKe2M69hA7N/KEd8dJzYEMBtbiIvkNrELWTcQcksP47yp4rm0 UbqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=rT5lYmKRhG3IQDSW5YSAUfpG+VUyRwA3EO5wYpZxixU=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=T2nElkRkJ/CtUOjtiKRHXQCzoA3H/3jLqxtSKOqaJ+txgoD2Apd3h+mHjU8EXIPA1H jJn20UBiH9ftfvf0Cww9ZRN9mvFO+iaDnt4joNtHHUzMWa4+a2QcsAGgwMaJEOAi7osd 0C9qanbS2QupGZh2AObaFVMBaBs/hndqzztGGLqsSkX3qQqscYEWgzWhr4eU1/nmcpqS 4pl6oB6C4N9djHXybp0Jn9IbXDKit4XPUQ7tDMWRixDxFQZBz6goRfGNzZVdEkQO1gDf Q3rIGJQ4bN0D6+ZMDrvwkcgsO/t3WRa7QIGEL+xrXycqHzsEI+U7UKJG4wKQPr0J9Ey0 5mqg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=VAN3B604; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6e3516be02si54969566b.388.2024.06.07.06.06.52; Fri, 07 Jun 2024 06:06:53 -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=@khirnov.net header.s=mail header.b=VAN3B604; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2744668D80D; Fri, 7 Jun 2024 16:04:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8684768D76F for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=VAN3B604; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id A0B884DE7 for ; Fri, 7 Jun 2024 15:03:48 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id a7RVhCFjImXe for ; Fri, 7 Jun 2024 15:03:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=cG6+5CSkhn99F092qwFO8sYRm7J32tZK6qg7PlZ4wWU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=VAN3B604eXcBclpSEGMDsafbfd5V8DHDNp9sjuAF7ifNoNwFmyGqXdJNZvYGgnL3r 5gqaGBbNXTk1kHAvyDAg1CGysOWqoW4Z9+/qb098YeBiL/0BXx3z3bA6p8YaLx3dEn K/TUZjjj1T1bBsX6GsRFvps6YcGh66ypbzv6hc73jBn/Zo7fb0Mubt8UiCXcDdbnBA p20R41flgEYI18qL/N/16GzjQakzkTGFaj9eThzwiW+yeCrqOID64pL3aevyTSxsD3 DG1z9mDovoV3hHIRnIySUYVsGI9cegqyPNqafo4ctvg2L3VkehugyFv8imSK5nAISR 4wQ1v8ZGXnt7Q== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 064AD4DF6 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 433AB3A1540 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:16 +0200 Message-ID: <20240607130135.9088-20-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 20/39] lavc/hevcdec: only set no_rasl_output_flag for IRAP frames 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: X13sOqZIpqBk Its meaning is only specified for IRAP frames. As it's currently never used otherwise, this should not change decoder behaviour, but will be useful in future commits. --- libavcodec/hevc/hevcdec.c | 4 +++- libavcodec/hevc/hevcdec.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 585a066426..d444ea93f7 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -2925,7 +2925,9 @@ static int hevc_frame_start(HEVCContext *s) s->is_decoded = 0; s->first_nal_type = s->nal_unit_type; - s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) || (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos); + if (IS_IRAP(s)) + s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) || + (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos); /* 8.3.1 */ if (s->temporal_id == 0 && diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index 5eaebd3584..fa7caf9cf7 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -493,6 +493,7 @@ typedef struct HEVCContext { int overlap; int is_decoded; + // NoRaslOutputFlag associated with the last IRAP frame int no_rasl_output_flag; HEVCPredContext hpc; From patchwork Fri Jun 7 13:01:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49668 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1012743vqo; Fri, 7 Jun 2024 06:10:08 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVbOi2S36FGZAmkpRh/M1nYRIR3zfmZMrHdd5zN95cv9EvJNsbyFbtyzg+R3xkOc1Au05QJxvGO03xo2/fvdmZdw1b/svnQ/ANvPg== X-Google-Smtp-Source: AGHT+IHWtmSrsoIQSHViHU0/TL5NBObg3b0CJv37H0JuMc2BjMTfOAbdokTinGDRTlI7wTfp2RvC X-Received: by 2002:a17:906:749:b0:a55:9dec:355f with SMTP id a640c23a62f3a-a6cdc0e203cmr148513766b.70.1717765808084; Fri, 07 Jun 2024 06:10:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765808; cv=none; d=google.com; s=arc-20160816; b=mQ6Fxyxzo0uShqfE1EG5eFyVG5Zw+wqG5lIBsfHBB1sWWlMoBtWy3KdUylQ40/RRRn C1uhwLaIF0nLHT+XoTqvj9c9bsN1DY1pE4Uv/jXc91/c0SqfkRK2pt6GP7k7MTk6znIN 6++zvqxOZqqExEGTQ5wu8idGh2ILVtufevqzN9L4MjWWSUehnz51iis6HZoSYqWWFBjs QIfsIJw9Wz186xKXyu2onXUCLnJY3OiUDrOVuTKx3MQ6WzytVRMR8ukd83Qj31Zrr6pJ 8QdVGYOaKk46uHM9f6+m4DTFyeVG12VV3ffY1Yh0GEJ3iBHtxKezZtW0wqGp99QAlp3T U4LQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=VrA6iHsOGmqat2wafNpqL60/sTOlJApJQs73rAtj+70=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Ao6lfrCI4II7Bc6XX+i6bRQnefORY1XILB+6jVpu50f4fcTThUyykf7NQShqjY3W5j ETOoHk2aUs7LsYyKMIQKYMtGUr5XxTwyDUEtbzGTjuZZWwkbZ4x7MxBAFiKBLzImhEq3 95RQ1w3eG8ZSmU2i5QhQZHbxB2xapFd813dCkKGfB8RCfrL5Zlj8CPvgjV9RYBoMnDnf r9GL+FQ0Dg6HBWzJBR6AIAqriUB++wBG3AU8d1uBa3wws2Bqx6lddT3Pnkq28lsw5OpI hM+Oqa/3GHXHRVz/pVHtj6cd7Ue+MHi9t9Pm5CaxccmzVgMvKDK/1cw/UfzV8sVUgtPf XO6Q==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=kl6Q9m+d; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c806dba44si172836266b.282.2024.06.07.06.10.07; Fri, 07 Jun 2024 06:10:08 -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=@khirnov.net header.s=mail header.b=kl6Q9m+d; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5EA7468D870; Fri, 7 Jun 2024 16:04:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 113D068D7E6 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=kl6Q9m+d; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id DF9504DBC for ; Fri, 7 Jun 2024 15:03:46 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id Vs8kyNknjOQq for ; Fri, 7 Jun 2024 15:03:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=s0IW8zJI+GDMHWF/Em71DjO0UCErHeiBWu12dlDVqqI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=kl6Q9m+dVrLgGvfZpCY4sGvz6tqrBT82hY7xhEkZyWXCT6wzlxPfmb9Rzg1MWwnvH 5N1oiAbc+Ehe6LCUY4Q5IdpycYSIxh8lfO+f4MTgJe1g7TN2t8XMHHdZJUhfuiHCuG yHCR7KYOHaa0jAqol3rLQZ7UBvOm195wCV9IC35R9Ck4s0/ZtJePBQq59MeOVhu4cr 9AA27fouOtmR+KBb//2o2dvXrZo4Lw7HNNxDoQ8vZDrEOZJZiiC0pSKzcU2fbWK5Dv iTg2Yj9JEleKuMhqR9fV+xP+fIVw2V4nWds+AwWJjYM6JZD9C4GU8hCams5PZTX+hD 2Bu5vusCepRZA== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 064584DF5 for ; Fri, 7 Jun 2024 15:03:41 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 4E82C3A155A for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:17 +0200 Message-ID: <20240607130135.9088-21-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 21/39] lavc/hevcdec: output RASL frames based on the value of no_rasl_output_flag 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: xj9s5mCbkK/Z Instead of an ad-hoc scheme. Also, combine skipping RASL frames with skip_frame handling - current code seems flawed as it only executes for the first slice of a RASL frame and unnecessarily unsets is_decoded, which should not be set at this point anyway.. Some RASL frames in fate-hevc-afd-tc-sei that were previously discarded are now output. --- libavcodec/hevc/hevcdec.c | 33 ++++--------------------------- libavcodec/hevc/hevcdec.h | 1 - tests/ref/fate/hevc-afd-tc-sei | 36 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index d444ea93f7..a57fa4e539 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -605,7 +605,6 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) { s->seq_decode = (s->seq_decode + 1) & HEVC_SEQUENCE_COUNTER_MASK; - s->max_ra = INT_MAX; if (IS_IDR(s)) ff_hevc_clear_refs(s); } @@ -645,7 +644,6 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) s->avctx->pix_fmt = pix_fmt; s->seq_decode = (s->seq_decode + 1) & HEVC_SEQUENCE_COUNTER_MASK; - s->max_ra = INT_MAX; } sh->dependent_slice_segment_flag = 0; @@ -3106,32 +3104,15 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) } - if ( - (s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) || + if ((s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) || (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) || - (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s))) { + (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s)) || + ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) && + s->no_rasl_output_flag)) { break; } if (s->sh.first_slice_in_pic_flag) { - if (s->max_ra == INT_MAX) { - if (s->nal_unit_type == HEVC_NAL_CRA_NUT || IS_BLA(s)) { - s->max_ra = s->poc; - } else { - if (IS_IDR(s)) - s->max_ra = INT_MIN; - } - } - - if ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) && - s->poc <= s->max_ra) { - s->is_decoded = 0; - break; - } else { - if (s->nal_unit_type == HEVC_NAL_RASL_R && s->poc > s->max_ra) - s->max_ra = INT_MIN; - } - s->overlap ++; ret = hevc_frame_start(s); if (ret < 0) @@ -3196,7 +3177,6 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) case HEVC_NAL_EOS_NUT: case HEVC_NAL_EOB_NUT: s->seq_decode = (s->seq_decode + 1) & HEVC_SEQUENCE_COUNTER_MASK; - s->max_ra = INT_MAX; break; case HEVC_NAL_AUD: case HEVC_NAL_FD_NUT: @@ -3572,8 +3552,6 @@ static av_cold int hevc_init_context(AVCodecContext *avctx) return AVERROR(ENOMEM); } - s->max_ra = INT_MAX; - s->md5_ctx = av_md5_alloc(); if (!s->md5_ctx) return AVERROR(ENOMEM); @@ -3626,7 +3604,6 @@ static int hevc_update_thread_context(AVCodecContext *dst, s->seq_decode = s0->seq_decode; s->seq_output = s0->seq_output; s->poc_tid0 = s0->poc_tid0; - s->max_ra = s0->max_ra; s->eos = s0->eos; s->no_rasl_output_flag = s0->no_rasl_output_flag; @@ -3640,7 +3617,6 @@ static int hevc_update_thread_context(AVCodecContext *dst, if (s0->eos) { s->seq_decode = (s->seq_decode + 1) & HEVC_SEQUENCE_COUNTER_MASK; - s->max_ra = INT_MAX; } ret = ff_h2645_sei_ctx_replace(&s->sei.common, &s0->sei.common); @@ -3734,7 +3710,6 @@ static void hevc_decode_flush(AVCodecContext *avctx) ff_hevc_reset_sei(&s->sei); ff_dovi_ctx_flush(&s->dovi_ctx); av_buffer_unref(&s->rpu_buf); - s->max_ra = INT_MAX; s->eos = 1; if (FF_HW_HAS_CB(avctx, flush)) diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index fa7caf9cf7..04eacca76d 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -487,7 +487,6 @@ typedef struct HEVCContext { int slice_idx; ///< number of the slice being currently decoded int eos; ///< current packet contains an EOS/EOB NAL int last_eos; ///< last packet contains an EOS/EOB NAL - int max_ra; int bs_width; int bs_height; int overlap; diff --git a/tests/ref/fate/hevc-afd-tc-sei b/tests/ref/fate/hevc-afd-tc-sei index 27eb3fc8d7..735226745b 100644 --- a/tests/ref/fate/hevc-afd-tc-sei +++ b/tests/ref/fate/hevc-afd-tc-sei @@ -202,3 +202,39 @@ value=00:00:00:00 [/TIMECODE] [/SIDE_DATA] [/FRAME] +[FRAME] +[SIDE_DATA] +side_data_type=Active format description +active_format=8 +[/SIDE_DATA] +[SIDE_DATA] +side_data_type=SMPTE 12-1 timecode +[TIMECODE] +value=00:00:00:00 +[/TIMECODE] +[/SIDE_DATA] +[/FRAME] +[FRAME] +[SIDE_DATA] +side_data_type=Active format description +active_format=8 +[/SIDE_DATA] +[SIDE_DATA] +side_data_type=SMPTE 12-1 timecode +[TIMECODE] +value=00:00:00:00 +[/TIMECODE] +[/SIDE_DATA] +[/FRAME] +[FRAME] +[SIDE_DATA] +side_data_type=Active format description +active_format=8 +[/SIDE_DATA] +[SIDE_DATA] +side_data_type=SMPTE 12-1 timecode +[TIMECODE] +value=00:00:00:00 +[/TIMECODE] +[/SIDE_DATA] +[/FRAME] From patchwork Fri Jun 7 13:01:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49659 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1011066vqo; Fri, 7 Jun 2024 06:07:45 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXeHpsX1bElnEO9HlzKbJKTEEWsVdw03EKsqRf6d9fu/uBNYzdBFyo18zdneNeEUBmq/mWH/JQnelUWIRpHrYqOUZN9/S1mtoiWxw== X-Google-Smtp-Source: AGHT+IF3MUkITh0OWCoZvehRlLzsPrfWCP7cJKX2n6dUG4FqXSOsjGvjP1FZ0m6vXT4AJXx/oHbM X-Received: by 2002:a50:9fc6:0:b0:57a:7490:a872 with SMTP id 4fb4d7f45d1cf-57c508b7a59mr1744616a12.10.1717765665131; Fri, 07 Jun 2024 06:07:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765665; cv=none; d=google.com; s=arc-20160816; b=Tw2TJytg703NNkLVt1KeTiF70aMmPPaJ7N7cFSfZmaK6LcNQI5IrSIommKlkWVxu2K rpYMsTMb631lNpo7Bgiud8wFXg6ko3Xmn3OEmgnXbjjH2v9R6iqUqLxoTYmAQXTrztmV Vt2fxwEmVTCq/RP61ZZjf6s8EY7S1aCKLbEk0bF2fhZs29U5E5H8wlN3m9Z2HWHp3wtW n3WJ+tOLJsAkO4YXL31s1+bgRLiExSlChPwk3psXH87OvptlFy8DdpcYR/Z3BEMfzsD8 W+62zq2H2u4D3a8JI/X0CfprDbFAXaEVqa35SKz9nFWmbpQfnIn+mCqk3Xu/4fsydgMZ GrAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=zVKtw5YWvLEBHtW43cgnXHRiqfujsrOSKnPETOVP2Hk=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=JyxjROws+3OMMl+0YFbpBFY6eECU9X2CUUYZTDU+ISvI+Kf/CUGzO4+lLftwLGDMZ0 5Ot7KdIHeJ3r5vmcVHA3pGDTUW82W7QQtzemitlUX77ClUeRFiZF/88pnSgGiDYWgp4w 648hcCS0nt4R5sRcNbepsnjeFR4Dt3YwFFwoIHR3f+TAzT4x7ggZcIH2PJd+cXbYsrt9 RlyN54yLL3IwYOUcvimmEMNT+LZlliZH33iIJM1eBrfHonJiGQsvrRE5En+bz0JWH5gl xwo+a64YPP7fYcgBycqyiTkW7dGAPd/pmzz/rO0P5AuDOQVBA/h2Da18FWUodnwllUlK sFMA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=m7Q7rOMf; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c8070813asi177169566b.566.2024.06.07.06.07.44; Fri, 07 Jun 2024 06:07:45 -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=@khirnov.net header.s=mail header.b=m7Q7rOMf; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 39B9D68D82A; Fri, 7 Jun 2024 16:04:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B041368D77E for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=m7Q7rOMf; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id D1B454D42 for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id eHLgfjtf33iF for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=YhNaxof0j6H8GxcKEdkRbwMJwlKOfHRnF9Bw0aRRxgQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=m7Q7rOMfZ+zo4qK/7sl8a3lODBgtmyB+DM4IwELtUsjIq/7Uhp0BiCfkUMq90J82z oVE4GmqwiK9AiFiJpMBrhNcJPyf7cYpNKLhSBQP+xMp8V5Rk1AU0uC3ZnoekHTqb7j plNARSbpQb2QQfyn1Fs++F/a/3IBC4DDIDD1Z6hg01LOMHk4BfQnCPFGuwIJemMPLm DhwAD9t/gvvTf3fOnEMP2e0vqlshN2mDjR6Kq8E+IK2k8SMqSMNHfdq8HAkfsBNa60 jAEZfgHtym60L0mqAcKmDW8Ux2FE2wd62BXWZUUmp59hSK3RDhu6sOAfxrKwaulmPx ZPeTxMezRMEJw== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 559494DFE for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 5A5863A174D for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:18 +0200 Message-ID: <20240607130135.9088-22-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 22/39] lavc/hevc/cabac: do not infer WPP use based on HEVCContext.threads_number 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: p6Db2o/u0dj1 Pass this information explicitly instead. --- libavcodec/hevc/cabac.c | 7 ++++--- libavcodec/hevc/hevcdec.c | 4 ++-- libavcodec/hevc/hevcdec.h | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/libavcodec/hevc/cabac.c b/libavcodec/hevc/cabac.c index 8708efc248..39ca7c0135 100644 --- a/libavcodec/hevc/cabac.c +++ b/libavcodec/hevc/cabac.c @@ -452,7 +452,8 @@ static void cabac_init_state(HEVCLocalContext *lc, const HEVCContext *s) } int ff_hevc_cabac_init(HEVCLocalContext *lc, const HEVCPPS *pps, - int ctb_addr_ts, const uint8_t *data, size_t size) + int ctb_addr_ts, const uint8_t *data, size_t size, + int is_wpp) { const HEVCContext *const s = lc->parent; const HEVCSPS *const sps = pps->sps; @@ -479,7 +480,7 @@ int ff_hevc_cabac_init(HEVCLocalContext *lc, const HEVCPPS *pps, if (pps->tiles_enabled_flag && pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]) { int ret; - if (s->threads_number == 1) + if (!is_wpp) ret = cabac_reinit(lc); else { ret = ff_init_cabac_decoder(&lc->cc, data, size); @@ -492,7 +493,7 @@ int ff_hevc_cabac_init(HEVCLocalContext *lc, const HEVCPPS *pps, if (ctb_addr_ts % sps->ctb_width == 0) { int ret; get_cabac_terminate(&lc->cc); - if (s->threads_number == 1) + if (!is_wpp) ret = cabac_reinit(lc); else { ret = ff_init_cabac_decoder(&lc->cc, data, size); diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index a57fa4e539..e3773a6147 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -2599,7 +2599,7 @@ static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) y_ctb = (ctb_addr_rs / ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size; hls_decode_neighbour(lc, pps, sps, x_ctb, y_ctb, ctb_addr_ts); - ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, slice_data, slice_size); + ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, slice_data, slice_size, 0); if (ret < 0) { s->tab_slice_address[ctb_addr_rs] = -1; return ret; @@ -2669,7 +2669,7 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, return 0; } - ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, data, data_size); + ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, data, data_size, 1); if (ret < 0) goto error; hls_sao_param(lc, pps, sps, diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index 04eacca76d..22367602aa 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -579,7 +579,8 @@ int ff_hevc_slice_rpl(HEVCContext *s); void ff_hevc_save_states(HEVCLocalContext *lc, const HEVCPPS *pps, int ctb_addr_ts); int ff_hevc_cabac_init(HEVCLocalContext *lc, const HEVCPPS *pps, - int ctb_addr_ts, const uint8_t *data, size_t size); + int ctb_addr_ts, const uint8_t *data, size_t size, + int is_wpp); int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc); int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc); int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc); From patchwork Fri Jun 7 13:01:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49646 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1009415vqo; Fri, 7 Jun 2024 06:05:28 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWeDw0kF3SWK2Fi/hXab/VR8UrHBlm8Ou6i13nizzu9NTFsIy5nnZwmh9833msV9me6lIoqPwqFF/thBcSXc2nDVMjpmCTFSJ3t6w== X-Google-Smtp-Source: AGHT+IFly0Yv4zyfr/bUcZo5saPRjU1pG6noiWReAk11srqg+uyA1H7aANWMhp4KHuYAAhIqk1Ce X-Received: by 2002:a17:906:f80c:b0:a62:2cae:c02 with SMTP id a640c23a62f3a-a6cdacfeda4mr149743266b.61.1717765527861; Fri, 07 Jun 2024 06:05:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765527; cv=none; d=google.com; s=arc-20160816; b=wFQ9NjVZd3iiEY3s7SvUR4S8y1Pe7T00mlwFN1/l3/vDtjK6YX+82gfiLoeEtV7Iyq XMIxL4VC5oMQUmE5Cy9XB+xCKvXQU5NYjO5+cr0lcJN2KIFBtGurhOxzMi5FQwlYOKvi hS7sLTNuTpIwIBN/vVCpXwz42Y+rn+fVJebhNYtW0/O7sS6OSnemFr9y2KvhEmh76Fr4 dVUhel7yma365kFTeK01+5aAwS57VkMtiH5KEb3POzEMDIbTXE5r2AiIiNL1vmSF5xBg Jqy3GLUHSRFXIEXACHtzhWKpL0IyAPw9JScxmWna3DuBlMzV8GiX4bmavxhKZ7ynxVcM sWUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=qzJoYGLeR26LHEzp5SR9XR2ScV4QwfqWz3lX08s5tM4=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=OZZJc1wZwex18J/XrWPkWUN6OIhSPrdM92J/htZzSyUu3TBQMFfjNYoWyQe/pG4VRu w9XMxzfx8ogtgv14zf41GbXekxlcDWg2aMEjecF606fKd70s4PKS9VbY7hHTupPG96zQ er5TcvGbCVAAX61oWjeYKjqNEgHUELvG1XDb0XbBo3y/Z5PF1SEmI06IvRSRpEIUjsJY VqWl9Uprsbr1HIGRktyVw7SJt3dCBkgo3Vr8yOAAy0kyAqgQETjwOXyKs8P4EAfyS8aM abOvFPB6jPSNrOrayQVTeorLs7Nuz5/oETnixSIAR8bbgd92dJl9JP+i01qLJXuvYPXA 2rAw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b="qF/tG2m/"; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c80708549si179430466b.645.2024.06.07.06.05.27; Fri, 07 Jun 2024 06:05:27 -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=@khirnov.net header.s=mail header.b="qF/tG2m/"; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 322D268CEC6; Fri, 7 Jun 2024 16:04:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 49E1B68D761 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=qF/tG2m/; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 25F4C4DF4 for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id WqTt3D9klxwx for ; Fri, 7 Jun 2024 15:03:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=QLZMs344g7ynd5imVo3boYR8omPulKpWIwWBpv1qLyI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=qF/tG2m/waMqeuRkEG3juiuhPcwneUGp7ckNkHxQnB/X95fF4PG80Jo006NlqWKl2 Ay2N9quXcQ2BR7T2zfBIAbUtbtfl1moLVFDoRUbJ+SXaNxpWIFWZz/sGK+FnMVwnnH a6AJwrdytutQP5iER2OhLGfXjkmD7n9CptyCqrhdkt042Z83KFwHiOLNMJt3YBG/AH buwjURyZeqIqA9mV8ggq2k9i2AcWHhxOBr6rFAiPV75p1Iset4Up1JFLBgay20tNxu q0wfZZvmuilFqXr2akrq5j7juO3H5NzJRCWjDSrzBHExYR/lzQMEze/dmhQIr+v7dE Q/CcELZXonrvg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 55A334E02 for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 667E53A180F for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:19 +0200 Message-ID: <20240607130135.9088-23-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 23/39] lavc/hevcdec: drop redundant HEVCContext.threads_{type, number} 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: xyveLeYP9Rad They are useless duplicates of corresponding AVCodecContext fields. --- libavcodec/hevc/filter.c | 6 +++--- libavcodec/hevc/hevcdec.c | 36 +++++++++++++----------------------- libavcodec/hevc/hevcdec.h | 3 --- libavcodec/hevc/mvs.c | 4 ++-- libavcodec/hevc/refs.c | 2 +- 5 files changed, 19 insertions(+), 32 deletions(-) diff --git a/libavcodec/hevc/filter.c b/libavcodec/hevc/filter.c index 081b3a3898..56e354b486 100644 --- a/libavcodec/hevc/filter.c +++ b/libavcodec/hevc/filter.c @@ -892,15 +892,15 @@ void ff_hevc_hls_filter(HEVCLocalContext *lc, const HEVCPPS *pps, sao_filter_CTB(lc, s, pps, sps, x - ctb_size, y); if (y && x_end) { sao_filter_CTB(lc, s, pps, sps, x, y - ctb_size); - if (s->threads_type & FF_THREAD_FRAME ) + if (s->avctx->active_thread_type & FF_THREAD_FRAME ) ff_progress_frame_report(&s->cur_frame->tf, y); } if (x_end && y_end) { sao_filter_CTB(lc, s, pps, sps, x , y); - if (s->threads_type & FF_THREAD_FRAME ) + if (s->avctx->active_thread_type & FF_THREAD_FRAME ) ff_progress_frame_report(&s->cur_frame->tf, y + ctb_size); } - } else if (s->threads_type & FF_THREAD_FRAME && x_end) + } else if (s->avctx->active_thread_type & FF_THREAD_FRAME && x_end) ff_progress_frame_report(&s->cur_frame->tf, y + ctb_size - 4); } diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index e3773a6147..f867fdbea5 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -968,8 +968,6 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) unsigned val = get_bits_long(gb, offset_len); sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size } - if (s->threads_number > 1 && (pps->num_tile_rows > 1 || pps->num_tile_columns > 1)) - s->threads_number = 1; } } @@ -1870,7 +1868,7 @@ static void chroma_mc_bi(HEVCLocalContext *lc, static void hevc_await_progress(const HEVCContext *s, const HEVCFrame *ref, const Mv *mv, int y0, int height) { - if (s->threads_type == FF_THREAD_FRAME ) { + if (s->avctx->active_thread_type == FF_THREAD_FRAME ) { int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9); ff_progress_frame_await(&ref->tf, y); @@ -2631,7 +2629,7 @@ static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) return ctb_addr_ts; } -static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, +static int hls_decode_entry_wpp(AVCodecContext *avctx, void *hevc_lclist, int job, int self_id) { HEVCLocalContext *lc = &((HEVCLocalContext*)hevc_lclist)[self_id]; @@ -2643,7 +2641,7 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, int ctb_row = job; int ctb_addr_rs = s->sh.slice_ctb_addr_rs + ctb_row * ((sps->width + ctb_size - 1) >> sps->log2_ctb_size); int ctb_addr_ts = pps->ctb_addr_rs_to_ts[ctb_addr_rs]; - int thread = ctb_row % s->threads_number; + int thread = ctb_row % avctx->thread_count; const uint8_t *data = s->data + s->sh.offset[ctb_row]; const size_t data_size = s->sh.size[ctb_row]; @@ -2736,8 +2734,8 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) return AVERROR_INVALIDDATA; } - if (s->threads_number > s->nb_local_ctx) { - HEVCLocalContext *tmp = av_malloc_array(s->threads_number, sizeof(*s->local_ctx)); + if (s->avctx->thread_count > s->nb_local_ctx) { + HEVCLocalContext *tmp = av_malloc_array(s->avctx->thread_count, sizeof(*s->local_ctx)); if (!tmp) return AVERROR(ENOMEM); @@ -2746,7 +2744,7 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) av_free(s->local_ctx); s->local_ctx = tmp; - for (unsigned i = s->nb_local_ctx; i < s->threads_number; i++) { + for (unsigned i = s->nb_local_ctx; i < s->avctx->thread_count; i++) { tmp = &s->local_ctx[i]; memset(tmp, 0, sizeof(*tmp)); @@ -2756,7 +2754,7 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) tmp->common_cabac_state = &s->cabac; } - s->nb_local_ctx = s->threads_number; + s->nb_local_ctx = s->avctx->thread_count; } offset = s->sh.data_offset; @@ -2795,7 +2793,7 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) s->data = data; - for (i = 1; i < s->threads_number; i++) { + for (i = 1; i < s->nb_local_ctx; i++) { s->local_ctx[i].first_qp_group = 1; s->local_ctx[i].qp_y = s->local_ctx[0].qp_y; } @@ -3157,7 +3155,9 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) goto fail; } - if (s->threads_number > 1 && s->sh.num_entry_point_offsets > 0) + if (s->avctx->active_thread_type == FF_THREAD_SLICE && + s->sh.num_entry_point_offsets > 0 && + s->pps->num_tile_rows == 1 && s->pps->num_tile_columns == 1) ctb_addr_ts = hls_slice_data_wpp(s, nal); else ctb_addr_ts = hls_decode_entry(s, &gb); @@ -3282,7 +3282,7 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) } fail: - if (s->cur_frame && s->threads_type == FF_THREAD_FRAME) + if (s->cur_frame && s->avctx->active_thread_type == FF_THREAD_FRAME) ff_progress_frame_report(&s->cur_frame->tf, INT_MAX); return ret; @@ -3610,9 +3610,6 @@ static int hevc_update_thread_context(AVCodecContext *dst, s->is_nalff = s0->is_nalff; s->nal_length_size = s0->nal_length_size; - s->threads_number = s0->threads_number; - s->threads_type = s0->threads_type; - s->film_grain_warning_shown = s0->film_grain_warning_shown; if (s0->eos) { @@ -3660,17 +3657,10 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) int ret; if (avctx->active_thread_type & FF_THREAD_SLICE) { - s->threads_number = avctx->thread_count; ret = ff_slice_thread_init_progress(avctx); if (ret < 0) return ret; - } else - s->threads_number = 1; - - if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1) - s->threads_type = FF_THREAD_FRAME; - else - s->threads_type = FF_THREAD_SLICE; + } ret = hevc_init_context(avctx); if (ret < 0) diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index 22367602aa..75026a8deb 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -453,9 +453,6 @@ typedef struct HEVCContext { HEVCLocalContext *local_ctx; unsigned nb_local_ctx; - uint8_t threads_type; - uint8_t threads_number; - /** 1 if the independent slice segment header was successfully parsed */ uint8_t slice_initialized; diff --git a/libavcodec/hevc/mvs.c b/libavcodec/hevc/mvs.c index 3fd7be5b32..772fedceeb 100644 --- a/libavcodec/hevc/mvs.c +++ b/libavcodec/hevc/mvs.c @@ -248,7 +248,7 @@ static int temporal_luma_motion_vector(const HEVCContext *s, const HEVCSPS *sps, x < sps->width) { x &= ~15; y &= ~15; - if (s->threads_type == FF_THREAD_FRAME) + if (s->avctx->active_thread_type == FF_THREAD_FRAME) ff_progress_frame_await(&ref->tf, y); x_pu = x >> sps->log2_min_pu_size; y_pu = y >> sps->log2_min_pu_size; @@ -262,7 +262,7 @@ static int temporal_luma_motion_vector(const HEVCContext *s, const HEVCSPS *sps, y = y0 + (nPbH >> 1); x &= ~15; y &= ~15; - if (s->threads_type == FF_THREAD_FRAME) + if (s->avctx->active_thread_type == FF_THREAD_FRAME) ff_progress_frame_await(&ref->tf, y); x_pu = x >> sps->log2_min_pu_size; y_pu = y >> sps->log2_min_pu_size; diff --git a/libavcodec/hevc/refs.c b/libavcodec/hevc/refs.c index 5bd5eab9f1..48fc4d27da 100644 --- a/libavcodec/hevc/refs.c +++ b/libavcodec/hevc/refs.c @@ -435,7 +435,7 @@ static HEVCFrame *generate_missing_ref(HEVCContext *s, int poc) frame->sequence = HEVC_SEQUENCE_COUNTER_INVALID; frame->flags = 0; - if (s->threads_type == FF_THREAD_FRAME) + if (s->avctx->active_thread_type == FF_THREAD_FRAME) ff_progress_frame_report(&frame->tf, INT_MAX); return frame; From patchwork Fri Jun 7 13:01:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49658 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1010929vqo; Fri, 7 Jun 2024 06:07:35 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUbDjFcknnBoV51TuyJUHyifQpMGo5lvPPO3tkCF4jt/q0psDsxoRyb3DAY0mTxzRwMjZLQMwY8IX7r6lq10Hz2uSvXM95wDaEqTA== X-Google-Smtp-Source: AGHT+IG3OuNlqXMS1uRicOyyrQC93BMpBqI7sO44LK2jwrx4nFt+TtVnkyAFgXZb6ZCy2ClyxPan X-Received: by 2002:a50:96c2:0:b0:57c:6042:2224 with SMTP id 4fb4d7f45d1cf-57c604225dbmr554740a12.24.1717765654934; Fri, 07 Jun 2024 06:07:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765654; cv=none; d=google.com; s=arc-20160816; b=a0YB3l2Pfpezk3klRg9XeOaoeUKe8P/2gU5UFSerHgSTISY1kgIc6ErGe9UGhgE+bz bQjtDxlM8VIK3yNm48UGTs9xFp1n6XTDko/SBTARuLxRmiG9MTim04zYMHY61WDixnRb KI6iCA5i3F3TbwkdGMHc89WZoRUyV8zBOb9D+2J2Lsm37VV9K5n2mLCPMRDYzZOpm7+1 i3sIXkodULt4oqYS3Vndr40GhQUtreffzxX/0Xkovh7pKwnSsmQtb8TJJGlMYwruywLN VinOHjGNWY1gS+H51vCkT3ji95e9hdpMOoUFYtjxM49gbYcppacdOuxcF0ri9SbpWJZQ g4xg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=1jIZC3S8Jzodue/D+7nMmGDLuKLAA4R1MedIA5tKa7g=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=dVUpqIJR91thBriWlFUiXHZJQrt5vXqCkSFQmCAfEAk7lwjzNoYWJovNZ/56z6LlAz 0/Rz49EaX4NuzK88QvnDa1y5NoBtZWD1tkmtS2me9xepQ76sJsucuXuZUueYVXX/TUvy 4+Hek7rjPVrLBEJg2OpvkUu/iiabX0vIqZLpFEbLuj8/fI8pm6J8lalC4R1MIaFK5fHt d/vaj+kwMLSzA7nqZdh8b4Z9y0NrOKKvUGamF+SRlSAXWFgaB6rlIHPGgMib8uDetHh5 paISoWTJ8keto651AW+OQrfWnwZ3/h8w5NpHNe5LFy3zeAth7hwGHL7ftmRAV7p30rFS JQ6Q==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=F0a0tnxs; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57c5f4ef258si426998a12.240.2024.06.07.06.07.34; Fri, 07 Jun 2024 06:07:34 -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=@khirnov.net header.s=mail header.b=F0a0tnxs; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E713F68D826; Fri, 7 Jun 2024 16:04:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B1AC768D785 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=F0a0tnxs; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 9D2374DA7 for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id KhjAB-kBuI_j for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=yTXOYU0el60SJpwvDc8RgHTTPACQcSsSySHbP2lTr6s=; h=From:To:Subject:Date:In-Reply-To:References:From; b=F0a0tnxsiDv+J5Hujhwa2Kab3VLVocpBR9SgNUZ9XTDbb1KMXb4tEhoZoiW9sjkpG jAgxGD9chjd6PO42J5yF0Ls+u4fZRkla6HIqTbcVpWwKGZZuqE+JCLJDogAF1M5AEk zIdUZjB9yqxPBw6STttc9vNR6h5mL3zLNlxajNAdpCBsAt0cntrPDdIUvde+7TrbO6 mXvjiml5vAHXwBP/fKR/oDtsNgy8PMX8Gaa549oNE7eZLoB6Z/F1bpMriZl0uULG78 SHWDsRvl1P75GcpX/pKM8e/RSygXIJCulALeU8PXSw3tfx0AwR3pDBUMtsAKuSVYGv Sp+AOcGrL9uLQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 6B8644E04 for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 71F903A1877 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:20 +0200 Message-ID: <20240607130135.9088-24-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 24/39] lavc/hevcdec: store slice header POC in SliceHeader 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: dMuxSwD1Yw1C Rather than decoding directly into HEVCContext.poc. This is a step towards constifying HEVCContext in hls_slice_header(). --- libavcodec/hevc/hevcdec.c | 13 +++++++------ libavcodec/hevc/hevcdec.h | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index f867fdbea5..df6d1565bc 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -706,14 +706,14 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->pic_order_cnt_lsb = get_bits(gb, sps->log2_max_poc_lsb); poc = ff_hevc_compute_poc(sps, s->poc_tid0, sh->pic_order_cnt_lsb, s->nal_unit_type); - if (!sh->first_slice_in_pic_flag && poc != s->poc) { + if (!sh->first_slice_in_pic_flag && poc != sh->poc) { av_log(s->avctx, AV_LOG_WARNING, - "Ignoring POC change between slices: %d -> %d\n", s->poc, poc); + "Ignoring POC change between slices: %d -> %d\n", poc, sh->poc); if (s->avctx->err_recognition & AV_EF_EXPLODE) return AVERROR_INVALIDDATA; - poc = s->poc; + poc = sh->poc; } - s->poc = poc; + sh->poc = poc; sh->short_term_ref_pic_set_sps_flag = get_bits1(gb); pos = get_bits_left(gb); @@ -738,7 +738,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->short_term_ref_pic_set_size = pos - get_bits_left(gb); pos = get_bits_left(gb); - ret = decode_lt_rps(sps, &sh->long_term_rps, gb, s->poc, sh->pic_order_cnt_lsb); + ret = decode_lt_rps(sps, &sh->long_term_rps, gb, sh->poc, sh->pic_order_cnt_lsb); if (ret < 0) { av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n"); if (s->avctx->err_recognition & AV_EF_EXPLODE) @@ -751,7 +751,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) else sh->slice_temporal_mvp_enabled_flag = 0; } else { - s->poc = 0; + sh->poc = 0; sh->pic_order_cnt_lsb = 0; sh->short_term_ref_pic_set_sps_flag = 0; sh->short_term_ref_pic_set_size = 0; @@ -2920,6 +2920,7 @@ static int hevc_frame_start(HEVCContext *s) s->is_decoded = 0; s->first_nal_type = s->nal_unit_type; + s->poc = s->sh.poc; if (IS_IRAP(s)) s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) || diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index 75026a8deb..e47a7107c8 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -209,6 +209,7 @@ typedef struct SliceHeader { enum HEVCSliceType slice_type; int pic_order_cnt_lsb; + int poc; uint8_t first_slice_in_pic_flag; uint8_t dependent_slice_segment_flag; From patchwork Fri Jun 7 13:01:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49661 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1011359vqo; Fri, 7 Jun 2024 06:08:06 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW/piUe0AhodpYkoOfvm9bSo90sJRhozOyz9oIP1lWHF6zfqcbuLa/uHS2no65yEFKMP7TGr2uC3mXANpC7g/ipYRgT252sp7JbiA== X-Google-Smtp-Source: AGHT+IF0TcenPX2xjS5+coc2vVnmAOGQ41kPvJDkLGbKzr4z7udoZwzsb4s/+9EkGakB+rN18cK0 X-Received: by 2002:a05:6512:3d06:b0:518:dae6:d0ec with SMTP id 2adb3069b0e04-52bb9f5ba2emr2795362e87.4.1717765686400; Fri, 07 Jun 2024 06:08:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765686; cv=none; d=google.com; s=arc-20160816; b=xComIUHd1uUr2BdGMIQMu3hqn1QzIdixO6ctHxiSDWXwdehP//0wNydryHYGGseKe8 cIC7GCLCv/V7Vqqm3z/NkIN4zwAOpOoT31YAdDl0b4KVl2oNC4GKmDHM3+PPeIsIaPiP uNlXqHGKbWpKwIbsyb6rwnOiaXLdQ+m5wRKD+ohlgnJ610uVwdgQwngvS8PW5TR5XZN8 egkUj5dn/W4Hb/vgl9GBsjLeNb9KBW+KxrYHRunGWk3QCeL6gqgM+s2BYWFQXtR847wg /LIAj4oPic4dnzyuIt3hICi8yfnwXj6dWDEOSjVOvBNRFYEHb6skCZ+vlWccN9p2qyj3 yTVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=ev3C6falqK2ZQQue2ZocyD77jgkeY95I++M9MkDXKRw=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=iHBAzXyDAWL8jUj+EmOScfkt7wOSKByF+l4vLNBwbkccwC7ScSoDoJEzP0Seg7986O sLQr1N5mDZrlIxwoM0cKGf6ygjlrw3GE++RIFnZbM/9ahLcy4PrTyx2ttjtFMD5vC3OZ Z1wLBs8hHiVydMwPJ3ByXeVh50pHowaJsDueaLa7NCidWiQLA9XqhGL6R6TPhkSNEt3i ubxEKshe+GKBY4RtYR1O1qeceDczBg+lVGG9XZQW4wI6YTrkhAWVc5avnq5aErboh+Dg 1Q6sTuDKRoaMsWN+eNVPPN02+2SKnRBk8SRWI7tY6FGTb4JfxRU31+Q+VYsFdgTlvI9w qmmQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=dzDTnnLW; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-52bc244c388si159386e87.440.2024.06.07.06.08.06; Fri, 07 Jun 2024 06:08: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=@khirnov.net header.s=mail header.b=dzDTnnLW; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C67DB68D834; Fri, 7 Jun 2024 16:04:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2FAFA68D763 for ; Fri, 7 Jun 2024 16:03:51 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=dzDTnnLW; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id E5CDF4D42 for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id T_FmAVUdbqDW for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=NAWiIs/3pvujQXjxuXfhm8AYxyuc1zoSq5HRPwfs114=; h=From:To:Subject:Date:In-Reply-To:References:From; b=dzDTnnLWRAFqp88Bjb59GNXjZhPwlcDPj78UjtFH/eRSZgibL9pOVbbu70V2qS5w9 vyDtcGPzq2hQoKDjuF87PCVV8yN68JedHRpNU62NieiRoAM4YdJXR25UyRoVK2qAWM KPcBXm2aCakCABjz+HUUHF/vfK6xo1EA2wa6XghLdykDXgqujT8WAFq1WSdgBetOV8 2owfFdl7Ps5iRy+T6DdE+f1i5STB0usbeDBLGyZDVU+v/RUlUzXjpeVm7wnyllsZS1 YnWmoQEEghBhUcIYf5ELKFlB0xBO0xsjBvBqn5X1GhYW+w4Ai/V1Ymdp22IRD6hEz6 QEx4TM7J2OtpQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 9075D4E0A for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 7D3E03A1951 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:21 +0200 Message-ID: <20240607130135.9088-25-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 25/39] lavc/hevcdec: move a slice segment sanity check to hls_slice_header() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NBKwLj4IzobB Combine it with an existing similar check. --- libavcodec/hevc/hevcdec.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index df6d1565bc..9c1d879953 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -1002,7 +1002,8 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) sh->slice_ctb_addr_rs = sh->slice_segment_addr; - if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) { + if (sh->dependent_slice_segment_flag && + (!sh->slice_ctb_addr_rs || !pps->ctb_addr_rs_to_ts[sh->slice_ctb_addr_rs])) { av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n"); return AVERROR_INVALIDDATA; } @@ -2577,11 +2578,6 @@ static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; int ret; - if (!ctb_addr_ts && s->sh.dependent_slice_segment_flag) { - av_log(s->avctx, AV_LOG_ERROR, "Impossible initial tile.\n"); - return AVERROR_INVALIDDATA; - } - if (s->sh.dependent_slice_segment_flag) { int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1]; if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) { From patchwork Fri Jun 7 13:01:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49657 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1010828vqo; Fri, 7 Jun 2024 06:07:26 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVqMmsca86ndg4qBTB0KijSmB6tl1EFXfIA5XFx9fRfihYUr0utrVmAkT/8ffTk2cYGQ6aWfee2IzAQHOzPE1I1bkbY+uxxLGNGfw== X-Google-Smtp-Source: AGHT+IErXCvZ8XNEHOhRsgp+NGH5zJ1eESHUX5to2VRQ4uEXsCC3is4zW2xIq6KNxAyA+Jd4hYZv X-Received: by 2002:a50:cd82:0:b0:57c:614c:56e7 with SMTP id 4fb4d7f45d1cf-57c614c5752mr361081a12.18.1717765645893; Fri, 07 Jun 2024 06:07:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765645; cv=none; d=google.com; s=arc-20160816; b=NR2rlQuC/lYI1JH6+nZm33W4u+VanefnZ0lM26xjY9qWc4LJZnkxKuR2gli/8nrBrE uA/P9wMwnCGou4UC8UtOuzpstwyImhnvQlSU178OZSiGcLvtdBBCZnXB/3VTSbRTLiW6 L23gJ06lN0VCevTpZa4eE7nhTbDPV++gtK3dEZ+l2SCsCwMhocoTuJ81IjoBwmUR3q/B eZlURsvt6lIL5P2sfjmS3yUw4fhMDE6kbBrvTfDERxkwxEqeOY+PGJdirX5VewOyNzqx wxgRXcUVFeo9RoVVzh51j0cqOSWCYdM/68XWrgYnU7OommY56Dv31lLr3sVZoCRXcnBO UIZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=sXM5tR2PZtQ95qfGvNhAHpTFt20XAazhkFBa31+ObLw=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=L03zICpqttmdnOn+b2qi9Q7Tiuj5yQA4AXH0jXExsAp0zZu+nl3VK9zZ2eBQR+607x LYhNKcMm+au80pfNN8rP/fhxfUoRpfcykNpDOPdaYjcGUEPT5hjme72P5sMxiKSgrOjA v7hIugfmWSPThEtzU+n51KqE4paFJr3aDm6me5bm9cJPrqMn0imM0YcYjrDMEs/6fOQk /Y8dydvPY59QVn+ciKsi5VHffjztesG47gB4cFTz3hxLdhXcT+vBzTbyN/aWCJZn22yZ pf/lYd1cayoZG+NQbz2TKebTPoPt6XymbY246Oq+WHPOZwAkCgETns+i3HC4m1gxoI4Y YVIQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b="rtez/uZ6"; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57aae1fdfb9si1753232a12.280.2024.06.07.06.07.24; Fri, 07 Jun 2024 06:07:25 -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=@khirnov.net header.s=mail header.b="rtez/uZ6"; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CC79568D81E; Fri, 7 Jun 2024 16:04:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AFF8068D763 for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=rtez/uZ6; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id DCABD4D76 for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id XM4rraa_yi5p for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=bN7AiHHSk3eoJwmWkocnm6OVR/kHvMeuHHhTP04JRtg=; h=From:To:Subject:Date:In-Reply-To:References:From; b=rtez/uZ6I5e2Tf7QgMTBH4Yd9IfqR5GMzmn9EZDCDR6T5QVw4tnQ/luPqGcObPJzk EVK9Ayyf/JK8OnsqK8YsHs88gEAu0DCiqGaBF8ma2zUoREzplVlZDG7JXpgXW6AHJS 03atHU7KUxZ67F6epQZXzLD6l9Sae3S70Ndl+cmC/m//dgOHsMid8uj6OGrNatfT9s ucjgyn/iy6tJGoPMUifVu6ipWk21RYoEHAdXtyL+JrRBJzDyV5h4Wun3Ul3AbFqiXu NoUyE7t8G+aU/ebGyoj7LE/jYp990CS3W9yMDlAdaMz4WUtFrszyJFId6aftOw8Jpd Vsg8gWUxEjZOA== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 7CD184E08 for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 883763A1A22 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:22 +0200 Message-ID: <20240607130135.9088-26-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 26/39] lavc/hevcdec: move slice decoding dispatch to its own function 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: VeKbQhTB0as1 Also move there a sanity check from hls_decode_entry() that should also be performed when WPP is active (note that the check is not moved to hls_slice_header() because it requires the HEVCContext.tab_slice_address to be set up). --- libavcodec/hevc/hevcdec.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 9c1d879953..bbcaa350c7 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -2578,14 +2578,6 @@ static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; int ret; - if (s->sh.dependent_slice_segment_flag) { - int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1]; - if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) { - av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n"); - return AVERROR_INVALIDDATA; - } - } - while (more_data && ctb_addr_ts < sps->ctb_size) { int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts]; @@ -2813,6 +2805,27 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) return res; } +static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext *gb) +{ + const HEVCPPS *pps = s->pps; + + if (s->sh.dependent_slice_segment_flag) { + int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; + int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1]; + if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) { + av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n"); + return AVERROR_INVALIDDATA; + } + } + + if (s->avctx->active_thread_type == FF_THREAD_SLICE && + s->sh.num_entry_point_offsets > 0 && + pps->num_tile_rows == 1 && pps->num_tile_columns == 1) + return hls_slice_data_wpp(s, nal); + + return hls_decode_entry(s, gb); +} + static int set_side_data(HEVCContext *s) { AVFrame *out = s->cur_frame->f; @@ -3152,12 +3165,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) goto fail; } - if (s->avctx->active_thread_type == FF_THREAD_SLICE && - s->sh.num_entry_point_offsets > 0 && - s->pps->num_tile_rows == 1 && s->pps->num_tile_columns == 1) - ctb_addr_ts = hls_slice_data_wpp(s, nal); - else - ctb_addr_ts = hls_decode_entry(s, &gb); + ctb_addr_ts = decode_slice_data(s, nal, &gb); if (ctb_addr_ts >= s->cur_frame->ctb_count) { ret = hevc_frame_end(s); if (ret < 0) From patchwork Fri Jun 7 13:01:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49652 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1010248vqo; Fri, 7 Jun 2024 06:06:34 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVfQ3MmnBTifw7k8dCV5JoAT8jFX8tTIMI3pnjkaI2UnnfeImOTfbR6zta3IARDzAPFbPk1R6EPv1RyBMotZq+NIQfROjDDTS7hFA== X-Google-Smtp-Source: AGHT+IGg4ZAgXAW/ctUoQGEs4RM4A1MjWuK1anBpMbOVnaNxEvxHerBaa6Lsp4q0y3q9Dkm9w574 X-Received: by 2002:a17:906:4090:b0:a6e:c5c0:ba42 with SMTP id a640c23a62f3a-a6ec5c0bb34mr78458166b.30.1717765594056; Fri, 07 Jun 2024 06:06:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765594; cv=none; d=google.com; s=arc-20160816; b=CEBoXuXzyaSdpJ/gQf4O3iv8vN94Bgq6leP0eCWs/1xqsUxsmGyu4f8n63/R2M3b6L N58llBRPx7o6E3JPIJZrER9w3HmhAuDeBB9PWl/HoS2blnWqtTDmmqtidPNjA4A8wshy 4KHxbDmOwpdDSbTEde6xd3XfZ1LLbBp2oUB5jRXYLIZgUmQ+HAoPgJ1D7UU+UTH1VfNd 7dPcM4C88vYD8Bdtz36bZOyhN7TKBafyO01Bhx9otBOOm2fYgY7PNkv6t8k6nn2EuJAI PnXDn1tNgJc3oL2e6TYrxqqVkBSXIHhsQN1DR7xZrHm5Op+dOuE6lsIvc8HhpOQIbPYY prgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=Aw+8vqIs0Dsm/j1AyQ+UOt11l4PVeM2m3wZ3GD/Woh8=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=JZvDg3i30b6Bu9GX7B7sp/YbReG52ZhwjjJBJLBa17AJhj8PosCQPzmATttGx1UWRI kjfhUGMgEFu2b/I78Gi9yMIlieXvptXpRE1z0lVIwsFHyvEpbNsbtCJy72ahCFra6FJ3 g1bz8cJpg516riioMLU9tPbzEa02mBbQitG+Bz4G3P5iWRS3SqFKe5XAp1x0JzeVO07l RFHNHbLmBQWPFz3NQlPXzUtwyMR2F/I4oV9Di+4dwgcat3cItxHQPiFowf4P8VDj8E6f qGDlga8LUU2tnZcR0Nwla5Zltj/DC1hkSy1E+HHX8pDvDPXyyWyWKI1/HClqEcGk58a6 SLlg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=TrdWSmLE; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c8bd0e898si119930766b.343.2024.06.07.06.06.32; Fri, 07 Jun 2024 06:06:34 -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=@khirnov.net header.s=mail header.b=TrdWSmLE; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 75D9968D7E3; Fri, 7 Jun 2024 16:04:09 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8655668D76C for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=TrdWSmLE; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 470DD4DE3 for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id tp2SJhRviBs8 for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=+tiLtGTGNwhZjSk8jdnmjPQFCInfASPgcoedArX747Y=; h=From:To:Subject:Date:In-Reply-To:References:From; b=TrdWSmLEaw4O6DJaR9uY9oJtU67A0UHnT4Ue6xhSuWFwKFBYgWjvyBN5SWNLdC05q qR7Nsv1Y7xUNsrOAjsnZkw+kHYNidRZjWM8HUhAE9Y97oZFg0Yobh5wNQcwmiWMTzu FvlU0CG3yJ+fCOPJ1brJkS3lUWTdjwywRdXk/cBw+LLM+T5oIw7M38GHf12Lz7Q2/2 zsg5gJH7U8Qcoo9M1wVehzNLQKLR7/9ssPOu3B1wc/YsIDyfccat3+Ekjgvvk3zjo3 +aQs/1jyUhvD+LYEwbEMu7qu+hJ5K8dQTGMeCo/HbZIt2n5tEPiWFpkinuOogXjyGr Bwn2E4PVcad7Q== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 7CD9E4E09 for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 93F043A1A42 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:23 +0200 Message-ID: <20240607130135.9088-27-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 27/39] lavc/hevcdec: move per-slice local_ctx setup out of hls_slice_header() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: r058zQrX6NTd Into decode_slice_data(). This is a step towards constifying HEVCContext in hls_slice_header(). --- libavcodec/hevc/hevcdec.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index bbcaa350c7..cda52e05ef 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -1014,14 +1014,7 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) return AVERROR_INVALIDDATA; } - s->local_ctx[0].first_qp_group = !s->sh.dependent_slice_segment_flag; - - if (!pps->cu_qp_delta_enabled_flag) - s->local_ctx[0].qp_y = s->sh.slice_qp; - s->slice_initialized = 1; - s->local_ctx[0].tu.cu_qp_offset_cb = 0; - s->local_ctx[0].tu.cu_qp_offset_cr = 0; return 0; } @@ -2818,6 +2811,14 @@ static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext } } + s->local_ctx[0].first_qp_group = !s->sh.dependent_slice_segment_flag; + + if (!pps->cu_qp_delta_enabled_flag) + s->local_ctx[0].qp_y = s->sh.slice_qp; + + s->local_ctx[0].tu.cu_qp_offset_cb = 0; + s->local_ctx[0].tu.cu_qp_offset_cr = 0; + if (s->avctx->active_thread_type == FF_THREAD_SLICE && s->sh.num_entry_point_offsets > 0 && pps->num_tile_rows == 1 && pps->num_tile_columns == 1) From patchwork Fri Jun 7 13:01:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49662 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1011463vqo; Fri, 7 Jun 2024 06:08:16 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUoDLwX6/g4PqcHsMXyXsk+8q059lEize9SQcSJe+ypnFtKNv+xGF6cUE5xRQbnf8M0OSZuK54e0wILHd9YcxDns2pzSzvt+w6Cww== X-Google-Smtp-Source: AGHT+IGtCqQcAf9S//iQ0ea+9PjVlrTB3VKY7/QmM4Y4/sc7GXSGLkBqyJI8Lsg/rPx9WahnN5uq X-Received: by 2002:a05:651c:1505:b0:2e0:e470:882f with SMTP id 38308e7fff4ca-2eadce3774amr19598471fa.28.1717765695923; Fri, 07 Jun 2024 06:08:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765695; cv=none; d=google.com; s=arc-20160816; b=fDuJK6UW4MvFVuQWl89aIBV3aCp9q/NcAy4jdqykud/VgiHA6oWbHnKVbz5ovGyjhJ xh8TxSdaUbPAuPB0iMmwZGuudIOxmBddPbVqJlWsfnLQc/mcZ4T8T0hBVHFVOAq4Gagf PlYMICykwEuxXyzK7OAgHKrazMhP3wqbzsrU85WvqKWE3jjfI0uYmsKK8vwIIqzE7PEt feU4d/EBlIPbdYZwckQlDiaGOnsZe9IB8Qiqygx+9Ha/2ZJ8cLrSi49KmVaUMEPN7ch2 VNlZi7JtSootkvpHzaZsIddexCX2GaGrtKZpMKM2QqhVjKnVdUMzoJSxuTJeL33kC/Pd h96w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=TRKeUAcHvQQjSC1exhdIo7l7ifpEgNEANcLpOz0pS4M=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=L9AYYHX9GB/xQVugP7Iil+AccLODVRlG47eJhwHezPuy3dsWk8MyOtnRQxKbFXzBPw zskgDrQiocAFKL8f83xZK/nvNf6NpB1245KIID0Y3loApjV2wfiX4L+HqyIpVbeXWuC8 iRIaO4sTyUlseFb7ZnZU+q16IO8KrZgYSfb4bJsViw7yundX0jogiVB5V/0zwb9/nOkj RQD1VVYPgAo+GP/nlUKvTOoIJDyckLJDYoOS8lR4VgeJusA7+Ga4lhqW+yd1JLbvasUR jN7KRUf4KjyuKdTXJovIx/uFW3PpWonjC6m+AfKSlFX/Qwg3v/Mus0cu8iKNzD2hRKAu RLlw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=rq9Wrsiz; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 38308e7fff4ca-2ead4134913si9746461fa.253.2024.06.07.06.08.15; Fri, 07 Jun 2024 06:08:15 -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=@khirnov.net header.s=mail header.b=rq9Wrsiz; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 439BE68D839; Fri, 7 Jun 2024 16:04:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3DB2F68D785 for ; Fri, 7 Jun 2024 16:03:51 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=rq9Wrsiz; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 26EC14D76 for ; Fri, 7 Jun 2024 15:03:51 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id Hco1C9AZTVjV for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=lDn7Pmj0Ka5EVWZNNvCMdHdSofydNR5oOSvySLS7z1Y=; h=From:To:Subject:Date:In-Reply-To:References:From; b=rq9WrsizeUv18R2JW30E0WXpVl8CThoXgXR5ozAyfTkI7NdOkG2oAoFXnf9BfWpiw wOQreTtq2f5svkf9Ev/WHK4I5un2K5X5nyzfO7AmblRlviFrYKPjX0Lbn111KOUFYS hmLyLJ5ADf3c0NQamHllOeJfPzr9P7ZtwLQnWGT7+SBYmtX1KV8bnGZtKTPfEqjWuz 4T/ynNPVL5pbvNHOU3DgGRqHtV6SrQJh/KKqw7JyP6mNbCBPXXA8Q05llOwQmblSfH 9/HsaV+PhOK7sVcsnQtVZDehGirGA3bsy4HxZAp1+C8RjZgSVMDGzd15FpyuS/385W NHkxBMLxSj8dw== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 7CC404E06 for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 9FB983A1A43 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:24 +0200 Message-ID: <20240607130135.9088-28-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 28/39] lavc/hevcdec: move calling hwaccel start_frame to hevc_frame_start() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: abjauRCrCXZ6 From decode_nal_unit(), as that is a more appropriate place for it. --- libavcodec/hevc/hevcdec.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index cda52e05ef..0bf68ea45c 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3006,7 +3006,11 @@ static int hevc_frame_start(HEVCContext *s) if (ret < 0) goto fail; - if (!s->avctx->hwaccel) + if (s->avctx->hwaccel) { + ret = FF_HW_CALL(s->avctx, start_frame, NULL, 0); + if (ret < 0) + goto fail; + } else ff_thread_finish_setup(s->avctx); return 0; @@ -3148,12 +3152,6 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) } } - if (s->sh.first_slice_in_pic_flag && s->avctx->hwaccel) { - ret = FF_HW_CALL(s->avctx, start_frame, NULL, 0); - if (ret < 0) - goto fail; - } - if (s->avctx->hwaccel) { ret = FF_HW_CALL(s->avctx, decode_slice, nal->raw_data, nal->raw_size); if (ret < 0) From patchwork Fri Jun 7 13:01:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49660 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1011194vqo; Fri, 7 Jun 2024 06:07:55 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUA0o9ZMMC968UqJw3b6Ph7HEKEFATR6Kn2R0m31trfA6TIOaIn/59Qql1OSLwxJ4me1jlqTdltHPdGdbMVI/PzAnQZ8cWZ7t2llA== X-Google-Smtp-Source: AGHT+IGKlVTbA7hFB0E3W+FYFVnRPGvixf2V900zH69/5VDA2jncZb1xEnk3PI2WPeeqn5SKwwCy X-Received: by 2002:a05:6512:1598:b0:52b:7a10:353d with SMTP id 2adb3069b0e04-52bb9fc974amr1963381e87.43.1717765675543; Fri, 07 Jun 2024 06:07:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765675; cv=none; d=google.com; s=arc-20160816; b=mXdFs5YnwcwSu46DGZf/6C0AQU2YFoXx03/jDGQflz3+hTJv8jsznfum3gszgs32yI kIC2Z+XLszfdtsbGQySqUviLrRjmIPfL8vEdJL7WGS7NKovEsWaGiqKFbu8/mBc/Y03R Sv8duQOTK2ffT/Q4MLxRlgs0AaZ6nM3ccDzH6/WsIq2kp3Q2Gxd0n2D0EglO5kvJdKJy 30i9/MbNMUOzF4ySqUSD++86+aufBnmMbkAdCeZZC/Y5G+4JyNrJExZRNsiJtRRIXMXq nSUIUT1KcDBk5zeBi0rvjbQbVeymGN5RQ7lMYsImtcKDjwEo15JR2p2wURXyIOyvQTKn 3S5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=qHMky4/KjP/xfVZUDHxtflBMtuqjkNm4JeD1rY9MEWA=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=N15NhZH7PQRlkr/KwjZmyqZNbWEo7S9+edz29vWufOKcLHjsr/klocltV/wkEU4pRc XOuLgClSIRlk19lrwr6dasv+09oAvgRXergNxnCXzcLN1lpisYwe64RQ1KJYQ6xv/UJG s8jf7vdkFm1o5U30MPHs0SUwZlTX8xv+xNNPSyOWt22Y7flffkjtmeEpR9bIlsCxM315 8gphtLLmmT4fSxLCE0xZUK2C8nKdqyx1X1hVKhY1IZaoLCHjtLlAjr7R1ZjvtPIhX6CU 5gxii2bBtdvJi0TCR0uAVtLckH4LCSzR6t1PLkQwKq75kfKO/XZxZZcCzspJf48NlmzI 4ycg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=Kh0hb95C; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-52bc3144befsi82810e87.328.2024.06.07.06.07.54; Fri, 07 Jun 2024 06:07:55 -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=@khirnov.net header.s=mail header.b=Kh0hb95C; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7D17668D82F; Fri, 7 Jun 2024 16:04:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E7B9868D76F for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=Kh0hb95C; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id D0A3B4D76 for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id IcLn3_T2jUsg for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=zXRNmjRmisussH92dLzqYKLX0QfbocptqStO8woikSY=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Kh0hb95C2emLxOiqOvl+pio85hCsX7FsYqA3DxVRbjs6gufHtvEhBxymBWFH2SBl1 8lc7y/qPGv2d/I7PvjjuStFRmAhJUl4KeMN7YrzkcyAawx4JpCr0jVRuKw9cCB4DV+ TvQ0ReBGGQnzZJtoKcSzP/JwQ8Tneoy5UZ0CkrilzqPhlwwBJINqXAAvENWUyUk93y RH82DNxQv6vfhpwWxd78ypDWeHKhr5FkXncd5rt25z3dVfRL603zGDaxo8ftYkLCmw HVrL8ErXOQZF/woVfWeakWe4oBhmik2z/yLLBRNEd15PWz4NOKf5w5akIZSRm+z7uN nAlvZyH9HKPNg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 7CBB44E05 for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id AB84F3A1A4F for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:25 +0200 Message-ID: <20240607130135.9088-29-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 29/39] lavc/hevcdec: move calling hwaccel decode_slice to decode_slice_data() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: zX0uXfDGNjPI From decode_nal_unit(), as that is a more appropriate place for it. --- libavcodec/hevc/hevcdec.c | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 0bf68ea45c..c148244361 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -2811,6 +2811,15 @@ static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext } } + if (s->avctx->hwaccel) + return FF_HW_CALL(s->avctx, decode_slice, nal->raw_data, nal->raw_size); + + if (s->avctx->profile == AV_PROFILE_HEVC_SCC) { + av_log(s->avctx, AV_LOG_ERROR, + "SCC profile is not yet implemented in hevc native decoder.\n"); + return AVERROR_PATCHWELCOME; + } + s->local_ctx[0].first_qp_group = !s->sh.dependent_slice_segment_flag; if (!pps->cu_qp_delta_enabled_flag) @@ -3152,30 +3161,17 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) } } - if (s->avctx->hwaccel) { - ret = FF_HW_CALL(s->avctx, decode_slice, nal->raw_data, nal->raw_size); + ctb_addr_ts = decode_slice_data(s, nal, &gb); + if (ctb_addr_ts >= s->cur_frame->ctb_count) { + ret = hevc_frame_end(s); if (ret < 0) goto fail; - } else { - if (s->avctx->profile == AV_PROFILE_HEVC_SCC) { - av_log(s->avctx, AV_LOG_ERROR, - "SCC profile is not yet implemented in hevc native decoder.\n"); - ret = AVERROR_PATCHWELCOME; - goto fail; - } + s->is_decoded = 1; + } - ctb_addr_ts = decode_slice_data(s, nal, &gb); - if (ctb_addr_ts >= s->cur_frame->ctb_count) { - ret = hevc_frame_end(s); - if (ret < 0) - goto fail; - s->is_decoded = 1; - } - - if (ctb_addr_ts < 0) { - ret = ctb_addr_ts; - goto fail; - } + if (ctb_addr_ts < 0) { + ret = ctb_addr_ts; + goto fail; } break; case HEVC_NAL_EOS_NUT: From patchwork Fri Jun 7 13:01:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49664 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1011699vqo; Fri, 7 Jun 2024 06:08:36 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXmI3x+j74UiC7y4JzHwh8OkuUlqimBuPt6p8FCmZnniy9pGoGQpFfvLMt8xNUW3ZB6MUubSXRByQ97LMzMAnOh8vfruj66jv6kAQ== X-Google-Smtp-Source: AGHT+IGG2cHx+7m1gKwP53OSq1EIXDaf3YDe19lUeRMEBUOTh7mNj9iuLTD1yiVYMXL6geBqIekZ X-Received: by 2002:a50:a415:0:b0:57a:2400:6fb9 with SMTP id 4fb4d7f45d1cf-57c50926b51mr1605642a12.20.1717765715661; Fri, 07 Jun 2024 06:08:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765715; cv=none; d=google.com; s=arc-20160816; b=Nn0TJO5DgPuX6yHUlqm1YrHKwAu6Q4RUZEYT5TsCLr0EIVDSiYxMSS3Uv6j60Jigd9 XLMsxOKBa5AJl6d2UScJbcga271x80+LGAxB1m1lk/1tLaOfj+2rTPr7zO6QHoZYy+pc ncT1dKO93AagGojogPIaTCWKxiPNLSDu0xApTDRyEIpq7ixXoJKkLVvTXfPglItQksgD hS0fqPsqTCqBAdbr+2cXOIywktooDnU47vN+sZzGfITit6FTIElJxrymrKOJIKDTN31V jofVR9GYnpIwfklvGGBt+t5lXqN5PzbZ6t+FPxXKew0V953FtDLX5uYt/2L5gCjc7oFa UJVw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=eGfVxkgzmGMpQminiAg/jt7g+GmKSnnGf9gp85PwAeU=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=sAEUiAb/o6ocV/UNwtao9fTZq0gPTPLYKJECQhj9O4V9YN8J7o2GRl6um9cyYnMbmT 49BLx6zAuSlqOH3eCnls2OYH8cX5ADP3oRYzRY/5+fXve1FSv/aLZrou/eDjo8TQ68SJ 62otJuoOHu93WAaA1qWlcPHeMIBkmxt1ajtQYVmwAD3lCEijfI1totI3FOnOGgvw88Q4 lm+CCg0b7mlSQ//4NEQkigcWAse28ZFd5DathmzYH2e6ph7IPJcPFrQH8e6MznA2weWw VFjPUNfzX9F8xmRZ7phyfh8s5htjr8buip9DXXkYwI6glqOEQo3sPgoDK6FE9M+C1hNF C4rg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=cGbSMI8p; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57c5f24ad96si442303a12.195.2024.06.07.06.08.35; Fri, 07 Jun 2024 06:08:35 -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=@khirnov.net header.s=mail header.b=cGbSMI8p; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5BE2068D842; Fri, 7 Jun 2024 16:04:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8F78568D7B3 for ; Fri, 7 Jun 2024 16:03:51 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=cGbSMI8p; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 7986C4D76 for ; Fri, 7 Jun 2024 15:03:51 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id AzOtRJtwHdap for ; Fri, 7 Jun 2024 15:03:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=nkhomVhzMfOqaIl57qMjt1QZ2bvZSSK4dF+uRSh56PQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=cGbSMI8p43ioqMJDgatvhAPfm+9Po34O1JH39vVmwd/SGFUY/ULz0ugRAKc0EDWtI k8ub4kgWVziCS/7VBaZVUvBbJudAIHTELeVokLQ1Gx3YVQ7LHfNqT0xYA4eg4KexvG n8xjQYoBMqc1x4M8uxhl0Aac9xbhc/pcxyH5GkXdHS2DG273dJb9QBXPSpwiIxg9lA M2I4wAzdc32hr/sdPiMIp4U/c33aGsaYzoKg901MFb6NezAwpNbbB65WbHsL38aAOO Js7md6gIZ+fKod3qFw3wgUhSZyt4OWpTOxCI+9ld7hpiUROQn6+GEmBTbY34vE/g9S Fg8tbnUQnCXNw== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id D3CDC4E0C for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id B72483A1A61 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:26 +0200 Message-ID: <20240607130135.9088-30-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 30/39] lavc/hevcdec: move constructing slice RPL to decode_slice_data() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: etSqSjZ4NvmC --- libavcodec/hevc/hevcdec.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index c148244361..804cceac3e 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -665,11 +665,9 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) if (!sh->dependent_slice_segment_flag) { sh->slice_addr = sh->slice_segment_addr; - s->slice_idx++; } } else { sh->slice_segment_addr = sh->slice_addr = 0; - s->slice_idx = 0; s->slice_initialized = 0; } @@ -2801,6 +2799,7 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext *gb) { const HEVCPPS *pps = s->pps; + int ret; if (s->sh.dependent_slice_segment_flag) { int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; @@ -2811,6 +2810,15 @@ static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext } } + if (!s->sh.dependent_slice_segment_flag && s->sh.slice_type != HEVC_SLICE_I) { + ret = ff_hevc_slice_rpl(s); + if (ret < 0) { + av_log(s->avctx, AV_LOG_WARNING, + "Error constructing the reference lists for the current slice.\n"); + return ret; + } + } + if (s->avctx->hwaccel) return FF_HW_CALL(s->avctx, decode_slice, nal->raw_data, nal->raw_size); @@ -2828,6 +2836,8 @@ static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext s->local_ctx[0].tu.cu_qp_offset_cb = 0; s->local_ctx[0].tu.cu_qp_offset_cr = 0; + s->slice_idx += !s->sh.dependent_slice_segment_flag; + if (s->avctx->active_thread_type == FF_THREAD_SLICE && s->sh.num_entry_point_offsets > 0 && pps->num_tile_rows == 1 && pps->num_tile_columns == 1) @@ -2938,6 +2948,7 @@ static int hevc_frame_start(HEVCContext *s) memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address)); s->is_decoded = 0; + s->slice_idx = 0; s->first_nal_type = s->nal_unit_type; s->poc = s->sh.poc; @@ -3151,16 +3162,6 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) return AVERROR_INVALIDDATA; } - if (!s->sh.dependent_slice_segment_flag && - s->sh.slice_type != HEVC_SLICE_I) { - ret = ff_hevc_slice_rpl(s); - if (ret < 0) { - av_log(s->avctx, AV_LOG_WARNING, - "Error constructing the reference lists for the current slice.\n"); - goto fail; - } - } - ctb_addr_ts = decode_slice_data(s, nal, &gb); if (ctb_addr_ts >= s->cur_frame->ctb_count) { ret = hevc_frame_end(s); From patchwork Fri Jun 7 13:01:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49669 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1012925vqo; Fri, 7 Jun 2024 06:10:23 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCULWKdy9+V5kQjWrEMK8ZoNAgmBtxbl8Phjj7vO8kc4GnREGI530uP9jevsIJXnZ+6ctBSWdADWWQ9SPnnr3KScIEt/cR/MAhVVGw== X-Google-Smtp-Source: AGHT+IEM2Gu2qkTQgZ+/q1bTN8NpksesjtxMlBzshk0EVyNNFPrtGaE9OnMtUNO9M2CX4qdpCraE X-Received: by 2002:a05:6512:15a0:b0:522:2a2c:759e with SMTP id 2adb3069b0e04-52bb9f5de1bmr2035648e87.6.1717765823750; Fri, 07 Jun 2024 06:10:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765823; cv=none; d=google.com; s=arc-20160816; b=QhJTeQ3svT0WaGhT0G45ozYezgCCOJPvZzk05Rkj/csdeB7WaIIKdlwLGwmIwgeSG/ hdFz6CHRMX+xAq5b4VH0wzuRwT025d8MACb9Lhp98XieM9K7LLTN/CxixO909OvJ5fYv XAHQ+unrb4TNNSrG/BdHlwwpRTZ/gogrKM77J1yvcU2K/XuUin0ZXXF3S2MGKzbYyacl Z1wuIjBaEAv9g8IJ/Ei/CgWWUWUbIN2owdZuOvfQslff5DUbEnB+EdvwmPVVWrzepWSv k59mziX69+exS7H4clLMz5Bwpn+of7GEPkkJ05zLaW3aHk04qZFMinkJQE9nfKdCqkjU HHtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=nW/it4sttWBzGpxLc+lX+sYgbQMwlZpagQB4PUglzKE=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=sCoouXd/jWmC9lY0V1wFBGwPZSGHDm/WD8B1GKyZPCc0P4g2+LGxwUlsnUiQRS9Zgs V1IYZu1WZQqbXudzWdG4GxoEx71DsOA8CmYP8sVT4pO2FnZBAOHNlLMX1K79gNrg5+F0 fWIEYqwvzblRH/RAYzKg5se64+TEGHkJXAz4/kEvAi6S0Wtrl4z+U8ryG30hbCNEjrC6 JNq639XSHYwXDGqN61AttHbMsxzQ9ogzOjlFkjElk97fVtpO310rccE4ENQ0/ANDWTmt lCw80T2DASvsPBd8WsflXa9aVkQsMEYqmMliIu37///DxdrJciNU23IU4xBX/QyDVTXP uS5A==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=KyaSNuPm; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 2adb3069b0e04-52bb41dbff1si1024348e87.334.2024.06.07.06.10.20; Fri, 07 Jun 2024 06:10:23 -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=@khirnov.net header.s=mail header.b=KyaSNuPm; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8C36C68D874; Fri, 7 Jun 2024 16:04:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4252568D2A2 for ; Fri, 7 Jun 2024 16:03:52 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=KyaSNuPm; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 2DF5D4D76 for ; Fri, 7 Jun 2024 15:03:52 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id 2xle7cKVK7Zm for ; Fri, 7 Jun 2024 15:03:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765423; bh=kCYiNFk8I7jqt9yzhJAmkemhXb+6n5JsA40aYc5T6lQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=KyaSNuPmbrZ1c6088AbA8Vs6C1U50GfUU83kp5Wk8sw1oyNjd59Qo4IX3vxRbDGGR /+skIik4TITnLevkyc1oTA82/ilqnE7kbmbrCBorK5rq2AL3AdST/iocLBshoxoAP1 7rpdH4d+lqL6nyRehomJar66uqBXQ6wfnKCK0VqsRa6PhdYAccYE2f7HC8pSxCiuQ4 Fbf/MApn8+GHCwLen4aY1a2NweN7TEMZDnFEXUeb9gWHndbU5Vg54+WEthArBN6GIQ hlt+XWsWJnz7p46hvLEbzE8oac/scr57ZhXvpT6TB7zjkHXzwAkGAofEtlogfMUJel woUodSE8O+FWA== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id F1BAD4DFC for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id CE9463A1ABC for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:28 +0200 Message-ID: <20240607130135.9088-32-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 32/39] lavc/hevcdec: move sequence increment/IDR handling to hevc_frame_start() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: yHDyWEgUO09V From hls_slice_header(). It is only done once per frame, so that is a more appropriate place for this code. --- libavcodec/hevc/hevcdec.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 9abae3260d..b13e3e06a3 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -604,11 +604,6 @@ static int hls_slice_header(HEVCContext *s, GetBitContext *gb) return 1; // This slice will be skipped later, do not corrupt state } - if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) { - s->seq_decode = (s->seq_decode + 1) & HEVC_SEQUENCE_COUNTER_MASK; - if (IS_IDR(s)) - ff_hevc_clear_refs(s); - } sh->no_output_of_prior_pics_flag = 0; if (IS_IRAP(s)) sh->no_output_of_prior_pics_flag = get_bits1(gb); @@ -2949,6 +2944,12 @@ static int hevc_frame_start(HEVCContext *s) memset(s->is_pcm, 0, (sps->min_pu_width + 1) * (sps->min_pu_height + 1)); memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address)); + if ((IS_IDR(s) || IS_BLA(s))) { + s->seq_decode = (s->seq_decode + 1) & HEVC_SEQUENCE_COUNTER_MASK; + if (IS_IDR(s)) + ff_hevc_clear_refs(s); + } + s->is_decoded = 0; s->slice_idx = 0; s->first_nal_type = s->nal_unit_type; From patchwork Fri Jun 7 13:01:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49653 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1010362vqo; Fri, 7 Jun 2024 06:06:43 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCU2do+5V1CF8VPc/+aEj3zGif8K4Rgdn10ZggFnWzZsIQ7Ahk22zEnxynaqIkzKYmJ03uPFu4qS8BhDaTs58101Lrz/ha+sRJknhg== X-Google-Smtp-Source: AGHT+IHp5h7f5kL19nBja09iuJJ84nQDU+J8QA6jPgxdk8OIffIU2qtKxi1bZw7dP6vYdwXcZMkR X-Received: by 2002:a17:906:e949:b0:a62:2eca:4f12 with SMTP id a640c23a62f3a-a6cdb203fc6mr165574266b.59.1717765603317; Fri, 07 Jun 2024 06:06:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765603; cv=none; d=google.com; s=arc-20160816; b=m5qx6Wo2JerfM6ZimtqO6WRVLY8HULgvBV4OSKM6TqIzehBZMM9fkgmoeV0x9z1dS8 hmdzv5CudF6X3Q0MBX3MGwO4tWqIyFuViz4YVoexH3xLHPpKPaTcc8buq6OZLrkXEskC qpeAcY4qF9ogE4Hbp6QQ5I2LMxEXK1THTp7UTDGfLw9eAJC/GHR/W+pAFfT7Uf9SSdZJ C1xDNLlw6n462p78e9F+1UXOGkdVNwSphOVdWVsWMHyYdUwxA2bbSLvZ7HggZUz6Uv6i yBEwyp43Gx4jbWMWZ7RXBrxdbIIIBo1V6rEAzrjhSlTQDAyDMWGkcbe6KnB4/KeAqSaS gcEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=pFsI+1EMH9BPDipBw9ICs7BEWnXBVGRHDn2Ms+mTyII=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=DHnza9sY2wv6hexnbFuHD8mqvfVAIxa6/uRszgH5PDXRLeUKS9zyEOm3/mVC6sFIdE Hqd4MiVx8vjv4ERH4oH1JpksptoDMRZmTeqh+hLIgYAjDu8ItJpyy6lxgDpoyPtWjhYy O9sXtiOvOwnObF/+7g1F+0aMOTnXWPiXyi2OxP1NuZzvHHlX+pPXG0F0GtRU3gOTYhPB mqCuVDbS5IKAojAvBK8/GruMdj4T2OM2sGKblJ9pjz0KQEVLrGuaZvJeiGdAqHNr/mOQ TD/NOPAJPfT/aYQdaJw927G33v1PWJDxKpjf5SKIhYMj7BYEvJ8CzbdUdh2Rp0VMITDO Hd9Q==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=GmDT7oEk; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6e27975456si52985466b.232.2024.06.07.06.06.42; Fri, 07 Jun 2024 06:06:43 -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=@khirnov.net header.s=mail header.b=GmDT7oEk; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BB7D868D807; Fri, 7 Jun 2024 16:04:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8693D68D78D for ; Fri, 7 Jun 2024 16:03:50 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=GmDT7oEk; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 330694DA7 for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id ZsRUdjTeMvbG for ; Fri, 7 Jun 2024 15:03:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=omURZJUN95BoyjKrC0b+G9dEXlPbwIaLFXQrEPBsUx8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=GmDT7oEkEnx+Dtsf8guOd1+iDekVZN3gqIyOqBcR8sss2nOjnOIo4D7JAytDn3n+L TH0aQ+TQZN6j0bMuymFMO1thcglKtaiY8E9atJGJbK9W9VqstkmlSbzUaw2j6IjSAk IIdFrltd+jyy/vtoAJdxfz/IlJrrnfRDCTj3v/N27r8x13kBnlk+Xw9ZaCUlQz88LV 8Dl8Qba8cfRj76mZ+SdJIsFq7AtMXsNiVW1QRGeSeYQMMrJlZ+yLiywjYSgaiyCp7W 1yQv2kX8FyhCqPHeR/bSAk9PbvE45Xy2R+5dAt1hzUOQB32rxDp3xfx7mm55dMTdAl VKiO+ad7CpmUg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 7CCBE4E07 for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id F1F483A25E9 for ; Fri, 07 Jun 2024 15:03:35 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:31 +0200 Message-ID: <20240607130135.9088-35-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 35/39] lavc/hevcdec: drop a redundant multiple-frame-per-packet check 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: S6V3SqGSqoqD --- libavcodec/hevc/hevcdec.c | 4 ---- libavcodec/hevc/hevcdec.h | 1 - 2 files changed, 5 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index a241e25196..b9aea45edb 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3143,7 +3143,6 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) goto fail; } - s->overlap ++; ret = hevc_frame_start(s); if (ret < 0) return ret; @@ -3204,7 +3203,6 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) s->cur_frame = s->collocated_ref = NULL; s->last_eos = s->eos; s->eos = 0; - s->overlap = 0; s->slice_initialized = 0; /* split the input packet into NAL units, so we know the upper bound on the @@ -3271,8 +3269,6 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) continue; ret = decode_nal_unit(s, nal); - if (ret >= 0 && s->overlap > 2) - ret = AVERROR_INVALIDDATA; if (ret < 0) { av_log(s->avctx, AV_LOG_WARNING, "Error parsing NAL unit #%d.\n", i); diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index e47a7107c8..f0443b3ab9 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -487,7 +487,6 @@ typedef struct HEVCContext { int last_eos; ///< last packet contains an EOS/EOB NAL int bs_width; int bs_height; - int overlap; int is_decoded; // NoRaslOutputFlag associated with the last IRAP frame From patchwork Fri Jun 7 13:01:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49663 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1011582vqo; Fri, 7 Jun 2024 06:08:25 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCV4G0NB40ZeWPpob+ZrlBqK9C4WJlb+BQgbg9qtPpNk2hfj6dxAysyve5cVy38mi+FT2KrBqmx4d4SbxPZJYknPiyqOqZ20j7vPkQ== X-Google-Smtp-Source: AGHT+IHcfjHF3gHMS3HjVo2A05mJuziojRv+QnLB99oTKjrKnNof0110MI2DtkfKG+hEq7GD6XcG X-Received: by 2002:a50:cdd4:0:b0:57a:1e62:4d56 with SMTP id 4fb4d7f45d1cf-57c5087ff5dmr1454812a12.1.1717765705537; Fri, 07 Jun 2024 06:08:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765705; cv=none; d=google.com; s=arc-20160816; b=P/HhUgevaIQ69uxmID2kfp3Kh7wYBWuiu3AMSa1Ognldc4LInZywaODi/Sam2efVvs Z82SsqXLmNY1Or93MGCSgcihmxMoP3DH/G6YQ8wKiLvgKhyXZ4p1adp5ByS6BfmG7p0i 9eUeOxhysW4qNhQZcxfvWi1tyM3KWozAob4tU200GR7Lt2RPVFjypYQAutYEltzcjr/F z3MwYAUjaKEYOuV0lGArjKuWQNNxFKTAcrZKsBCKQ83OOZXFJFWlc+eeShv4R5K1LgAU 6EeUf55M8056E45IUHGW0xv/KKRyTuYPsnQdKLh+Dm9TJjzUF1bt6vaxPFkNXXmbM3T8 kd3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=RCzr3cr7c+btoae+FjWxJxsxzdEe3a+XTVqS9PzPstE=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=ac1Pw2+qPJQK0Tr7FDvDI4qnAj+vP2ct+Lb4imX6h6Z+1DyM/i7mNZAyY0tROdclSH dzRC4R+Qr1X/TqYbgAX8IbLiD4BBX3tVo/OxAYjVl7Cyc7hgMYyDZqHCCmv4Z2s0L2xB 8BUUBq4BDJxLQCEzte+3odrLJZ3k0CEEX0dml5PA3Ztl9x1zMg5vj19eqSyrGkiRHLbX 2jr6E+M3+OlwDhPHwspymCuT4i1VcbXXB7BVdHJOjAQjVTEqKHFfb8yZej3bFY7sHp9f Nam/Lag4xUe2YLnhVqcOeCd5s5o/OMX7x5/WOVVSvrnhM12CWuFlSwO3mMCDP1sSrxbx rxig==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b="KU1J2/MP"; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 4fb4d7f45d1cf-57aae0fa2bfsi1805001a12.193.2024.06.07.06.08.24; Fri, 07 Jun 2024 06:08:25 -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=@khirnov.net header.s=mail header.b="KU1J2/MP"; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7EE3268D83E; Fri, 7 Jun 2024 16:04:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6133A68D782 for ; Fri, 7 Jun 2024 16:03:51 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=KU1J2/MP; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 4A31E4D42 for ; Fri, 7 Jun 2024 15:03:51 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id WoixkzKdX8pq for ; Fri, 7 Jun 2024 15:03:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765422; bh=q4HK3pE1oAvBJizObCHv9wYRFMuyYvF3Po4iXjbtF40=; h=From:To:Subject:Date:In-Reply-To:References:From; b=KU1J2/MPxvCCHvFoqCjwsnfU3JHcCERa5owhNAkXf+g2nEzulwixMk8iMt/bfzAAL O6OvuiGBthjFyekP5oSwvnrmhNkh7llbn28/HaBO8hl0UWqjIj8+BwIN/qvK9555EF 46Swrcn7yw+jhMN1CZi+fiWZVJaS8z+XHTmiRrVMLZxUVRYyNfc6b8s3zbFqjN8Agp pS2RBrRXYtx1Qm0jzuXH5wb3G+cQNtWvOo5Tt/EBJc9ofjcogL0iRKsCmZQwbWC8jj YuYI5U5YHCppyZ/iAymkPwnUhKAwT4g5IF1CGwY/kuvlv0EYnpf2m5iyzKsyBfTi3y HU8Ru+PGm1ppQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id B10894E0B for ; Fri, 7 Jun 2024 15:03:42 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 0A7933A2729 for ; Fri, 07 Jun 2024 15:03:36 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:32 +0200 Message-ID: <20240607130135.9088-36-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 36/39] lavc/hevcdec: factor decoding a slice NALU out of decode_nal_unit() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: OEg9YypQs6RX --- libavcodec/hevc/hevcdec.c | 97 +++++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index b9aea45edb..7263b80a24 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3065,10 +3065,60 @@ static int hevc_frame_end(HEVCContext *s) return 0; } +static int decode_slice(HEVCContext *s, const H2645NAL *nal, GetBitContext *gb) +{ + int ret; + + ret = hls_slice_header(&s->sh, s, gb); + if (ret < 0) + return ret; + + if ((s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) || + (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) || + (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s)) || + ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) && + s->no_rasl_output_flag)) { + return 0; + } + + if (s->sh.first_slice_in_pic_flag) { + if (s->cur_frame) { + av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n"); + return AVERROR_INVALIDDATA; + } + + ret = hevc_frame_start(s); + if (ret < 0) + return ret; + } else if (!s->cur_frame) { + av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n"); + return AVERROR_INVALIDDATA; + } + + if (s->nal_unit_type != s->first_nal_type) { + av_log(s->avctx, AV_LOG_ERROR, + "Non-matching NAL types of the VCL NALUs: %d %d\n", + s->first_nal_type, s->nal_unit_type); + return AVERROR_INVALIDDATA; + } + + ret = decode_slice_data(s, nal, gb); + if (ret < 0) + return ret; + if (ret >= s->cur_frame->ctb_count) { + ret = hevc_frame_end(s); + if (ret < 0) + return ret; + s->is_decoded = 1; + } + + return 0; +} + static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) { GetBitContext gb = nal->gb; - int ctb_addr_ts, ret; + int ret; s->nal_unit_type = nal->type; s->temporal_id = nal->temporal_id; @@ -3124,52 +3174,9 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) case HEVC_NAL_RADL_R: case HEVC_NAL_RASL_N: case HEVC_NAL_RASL_R: - ret = hls_slice_header(&s->sh, s, &gb); + ret = decode_slice(s, nal, &gb); if (ret < 0) - return ret; - - if ((s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) || - (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) || - (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s)) || - ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) && - s->no_rasl_output_flag)) { - break; - } - - if (s->sh.first_slice_in_pic_flag) { - if (s->cur_frame) { - av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n"); - ret = AVERROR_INVALIDDATA; - goto fail; - } - - ret = hevc_frame_start(s); - if (ret < 0) - return ret; - } else if (!s->cur_frame) { - av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n"); goto fail; - } - - if (s->nal_unit_type != s->first_nal_type) { - av_log(s->avctx, AV_LOG_ERROR, - "Non-matching NAL types of the VCL NALUs: %d %d\n", - s->first_nal_type, s->nal_unit_type); - return AVERROR_INVALIDDATA; - } - - ctb_addr_ts = decode_slice_data(s, nal, &gb); - if (ctb_addr_ts >= s->cur_frame->ctb_count) { - ret = hevc_frame_end(s); - if (ret < 0) - goto fail; - s->is_decoded = 1; - } - - if (ctb_addr_ts < 0) { - ret = ctb_addr_ts; - goto fail; - } break; case HEVC_NAL_EOS_NUT: case HEVC_NAL_EOB_NUT: From patchwork Fri Jun 7 13:01:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49671 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1018666vqo; Fri, 7 Jun 2024 06:19:09 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVT6z9eQHLfwDMl+cl8u72Gvs+QfulRbigxRq9iVGcQ35REfHoM2LQqQUHgEXdyuhqHcI7jxjrqI+N8yRh06SJ9km6Jk5Ayjy49PA== X-Google-Smtp-Source: AGHT+IHCmUg14GIMbV86cdnZxpQUk2ABD49d3CoU9MlU/bBtyxZ58GOCQy9Qz52nsnwud/CMMBb7 X-Received: by 2002:a17:906:380b:b0:a68:eade:17af with SMTP id a640c23a62f3a-a6cd665fca6mr189679666b.25.1717766349606; Fri, 07 Jun 2024 06:19:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717766349; cv=none; d=google.com; s=arc-20160816; b=R14cH3Z8AJIucVsgcCPdqhnzLO2obQ0wPbN7tbHIp4b7xdJvuHMOPP8bVMsikjg5Oi w8YNZC+Ay65Ioh+ZHIeDYQ7FIh/3rsa/qneen4mTo2zjnMbt2a13uPflImrZOq3tR24A 4eZlvdgyq5QjtrlknohrhSklIA5cqw7l1edDCLxF3O9LvSFidXYjLxXyEm9c+uxRJfuC QWokOHP2JTKyTyk9h0twsMSW7XgqtZbkJyFMb4XuJausql21OoLjNpSjvRdVflVwH4qo t3s/oZiVIvkm9/nwh9f/ZoBoJ8NfkmyXfIOJRNVfPnJDCl7LYfjXehJdD31Tju3C7RFv PbqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=egrfVuN1E1ld9K9+UIGZ+mAAAU/KKplgfUjNv+0A89E=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=xOb/v/PWBtuVQHkeP7wfFfuPptzTqIYc79UI17YLFFSMtOmnLDKPDx8lRSMVbmy8a0 iCHum5T78fRLkv4vxAJqwzjXyKBHV1Defqjlqv1uupgpkBvnj9HAb1YHFAlye9VJB4TZ BR3tblaKt2JONFWHq26Gz5fGYTq7I4o1+pdguIHkuL8mila54bKiCBQPAzl4xmM4BUnj mc3c5Y9q9BQhy0+BAx9zQjXOEVdzPMgqSoTbPHMGJHPPM8aodwf2MyZ+5ByZKNVavtPI gqY+VT3B4TIqkOZsluf8+mPKuApYbbNkHQADV92yA27Ou3AzV+qPrDLNV9ZJeRw1dmFY hmDw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b="sB0/tT0w"; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c80591cebsi186787066b.36.2024.06.07.06.19.09; Fri, 07 Jun 2024 06:19:09 -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=@khirnov.net header.s=mail header.b="sB0/tT0w"; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8E0BE68D7D5; Fri, 7 Jun 2024 16:08:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7DF7668D883 for ; Fri, 7 Jun 2024 16:08:45 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=sB0/tT0w; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 298ED4DBC for ; Fri, 7 Jun 2024 15:08:45 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id n6y075bVh-jz for ; Fri, 7 Jun 2024 15:08:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765724; bh=L3mfQq3CId1Y1SArgMRDjx4TU/fdy6B88z737ZL+XwM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=sB0/tT0wMvPV/8ePtCytwMJ2KT3j58NaK/qL1dA05LRPrMt7HDYOTBfG0H7jQ3a6+ wfCiVOxCxwDBqick7txELRBGqAFWSX5sJiZrAuQvGrRrxlRPSEpi0uq9tNeoV2zvMv xU5ZRrZqem2ga4gQ9lGY6cnP0LG84dC/V3vPZqZwqUSiWttLBHReqw6LWlF9EuRT/s EhFDEz35MDf4k0tG86MeTpp90B7KcYdax8RuTao1LBf3F3ODsJvDjdPD7V8ItcBeo7 jL+xtxN0We8HpvkSa8qyajWjURV1X5zyQOxBxnQrE+HzbJL/dAs50I3bAVMFttI2jE l3qB1IiRL4M9g== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 9A74D4D9D for ; Fri, 7 Jun 2024 15:08:44 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 1616E3A274F for ; Fri, 07 Jun 2024 15:03:36 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:33 +0200 Message-ID: <20240607130135.9088-37-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 37/39] lavc/hevcdec: move some frame-end code to hevc_frame_end() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: HKpSEp330jlR Specifically, calling hwaccel end_frame, verifying frame checksum, and printing the frame-was-decoded message. --- libavcodec/hevc/hevcdec.c | 187 +++++++++++++++++++------------------- libavcodec/hevc/hevcdec.h | 1 - 2 files changed, 91 insertions(+), 97 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 7263b80a24..a8c2172674 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -2942,7 +2942,6 @@ static int hevc_frame_start(HEVCContext *s) ff_hevc_clear_refs(s); } - s->is_decoded = 0; s->slice_idx = 0; s->first_nal_type = s->nal_unit_type; s->poc = s->sh.poc; @@ -3038,6 +3037,75 @@ fail: return ret; } +static int verify_md5(HEVCContext *s, AVFrame *frame) +{ + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); + char msg_buf[4 * (50 + 2 * 2 * 16 /* MD5-size */)]; + int pixel_shift; + int err = 0; + int i, j; + + if (!desc) + return AVERROR(EINVAL); + + pixel_shift = desc->comp[0].depth > 8; + + /* the checksums are LE, so we have to byteswap for >8bpp formats + * on BE arches */ +#if HAVE_BIGENDIAN + if (pixel_shift && !s->checksum_buf) { + av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size, + FFMAX3(frame->linesize[0], frame->linesize[1], + frame->linesize[2])); + if (!s->checksum_buf) + return AVERROR(ENOMEM); + } +#endif + + msg_buf[0] = '\0'; + for (i = 0; frame->data[i]; i++) { + int width = s->avctx->coded_width; + int height = s->avctx->coded_height; + int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width; + int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height; + uint8_t md5[16]; + + av_md5_init(s->md5_ctx); + for (j = 0; j < h; j++) { + const uint8_t *src = frame->data[i] + j * frame->linesize[i]; +#if HAVE_BIGENDIAN + if (pixel_shift) { + s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf, + (const uint16_t *) src, w); + src = s->checksum_buf; + } +#endif + av_md5_update(s->md5_ctx, src, w << pixel_shift); + } + av_md5_final(s->md5_ctx, md5); + +#define MD5_PRI "%016" PRIx64 "%016" PRIx64 +#define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8) + + if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) { + av_strlcatf(msg_buf, sizeof(msg_buf), + "plane %d - correct " MD5_PRI "; ", + i, MD5_PRI_ARG(md5)); + } else { + av_strlcatf(msg_buf, sizeof(msg_buf), + "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ", + i, MD5_PRI_ARG(md5), MD5_PRI_ARG(s->sei.picture_hash.md5[i])); + err = AVERROR_INVALIDDATA; + } + } + + av_log(s->avctx, err < 0 ? AV_LOG_ERROR : AV_LOG_DEBUG, + "Verifying checksum for frame with POC %d: %s\n", + s->poc, msg_buf); + + return err; + } + static int hevc_frame_end(HEVCContext *s) { HEVCFrame *out = s->cur_frame; @@ -3062,6 +3130,28 @@ static int hevc_frame_end(HEVCContext *s) av_assert1(ret >= 0); } + if (s->avctx->hwaccel) { + ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame); + if (ret < 0) { + av_log(s->avctx, AV_LOG_ERROR, + "hardware accelerator failed to decode picture\n"); + ff_hevc_unref_frame(s->cur_frame, ~0); + return ret; + } + } else { + if (s->avctx->err_recognition & AV_EF_CRCCHECK && + s->sei.picture_hash.is_md5) { + ret = verify_md5(s, s->cur_frame->f); + if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE) { + ff_hevc_unref_frame(s->cur_frame, ~0); + return ret; + } + } + } + s->sei.picture_hash.is_md5 = 0; + + av_log(s->avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc); + return 0; } @@ -3109,7 +3199,6 @@ static int decode_slice(HEVCContext *s, const H2645NAL *nal, GetBitContext *gb) ret = hevc_frame_end(s); if (ret < 0) return ret; - s->is_decoded = 1; } return 0; @@ -3290,75 +3379,6 @@ fail: return ret; } -static int verify_md5(HEVCContext *s, AVFrame *frame) -{ - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); - char msg_buf[4 * (50 + 2 * 2 * 16 /* MD5-size */)]; - int pixel_shift; - int err = 0; - int i, j; - - if (!desc) - return AVERROR(EINVAL); - - pixel_shift = desc->comp[0].depth > 8; - - /* the checksums are LE, so we have to byteswap for >8bpp formats - * on BE arches */ -#if HAVE_BIGENDIAN - if (pixel_shift && !s->checksum_buf) { - av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size, - FFMAX3(frame->linesize[0], frame->linesize[1], - frame->linesize[2])); - if (!s->checksum_buf) - return AVERROR(ENOMEM); - } -#endif - - msg_buf[0] = '\0'; - for (i = 0; frame->data[i]; i++) { - int width = s->avctx->coded_width; - int height = s->avctx->coded_height; - int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width; - int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height; - uint8_t md5[16]; - - av_md5_init(s->md5_ctx); - for (j = 0; j < h; j++) { - const uint8_t *src = frame->data[i] + j * frame->linesize[i]; -#if HAVE_BIGENDIAN - if (pixel_shift) { - s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf, - (const uint16_t *) src, w); - src = s->checksum_buf; - } -#endif - av_md5_update(s->md5_ctx, src, w << pixel_shift); - } - av_md5_final(s->md5_ctx, md5); - -#define MD5_PRI "%016" PRIx64 "%016" PRIx64 -#define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8) - - if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) { - av_strlcatf(msg_buf, sizeof(msg_buf), - "plane %d - correct " MD5_PRI "; ", - i, MD5_PRI_ARG(md5)); - } else { - av_strlcatf(msg_buf, sizeof(msg_buf), - "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ", - i, MD5_PRI_ARG(md5), MD5_PRI_ARG(s->sei.picture_hash.md5[i])); - err = AVERROR_INVALIDDATA; - } - } - - av_log(s->avctx, err < 0 ? AV_LOG_ERROR : AV_LOG_DEBUG, - "Verifying checksum for frame with POC %d: %s\n", - s->poc, msg_buf); - - return err; -} - static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first) { int ret, i; @@ -3424,31 +3444,6 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe, if (ret < 0) return ret; - if (avctx->hwaccel) { - if (s->cur_frame && (ret = FF_HW_SIMPLE_CALL(avctx, end_frame)) < 0) { - av_log(avctx, AV_LOG_ERROR, - "hardware accelerator failed to decode picture\n"); - ff_hevc_unref_frame(s->cur_frame, ~0); - return ret; - } - } else { - /* verify the SEI checksum */ - if (avctx->err_recognition & AV_EF_CRCCHECK && s->cur_frame && s->is_decoded && - s->sei.picture_hash.is_md5) { - ret = verify_md5(s, s->cur_frame->f); - if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) { - ff_hevc_unref_frame(s->cur_frame, ~0); - return ret; - } - } - } - s->sei.picture_hash.is_md5 = 0; - - if (s->is_decoded) { - av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc); - s->is_decoded = 0; - } - if (s->output_frame->buf[0]) { av_frame_move_ref(rframe, s->output_frame); *got_output = 1; diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h index f0443b3ab9..da4d83e661 100644 --- a/libavcodec/hevc/hevcdec.h +++ b/libavcodec/hevc/hevcdec.h @@ -488,7 +488,6 @@ typedef struct HEVCContext { int bs_width; int bs_height; - int is_decoded; // NoRaslOutputFlag associated with the last IRAP frame int no_rasl_output_flag; From patchwork Fri Jun 7 13:01:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49670 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1012960vqo; Fri, 7 Jun 2024 06:10:27 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXPk0yShPV2D3381jTFRfm1YbpbxISa2p4wLtghtvYE7DT9Wby30g0mosIMBpVvWd0KTzKY97qEtQmWkb/rM3xKgWyMZd1waGXxVg== X-Google-Smtp-Source: AGHT+IEe4PllldZG9m+rxf28cVnuz4fgEVlBuMct9OpQuV/epBw7nyx1i4UoG60O77inqZUo2gVS X-Received: by 2002:a05:6512:36cc:b0:529:b6e9:79a7 with SMTP id 2adb3069b0e04-52bb9f853acmr1760701e87.35.1717765826878; Fri, 07 Jun 2024 06:10:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765826; cv=none; d=google.com; s=arc-20160816; b=yPLl3To6t2YMqUORGPCQ7Zx1ZJ/KSiX97LMrVZThgIoa+0b9MWun78FwAE9TOdr6Am VFWpymnc6MINPtF0cVDEajrIdm6BAhxww+ecc1svWGNGrSkC68JW9uUcZciS7v4RAV77 zod7sbOuqZuVniup1/SzBeaFwivXFsxBwCx6pp0yvrY89FW7AqNyXZqKuGwBctdLMLDK AmpPWffakg2urtM3gAbH1F44FnkItddMI6Zo3ldyfzazURVhiBrcK7mZlt52gEKcir8p /f7z4tYw8ebOXgyBc09Vh050blqZzZlW1rg5q1kbgwHqhLYE5OYTwH2bmHHCGHeWUPnH IDEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=OK8g+YN9zS38ABumEXHZwCP6UZgy8n6DM3YzwWdD7rU=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=z7jf1neP1iQMssxulhXYI8ohniZCLuuIwPIXXt8i+emVcxtPOqHkZMh/8906mYiMN6 XRqJViRw/bnqiHJji4m8LU4tqQ9LfhF+ryWOJfY7R5Xr9Xt8T9kt4lbNs1F2C+8ieG5q XeK7YM3b+HAyxk/37klql5fTUx4lgUd7n6aLduI6A3W0MMlYtY3/6a04YES3ldbFIl3z hEIKfyadF7jxm27GRLTbIcbTEmOc992QeCg/2/CY3/BWeYXPTIfnVvnT61V5csq//HNb Fz/eHlYW/CwBMST+dzrnawTffZepGeNtAEQ0yZltYx3cv+6kZMxoT7PB7YY/dzjvT/Vl wPig==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=Mr83E5TG; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c80588909si190756666b.196.2024.06.07.06.10.26; Fri, 07 Jun 2024 06:10:26 -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=@khirnov.net header.s=mail header.b=Mr83E5TG; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7B51368D88E; Fri, 7 Jun 2024 16:08:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4C5C468D851 for ; Fri, 7 Jun 2024 16:08:45 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=Mr83E5TG; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id EAFC04DBA for ; Fri, 7 Jun 2024 15:08:44 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id Ag0BeuBd-uWp for ; Fri, 7 Jun 2024 15:08:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765724; bh=QyvvVuZBKpKPAq55ghF1ocZgE89GXoTEOmFroai9ZNI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Mr83E5TGXw3xZdmRSls3gONuIuZBVYTUEHC/4aNvde3lkCayYfUHbjXfcy1ZxZVnV msCXdd7Wg/xSxMkKdeBBiLoGwphUv1D85sPYjwv5sKIT84s+XIC5woGLyhgMMcfbzv SGjj/q7AhPhowLE49cmMJyFySD88OnOiwdSm+BM3dYzp6oNVBAYkUXqxX6tkTFYDaV 2CZn8D84j89ne+51X1EFnfybGgUw1OSjlHaKXuSemQ6X2KsyB2Uwo/J4Ohxuv6Oqaj 6/VVB/zgEKhQWyWpWicvAjchtkPPwHVnmf6xG8Lk68ZqeXHnH6hts76awhRDQbmZt5 JgQf3PyIz/dvQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 954C74D42 for ; Fri, 7 Jun 2024 15:08:44 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 21D563A27BF for ; Fri, 07 Jun 2024 15:03:36 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:34 +0200 Message-ID: <20240607130135.9088-38-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 38/39] lavc/hevcdec: do not unref current frame on frame_end() failure 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Zd8Wgfxg0//3 It's a race with frame threading. --- libavcodec/hevc/hevcdec.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index a8c2172674..5fc55d5de9 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3135,17 +3135,14 @@ static int hevc_frame_end(HEVCContext *s) if (ret < 0) { av_log(s->avctx, AV_LOG_ERROR, "hardware accelerator failed to decode picture\n"); - ff_hevc_unref_frame(s->cur_frame, ~0); return ret; } } else { if (s->avctx->err_recognition & AV_EF_CRCCHECK && s->sei.picture_hash.is_md5) { ret = verify_md5(s, s->cur_frame->f); - if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE) { - ff_hevc_unref_frame(s->cur_frame, ~0); + if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE) return ret; - } } } s->sei.picture_hash.is_md5 = 0; From patchwork Fri Jun 7 13:01:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 49666 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:c209:0:b0:460:55fa:d5ed with SMTP id d9csp1013190vqo; Fri, 7 Jun 2024 06:10:46 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXUjtyTlSQXCRwBr+CnMA4564GEAW8Ehq3Jx3lg6nA1jtyiLLXJ8cjf4oKLOC+LHfNVUBj75bFtcjnAn+zcU2WdQ6XE0ndXtFKc0w== X-Google-Smtp-Source: AGHT+IF0YbrLouFYrHrUabdNouI8/M58WQPjs8sW1RDgXyxSY/cfCioj24XO8/BJmf+p7dwxsBdO X-Received: by 2002:a17:906:b7d6:b0:a68:f0ce:9f2e with SMTP id a640c23a62f3a-a6cd7a84558mr173776866b.44.1717765846328; Fri, 07 Jun 2024 06:10:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717765846; cv=none; d=google.com; s=arc-20160816; b=CjtJLoa/eVsKTAZj0oFQazXqLKXTjdrRZCqU/hHKQwy8/nfGFtDZWuHscftfD+DVUk KXy6WtOPpsO0o/my/lpC4Vxi+YfJmyj0LVoF8LL9dhhEKgzUo41Pz+qvZrewNFeK5+Gs wN9VN1AERML0a2JMMNJ3jEB/08AEHvefN448MbIOi8dBI3RqoOyr4Z6EFHgdCmZX6CiQ gS879GhNZx/5C8wWz+VxAnzDf59KU2XrcMTdWaCgANqhol0OjwlDP8FmVbuIl7+34wfN AoQnNL1oxXV9OGavitlZTZzvAqk3t6PYxFrjN5mK8mS27URC2m81WZBCS7GStSwBnYNH gq2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=Ks2tHE+NHnmkLMpTfKlb8iioiR+VwOvYZZNcIjOleUo=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=lTw6m5q8bjciLzy1xB5wTcFA5L6MQbgVx2aipShbYMgVkSs0rADeSncADJeG0NgPVt 2WDJs5s3EZAXPFVqi+oKuLus7IALI6gD6+Gv2P4i12F3SukA/TSWZ6Z9kCLQSquP1xcr pmgCZaOQ1t0lYbeKVYLq8fVIxSlBjX8UJqvGVlQX6VuUScxtPJf6yjcVWRzicZKzM9n7 2q8Mrc4e0Xrp6dRhJwAzUnCBT4m1fakPuFbtLfZF/mYO4HxskIEbydRJZAdQRD6ehYjc S9zzTs7CkjEajIcY4qzXaNaM1TmUZURS7VF7v4uhFlj3Xlxm8sgTbJCHVdZSsK+OveWx HRMA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=mMbRHIrR; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a6c80591ba0si181631766b.15.2024.06.07.06.10.45; Fri, 07 Jun 2024 06:10: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=@khirnov.net header.s=mail header.b=mMbRHIrR; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1408A68D897; Fri, 7 Jun 2024 16:08:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9127F68D851 for ; Fri, 7 Jun 2024 16:08:45 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=mMbRHIrR; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 440524D42 for ; Fri, 7 Jun 2024 15:08:45 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id 79JcWbY6euFM for ; Fri, 7 Jun 2024 15:08:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1717765724; bh=0sN1dazct/DsTAcwLJLjMVR2Kbjg4AaUzccktPVrIlU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=mMbRHIrRuVL6fflSIcwLjLQyV1YtT24MIjfqKFMHV077kO9HCLY1JOx8w/8NI5JsQ 9ZOyg9VkOmJvdjo8nbj6J1Vr9Z6se26p6SH0IZVByBMke5skOH8HLkB1Z192rm3WE8 cjJGWrYJTFA8vRiJJn5buFfQIFo0yNk0ZJxq9tKvB8Zas/0sArrj7DQzPKMRALPBnH SML097E9H4YnzoZ5LosL8BAsC86Lxd9HWBA/LCRnfWYSPHQbM1QTxY4if+u+MhxcxN VMHCrwcdshMGeEqWEqRpMiWSbYE1iIhbIiNFJV3Uv9ySjZ0tJm1ZkYvX+gPuK2IzOy 1D6LWZ/2P3GnQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 978E84D76 for ; Fri, 7 Jun 2024 15:08:44 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 2DB773A27C7 for ; Fri, 07 Jun 2024 15:03:36 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Fri, 7 Jun 2024 15:01:35 +0200 Message-ID: <20240607130135.9088-39-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240607130135.9088-1-anton@khirnov.net> References: <20240607130135.9088-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 39/39] lavc/hevcdec: constify source frame in hevc_ref_frame() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: iCrICRg9+eu9 --- libavcodec/hevc/hevcdec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index 5fc55d5de9..88f2bcecad 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3449,7 +3449,7 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe, return avpkt->size; } -static int hevc_ref_frame(HEVCFrame *dst, HEVCFrame *src) +static int hevc_ref_frame(HEVCFrame *dst, const HEVCFrame *src) { int ret;