From patchwork Tue Sep 26 22:17:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 43946 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:2a18:b0:15d:8365:d4b8 with SMTP id e24csp2210327pzh; Tue, 26 Sep 2023 15:21:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF+jAIvS77vZu324algryaKCpIjbRbdcGNgggTF95tTl44Faf8R6yJ+5rWRajb7u+c9j3bS X-Received: by 2002:a05:6402:899:b0:530:db58:61c8 with SMTP id e25-20020a056402089900b00530db5861c8mr297013edy.23.1695766880886; Tue, 26 Sep 2023 15:21:20 -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 c23-20020aa7d617000000b00530c2e7963asi7216009edr.168.2023.09.26.15.21.20; Tue, 26 Sep 2023 15:21:20 -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=YFRpFsZl; 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 AD75A68CB25; Wed, 27 Sep 2023 01:19:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2043.outbound.protection.outlook.com [40.92.89.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 691C668CB11 for ; Wed, 27 Sep 2023 01:19:15 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=B0jLSWHOxY30qCfE183sxEGdEdblcoWMg04piGq67cW49K24BO3CxRywkn5G151sc7HCjGX7Kuf/6M+aMNbvMSlRoeWNUJt8m+N0Slqwt1LXiUA4icK6M3YTrf0Jafi6d8hkIBs+z4nXImWHp42aNKbxj0FYNpXAe7D6Xc8WjXEa0RAYM7MXrdKgAX4RRxNYZ7SR6YBnlQm4bdzmsD/95JiGf3+YCtthdLwqviozZBG9jwjX58YVa1sQfhg6he8Y7WZoRmY5BXcTCepptBA3oXxz6tajL6ss6kkSK/SjQfQx3jdjY7WMNB5z1dyWHZpNyKE1ZPNcQYImD89FizVd4A== 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=k6S5j1MZWK2BqHIfIL9szOEQrdVc/zLM3uo/Y7+iu5Y=; b=CQBRoYwaqmgWiqlfcXF0jzKVXvR7mKDFJGfKoPXxn6U5777YnEUxCuwXEsZBStem/hNzI4huNGXlx4hfY/dsRhEdrIVjS6nmZhwcHgzVgos0qW74nPviy7/78eglW75Og+OkRgZkMsQ3ojQN5luV4net6j8PDiKxPP0jHRXgBqkFN619A1iOhtYenZmAgJv8apkI921UCbr2WxZpOg5lBNJYeUiuMnw3EDKmJ3UCceADOfrGYZMy826Q+HfEMHaQ6xcChinw4fC7zvNC0kVd4E2k10McyfSQK+q0W3xgKsXHM+3jLplHxR5IgtvENVmRMw3Zzaw3XhU7mmC+vlpopw== 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=k6S5j1MZWK2BqHIfIL9szOEQrdVc/zLM3uo/Y7+iu5Y=; b=YFRpFsZlVa4QmGOI/wsfIVcB8kG5pobfdzBUs0/vvWr+cvXObZKd1Icgj5V9hLFjwZrxTYnZsi3//7Zoj7DhVAFZSHrQWenVZLLxJTyaNYPpHSOg42MVtnltmMfPTfpqzlyr9N+1IKSk24pOXS0JRs6RLoB+6M1XG1y0Uyvw7QulTuqkQuh/vs63DTHNs4CeW9OW4qEo7rX+3Q1sCsOSd+qKbWeWObJX71o+Aq3HTTD3oClkP+4xppgmJRWM5qSC8vIGYJT2nXWAY+3wQvwkKUhYrAd0mXl2m9bdXi8Ns/a60ThN0yDF2uS8oLsw8FECzBKGLFIFaSiUx7MysT6kjA== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by AS8P250MB0393.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:37e::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6813.28; Tue, 26 Sep 2023 22:19:14 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::9d42:7b4f:71ef:c76a]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::9d42:7b4f:71ef:c76a%3]) with mapi id 15.20.6813.027; Tue, 26 Sep 2023 22:19:13 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 27 Sep 2023 00:17:05 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [nTaIyDzz4/XNZaoF8Gk03gyMraWQrnUJ] X-ClientProxiedBy: FR3P281CA0019.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1c::6) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20230926221732.3711507-33-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|AS8P250MB0393:EE_ X-MS-Office365-Filtering-Correlation-Id: 8fb94585-0caf-4398-2dc3-08dbbede9d51 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: u7EdfWG0ZPzk+sNrw3vqi/bVz8fF0sYEYE8GfrgY2L1W6jzPCOdrg/airVqBxXWuVzLTUJEei5m8IQ5k54CRwQmZKMhuLx/AyofrEzbsWMQbnD4OtSIUPbge8hzuDwSlogMkx/S4nT5cT5lbg1e6pc4VzGcR//yCZUSwuIXHw2yeDiDWRnJBoOa8vVQpoeN7dcGVLbCdSLCj2/ojPID8kcrNecjktE2KEL1p4wEYTkiGaBcBFll7zq6C5xgSpmJ+76k1LQrXRpMe0Lx2rrb2i+Hql0JX5tIsSKO4VZ1XTbV0Gb71xzn+QXgmJPqIAm4COO/Rp5nMoQDLcvWv5dxuR9Wbt+2m0fA8oL1SQ/wspHz6sRwQEZNVXZXoRWupGVDD737YGjGpP4Ea/K/eKQAHxHJj+2Yt76aq7zBLRxjLk8HiHWeHMpMXrHBagcclX+Hz2kPz9gCRRlfjCHdnkoeWefdnScmCNoPNaM0ic15ZbADhaJ44q591Ih4Q0NzrurtuWq894Qp9JWwp4uTHkrtym8HgScn/D9/MnHFMzWA3daxdsqbH21BiwtMSjTL019xwNPbX9xYPlSnJXE8PdUNO+YvHM/iwtrpb5G1DlUJ65jyWRlVlOgQ/TUaFmBf6hPVj X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: tSthMMVTRZcIlt0O/lOpc8uqKmUzQguszatJj5m90SmgdmbGyzlaYtNaoBTeRpx9zc1SrOuvfjVfo82WZ8pHiPBLHTdvgUT9GGpSzhduavObnSWHn176k89+R3z7kr71sAFDJLI3j7fRWNP0+6cNDiAMhBnp+O2AHrhs97gYkgfGvf9cZUKasb3u0QHj7ECf341z1tHCdpy9rMdsQgQgW9mrTHzgw5+hWQeXGx3D0miDlIDsj4zGeEatFIpUvf12G6IvX6XALvFc6yyG6qL8q7dMnwiPHrRJMJY4QtGvA/T07ROPrZGazLC1PCDmIdrJFUlRuiThhuIPWRVqlBs6/jKJmMVcMFsH8rXxWG4QlzSEKy1NVxQXRl8NdNHMLKYm14auq9eAyqpUUI7zwzwOjMGtADGHJgCtlfIm99jpdqQc+HKlElTBCMz9hBIRQy8VeX2X+sV2iRZd/0sRdQtt+2d4OlXe1lKS54EjiZzv14T2UyWGVTkmVQEpdPG97mdBAdR61ubInB/J5lLhWWnfiZh9e9JgSIBwJLP0eyRHFxabzKmnDRGs2gpi1xlMp7XhvUNF1ABfIzmbCjHQvRZxRSF91Y4/rh8v8lG7tWpI0p5WJZDOz7PpPUO66SwsblJ/+9q6V8F32qINWeIKZmE9rj80oXeJBmUw/zA1TDd9DjLBIzTLsiJ2Wy4LY9tmI2dHxTPRoOFZO4akCcOZyfrBY2D2Q6CtUpnEGbs65I7/VQRNP3r22tCiy7VfEakGLHkXqTCRTNaKba/iPMLLUH9UBfcV0xMxeMYKoxR1NGqxwCmDJ0/+UeJHb2XmRuMtW8NQTFIZiuBnrAKD0nmIANM0poXJk+RETpbAaHxKUa1N3jDZa9csMaGVcsOIz7WbZV0eejuGbf0DkqYXwYfkFr32x/j2BeN3w5Dh5n/p8Lc89RtUUSXvKhMqcutVbKeioV949aCHZReLOleEadF6QR1uMdQBx2H4Cezzz3f61t/txfTrps4Am/WAM4Qmu6+S0x8Rqr3QLy6bLH3i49P6TGdOdEAeO1aGUr7+SHN6Nb+5E43V2LnyIlyXxqfihq8E+2D55s2f8gVKrNn4ZU38WVkZ68EBPTLCjdbXz+QmiPc0LO2HtWE+to3MgJ6e6a4Wcy0dgo7a7437Ja+GDMyH5ViNiYrowaY0fcfoIEOmmDisH4nS6y/hff+ckWCSEyrcRN/gv5HzS39WkPpZn8DlOdmvnAv77sJej/RlqBocj7281hq4XX+pub33V29RoBlPZTBu X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8fb94585-0caf-4398-2dc3-08dbbede9d51 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Sep 2023 22:19:13.7222 (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: AS8P250MB0393 Subject: [FFmpeg-devel] [PATCH 34/61] avcodec/vc1: Avoid superfluous VLC structures 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: y7nR4+zvGjB6 For all VLCs here, the number of bits of the VLC is write-only, because it is hardcoded at the call site. Therefore one can replace these VLC structures with the only thing that is actually used: The pointer to the VLCElem table. And in some cases one can even avoid this. Signed-off-by: Andreas Rheinhardt --- libavcodec/vc1.c | 60 +++++++------- libavcodec/vc1.h | 10 +-- libavcodec/vc1_block.c | 74 +++++++++--------- libavcodec/vc1data.c | 36 ++++----- libavcodec/vc1data.h | 36 ++++----- libavcodec/vc1dec.c | 174 +++++++++++++++++------------------------ 6 files changed, 180 insertions(+), 210 deletions(-) diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 795c6db541..e234192fdd 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -104,7 +104,7 @@ static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v) height = v->s.mb_height >> v->field_mode; stride = v->s.mb_stride; invert = get_bits1(gb); - imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1); + imode = get_vlc2(gb, ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 1); *raw_flag = 0; switch (imode) { @@ -126,7 +126,7 @@ static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v) y = offset = 0; // decode bitplane as one long line for (; y < height * width; y += 2) { - code = get_vlc2(gb, ff_vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1); + code = get_vlc2(gb, ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 1); *planep++ = code & 1; offset++; if (offset == width) { @@ -146,7 +146,7 @@ static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v) if (!(height % 3) && (width % 3)) { // use 2x3 decoding for (y = 0; y < height; y += 3) { for (x = width & 1; x < width; x += 2) { - code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2); + code = get_vlc2(gb, ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 2); if (code < 0) { av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); return -1; @@ -166,7 +166,7 @@ static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v) planep += (height & 1) * stride; for (y = height & 1; y < height; y += 2) { for (x = width % 3; x < width; x += 3) { - code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2); + code = get_vlc2(gb, ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 2); if (code < 0) { av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); return -1; @@ -765,7 +765,7 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) /* Hopefully this is correct for P-frames */ v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables v->cbptab = get_bits(gb, 2); - v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[v->cbptab]; + v->cbpcy_vlc = ff_vc1_cbpcy_p_vlc[v->cbptab]; if (v->dquant) { av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); @@ -804,7 +804,7 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) v->s.mv_table_index = get_bits(gb, 2); v->cbptab = get_bits(gb, 2); - v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[v->cbptab]; + v->cbpcy_vlc = ff_vc1_cbpcy_p_vlc[v->cbptab]; if (v->dquant) { av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); @@ -1061,19 +1061,19 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) "Imode: %i, Invert: %i\n", status>>1, status&1); v->mbmodetab = get_bits(gb, 2); if (v->fourmvswitch) - v->mbmode_vlc = &ff_vc1_intfr_4mv_mbmode_vlc[v->mbmodetab]; + v->mbmode_vlc = ff_vc1_intfr_4mv_mbmode_vlc[v->mbmodetab]; else - v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[v->mbmodetab]; + v->mbmode_vlc = ff_vc1_intfr_non4mv_mbmode_vlc[v->mbmodetab]; v->imvtab = get_bits(gb, 2); - v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[v->imvtab]; + v->imv_vlc = ff_vc1_1ref_mvdata_vlc[v->imvtab]; // interlaced p-picture cbpcy range is [1, 63] v->icbptab = get_bits(gb, 3); - v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[v->icbptab]; + v->cbpcy_vlc = ff_vc1_icbpcy_vlc[v->icbptab]; v->twomvbptab = get_bits(gb, 2); - v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[v->twomvbptab]; + v->twomvbp_vlc = ff_vc1_2mv_block_pattern_vlc[v->twomvbptab]; if (v->fourmvswitch) { v->fourmvbptab = get_bits(gb, 2); - v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab]; + v->fourmvbp_vlc = ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab]; } } } @@ -1158,7 +1158,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) /* Hopefully this is correct for P-frames */ v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables v->cbptab = get_bits(gb, 2); - v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[v->cbptab]; + v->cbpcy_vlc = ff_vc1_cbpcy_p_vlc[v->cbptab]; } else if (v->fcm == ILACE_FRAME) { // frame interlaced v->qs_last = v->s.quarter_sample; v->s.quarter_sample = 1; @@ -1167,18 +1167,18 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) v->mbmodetab = get_bits(gb, 3); v->imvtab = get_bits(gb, 2 + v->numref); if (!v->numref) - v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[v->imvtab]; + v->imv_vlc = ff_vc1_1ref_mvdata_vlc[v->imvtab]; else - v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[v->imvtab]; + v->imv_vlc = ff_vc1_2ref_mvdata_vlc[v->imvtab]; v->icbptab = get_bits(gb, 3); - v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[v->icbptab]; + v->cbpcy_vlc = ff_vc1_icbpcy_vlc[v->icbptab]; if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_MIXED_MV) || v->mv_mode == MV_PMODE_MIXED_MV) { v->fourmvbptab = get_bits(gb, 2); - v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab]; - v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[v->mbmodetab]; + v->fourmvbp_vlc = ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab]; + v->mbmode_vlc = ff_vc1_if_mmv_mbmode_vlc[v->mbmodetab]; } else { - v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[v->mbmodetab]; + v->mbmode_vlc = ff_vc1_if_1mv_mbmode_vlc[v->mbmodetab]; } } if (v->dquant) { @@ -1234,16 +1234,16 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) "Imode: %i, Invert: %i\n", status>>1, status&1); v->mbmodetab = get_bits(gb, 3); if (v->mv_mode == MV_PMODE_MIXED_MV) - v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[v->mbmodetab]; + v->mbmode_vlc = ff_vc1_if_mmv_mbmode_vlc[v->mbmodetab]; else - v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[v->mbmodetab]; + v->mbmode_vlc = ff_vc1_if_1mv_mbmode_vlc[v->mbmodetab]; v->imvtab = get_bits(gb, 3); - v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[v->imvtab]; + v->imv_vlc = ff_vc1_2ref_mvdata_vlc[v->imvtab]; v->icbptab = get_bits(gb, 3); - v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[v->icbptab]; + v->cbpcy_vlc = ff_vc1_icbpcy_vlc[v->icbptab]; if (v->mv_mode == MV_PMODE_MIXED_MV) { v->fourmvbptab = get_bits(gb, 2); - v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab]; + v->fourmvbp_vlc = ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab]; } v->numref = 1; // interlaced field B pictures are always 2-ref } else if (v->fcm == ILACE_FRAME) { @@ -1268,16 +1268,16 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " "Imode: %i, Invert: %i\n", status>>1, status&1); v->mbmodetab = get_bits(gb, 2); - v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[v->mbmodetab]; + v->mbmode_vlc = ff_vc1_intfr_non4mv_mbmode_vlc[v->mbmodetab]; v->imvtab = get_bits(gb, 2); - v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[v->imvtab]; + v->imv_vlc = ff_vc1_1ref_mvdata_vlc[v->imvtab]; // interlaced p/b-picture cbpcy range is [1, 63] v->icbptab = get_bits(gb, 3); - v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[v->icbptab]; + v->cbpcy_vlc = ff_vc1_icbpcy_vlc[v->icbptab]; v->twomvbptab = get_bits(gb, 2); - v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[v->twomvbptab]; + v->twomvbp_vlc = ff_vc1_2mv_block_pattern_vlc[v->twomvbptab]; v->fourmvbptab = get_bits(gb, 2); - v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab]; + v->fourmvbp_vlc = ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab]; } else { v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN; v->qs_last = v->s.quarter_sample; @@ -1295,7 +1295,7 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) "Imode: %i, Invert: %i\n", status>>1, status&1); v->s.mv_table_index = get_bits(gb, 2); v->cbptab = get_bits(gb, 2); - v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[v->cbptab]; + v->cbpcy_vlc = ff_vc1_cbpcy_p_vlc[v->cbptab]; } if (v->dquant) { diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h index 3b6be78141..0e01458c89 100644 --- a/libavcodec/vc1.h +++ b/libavcodec/vc1.h @@ -279,7 +279,7 @@ typedef struct VC1Context{ */ uint8_t mvrange; ///< Extended MV range flag uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use - VLC *cbpcy_vlc; ///< CBPCY VLC table + const VLCElem *cbpcy_vlc; ///< CBPCY VLC table int tt_index; ///< Index for Transform Type tables (to decode TTMB) uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV) uint8_t* direct_mb_plane; ///< bitplane for "direct" MBs @@ -334,10 +334,10 @@ typedef struct VC1Context{ int intcomp; uint8_t lumscale2; ///< for interlaced field P picture uint8_t lumshift2; - VLC* mbmode_vlc; - VLC* imv_vlc; - VLC* twomvbp_vlc; - VLC* fourmvbp_vlc; + const VLCElem *mbmode_vlc; + const VLCElem *imv_vlc; + const VLCElem *twomvbp_vlc; + const VLCElem *fourmvbp_vlc; uint8_t twomvbp; uint8_t fourmvbp; uint8_t* fieldtx_plane; diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index 751ea57617..a6ee4922f9 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -227,7 +227,7 @@ static void vc1_put_blocks_clamped(VC1Context *v, int put_signed) * @param _dmv_y Vertical differential for decoded MV */ #define GET_MVDATA(_dmv_x, _dmv_y) \ - index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table, \ + index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index], \ VC1_MV_DIFF_VLC_BITS, 2); \ if (index > 36) { \ mb_has_coeffs = 1; \ @@ -282,7 +282,7 @@ static av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x, } extend_x = v->dmvrange & 1; extend_y = (v->dmvrange >> 1) & 1; - index = get_vlc2(gb, v->imv_vlc->table, bits, 3); + index = get_vlc2(gb, v->imv_vlc, bits, 3); if (index == esc) { *dmv_x = get_bits(gb, v->k_x); *dmv_y = get_bits(gb, v->k_y); @@ -519,7 +519,7 @@ static int vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, GetBitContext *gb = &v->s.gb; int index, run, level, lst, sign; - index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); + index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset], AC_VLC_BITS, 3); if (index < 0) return index; if (index != ff_vc1_ac_sizes[codingset] - 1) { @@ -530,7 +530,7 @@ static int vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, } else { int escape = decode210(gb); if (escape != 2) { - index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); + index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset], AC_VLC_BITS, 3); if (index >= ff_vc1_ac_sizes[codingset] - 1U) return AVERROR_INVALIDDATA; run = vc1_index_decode_table[codingset][index][0]; @@ -1124,10 +1124,10 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, s->bdsp.clear_block(block); if (ttmb == -1) { - ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)]; + ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index], VC1_TTBLK_VLC_BITS, 1)]; } if (ttblk == TT_4X4) { - subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1); + subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index], VC1_SUBBLKPAT_VLC_BITS, 1) + 1); } if ((ttblk != TT_8X8 && ttblk != TT_4X4) && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block)) @@ -1328,7 +1328,7 @@ static int vc1_decode_p_mb(VC1Context *v) } else if (mb_has_coeffs) { if (s->mb_intra) s->ac_pred = get_bits1(gb); - cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); GET_MQUANT(); } else { mquant = v->pq; @@ -1337,7 +1337,7 @@ static int vc1_decode_p_mb(VC1Context *v) s->current_picture.qscale_table[mb_pos] = mquant; if (!v->ttmbf && !s->mb_intra && mb_has_coeffs) - ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, + ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); if (!s->mb_intra) ff_vc1_mc_1mv(v, 0); dst_idx = 0; @@ -1393,7 +1393,7 @@ static int vc1_decode_p_mb(VC1Context *v) int intra_count = 0, coded_inter = 0; int is_intra[6], is_coded[6]; /* Get CBPCY */ - cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); for (i = 0; i < 6; i++) { val = ((cbp >> (5 - i)) & 1); s->dc_val[0][s->block_index[i]] = 0; @@ -1445,7 +1445,7 @@ static int vc1_decode_p_mb(VC1Context *v) s->ac_pred = 0; } if (!v->ttmbf && coded_inter) - ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); + ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); for (i = 0; i < 6; i++) { dst_idx += i >> 2; off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); @@ -1539,9 +1539,9 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) skipped = v->s.mbskip_table[mb_pos]; if (!skipped) { if (v->fourmvswitch) - idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done + idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done else - idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line + idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) { /* store the motion vector type in a flag (useful later) */ case MV_PMODE_INTFR_4MV: @@ -1583,7 +1583,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb); mb_has_coeffs = get_bits1(gb); if (mb_has_coeffs) - cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); GET_MQUANT(); s->current_picture.qscale_table[mb_pos] = mquant; @@ -1617,13 +1617,13 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) } else { // inter MB mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3]; if (mb_has_coeffs) - cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) { - v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); + v->twomvbp = get_vlc2(gb, v->twomvbp_vlc, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); } else { if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV) || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) { - v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); + v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); } } s->mb_intra = v->is_intra[s->mb_x] = 0; @@ -1672,7 +1672,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) GET_MQUANT(); // p. 227 s->current_picture.qscale_table[mb_pos] = mquant; if (!v->ttmbf && cbp) - ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); + ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); for (i = 0; i < 6; i++) { s->dc_val[0][s->block_index[i]] = 0; dst_idx += i >> 2; @@ -1742,7 +1742,7 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) mquant = v->pq; /* Lossy initialization */ - idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2); + idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_IF_MBMODE_VLC_BITS, 2); if (idx_mbmode <= 1) { // intra MB v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1. s->mb_intra = 1; @@ -1757,7 +1757,7 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); mb_has_coeffs = idx_mbmode & 1; if (mb_has_coeffs) - cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2); + cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_ICBPCY_VLC_BITS, 2); dst_idx = 0; for (i = 0; i < 6; i++) { v->a_avail = v->c_avail = 0; @@ -1792,7 +1792,7 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) ff_vc1_mc_1mv(v, 0); mb_has_coeffs = !(idx_mbmode & 2); } else { // 4-MV - v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); + v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); for (i = 0; i < 4; i++) { dmv_x = dmv_y = pred_flag = 0; if (v->fourmvbp & (8 >> i)) @@ -1804,13 +1804,13 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) mb_has_coeffs = idx_mbmode & 1; } if (mb_has_coeffs) - cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); if (cbp) { GET_MQUANT(); } s->current_picture.qscale_table[mb_pos] = mquant; if (!v->ttmbf && cbp) { - ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); + ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); } dst_idx = 0; for (i = 0; i < 6; i++) { @@ -1914,12 +1914,12 @@ static int vc1_decode_b_mb(VC1Context *v) return 0; } if (direct) { - cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); GET_MQUANT(); s->mb_intra = 0; s->current_picture.qscale_table[mb_pos] = mquant; if (!v->ttmbf) - ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); + ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0; ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype); vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype); @@ -1952,11 +1952,11 @@ static int vc1_decode_b_mb(VC1Context *v) } if (s->mb_intra) s->ac_pred = get_bits1(gb); - cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); GET_MQUANT(); s->current_picture.qscale_table[mb_pos] = mquant; if (!v->ttmbf && !s->mb_intra && mb_has_coeffs) - ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); + ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); } } dst_idx = 0; @@ -2025,7 +2025,7 @@ static int vc1_decode_b_mb_intfi(VC1Context *v) mquant = v->pq; /* Lossy initialization */ s->mb_intra = 0; - idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2); + idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_IF_MBMODE_VLC_BITS, 2); if (idx_mbmode <= 1) { // intra MB v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1. s->mb_intra = 1; @@ -2040,7 +2040,7 @@ static int vc1_decode_b_mb_intfi(VC1Context *v) v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); mb_has_coeffs = idx_mbmode & 1; if (mb_has_coeffs) - cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2); + cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_ICBPCY_VLC_BITS, 2); dst_idx = 0; for (i = 0; i < 6; i++) { v->a_avail = v->c_avail = 0; @@ -2118,7 +2118,7 @@ static int vc1_decode_b_mb_intfi(VC1Context *v) if (fwd) bmvtype = BMV_TYPE_FORWARD; v->bmvtype = bmvtype; - v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); + v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); for (i = 0; i < 4; i++) { dmv_x[0] = dmv_y[0] = pred_flag[0] = 0; dmv_x[1] = dmv_y[1] = pred_flag[1] = 0; @@ -2134,13 +2134,13 @@ static int vc1_decode_b_mb_intfi(VC1Context *v) mb_has_coeffs = idx_mbmode & 1; } if (mb_has_coeffs) - cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); if (cbp) { GET_MQUANT(); } s->current_picture.qscale_table[mb_pos] = mquant; if (!v->ttmbf && cbp) { - ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); + ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); } dst_idx = 0; for (i = 0; i < 6; i++) { @@ -2200,7 +2200,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) skipped = v->s.mbskip_table[mb_pos]; if (!skipped) { - idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); + idx_mbmode = get_vlc2(gb, v->mbmode_vlc, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) { twomv = 1; v->blk_mv_type[s->block_index[0]] = 1; @@ -2228,7 +2228,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb); mb_has_coeffs = get_bits1(gb); if (mb_has_coeffs) - cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb); GET_MQUANT(); s->current_picture.qscale_table[mb_pos] = mquant; @@ -2323,12 +2323,12 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) if (!skipped) { // inter MB mb_has_coeffs = ff_vc1_mbmode_intfrp[0][idx_mbmode][3]; if (mb_has_coeffs) - cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); + cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc, VC1_CBPCY_P_VLC_BITS, 2); if (!direct) { if (bmvtype == BMV_TYPE_INTERPOLATED && twomv) { - v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); + v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); } else if (bmvtype == BMV_TYPE_INTERPOLATED || twomv) { - v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); + v->twomvbp = get_vlc2(gb, v->twomvbp_vlc, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); } } @@ -2438,7 +2438,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) GET_MQUANT(); // p. 227 s->current_picture.qscale_table[mb_pos] = mquant; if (!v->ttmbf && cbp) - ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2); + ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index], VC1_TTMB_VLC_BITS, 2); for (i = 0; i < 6; i++) { s->dc_val[0][s->block_index[i]] = 0; dst_idx += i >> 2; diff --git a/libavcodec/vc1data.c b/libavcodec/vc1data.c index 5ebf20a0f0..4046ea042f 100644 --- a/libavcodec/vc1data.c +++ b/libavcodec/vc1data.c @@ -102,26 +102,26 @@ const uint8_t ff_vc1_pquant_table[3][32] = { * @todo TODO move this into the context */ //@{ -VLC ff_vc1_imode_vlc; -VLC ff_vc1_norm2_vlc; -VLC ff_vc1_norm6_vlc; +VLCElem ff_vc1_imode_vlc[1 << VC1_IMODE_VLC_BITS]; +VLCElem ff_vc1_norm2_vlc[1 << VC1_NORM2_VLC_BITS]; +VLCElem ff_vc1_norm6_vlc[556]; /* Could be optimized, one table only needs 8 bits */ -VLC ff_vc1_ttmb_vlc[3]; -VLC ff_vc1_mv_diff_vlc[4]; -VLC ff_vc1_cbpcy_p_vlc[4]; -VLC ff_vc1_icbpcy_vlc[8]; -VLC ff_vc1_4mv_block_pattern_vlc[4]; -VLC ff_vc1_2mv_block_pattern_vlc[4]; -VLC ff_vc1_ttblk_vlc[3]; -VLC ff_vc1_subblkpat_vlc[3]; -VLC ff_vc1_intfr_4mv_mbmode_vlc[4]; -VLC ff_vc1_intfr_non4mv_mbmode_vlc[4]; -VLC ff_vc1_if_mmv_mbmode_vlc[8]; -VLC ff_vc1_if_1mv_mbmode_vlc[8]; -VLC ff_vc1_1ref_mvdata_vlc[4]; -VLC ff_vc1_2ref_mvdata_vlc[8]; +const VLCElem *ff_vc1_ttmb_vlc[3]; +const VLCElem *ff_vc1_mv_diff_vlc[4]; +const VLCElem *ff_vc1_cbpcy_p_vlc[4]; +const VLCElem *ff_vc1_icbpcy_vlc[8]; +const VLCElem *ff_vc1_4mv_block_pattern_vlc[4]; +const VLCElem *ff_vc1_2mv_block_pattern_vlc[4]; +const VLCElem *ff_vc1_ttblk_vlc[3]; +const VLCElem *ff_vc1_subblkpat_vlc[3]; +const VLCElem *ff_vc1_intfr_4mv_mbmode_vlc[4]; +const VLCElem *ff_vc1_intfr_non4mv_mbmode_vlc[4]; +const VLCElem *ff_vc1_if_mmv_mbmode_vlc[8]; +const VLCElem *ff_vc1_if_1mv_mbmode_vlc[8]; +const VLCElem *ff_vc1_1ref_mvdata_vlc[4]; +const VLCElem *ff_vc1_2ref_mvdata_vlc[8]; -VLC ff_vc1_ac_coeff_table[8]; +const VLCElem *ff_vc1_ac_coeff_table[8]; //@} diff --git a/libavcodec/vc1data.h b/libavcodec/vc1data.h index 0900469ab2..e71593d023 100644 --- a/libavcodec/vc1data.h +++ b/libavcodec/vc1data.h @@ -56,42 +56,42 @@ extern const uint8_t ff_vc1_mbmode_intfrp[2][15][4]; */ //@{ #define VC1_IMODE_VLC_BITS 4 -extern VLC ff_vc1_imode_vlc; +extern VLCElem ff_vc1_imode_vlc[1 << VC1_IMODE_VLC_BITS]; #define VC1_NORM2_VLC_BITS 3 -extern VLC ff_vc1_norm2_vlc; +extern VLCElem ff_vc1_norm2_vlc[1 << VC1_NORM2_VLC_BITS]; #define VC1_NORM6_VLC_BITS 9 -extern VLC ff_vc1_norm6_vlc; +extern VLCElem ff_vc1_norm6_vlc[556]; /* Could be optimized, one table only needs 8 bits */ #define VC1_TTMB_VLC_BITS 9 //12 -extern VLC ff_vc1_ttmb_vlc[3]; +extern const VLCElem *ff_vc1_ttmb_vlc[3]; #define VC1_MV_DIFF_VLC_BITS 9 //15 -extern VLC ff_vc1_mv_diff_vlc[4]; +extern const VLCElem *ff_vc1_mv_diff_vlc[4]; #define VC1_CBPCY_P_VLC_BITS 9 //14 -extern VLC ff_vc1_cbpcy_p_vlc[4]; +extern const VLCElem *ff_vc1_cbpcy_p_vlc[4]; #define VC1_ICBPCY_VLC_BITS 9 -extern VLC ff_vc1_icbpcy_vlc[8]; +extern const VLCElem *ff_vc1_icbpcy_vlc[8]; #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6 -extern VLC ff_vc1_4mv_block_pattern_vlc[4]; +extern const VLCElem *ff_vc1_4mv_block_pattern_vlc[4]; #define VC1_2MV_BLOCK_PATTERN_VLC_BITS 3 -extern VLC ff_vc1_2mv_block_pattern_vlc[4]; +extern const VLCElem *ff_vc1_2mv_block_pattern_vlc[4]; #define VC1_TTBLK_VLC_BITS 5 -extern VLC ff_vc1_ttblk_vlc[3]; +extern const VLCElem *ff_vc1_ttblk_vlc[3]; #define VC1_SUBBLKPAT_VLC_BITS 6 -extern VLC ff_vc1_subblkpat_vlc[3]; +extern const VLCElem *ff_vc1_subblkpat_vlc[3]; #define VC1_INTFR_4MV_MBMODE_VLC_BITS 9 -extern VLC ff_vc1_intfr_4mv_mbmode_vlc[4]; +extern const VLCElem *ff_vc1_intfr_4mv_mbmode_vlc[4]; #define VC1_INTFR_NON4MV_MBMODE_VLC_BITS 6 -extern VLC ff_vc1_intfr_non4mv_mbmode_vlc[4]; +extern const VLCElem *ff_vc1_intfr_non4mv_mbmode_vlc[4]; #define VC1_IF_MMV_MBMODE_VLC_BITS 5 -extern VLC ff_vc1_if_mmv_mbmode_vlc[8]; +extern const VLCElem *ff_vc1_if_mmv_mbmode_vlc[8]; #define VC1_IF_1MV_MBMODE_VLC_BITS 5 -extern VLC ff_vc1_if_1mv_mbmode_vlc[8]; +extern const VLCElem *ff_vc1_if_1mv_mbmode_vlc[8]; #define VC1_1REF_MVDATA_VLC_BITS 9 -extern VLC ff_vc1_1ref_mvdata_vlc[4]; +extern const VLCElem *ff_vc1_1ref_mvdata_vlc[4]; #define VC1_2REF_MVDATA_VLC_BITS 9 -extern VLC ff_vc1_2ref_mvdata_vlc[8]; +extern const VLCElem *ff_vc1_2ref_mvdata_vlc[8]; -extern VLC ff_vc1_ac_coeff_table[8]; +extern const VLCElem *ff_vc1_ac_coeff_table[8]; #define VC1_IF_MBMODE_VLC_BITS 5 // as a placeholder for VC1_IF_MMV_MBMODE_VLC_BITS // or VC1_IF_1MV_MBMODE_VLC_BITS since they are the same diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 449d2fea5e..fe0158d1fa 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -470,122 +470,92 @@ av_cold void ff_vc1_init_transposed_scantables(VC1Context *v) v->top_blk_sh = 3; } -static const uint16_t vlc_offs[] = { - 0, 520, 552, 616, 1128, 1160, 1224, 1740, 1772, 1836, 1900, 2436, - 2986, 3050, 3610, 4154, 4218, 4746, 5326, 5390, 5902, 6554, 7658, 8342, - 9304, 9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522, - 20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980, - 27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866, - 29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186, - 31714, 31746, 31778, 32306, 32340, 32372 -}; - static av_cold void vc1_init_static(void) { static VLCElem vlc_table[32372]; - - VLC_INIT_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4, - vc1_norm2_bits, 1, 1, - vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS); - VLC_INIT_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64, - vc1_norm6_bits, 1, 1, - vc1_norm6_codes, 2, 2, 556); - VLC_INIT_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7, - vc1_imode_bits, 1, 1, - vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS); + VLCInitState state = VLC_INIT_STATE(vlc_table); + + VLC_INIT_STATIC_TABLE(ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4, + vc1_norm2_bits, 1, 1, + vc1_norm2_codes, 1, 1, 0); + VLC_INIT_STATIC_TABLE(ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64, + vc1_norm6_bits, 1, 1, + vc1_norm6_codes, 2, 2, 0); + VLC_INIT_STATIC_TABLE(ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7, + vc1_imode_bits, 1, 1, + vc1_imode_codes, 1, 1, 0); for (int i = 0; i < 3; i++) { - ff_vc1_ttmb_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 0]]; - ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i * 3 + 1] - vlc_offs[i * 3 + 0]; - vlc_init(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16, - vc1_ttmb_bits[i], 1, 1, - vc1_ttmb_codes[i], 2, 2, VLC_INIT_USE_STATIC); - ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 1]]; - ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1]; - vlc_init(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8, - vc1_ttblk_bits[i], 1, 1, - vc1_ttblk_codes[i], 1, 1, VLC_INIT_USE_STATIC); - ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 2]]; - ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2]; - vlc_init(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15, - vc1_subblkpat_bits[i], 1, 1, - vc1_subblkpat_codes[i], 1, 1, VLC_INIT_USE_STATIC); - } - for (int i = 0; i < 4; i++) { - ff_vc1_4mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 9]]; - ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i * 3 + 10] - vlc_offs[i * 3 + 9]; - vlc_init(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16, - vc1_4mv_block_pattern_bits[i], 1, 1, - vc1_4mv_block_pattern_codes[i], 1, 1, VLC_INIT_USE_STATIC); - ff_vc1_cbpcy_p_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 10]]; - ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i * 3 + 11] - vlc_offs[i * 3 + 10]; - vlc_init(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64, - vc1_cbpcy_p_bits[i], 1, 1, - vc1_cbpcy_p_codes[i], 2, 2, VLC_INIT_USE_STATIC); - ff_vc1_mv_diff_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 11]]; - ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i * 3 + 12] - vlc_offs[i * 3 + 11]; - vlc_init(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73, - vc1_mv_diff_bits[i], 1, 1, - vc1_mv_diff_codes[i], 2, 2, VLC_INIT_USE_STATIC); - } - for (int i = 0; i < 8; i++) { - ff_vc1_ac_coeff_table[i].table = &vlc_table[vlc_offs[i * 2 + 21]]; - ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i * 2 + 22] - vlc_offs[i * 2 + 21]; - vlc_init(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, ff_vc1_ac_sizes[i], - &vc1_ac_tables[i][0][1], 8, 4, - &vc1_ac_tables[i][0][0], 8, 4, VLC_INIT_USE_STATIC); - /* initialize interlaced MVDATA tables (2-Ref) */ - ff_vc1_2ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 2 + 22]]; - ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 2 + 23] - vlc_offs[i * 2 + 22]; - vlc_init(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126, - vc1_2ref_mvdata_bits[i], 1, 1, - vc1_2ref_mvdata_codes[i], 4, 4, VLC_INIT_USE_STATIC); + ff_vc1_ttmb_vlc[i] = + ff_vlc_init_tables(&state, VC1_TTMB_VLC_BITS, 16, + vc1_ttmb_bits[i], 1, 1, + vc1_ttmb_codes[i], 2, 2, 0); + ff_vc1_ttblk_vlc[i] = + ff_vlc_init_tables(&state, VC1_TTBLK_VLC_BITS, 8, + vc1_ttblk_bits[i], 1, 1, + vc1_ttblk_codes[i], 1, 1, 0); + ff_vc1_subblkpat_vlc[i] = + ff_vlc_init_tables(&state, VC1_SUBBLKPAT_VLC_BITS, 15, + vc1_subblkpat_bits[i], 1, 1, + vc1_subblkpat_codes[i], 1, 1, 0); } for (int i = 0; i < 4; i++) { + ff_vc1_4mv_block_pattern_vlc[i] = + ff_vlc_init_tables(&state, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16, + vc1_4mv_block_pattern_bits[i], 1, 1, + vc1_4mv_block_pattern_codes[i], 1, 1, 0); + ff_vc1_cbpcy_p_vlc[i] = + ff_vlc_init_tables(&state, VC1_CBPCY_P_VLC_BITS, 64, + vc1_cbpcy_p_bits[i], 1, 1, + vc1_cbpcy_p_codes[i], 2, 2, 0); + ff_vc1_mv_diff_vlc[i] = + ff_vlc_init_tables(&state, VC1_MV_DIFF_VLC_BITS, 73, + vc1_mv_diff_bits[i], 1, 1, + vc1_mv_diff_codes[i], 2, 2, 0); /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */ - ff_vc1_intfr_4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 37]]; - ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37]; - vlc_init(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15, - vc1_intfr_4mv_mbmode_bits[i], 1, 1, - vc1_intfr_4mv_mbmode_codes[i], 2, 2, VLC_INIT_USE_STATIC); + ff_vc1_intfr_4mv_mbmode_vlc[i] = + ff_vlc_init_tables(&state, VC1_INTFR_4MV_MBMODE_VLC_BITS, 15, + vc1_intfr_4mv_mbmode_bits[i], 1, 1, + vc1_intfr_4mv_mbmode_codes[i], 2, 2, 0); /* initialize NON-4MV MBMODE VLC tables for the same */ - ff_vc1_intfr_non4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 38]]; - ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38]; - vlc_init(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9, - vc1_intfr_non4mv_mbmode_bits[i], 1, 1, - vc1_intfr_non4mv_mbmode_codes[i], 1, 1, VLC_INIT_USE_STATIC); + ff_vc1_intfr_non4mv_mbmode_vlc[i] = + ff_vlc_init_tables(&state, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9, + vc1_intfr_non4mv_mbmode_bits[i], 1, 1, + vc1_intfr_non4mv_mbmode_codes[i], 1, 1, 0); /* initialize interlaced MVDATA tables (1-Ref) */ - ff_vc1_1ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 39]]; - ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39]; - vlc_init(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72, - vc1_1ref_mvdata_bits[i], 1, 1, - vc1_1ref_mvdata_codes[i], 4, 4, VLC_INIT_USE_STATIC); - } - for (int i = 0; i < 4; i++) { + ff_vc1_1ref_mvdata_vlc[i] = + ff_vlc_init_tables(&state, VC1_1REF_MVDATA_VLC_BITS, 72, + vc1_1ref_mvdata_bits[i], 1, 1, + vc1_1ref_mvdata_codes[i], 4, 4, 0); /* Initialize 2MV Block pattern VLC tables */ - ff_vc1_2mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i + 49]]; - ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i + 50] - vlc_offs[i + 49]; - vlc_init(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4, - vc1_2mv_block_pattern_bits[i], 1, 1, - vc1_2mv_block_pattern_codes[i], 1, 1, VLC_INIT_USE_STATIC); + ff_vc1_2mv_block_pattern_vlc[i] = + ff_vlc_init_tables(&state, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4, + vc1_2mv_block_pattern_bits[i], 1, 1, + vc1_2mv_block_pattern_codes[i], 1, 1, 0); } for (int i = 0; i < 8; i++) { + ff_vc1_ac_coeff_table[i] = + ff_vlc_init_tables(&state, AC_VLC_BITS, ff_vc1_ac_sizes[i], + &vc1_ac_tables[i][0][1], 8, 4, + &vc1_ac_tables[i][0][0], 8, 4, 0); + /* initialize interlaced MVDATA tables (2-Ref) */ + ff_vc1_2ref_mvdata_vlc[i] = + ff_vlc_init_tables(&state, VC1_2REF_MVDATA_VLC_BITS, 126, + vc1_2ref_mvdata_bits[i], 1, 1, + vc1_2ref_mvdata_codes[i], 4, 4, 0); /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */ - ff_vc1_icbpcy_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 53]]; - ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i * 3 + 54] - vlc_offs[i * 3 + 53]; - vlc_init(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63, - vc1_icbpcy_p_bits[i], 1, 1, - vc1_icbpcy_p_codes[i], 2, 2, VLC_INIT_USE_STATIC); + ff_vc1_icbpcy_vlc[i] = + ff_vlc_init_tables(&state, VC1_ICBPCY_VLC_BITS, 63, + vc1_icbpcy_p_bits[i], 1, 1, + vc1_icbpcy_p_codes[i], 2, 2, 0); /* Initialize interlaced field picture MBMODE VLC tables */ - ff_vc1_if_mmv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 54]]; - ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 55] - vlc_offs[i * 3 + 54]; - vlc_init(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8, - vc1_if_mmv_mbmode_bits[i], 1, 1, - vc1_if_mmv_mbmode_codes[i], 1, 1, VLC_INIT_USE_STATIC); - ff_vc1_if_1mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 55]]; - ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 56] - vlc_offs[i * 3 + 55]; - vlc_init(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6, - vc1_if_1mv_mbmode_bits[i], 1, 1, - vc1_if_1mv_mbmode_codes[i], 1, 1, VLC_INIT_USE_STATIC); + ff_vc1_if_mmv_mbmode_vlc[i] = + ff_vlc_init_tables(&state, VC1_IF_MMV_MBMODE_VLC_BITS, 8, + vc1_if_mmv_mbmode_bits[i], 1, 1, + vc1_if_mmv_mbmode_codes[i], 1, 1, 0); + ff_vc1_if_1mv_mbmode_vlc[i] = + ff_vlc_init_tables(&state, VC1_IF_1MV_MBMODE_VLC_BITS, 6, + vc1_if_1mv_mbmode_bits[i], 1, 1, + vc1_if_1mv_mbmode_codes[i], 1, 1, 0); } ff_msmp4_vc1_vlcs_init_once(); }