From patchwork Fri Mar 8 02:28:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 46889 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c995:b0:1a1:738b:6bc0 with SMTP id gy21csp675519pzb; Thu, 7 Mar 2024 18:29:00 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCWfE2bMUCAMEdWe77s3X+T6QCFziJPU2U54/9OJlezEVqB+FqpOFNnqjj4eQns5xhbFye9TenqM5Marq8b5bEHU1DyXln7KiLplig== X-Google-Smtp-Source: AGHT+IFLhS2yWUq+Ix0E5aTecFxrAawOdbhF8jia1FoQ9WTxlU34HD7an95A3Zyo2PE901a8k9Uh X-Received: by 2002:a17:907:7750:b0:a44:1bcf:4e8d with SMTP id kx16-20020a170907775000b00a441bcf4e8dmr343323ejc.5.1709864939912; Thu, 07 Mar 2024 18:28:59 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id sa1-20020a1709076d0100b00a4573afbb18si3983264ejc.255.2024.03.07.18.28.45; Thu, 07 Mar 2024 18:28:59 -0800 (PST) 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=W93uCN3s; 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 E613968CCAA; Fri, 8 Mar 2024 04:28:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05olkn2100.outbound.protection.outlook.com [40.92.90.100]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5566668C7E6 for ; Fri, 8 Mar 2024 04:28:35 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LAQPMK0okN8pXzAesm3o2GXT8e5VHezcTWhtPpqy4Le5v0MAxC5YeTIU4XFMScaek7o7SWKUqb2jFHCJh83L7UMcDfQQqGRgreYIt6gEH52EKRJdc29bDXs02d5W+Vpwo+63kFxKnJwCIA4A3+q1DojA12zWVHq4Xm5Adrj+GA3ChfLPZipNtVvy0D9/GQb0B+ezGRvNqkP0WRLpDRBgMHgyg06CXD8WPrN3q+oRpwOh3mb5pBHr3ucyOlN2JGx8Qj/UWYTaWsoDVEKuWzgAw+CyT/s71sdVBpTxyhfe7/ZTmAfLQ46XWxa3ClguLA0mvIaXOditO3VwlCJ4M84pjQ== 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=U2f5KsvAshG1aNOJR+PBgOIc3khUj5I3ZG+2s8qC9sE=; b=JRS7jhLz+xG8VVK9H72GLtKXm+svKlSNRViqeXr9/tc6sUBhpKhzqjWojNEGP362hEl5JmaDDtu625Xj0AlDfx4COeraN9Su/fEe31Cn1sE47uadUWBLxKX3lAMH28IkumW1dS+BDjjR+szHSha500jMDpqRJwaggHHpTO3dhOhKchb6NKT5t7A0OUgcit5iC9bFSr2clik5UFr7ikpvcIHPOJR/O2XeYufjr5xWeVi2PNuIAb1oQkmcj99qm36tiXMRzc69vfO+CJfsKATv6+PYSpYaGpKIq0GK8F/eNRUiisPVv1YORB5CLmNX45Z+Q2g8VKQi6KI6RAEZdWv/rQ== 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=U2f5KsvAshG1aNOJR+PBgOIc3khUj5I3ZG+2s8qC9sE=; b=W93uCN3sq/KZbk0A7G6WQQV/K+lLgLOaLHmruDLN9hW9iOBGqeAW9Py+0VyYJcdEFOWj6HcVR04MGMN639Pg47QM8R4FIddJgS/qnXdxqau/HRAcsEGcl5GZcgDe0y2SmDLxKz3/tuJWM/uxmLbgTZHsVlaCvgfcvdNE3wGcCzv8mqAjtUFT/JEX7k4PQvkTi57LOOCljyoleSctssLcYOYQq+l7lBteHucZhg4Da1bQjBWJjjTE08ZKFoaET2aFLK7qYJH+d3FpoiOZRFpZy/d00UR4hJt75nDHl/sZtB+eZNZ6BZuwRunjM/ptMe6MyGJCTzKd7wgxFEHvLqtJeQ== Received: from GV1SPRMB0052.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:109::15) by DB9P250MB0500.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:33a::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7362.24; Fri, 8 Mar 2024 02:28:33 +0000 Received: from GV1SPRMB0052.EURP250.PROD.OUTLOOK.COM ([fe80::a8f2:5082:22e4:8d1b]) by GV1SPRMB0052.EURP250.PROD.OUTLOOK.COM ([fe80::a8f2:5082:22e4:8d1b%5]) with mapi id 15.20.7339.035; Fri, 8 Mar 2024 02:28:33 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 Mar 2024 03:28:25 +0100 Message-ID: X-Mailer: git-send-email 2.40.1 X-TMN: [Jf/lvqE5wN1qYNpWPo+x+PZ+/iUi/tcXcExZqU5i45s=] X-ClientProxiedBy: ZR0P278CA0035.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:1c::22) To GV1SPRMB0052.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:109::15) X-Microsoft-Original-Message-ID: <20240308022825.4068394-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1SPRMB0052:EE_|DB9P250MB0500:EE_ X-MS-Office365-Filtering-Correlation-Id: 020a4185-2aa0-4050-6b8f-08dc3f177351 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: qdmpmQ/dqmb8ozzbFtu1Hqa4NjaTlTLAIdBu3XVmji5mGCQqRiOqyXRmUx9WeZvTJDI9PO8pPmPsO1Ez6NAYq9zxekWgHzoKy7h9E2nQlxJPUXVCaLKeFNjj9NfsZF28xavq1Lxhuo5rfKwG6HQTesy0pmzDqW736GxEzJ0ooBy5akbp0GFQcgceIqpPecb/CvzDZlyA2j673bf02vrL3jVkd8/rRuf8ymP+28oUQmfAecKKYRrOoRbw+c2RYQdIUfVYWaEEnreCcXdn3lHOdCSetixTZqwTAx2Zjvv/lyMhRRonbvIBUyddAr5rOlhMakGhI5tmfoFh/XoN49SNyvi2kK07+QUCL8d0bAOKCgMyjkMPN0KgHxoFxbKzSOE7AKIAYiI36YnRA1jSLecua0CItHdxObCvQ3SJezVVYC3VwqtBPOjwmz2g+ksrdrvP13eO8baxcm1kSVEjZ/9DqG61L4smR/m+GTTMg13U9ylj9lmJjVmGT1oxMor12LjOd+xS4QhOCbL6vSMkIzFwdLEGVC8N5iHadxSJiXa+2q5vbDNKb6zdtuGLUqvHPHvl6+vQJyChlVs+a1C8dNt5Za7McDEGHfS7dqNfkjaGAecUZazgeT5NCH4sB+ndzSJg X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: PXdYwj6ksfOEAWTz3XGuj3oJWjOre7Kwke3COimvp0wh9pOj1kZRiEWqZFSyfdtY2d+w4epPKgTNJiNx1a31UyKNk/OZzbnkIFnlII24QpPCNd0QQBZzsSXw3kqtG9D1iUBAa/PeNzxbBONTqMGC3P1+WB/J9B4Dxl1DxGQINkQkhJVB7THYAB76UehhEo107MXOymmvbhvb8DFj8/2u8LsrEBrDdi5787zIXCfA7MUN2yUz+LRqwJn7P5TcPQdpNrQzhcW4Lm/P1wcdXuklnnUeQ/Wmy8MVU8kJ+Ae8LkFXc5H199FVn6yrtmKh90aUo7GWdL7ulwORzmMyfm7Ntcqvwuiml6KbcgtvXSga2yQBDLLcrCnPF1pfIJeUrkViWlpwbLs/XQFrBgy69wGvvIXE6Yo0eIdbr/+/ItnW2hGWJllZuomRF9+ey75ToDvpNXhULxBICYliYk8HNZIQ85ggKmdfLaxR1Kvof/p9WOdlKSTUIKTFrVc8DCoQIvWT0S1TyMyShX91KgDzwR8ANSJGnnD48j5fPTNDJdpNEoDbD+nYsmftA6hBYA+QwCAgVfTSQG01fpaPc3AZrQm6Zlw5awkuIcSmMvUou/o8OjI4yVuByjkshyq/iuPE5YuTiEDCapI8kjnymxh9eOUk3HOi4KDUSOpxjBfY9MsRZAScnQZb0x3NbP/9S3LVurhjgPrS6LA7+DiLZzeCPWeRLy42vVNTkIrAcsm787dUL10V+e2mLC4jvhYScc/BsD/2ncNKPrzoVvPaHRucW4Fgcwg0wqYW67f7lfoR/6PRsmCsEaGG4HP0VJM28vsnS/cwiZ2swhnMmT8UdC2CIBdIr9Sx2lIbAJXZuG/XSMmGfzGdsZGulgFARjVyjAWav2Eatl0oP6WYL7lUEvxmHR9xIUVqQtKnEE/F1Kw4L7HC91SOXlVz+8lu55o01hai1/cnsITkjwwqtvq/eBbRIndetcLDIw4vCz6BO72jKJfzAvvfdnYa8LdPZ+uHTVitLw9RgwxARFz4rpxaVD5hmKxk0SnapZXFBX9omjE99EPgXYiGrK7522feTvaqfjVQVbDzCNyW4A3e2Zc5brGKab3m1hWd/EVf79AUUFg8Ar+SuRvS21A6u3Sf2LUoeJ3INs8CFtP76PHfeQ3+GI3VhQ54dUu3uDljUaIRwmDTPY4ZZF/ZpRmvF3QqkTRF/R/6SfWW/bKOfQ6g9LEvWboS9OqZ/u2XGPogI/w+H41IbPdDPFPbNmUJfsTZGDwY7U/gXm5Vc8Gvug/JccWBS4erRKUBuA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 020a4185-2aa0-4050-6b8f-08dc3f177351 X-MS-Exchange-CrossTenant-AuthSource: GV1SPRMB0052.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Mar 2024 02:28:33.3091 (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: DB9P250MB0500 Subject: [FFmpeg-devel] [PATCH] avcodec/hevc_cabac: Let compiler count offsets 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: CPWRxWiXYhUL This is easily possible with an X macro. Using an enum for the offsets also allows to remove two arrays which are not really needed and will typically be optimized away by the compiler: The first just exists to count the number of syntax elements*, the second one exists to get offset[CONSTANT]. These constants were of type enum SyntaxElement and this enum was only used in hevc_cabac.c (although it was declared in hevcdec.h); it is now no longer needed at all and has therefore been removed. The first of these arrays led to a warning from Clang which is fixed by this commit: warning: variable 'num_bins_in_se' is not needed and will not be emitted [-Wunneeded-internal-declaration] *: One could also just added a trailing SYNTAX_ELEMENT_NB to the SyntaxElement enum for this purpose. Signed-off-by: Andreas Rheinhardt --- libavcodec/hevc_cabac.c | 248 ++++++++++++++++------------------------ libavcodec/hevcdec.h | 52 --------- 2 files changed, 100 insertions(+), 200 deletions(-) diff --git a/libavcodec/hevc_cabac.c b/libavcodec/hevc_cabac.c index 6b38da84bd..63ffb3d37c 100644 --- a/libavcodec/hevc_cabac.c +++ b/libavcodec/hevc_cabac.c @@ -31,114 +31,66 @@ #define CABAC_MAX_BIN 31 -/** - * number of bin by SyntaxElement. - */ -static const int8_t num_bins_in_se[] = { - 1, // sao_merge_flag - 1, // sao_type_idx - 0, // sao_eo_class - 0, // sao_band_position - 0, // sao_offset_abs - 0, // sao_offset_sign - 0, // end_of_slice_flag - 3, // split_coding_unit_flag - 1, // cu_transquant_bypass_flag - 3, // skip_flag - 3, // cu_qp_delta - 1, // pred_mode - 4, // part_mode - 0, // pcm_flag - 1, // prev_intra_luma_pred_mode - 0, // mpm_idx - 0, // rem_intra_luma_pred_mode - 2, // intra_chroma_pred_mode - 1, // merge_flag - 1, // merge_idx - 5, // inter_pred_idc - 2, // ref_idx_l0 - 2, // ref_idx_l1 - 2, // abs_mvd_greater0_flag - 2, // abs_mvd_greater1_flag - 0, // abs_mvd_minus2 - 0, // mvd_sign_flag - 1, // mvp_lx_flag - 1, // no_residual_data_flag - 3, // split_transform_flag - 2, // cbf_luma - 5, // cbf_cb, cbf_cr - 2, // transform_skip_flag[][] - 2, // explicit_rdpcm_flag[][] - 2, // explicit_rdpcm_dir_flag[][] - 18, // last_significant_coeff_x_prefix - 18, // last_significant_coeff_y_prefix - 0, // last_significant_coeff_x_suffix - 0, // last_significant_coeff_y_suffix - 4, // significant_coeff_group_flag - 44, // significant_coeff_flag - 24, // coeff_abs_level_greater1_flag - 6, // coeff_abs_level_greater2_flag - 0, // coeff_abs_level_remaining - 0, // coeff_sign_flag - 8, // log2_res_scale_abs - 2, // res_scale_sign_flag - 1, // cu_chroma_qp_offset_flag - 1, // cu_chroma_qp_offset_idx -}; +// ELEM(NAME, NUM_BINS) +#define CABAC_ELEMS(ELEM) \ + ELEM(SAO_MERGE_FLAG, 1) \ + ELEM(SAO_TYPE_IDX, 1) \ + ELEM(SAO_EO_CLASS, 0) \ + ELEM(SAO_BAND_POSITION, 0) \ + ELEM(SAO_OFFSET_ABS, 0) \ + ELEM(SAO_OFFSET_SIGN, 0) \ + ELEM(END_OF_SLICE_FLAG, 0) \ + ELEM(SPLIT_CODING_UNIT_FLAG, 3) \ + ELEM(CU_TRANSQUANT_BYPASS_FLAG, 1) \ + ELEM(SKIP_FLAG, 3) \ + ELEM(CU_QP_DELTA, 3) \ + ELEM(PRED_MODE_FLAG, 1) \ + ELEM(PART_MODE, 4) \ + ELEM(PCM_FLAG, 0) \ + ELEM(PREV_INTRA_LUMA_PRED_FLAG, 1) \ + ELEM(MPM_IDX, 0) \ + ELEM(REM_INTRA_LUMA_PRED_MODE, 0) \ + ELEM(INTRA_CHROMA_PRED_MODE, 2) \ + ELEM(MERGE_FLAG, 1) \ + ELEM(MERGE_IDX, 1) \ + ELEM(INTER_PRED_IDC, 5) \ + ELEM(REF_IDX_L0, 2) \ + ELEM(REF_IDX_L1, 2) \ + ELEM(ABS_MVD_GREATER0_FLAG, 2) \ + ELEM(ABS_MVD_GREATER1_FLAG, 2) \ + ELEM(ABS_MVD_MINUS2, 0) \ + ELEM(MVD_SIGN_FLAG, 0) \ + ELEM(MVP_LX_FLAG, 1) \ + ELEM(NO_RESIDUAL_DATA_FLAG, 1) \ + ELEM(SPLIT_TRANSFORM_FLAG, 3) \ + ELEM(CBF_LUMA, 2) \ + ELEM(CBF_CB_CR, 5) \ + ELEM(TRANSFORM_SKIP_FLAG, 2) \ + ELEM(EXPLICIT_RDPCM_FLAG, 2) \ + ELEM(EXPLICIT_RDPCM_DIR_FLAG, 2) \ + ELEM(LAST_SIGNIFICANT_COEFF_X_PREFIX, 18) \ + ELEM(LAST_SIGNIFICANT_COEFF_Y_PREFIX, 18) \ + ELEM(LAST_SIGNIFICANT_COEFF_X_SUFFIX, 0) \ + ELEM(LAST_SIGNIFICANT_COEFF_Y_SUFFIX, 0) \ + ELEM(SIGNIFICANT_COEFF_GROUP_FLAG, 4) \ + ELEM(SIGNIFICANT_COEFF_FLAG, 44) \ + ELEM(COEFF_ABS_LEVEL_GREATER1_FLAG, 24) \ + ELEM(COEFF_ABS_LEVEL_GREATER2_FLAG, 6) \ + ELEM(COEFF_ABS_LEVEL_REMAINING, 0) \ + ELEM(COEFF_SIGN_FLAG, 0) \ + ELEM(LOG2_RES_SCALE_ABS, 8) \ + ELEM(RES_SCALE_SIGN_FLAG, 2) \ + ELEM(CU_CHROMA_QP_OFFSET_FLAG, 1) \ + ELEM(CU_CHROMA_QP_OFFSET_IDX, 1) \ /** - * Offset to ctxIdx 0 in init_values and states, indexed by SyntaxElement. + * Offset to ctxIdx 0 in init_values and states. */ -static const int elem_offset[sizeof(num_bins_in_se)] = { - 0, // sao_merge_flag - 1, // sao_type_idx - 2, // sao_eo_class - 2, // sao_band_position - 2, // sao_offset_abs - 2, // sao_offset_sign - 2, // end_of_slice_flag - 2, // split_coding_unit_flag - 5, // cu_transquant_bypass_flag - 6, // skip_flag - 9, // cu_qp_delta - 12, // pred_mode - 13, // part_mode - 17, // pcm_flag - 17, // prev_intra_luma_pred_mode - 18, // mpm_idx - 18, // rem_intra_luma_pred_mode - 18, // intra_chroma_pred_mode - 20, // merge_flag - 21, // merge_idx - 22, // inter_pred_idc - 27, // ref_idx_l0 - 29, // ref_idx_l1 - 31, // abs_mvd_greater0_flag - 33, // abs_mvd_greater1_flag - 35, // abs_mvd_minus2 - 35, // mvd_sign_flag - 35, // mvp_lx_flag - 36, // no_residual_data_flag - 37, // split_transform_flag - 40, // cbf_luma - 42, // cbf_cb, cbf_cr - 47, // transform_skip_flag[][] - 49, // explicit_rdpcm_flag[][] - 51, // explicit_rdpcm_dir_flag[][] - 53, // last_significant_coeff_x_prefix - 71, // last_significant_coeff_y_prefix - 89, // last_significant_coeff_x_suffix - 89, // last_significant_coeff_y_suffix - 89, // significant_coeff_group_flag - 93, // significant_coeff_flag - 137, // coeff_abs_level_greater1_flag - 161, // coeff_abs_level_greater2_flag - 167, // coeff_abs_level_remaining - 167, // coeff_sign_flag - 167, // log2_res_scale_abs - 175, // res_scale_sign_flag - 177, // cu_chroma_qp_offset_flag - 178, // cu_chroma_qp_offset_idx +enum { +#define OFFSET(NAME, NUM_BINS) \ + NAME ## _OFFSET, \ + NAME ## _END = NAME ## _OFFSET + NUM_BINS - 1, +CABAC_ELEMS(OFFSET) }; #define CNU 154 @@ -570,12 +522,12 @@ int ff_hevc_cabac_init(HEVCLocalContext *lc, int ctb_addr_ts) int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[SAO_MERGE_FLAG]); + return GET_CABAC(SAO_MERGE_FLAG_OFFSET); } int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc) { - if (!GET_CABAC(elem_offset[SAO_TYPE_IDX])) + if (!GET_CABAC(SAO_TYPE_IDX_OFFSET)) return 0; if (!get_cabac_bypass(&lc->cc)) @@ -622,7 +574,7 @@ int ff_hevc_end_of_slice_flag_decode(HEVCLocalContext *lc) int ff_hevc_cu_transquant_bypass_flag_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[CU_TRANSQUANT_BYPASS_FLAG]); + return GET_CABAC(CU_TRANSQUANT_BYPASS_FLAG_OFFSET); } int ff_hevc_skip_flag_decode(HEVCLocalContext *lc, int x0, int y0, int x_cb, int y_cb) @@ -638,7 +590,7 @@ int ff_hevc_skip_flag_decode(HEVCLocalContext *lc, int x0, int y0, int x_cb, int if (lc->ctb_up_flag || y0b) inc += !!SAMPLE_CTB(s->skip_flag, x_cb, y_cb - 1); - return GET_CABAC(elem_offset[SKIP_FLAG] + inc); + return GET_CABAC(SKIP_FLAG_OFFSET + inc); } int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc) @@ -647,7 +599,7 @@ int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc) int suffix_val = 0; int inc = 0; - while (prefix_val < 5 && GET_CABAC(elem_offset[CU_QP_DELTA] + inc)) { + while (prefix_val < 5 && GET_CABAC(CU_QP_DELTA_OFFSET + inc)) { prefix_val++; inc = 1; } @@ -675,7 +627,7 @@ int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc) int ff_hevc_cu_chroma_qp_offset_flag(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_FLAG]); + return GET_CABAC(CU_CHROMA_QP_OFFSET_FLAG_OFFSET); } int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc) @@ -683,7 +635,7 @@ int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc) int c_max= FFMAX(5, lc->parent->ps.pps->chroma_qp_offset_list_len_minus1); int i = 0; - while (i < c_max && GET_CABAC(elem_offset[CU_CHROMA_QP_OFFSET_IDX])) + while (i < c_max && GET_CABAC(CU_CHROMA_QP_OFFSET_IDX_OFFSET)) i++; return i; @@ -691,7 +643,7 @@ int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc) int ff_hevc_pred_mode_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[PRED_MODE_FLAG]); + return GET_CABAC(PRED_MODE_FLAG_OFFSET); } int ff_hevc_split_coding_unit_flag_decode(HEVCLocalContext *lc, int ct_depth, int x0, int y0) @@ -712,40 +664,40 @@ int ff_hevc_split_coding_unit_flag_decode(HEVCLocalContext *lc, int ct_depth, in inc += (depth_left > ct_depth); inc += (depth_top > ct_depth); - return GET_CABAC(elem_offset[SPLIT_CODING_UNIT_FLAG] + inc); + return GET_CABAC(SPLIT_CODING_UNIT_FLAG_OFFSET + inc); } int ff_hevc_part_mode_decode(HEVCLocalContext *lc, int log2_cb_size) { - if (GET_CABAC(elem_offset[PART_MODE])) // 1 + if (GET_CABAC(PART_MODE_OFFSET)) // 1 return PART_2Nx2N; if (log2_cb_size == lc->parent->ps.sps->log2_min_cb_size) { if (lc->cu.pred_mode == MODE_INTRA) // 0 return PART_NxN; - if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01 + if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01 return PART_2NxN; if (log2_cb_size == 3) // 00 return PART_Nx2N; - if (GET_CABAC(elem_offset[PART_MODE] + 2)) // 001 + if (GET_CABAC(PART_MODE_OFFSET + 2)) // 001 return PART_Nx2N; return PART_NxN; // 000 } if (!lc->parent->ps.sps->amp_enabled_flag) { - if (GET_CABAC(elem_offset[PART_MODE] + 1)) // 01 + if (GET_CABAC(PART_MODE_OFFSET + 1)) // 01 return PART_2NxN; return PART_Nx2N; } - if (GET_CABAC(elem_offset[PART_MODE] + 1)) { // 01X, 01XX - if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 011 + if (GET_CABAC(PART_MODE_OFFSET + 1)) { // 01X, 01XX + if (GET_CABAC(PART_MODE_OFFSET + 3)) // 011 return PART_2NxN; if (get_cabac_bypass(&lc->cc)) // 0101 return PART_2NxnD; return PART_2NxnU; // 0100 } - if (GET_CABAC(elem_offset[PART_MODE] + 3)) // 001 + if (GET_CABAC(PART_MODE_OFFSET + 3)) // 001 return PART_Nx2N; if (get_cabac_bypass(&lc->cc)) // 0001 return PART_nRx2N; @@ -759,7 +711,7 @@ int ff_hevc_pcm_flag_decode(HEVCLocalContext *lc) int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[PREV_INTRA_LUMA_PRED_FLAG]); + return GET_CABAC(PREV_INTRA_LUMA_PRED_FLAG_OFFSET); } int ff_hevc_mpm_idx_decode(HEVCLocalContext *lc) @@ -783,7 +735,7 @@ int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCLocalContext *lc) int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc) { int ret; - if (!GET_CABAC(elem_offset[INTRA_CHROMA_PRED_MODE])) + if (!GET_CABAC(INTRA_CHROMA_PRED_MODE_OFFSET)) return 4; ret = get_cabac_bypass(&lc->cc) << 1; @@ -793,7 +745,7 @@ int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc) int ff_hevc_merge_idx_decode(HEVCLocalContext *lc) { - int i = GET_CABAC(elem_offset[MERGE_IDX]); + int i = GET_CABAC(MERGE_IDX_OFFSET); if (i != 0) { while (i < lc->parent->sh.max_num_merge_cand-1 && get_cabac_bypass(&lc->cc)) @@ -804,17 +756,17 @@ int ff_hevc_merge_idx_decode(HEVCLocalContext *lc) int ff_hevc_merge_flag_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[MERGE_FLAG]); + return GET_CABAC(MERGE_FLAG_OFFSET); } int ff_hevc_inter_pred_idc_decode(HEVCLocalContext *lc, int nPbW, int nPbH) { if (nPbW + nPbH == 12) - return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4); - if (GET_CABAC(elem_offset[INTER_PRED_IDC] + lc->ct_depth)) + return GET_CABAC(INTER_PRED_IDC_OFFSET + 4); + if (GET_CABAC(INTER_PRED_IDC_OFFSET + lc->ct_depth)) return PRED_BI; - return GET_CABAC(elem_offset[INTER_PRED_IDC] + 4); + return GET_CABAC(INTER_PRED_IDC_OFFSET + 4); } int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx) @@ -823,7 +775,7 @@ int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx) int max = num_ref_idx_lx - 1; int max_ctx = FFMIN(max, 2); - while (i < max_ctx && GET_CABAC(elem_offset[REF_IDX_L0] + i)) + while (i < max_ctx && GET_CABAC(REF_IDX_L0_OFFSET + i)) i++; if (i == 2) { while (i < max && get_cabac_bypass(&lc->cc)) @@ -835,22 +787,22 @@ int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx) int ff_hevc_mvp_lx_flag_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[MVP_LX_FLAG]); + return GET_CABAC(MVP_LX_FLAG_OFFSET); } int ff_hevc_no_residual_syntax_flag_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[NO_RESIDUAL_DATA_FLAG]); + return GET_CABAC(NO_RESIDUAL_DATA_FLAG_OFFSET); } static av_always_inline int abs_mvd_greater0_flag_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[ABS_MVD_GREATER0_FLAG]); + return GET_CABAC(ABS_MVD_GREATER0_FLAG_OFFSET); } static av_always_inline int abs_mvd_greater1_flag_decode(HEVCLocalContext *lc) { - return GET_CABAC(elem_offset[ABS_MVD_GREATER1_FLAG] + 1); + return GET_CABAC(ABS_MVD_GREATER1_FLAG_OFFSET + 1); } static av_always_inline int mvd_decode(HEVCLocalContext *lc) @@ -878,39 +830,39 @@ static av_always_inline int mvd_sign_flag_decode(HEVCLocalContext *lc) int ff_hevc_split_transform_flag_decode(HEVCLocalContext *lc, int log2_trafo_size) { - return GET_CABAC(elem_offset[SPLIT_TRANSFORM_FLAG] + 5 - log2_trafo_size); + return GET_CABAC(SPLIT_TRANSFORM_FLAG_OFFSET + 5 - log2_trafo_size); } int ff_hevc_cbf_cb_cr_decode(HEVCLocalContext *lc, int trafo_depth) { - return GET_CABAC(elem_offset[CBF_CB_CR] + trafo_depth); + return GET_CABAC(CBF_CB_CR_OFFSET + trafo_depth); } int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth) { - return GET_CABAC(elem_offset[CBF_LUMA] + !trafo_depth); + return GET_CABAC(CBF_LUMA_OFFSET + !trafo_depth); } static int hevc_transform_skip_flag_decode(HEVCLocalContext *lc, int c_idx) { - return GET_CABAC(elem_offset[TRANSFORM_SKIP_FLAG] + !!c_idx); + return GET_CABAC(TRANSFORM_SKIP_FLAG_OFFSET + !!c_idx); } static int explicit_rdpcm_flag_decode(HEVCLocalContext *lc, int c_idx) { - return GET_CABAC(elem_offset[EXPLICIT_RDPCM_FLAG] + !!c_idx); + return GET_CABAC(EXPLICIT_RDPCM_FLAG_OFFSET + !!c_idx); } static int explicit_rdpcm_dir_flag_decode(HEVCLocalContext *lc, int c_idx) { - return GET_CABAC(elem_offset[EXPLICIT_RDPCM_DIR_FLAG] + !!c_idx); + return GET_CABAC(EXPLICIT_RDPCM_DIR_FLAG_OFFSET + !!c_idx); } int ff_hevc_log2_res_scale_abs(HEVCLocalContext *lc, int idx) { int i =0; - while (i < 4 && GET_CABAC(elem_offset[LOG2_RES_SCALE_ABS] + 4 * idx + i)) + while (i < 4 && GET_CABAC(LOG2_RES_SCALE_ABS_OFFSET + 4 * idx + i)) i++; return i; @@ -918,7 +870,7 @@ int ff_hevc_log2_res_scale_abs(HEVCLocalContext *lc, int idx) int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx) { - return GET_CABAC(elem_offset[RES_SCALE_SIGN_FLAG] + idx); + return GET_CABAC(RES_SCALE_SIGN_FLAG_OFFSET + idx); } static av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCLocalContext *lc, int c_idx, @@ -936,13 +888,13 @@ static av_always_inline void last_significant_coeff_xy_prefix_decode(HEVCLocalCo ctx_shift = log2_size - 2; } while (i < max && - GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_X_PREFIX] + (i >> ctx_shift) + ctx_offset)) + GET_CABAC(LAST_SIGNIFICANT_COEFF_X_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset)) i++; *last_scx_prefix = i; i = 0; while (i < max && - GET_CABAC(elem_offset[LAST_SIGNIFICANT_COEFF_Y_PREFIX] + (i >> ctx_shift) + ctx_offset)) + GET_CABAC(LAST_SIGNIFICANT_COEFF_Y_PREFIX_OFFSET + (i >> ctx_shift) + ctx_offset)) i++; *last_scy_prefix = i; } @@ -965,18 +917,18 @@ static av_always_inline int significant_coeff_group_flag_decode(HEVCLocalContext inc = FFMIN(ctx_cg, 1) + (c_idx>0 ? 2 : 0); - return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_GROUP_FLAG] + inc); + return GET_CABAC(SIGNIFICANT_COEFF_GROUP_FLAG_OFFSET + inc); } static av_always_inline int significant_coeff_flag_decode(HEVCLocalContext *lc, int x_c, int y_c, int offset, const uint8_t *ctx_idx_map) { int inc = ctx_idx_map[(y_c << 2) + x_c] + offset; - return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + inc); + return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + inc); } static av_always_inline int significant_coeff_flag_decode_0(HEVCLocalContext *lc, int c_idx, int offset) { - return GET_CABAC(elem_offset[SIGNIFICANT_COEFF_FLAG] + offset); + return GET_CABAC(SIGNIFICANT_COEFF_FLAG_OFFSET + offset); } static av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCLocalContext *lc, int c_idx, int inc) @@ -985,7 +937,7 @@ static av_always_inline int coeff_abs_level_greater1_flag_decode(HEVCLocalContex if (c_idx > 0) inc += 16; - return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER1_FLAG] + inc); + return GET_CABAC(COEFF_ABS_LEVEL_GREATER1_FLAG_OFFSET + inc); } static av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCLocalContext *lc, int c_idx, int inc) @@ -993,7 +945,7 @@ static av_always_inline int coeff_abs_level_greater2_flag_decode(HEVCLocalContex if (c_idx > 0) inc += 4; - return GET_CABAC(elem_offset[COEFF_ABS_LEVEL_GREATER2_FLAG] + inc); + return GET_CABAC(COEFF_ABS_LEVEL_GREATER2_FLAG_OFFSET + inc); } static av_always_inline int coeff_abs_level_remaining_decode(HEVCLocalContext *lc, int rc_rice_param) diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h index c697119891..e65a6180ca 100644 --- a/libavcodec/hevcdec.h +++ b/libavcodec/hevcdec.h @@ -86,58 +86,6 @@ enum RPSType { NB_RPS_TYPE, }; -enum SyntaxElement { - SAO_MERGE_FLAG = 0, - SAO_TYPE_IDX, - SAO_EO_CLASS, - SAO_BAND_POSITION, - SAO_OFFSET_ABS, - SAO_OFFSET_SIGN, - END_OF_SLICE_FLAG, - SPLIT_CODING_UNIT_FLAG, - CU_TRANSQUANT_BYPASS_FLAG, - SKIP_FLAG, - CU_QP_DELTA, - PRED_MODE_FLAG, - PART_MODE, - PCM_FLAG, - PREV_INTRA_LUMA_PRED_FLAG, - MPM_IDX, - REM_INTRA_LUMA_PRED_MODE, - INTRA_CHROMA_PRED_MODE, - MERGE_FLAG, - MERGE_IDX, - INTER_PRED_IDC, - REF_IDX_L0, - REF_IDX_L1, - ABS_MVD_GREATER0_FLAG, - ABS_MVD_GREATER1_FLAG, - ABS_MVD_MINUS2, - MVD_SIGN_FLAG, - MVP_LX_FLAG, - NO_RESIDUAL_DATA_FLAG, - SPLIT_TRANSFORM_FLAG, - CBF_LUMA, - CBF_CB_CR, - TRANSFORM_SKIP_FLAG, - EXPLICIT_RDPCM_FLAG, - EXPLICIT_RDPCM_DIR_FLAG, - LAST_SIGNIFICANT_COEFF_X_PREFIX, - LAST_SIGNIFICANT_COEFF_Y_PREFIX, - LAST_SIGNIFICANT_COEFF_X_SUFFIX, - LAST_SIGNIFICANT_COEFF_Y_SUFFIX, - SIGNIFICANT_COEFF_GROUP_FLAG, - SIGNIFICANT_COEFF_FLAG, - COEFF_ABS_LEVEL_GREATER1_FLAG, - COEFF_ABS_LEVEL_GREATER2_FLAG, - COEFF_ABS_LEVEL_REMAINING, - COEFF_SIGN_FLAG, - LOG2_RES_SCALE_ABS, - RES_SCALE_SIGN_FLAG, - CU_CHROMA_QP_OFFSET_FLAG, - CU_CHROMA_QP_OFFSET_IDX, -}; - enum PartMode { PART_2Nx2N = 0, PART_2NxN = 1,