From patchwork Thu Jun 30 22:29:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36564 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp620744pzh; Thu, 30 Jun 2022 15:31:17 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tnKkbbcLJ0K5jqoZ1ZXShm+zTRgVjZCQQozoYO8AGgS0/0k9/1QS98+TCiuCFLLiVhaomA X-Received: by 2002:a05:6402:201:b0:431:665f:11f1 with SMTP id t1-20020a056402020100b00431665f11f1mr14583610edv.378.1656628276783; Thu, 30 Jun 2022 15:31:16 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h7-20020a1709063c0700b007269d20facasi17507674ejg.478.2022.06.30.15.31.15; Thu, 30 Jun 2022 15:31: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=@outlook.com header.s=selector1 header.b=l8Ze6Tpw; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9AF8568B7C2; Fri, 1 Jul 2022 01:30:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2046.outbound.protection.outlook.com [40.92.91.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EA4CC68B77F for ; Fri, 1 Jul 2022 01:30:42 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=B7nPAlBpX2VKn/0vKEFz6CaC+Eq6BAbGLQmSqpTxEOCCC0TO9hHA5XbGpU7UmZEd8zzZXFQj5yL/IBozu3joo3E8JS2jfQOjWd0hnaMdYWCc7LEf1TM0YYk5uYCJtnZ7cvOAWKwyZteNjxNZpDNywQLF+jioQU1DoD2ymkNEKQF1xAureDhfkHFbmo3OaXhhy1eaekmWjPo4eGHJ0UmvgFsbpheUtpM5AIdZP6eaJybROk0nJrTolJqou1V0HZajt9umhNAsk6aVGgqTe+LOPN9pzKVV3rl2pY1z6cFl7Z2c6pCHjcDXmF6pXIRt4VZIncNbJrmsklUIPAgs3T4AmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=woCqbYabYyMbVvIfpsr1Z0G21o0/3Dk+LxWCz7PnpP4=; b=AMLJdWyZvQPx8J/VBDaF6fyxMDsd3ULGZmP2ASJ7GsU54B4aDO22pHuQllfyd+sN6MVMvAeuYMOqcNcAPS8vJv3zUWyIqXUpZT/cLavxIxMBN7BuJaGUDob8/pzOyTIW8oYid8h7+UJq85LnnxM/0pDFhuh4Neoao683bOhH9M2KfvuaNwb5As9ob8a32NyT1BomTOMyNmyJ5FMtyun/uab4V1K8/W5C+B8vjOBPxM3uPq0wLTAFkxIvxICKzF2p2opwKHc0USl3I6G3q+Sd63FzJ5RxNHwMyvxcUOXAnz62q+3vZH1GNaMkVaHyl0SzoWfqo9+GVxdqRiLh9U8vmg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=woCqbYabYyMbVvIfpsr1Z0G21o0/3Dk+LxWCz7PnpP4=; b=l8Ze6Tpw8B8mjygSwNKoLwkld0HsZg4/KUCZ0UShKTi+2CxTrLGAZHmAfv5p4rPRDpCiyQai2BGiMaeny4G7mP2G0mIv16+SeSHjcPMWXCuUVuX/nZYGhRl03rDwEchBep+H0cE2Aa2jAUqrafPF4nOskgAzEKRy/KPeyLRf62UDq0sjZ+r0AL56Kp/ndxmoS199neZ1/JthufbGogWHT3TY1wgBvkZ9beq+UAhOz2e1FdnXdqU6JBVpE2nKKSCaMjptPU3JQNQnRDrg45mW3giXFaBvu8CKoQRI9xZThWXsXtOhi6T/nZrxkttjxLGqj7SO+4gKoMcuTXvE1oF5NA== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by DB3PR0102MB3546.eurprd01.prod.exchangelabs.com (2603:10a6:8:d::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.15; Thu, 30 Jun 2022 22:30:39 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5373.018; Thu, 30 Jun 2022 22:30:39 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 1 Jul 2022 00:29:38 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [G3aWbuQU0shrfkeOY5UUFu8w7LqiWi3t] X-ClientProxiedBy: FR0P281CA0099.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a9::17) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220630222949.1758625-6-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: dfa82f8b-70cf-49fe-60ce-08da5ae82909 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiSAA+E0K/sYrHNnfsWcYQJjGKpr3ZY77P4HWwVjhpvDHGn43NCQMHKpAcDI17QQrBp3plbECrQpWUtxmK4R6TPOZQTwqe9WYrzeUdwea78RnKa0kdFGYkceU6KlJuPFQaMZCkyDq5RMojmIhjhD+h7O6TwQ55vhszh4N2UB3u2OK+xBbwFQ1XfEC5bWlxUoB+eVled39dQKeCGIvWMw7jdfvYawwT47lgCR4wNt/soBJtvxT4PyBNUD16hj3UMjxxr+qWuYRfzM4y5gWSBQl5rX8P32T60r6x2RyX7bIQnDArDxSTGwS6FVMpMbJQCvLEMjLoSFZlyNkT8rOeoip16fnIxlv7pVXDmTLOboCCjiGwNTTKmPhje+QQOoBG3DrD4QwkwCK+l0rdM4j8fBqhPdFOTZolQUVOD4ZU55YUsKjBy3IuNGDOOCeoZxS90KWSzMH7SXoF76yJzJ8qYvXjxnfSkSr7hqUa9BrsbhdXVEpS1CUz6VU6T8xIyzEw/UFY8OHKyzvdoyiOnDORHFWt5El8lx3n3jvNlw7jOSGNbDFQiofM2l+7+fqYSq/V5YjTiaI3T3KcIYJJzXo+ygerlODreDV82XjuVOI0mZy7O1yt2UuTtinHxhXw8RcTgvbwhStbPHVFjRajfzS145XP84g6BVOXxW9QUyFlmuxBhs2n/JOj38d3VoFqMA3FH/oUG1uUVB4UbKQ39qKB9PJw0iZ+70Sph7K3Kymh85iMsEixzatBA7fKsPpcc7sl8BBZY= X-MS-TrafficTypeDiagnostic: DB3PR0102MB3546:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: RYwE8S7wO6+ocHYsRmq6Ac/1rkCScEHrWpCo3Nq20a4do7yf0sxTR2sgRGC8C89BPb2hgRXzf4IT01Gq0KuQYSTesPtCmekQnNW3qjy3m4yvCHXa/Z47/9OzLM7dL3B5UfSFLwUboNaU5jS+qerCSfi9gCqGUKyMvrISbR08kEDNYy8MVhmpqJZfvDbk5dCpJpPJKVXkrjEgNAYZpJk8pO47KCZKD6w2rZPeCTYPgWBFBIVhcA2RBwMloK0VjZxotCG4JO3X/AS7zR6Qwx9YeIPkpwMje5B0RnhUPe40TP/GXvh8k7Egzq238HZvcWJHU/AodCX8hSzAqQ+qirEWCBtray0zVbKter5wbnuBEcMA2z1nmEuhsT22zqAw7xjM7Woy0UE/affV7n1Der+SdD0m1WxSf1MxmhGoTu1ShBkCbG/8wri4zZSyZTnDE0P5B+0k/9r8SeDZn1aIQN35tnO3LZ3ptI7pgnpfFLhDX1argqtkGZ6ojPSSNrBjiRn87HoAf19B4/VZYdsl+u5IhO5YXdXp9r2GFsx9FnFiSB1IDDrGJ5XWj78X7wu+kdYxzmkPGaaHwLO4Gmd0hL9mH7fPJEd+iKrGv00++ovMwqjv0uqAMWDWsch/ptwLpHxCPkGR/4SrfnC49rih8Cq6S0jzbvDf19BepvQS/4gt2hHRijwAxJhh+4sRGZa16cnAc6YCt8QrZbbwLt8tkc5lPg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DTmkaR+tsCocfeJvUdlrH/0jSKba3WKWmtH4bqdb0RAtloFzjlNtu5kq+Z6//N+R4dkxJ7FBj0NmQvJULX78nxaKXjE5VRTbIXtIHbULMZJqnayVmzqU8zfh/MDMXsE0zZstW8Amg3gUPwz9bFCzDukMCozPNOOUvAxXSlAzhcJcFdtu6T6CU1GtE8UAlIuYNf+sUl9TRX4Thcwpfe4jL5V8qpWskNPA8GIEiGIadWD3JHpqe6+WGbypOpGwWhhI+J62nHrf3lLwUqjzWSRguV+5XMQteo2EYa4UXJMJCzPjRqanrlAZoZ6zR35FI/wQ5nb6Jk8PkiSxjoiPGv0LPgMprGxguyU/yxnmzw31V2OI286QplIqJ8oGqWQJim5d/tbFEZtNmhYOfyBGkwpJJJ/2c2x4SbyhW2JR6W+fusaOI7dw8JGGQebDiQPebql46SocH5NAPkHhjA5bitUTt8NXeibb0NgiIH1gArdz+C4O6++YQnBBt0n962sL9v53mKFy9a1bgcEgFS9LcI5r1wDkp3AloK32XrWxOoPq5EwpgMEFYGpqaEYRek/w0vZczn9faehXObDj+BsOY3t0pliL+SqchmycjcX+DKR8JraJNyUWyK6XkNe9gEERtqSF0dz/u70/Tmu49mWzwkfujwmPZh/IlP/0pFl5S/jrV2Bxda66R/7Nl57LBZgwk5q0KCp1uyUE2Elf4KOSsSUvdKJQFmx1XbNp9f+KhT6Fd8PTzf6lZDQMOcSLbBny3MGjRn+B554LLjJCezOyN3CCK02wLi7baWbUrszO7PuLdA1m6j4v3yC16PHNIVg96Y5WBRI5R1x3J4No3IkMPSOaIZjbTnNutoOMPZaxtbAtUwbiBAVeYl30TrJipjkncxzjtcnBXJR17n9zfcdYlQZkc3Addpbjjr9aOzzINTuUVuznRaXX2Uze91gYY31ErOld9CI1vUK/cWjM5CMHm4vpEkPwZI3TMafw/1r7ZnK6nw5dTY4/1yNFA7HqR5HFu2NTBNrz7YPU544Cdwse91Ju0JVNSTD3B8E2JET3Y+j+PojEncqy+gauQbcPldGQ2ybbZB8XHITH7+h662sm6tfh3bn/j+bIfBsT5LkgMtcQT9CZvnaKjQV6MS1GRPtXjlJ1Z1HgtIlS0unBowfIbs5bjJ2pJJsrV1RN84QJZTbe3ZatvrXJ/vFqmpV2TWWANcQH1M3ctteJkG/Ml8rVClmeaFu8AtN9LJXxMLwSFlN305ZCRv3/AdNRE3V+uH2xChxpuE4Zgx4fov1sUt6SRwebLfxlFXJbbFekuDI4gykKJuA= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: dfa82f8b-70cf-49fe-60ce-08da5ae82909 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2022 22:30:39.6551 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR0102MB3546 Subject: [FFmpeg-devel] [PATCH 07/18] avcodec/hevc_mvs: Pass HEVCLocalContext when slice-threading X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: DAp1/5KqyHWa The HEVC decoder has both HEVCContext and HEVCLocalContext structures. The latter is supposed to be the structure containing the per-slicethread state. Yet that is not how it is handled in practice: Each HEVCLocalContext has a unique HEVCContext allocated for it and each of these coincides except in exactly one field: The corresponding HEVCLocalContext. This makes it possible to pass the HEVCContext everywhere where logically a HEVCLocalContext should be used. This commit stops doing this for lavc/hevc_mvs.c; it also constifies everything that is possible in order to ensure that no slice thread accidentally modifies the main HEVCContext state. Signed-off-by: Andreas Rheinhardt --- libavcodec/hevc_mvs.c | 56 +++++++++++++++++++++---------------------- libavcodec/hevcdec.c | 27 +++++++++++---------- libavcodec/hevcdec.h | 6 ++--- 3 files changed, 45 insertions(+), 44 deletions(-) diff --git a/libavcodec/hevc_mvs.c b/libavcodec/hevc_mvs.c index 516e4a6b7a..bcf6ec3abc 100644 --- a/libavcodec/hevc_mvs.c +++ b/libavcodec/hevc_mvs.c @@ -40,10 +40,10 @@ static const uint8_t l0_l1_cand_idx[12][2] = { { 3, 2, }, }; -void ff_hevc_set_neighbour_available(HEVCContext *s, int x0, int y0, +void ff_hevc_set_neighbour_available(HEVCLocalContext *lc, int x0, int y0, int nPbW, int nPbH) { - HEVCLocalContext *lc = s->HEVClc; + 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); @@ -62,7 +62,7 @@ void ff_hevc_set_neighbour_available(HEVCContext *s, int x0, int y0, /* * 6.4.1 Derivation process for z-scan order block availability */ -static av_always_inline int z_scan_block_avail(HEVCContext *s, int xCurr, int yCurr, +static av_always_inline int z_scan_block_avail(const HEVCContext *s, int xCurr, int yCurr, int xN, int yN) { #define MIN_TB_ADDR_ZS(x, y) \ @@ -84,7 +84,7 @@ static av_always_inline int z_scan_block_avail(HEVCContext *s, int xCurr, int yC } //check if the two luma locations belong to the same motion estimation region -static av_always_inline int is_diff_mer(HEVCContext *s, int xN, int yN, int xP, int yP) +static av_always_inline int is_diff_mer(const HEVCContext *s, int xN, int yN, int xP, int yP) { uint8_t plevel = s->ps.pps->log2_parallel_merge_level; @@ -161,11 +161,11 @@ static int check_mvset(Mv *mvLXCol, const Mv *mvCol, refPicList_col, L ## l, temp_col.ref_idx[l]) // derive the motion vectors section 8.5.3.1.8 -static int derive_temporal_colocated_mvs(HEVCContext *s, MvField temp_col, +static int derive_temporal_colocated_mvs(const HEVCContext *s, MvField temp_col, int refIdxLx, Mv *mvLXCol, int X, int colPic, const RefPicList *refPicList_col) { - RefPicList *refPicList = s->ref->refPicList; + const RefPicList *refPicList = s->ref->refPicList; if (temp_col.pred_flag == PF_INTRA) return 0; @@ -216,11 +216,11 @@ static int derive_temporal_colocated_mvs(HEVCContext *s, MvField temp_col, /* * 8.5.3.1.7 temporal luma motion vector prediction */ -static int temporal_luma_motion_vector(HEVCContext *s, int x0, int y0, +static int temporal_luma_motion_vector(const HEVCContext *s, int x0, int y0, int nPbW, int nPbH, int refIdxLx, Mv *mvLXCol, int X) { - MvField *tab_mvf; + const MvField *tab_mvf; MvField temp_col; int x, y, x_pu, y_pu; int min_pu_width = s->ps.sps->min_pu_width; @@ -283,16 +283,16 @@ static int temporal_luma_motion_vector(HEVCContext *s, int x0, int y0, /* * 8.5.3.1.2 Derivation process for spatial merging candidates */ -static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0, +static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCContext *s, + int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int singleMCLFlag, int part_idx, int merge_idx, struct MvField mergecandlist[]) { - HEVCLocalContext *lc = s->HEVClc; - RefPicList *refPicList = s->ref->refPicList; - MvField *tab_mvf = s->ref->tab_mvf; + const RefPicList *refPicList = s->ref->refPicList; + const MvField *tab_mvf = s->ref->tab_mvf; const int min_pu_width = s->ps.sps->min_pu_width; @@ -477,16 +477,16 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0, /* * 8.5.3.1.1 Derivation process of luma Mvs for merge mode */ -void ff_hevc_luma_mv_merge_mode(HEVCContext *s, int x0, int y0, int nPbW, +void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv) { + const HEVCContext *const s = lc->parent; int singleMCLFlag = 0; int nCS = 1 << log2_cb_size; MvField mergecand_list[MRG_MAX_NUM_CANDS]; int nPbW2 = nPbW; int nPbH2 = nPbH; - HEVCLocalContext *lc = s->HEVClc; if (s->ps.pps->log2_parallel_merge_level > 2 && nCS == 8) { singleMCLFlag = 1; @@ -497,8 +497,8 @@ void ff_hevc_luma_mv_merge_mode(HEVCContext *s, int x0, int y0, int nPbW, part_idx = 0; } - ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH); - derive_spatial_merge_candidates(s, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH); + derive_spatial_merge_candidates(lc, s, x0, y0, nPbW, nPbH, log2_cb_size, singleMCLFlag, part_idx, merge_idx, mergecand_list); @@ -510,12 +510,12 @@ void ff_hevc_luma_mv_merge_mode(HEVCContext *s, int x0, int y0, int nPbW, *mv = mergecand_list[merge_idx]; } -static av_always_inline void dist_scale(HEVCContext *s, Mv *mv, +static av_always_inline void dist_scale(const HEVCContext *s, Mv *mv, int min_pu_width, int x, int y, int elist, int ref_idx_curr, int ref_idx) { - RefPicList *refPicList = s->ref->refPicList; - MvField *tab_mvf = s->ref->tab_mvf; + const RefPicList *refPicList = s->ref->refPicList; + const MvField *tab_mvf = s->ref->tab_mvf; int ref_pic_elist = refPicList[elist].list[TAB_MVF(x, y).ref_idx[elist]]; int ref_pic_curr = refPicList[ref_idx_curr].list[ref_idx]; @@ -527,13 +527,13 @@ static av_always_inline void dist_scale(HEVCContext *s, Mv *mv, } } -static int mv_mp_mode_mx(HEVCContext *s, int x, int y, int pred_flag_index, +static int mv_mp_mode_mx(const HEVCContext *s, int x, int y, int pred_flag_index, Mv *mv, int ref_idx_curr, int ref_idx) { - MvField *tab_mvf = s->ref->tab_mvf; + const MvField *tab_mvf = s->ref->tab_mvf; int min_pu_width = s->ps.sps->min_pu_width; - RefPicList *refPicList = s->ref->refPicList; + const RefPicList *refPicList = s->ref->refPicList; if (((TAB_MVF(x, y).pred_flag) & (1 << pred_flag_index)) && refPicList[pred_flag_index].list[TAB_MVF(x, y).ref_idx[pred_flag_index]] == refPicList[ref_idx_curr].list[ref_idx]) { @@ -543,13 +543,13 @@ static int mv_mp_mode_mx(HEVCContext *s, int x, int y, int pred_flag_index, return 0; } -static int mv_mp_mode_mx_lt(HEVCContext *s, int x, int y, int pred_flag_index, +static int mv_mp_mode_mx_lt(const HEVCContext *s, int x, int y, int pred_flag_index, Mv *mv, int ref_idx_curr, int ref_idx) { - MvField *tab_mvf = s->ref->tab_mvf; + const MvField *tab_mvf = s->ref->tab_mvf; int min_pu_width = s->ps.sps->min_pu_width; - RefPicList *refPicList = s->ref->refPicList; + const RefPicList *refPicList = s->ref->refPicList; if ((TAB_MVF(x, y).pred_flag) & (1 << pred_flag_index)) { int currIsLongTerm = refPicList[ref_idx_curr].isLongTerm[ref_idx]; @@ -580,13 +580,13 @@ static int mv_mp_mode_mx_lt(HEVCContext *s, int x, int y, int pred_flag_index, (y ## v) >> s->ps.sps->log2_min_pu_size, \ pred, &mx, ref_idx_curr, ref_idx) -void ff_hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW, +void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, 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) { - HEVCLocalContext *lc = s->HEVClc; - MvField *tab_mvf = s->ref->tab_mvf; + const HEVCContext *const s = lc->parent; + const MvField *const tab_mvf = s->ref->tab_mvf; int isScaledFlag_L0 = 0; int availableFlagLXA0 = 1; int availableFlagLXB0 = 1; diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 111da42836..4786282669 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -1106,7 +1106,7 @@ static int hls_transform_unit(HEVCContext *s, int x0, int y0, if (lc->cu.pred_mode == MODE_INTRA) { int trafo_size = 1 << log2_trafo_size; - ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size); + ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size); s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0); } @@ -1193,7 +1193,7 @@ static int hls_transform_unit(HEVCContext *s, 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(s, 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->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 1); } if (cbf_cb[i]) @@ -1222,7 +1222,8 @@ static int hls_transform_unit(HEVCContext *s, 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(s, 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->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 2); } if (cbf_cr[i]) @@ -1250,7 +1251,7 @@ static int hls_transform_unit(HEVCContext *s, int x0, int y0, 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++) { if (lc->cu.pred_mode == MODE_INTRA) { - ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size), + ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size), trafo_size_h, trafo_size_v); s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 1); } @@ -1260,7 +1261,7 @@ static int hls_transform_unit(HEVCContext *s, 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(s, xBase, yBase + (i << log2_trafo_size), + ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size), trafo_size_h, trafo_size_v); s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 2); } @@ -1273,11 +1274,11 @@ static int hls_transform_unit(HEVCContext *s, 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(s, x0, y0, trafo_size_h, trafo_size_v); + ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size_h, trafo_size_v); s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 1); s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 2); if (s->ps.sps->chroma_format_idc == 2) { - ff_hevc_set_neighbour_available(s, x0, y0 + (1 << log2_trafo_size_c), + ff_hevc_set_neighbour_available(lc, x0, y0 + (1 << log2_trafo_size_c), trafo_size_h, trafo_size_v); s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 1); s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 2); @@ -1285,12 +1286,12 @@ static int hls_transform_unit(HEVCContext *s, int x0, int y0, } 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(s, xBase, yBase, + ff_hevc_set_neighbour_available(lc, xBase, yBase, trafo_size_h, trafo_size_v); s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1); s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2); if (s->ps.sps->chroma_format_idc == 2) { - ff_hevc_set_neighbour_available(s, xBase, yBase + (1 << (log2_trafo_size)), + ff_hevc_set_neighbour_available(lc, xBase, yBase + (1 << (log2_trafo_size)), trafo_size_h, trafo_size_v); s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 1); s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 2); @@ -1821,7 +1822,7 @@ static void hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW, enum InterPredIdc inter_pred_idc = PRED_L0; int mvp_flag; - ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH); + ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH); mv->pred_flag = 0; if (s->sh.slice_type == HEVC_SLICE_B) inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH); @@ -1833,7 +1834,7 @@ static void hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW, mv->pred_flag = PF_L0; ff_hevc_hls_mvd_coding(s, x0, y0, 0); mvp_flag = ff_hevc_mvp_lx_flag_decode(s); - ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_mvp_mode(lc, 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; @@ -1851,7 +1852,7 @@ static void hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW, mv->pred_flag += PF_L1; mvp_flag = ff_hevc_mvp_lx_flag_decode(s); - ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_mvp_mode(lc, 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; @@ -1895,7 +1896,7 @@ static void hls_prediction_unit(HEVCContext *s, int x0, int y0, else merge_idx = 0; - ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, + ff_hevc_luma_mv_merge_mode(lc, x0, y0, nPbW, nPbH, log2_cb_size, partIdx, merge_idx, ¤t_mv); } else { hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size, diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h index 271a55df2f..3bb3fdb90a 100644 --- a/libavcodec/hevcdec.h +++ b/libavcodec/hevcdec.h @@ -667,12 +667,12 @@ void ff_hevc_bump_frame(HEVCContext *s); void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags); -void ff_hevc_set_neighbour_available(HEVCContext *s, int x0, int y0, +void ff_hevc_set_neighbour_available(HEVCLocalContext *lc, int x0, int y0, int nPbW, int nPbH); -void ff_hevc_luma_mv_merge_mode(HEVCContext *s, int x0, int y0, +void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, 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(HEVCContext *s, int x0, int y0, +void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, 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);