From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 5F97447ECC for ; Mon, 30 Oct 2023 23:06:58 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C285568CCC6; Tue, 31 Oct 2023 01:06:55 +0200 (EET) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2029.outbound.protection.outlook.com [40.92.91.29]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA8D468CBC2 for ; Tue, 31 Oct 2023 01:06:49 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mHEzfwxGQRVDoCvSNGjv7UY+ppzwf32fq/5xCmGRPw4Ad4qlGd7znH5Cia1pC+FeV5vfMJT0cpxTt/0bmaRjSlaAqew1IYf/fgrQG6435zCXZ0eo/bc7xIsNeMzLE1zkOvS8tnV6cagFP9sFHKK6Bg6S8g2Xiz3JH4bBSQWaZ7g1TaytBhRXRYYpscHBeEfZcHyDx0NAchIHmyf4c6GStUG2Xw0d6RintsLHxMtdHLmHmAn3166XzKOxu4j+6YxuWW+u3Mqiy6DUOMb9SF3cnSku1Rek3rClBV35B+/zzibY32eFWd5CLk4PL+AljtQNUW8dnZtUX1YcxSQFQgpOCQ== 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=jhV94Yb5m9hC+4cxbidvxswvhNp7ckQs1IQpr2g6rVg=; b=gV3t9biwtHESwYldJZ8ukOhssqFxHmyY3aj59Xt1/ELQlxu1PVbTYoMty3LQs4wYaM739y3MjA+NALKBXYOqLRCb9vwOm7Bsg+1CsMnLO1T91L0Ic194Io+x5G/JxLfKN3XTuvEzGWeDUadQN/V6ElIK8C8UGsHpncougI+pWbY9NTxR0A5TGUd2NWZyLMf/RAK6UUNTR68Q7agKRLtPIwn5aShYgbwttvlGPW8hLqbNI+ZHP9qGAQNzHOBNgcVF3tQeY2Ds6CqmoscyYI1QbjkxmJN52jUMD2MkM8uffeXuXuFzUbAxczWW1aeKinYYpegi+MWbcLLbG9HuFwMHFw== 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=jhV94Yb5m9hC+4cxbidvxswvhNp7ckQs1IQpr2g6rVg=; b=s6pUpqA2SHLZ2sR43rBQSngcmLhxsAl5uysGa7qBzlbUcbLwK4qdxMQXysI5f56aW7WxZoGKMZdylqOZCT0/6msehx623lEHYDxXeUo/xXI00SPq0lsnIpmNRP1AXGBjvzcgQFs7YG+0iv1tqaGI6EKLC0aPT1Z7xtDl268RBmn6V2Ra6aH131E0yNYhJ8HNJh6Z+5zDmV7xhQ0YO/kGULpm0fF2iupRrgTpBiEaeEsqcet0iO6SZgdFkl+9QWtva5vBf4qhOTPfbQEBgGYM904mctBLcr3PwSYWH14KpYb1jBhR2/MG4+1gDPlcLliIw6TdKdJvqYx7wLzQO8VrpQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by PR3P250MB0082.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:171::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6933.28; Mon, 30 Oct 2023 23:06:46 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::f59c:9cff:a42d:bde]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::f59c:9cff:a42d:bde%3]) with mapi id 15.20.6907.030; Mon, 30 Oct 2023 23:06:46 +0000 Message-ID: Date: Tue, 31 Oct 2023 00:08:04 +0100 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: X-TMN: [1O8TDbT7fQwza2ByAZeSlN2+63PmbShbE7vIwtSSg6I=] X-ClientProxiedBy: ZR2P278CA0087.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:65::12) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|PR3P250MB0082:EE_ X-MS-Office365-Filtering-Correlation-Id: 4c2373eb-1035-4472-e170-08dbd99ce3f8 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: grV+CYFZOx75/tQp6mn0gau3ehZ3jr5882znSk/o7J02vzyBq1JtZVlDINOu8yqJ6I3mUZ6KFdjFpXzas0Hx7UbyYFlo71PEvs8QJfL0H4LzfhnXbDUz3CbncO/NjDBL16D0dzMDyCnRuvDHL1n0x/6vS05lN7vGYt44y4XgexVVnoLHxS/AUoqjGaM7/nCf8zecydPyrDZ1jIDfH6ErZ7+D1WLQtIpGftQ4Dne3vxf0Uiyg5OwKqojntXKIhPiVkXxi3Nk++QihugG8bEJrtuJSQdsud/hF9MCy29/kkgh6ZhNe/e2BMr9WVs6f3Biyfu2t+lEo7Mf6yk8MetMbl0VbEePZG96HE68SWFPrDTKkBVznWgQPQjqbKm01HaS5KRLrHsnWJFU+XNO7jL061OksjJ6Qk8DCFgs8ZPdm33KPPUt71CJCS1NxUkG/gxenQ2Z+WL4DGPDcy+DQvrvprJLSfEo2/f3SERMa+7QoroSKbx4Pb+ope6FhVIn0UInz5Gus6JYIG6H5edOgrLKw6cgS6B+ORIOSC1vn877tTDWw4RZr2fDak8u2UNcBApWL X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RjVtb0xqY1JVSEEzUjZsOWV3bm1uVnQ3NzgwRnI4aGNQZ0p0VlZ1MWFMaHJZ?= =?utf-8?B?c0RnUDNiSFExUGI1djJIblVSYm5JRE9oZExURHBod3lqa1lreEloNUlQaVNV?= =?utf-8?B?UXhyTGpFMUZKeFptM3B5SENkbzFiZkExamtkRHlFVXJtdXdRRXFrKzFMOS9y?= =?utf-8?B?YWpoQlgra1YxSDBjVnZRR0dxdGV3YWEvQmNuOXY4OTBvZm9COXB3M25mWmVY?= =?utf-8?B?OHgrTk1VMFl6UnBoanl2TVZxelp0Z0tmUk5WOStnTTU1cnpzMDRZK3IwNWVp?= =?utf-8?B?eWFFYVl1Q3RHT2NYSUozQWNTdjJybU5FL0tFQjZaSDFGZStUbEw4LzAzdy9j?= =?utf-8?B?ZUJwWlhNWFpqamFpTVN5OVIvQWRCaDkxMGUxRHo3ai9FU3VOaEh4UEsxRzZl?= =?utf-8?B?T0lpbExQcU1Jd0ptYTZlTGx2eEdMdnJyTktWSWF5ZGVYUG43d0NNenB4emJK?= =?utf-8?B?VFBjNnMzYmZDdXNORFJXdEdtenZlbFlCZE81V3VwNjFXMTA0ZXI3TmFoWjBq?= =?utf-8?B?ejVIeExMOC9QSUtTSUJpdnJ1NFhZYWdMSDB4U2psN1dtQVFXSUhYaDJQdlh6?= =?utf-8?B?aVZ0WS9PcEpscWV6bmNqQktPUmRUUGV2a0FreTNLSC9Sb1FDTEZ6QjgzU2Y5?= =?utf-8?B?RFdHTG0zRC9wenFTVEwyRnBITGxaVGlGK0dVOWNFUUVjenV6aHBRbm1ia1Nj?= =?utf-8?B?QTF0MGRMRG13bHRQRXdvSnJzSXk2akIvdW1laGpSenp0ZW5Fanp1ejUxRHlW?= =?utf-8?B?MkpRMTZONzVtMDg2N0hEdEpZTmlNRW95WnRZeUVCU2VxVVcrZDl5ZFlrUUFF?= =?utf-8?B?ZVFDaDBEc3JMdkFJWDljKzM5UmU3Q0xDQmpXMFArbmNhNVh2VStOS013Q2JW?= =?utf-8?B?ZXVmcUg2ZlBLUHFlU2c2VU1uOHpINnFBVURFenpWR2ZpQUFwY2JEUEhwQTBH?= =?utf-8?B?SXhmbTdqSk1RcVJ3dU45S2JYOFp6cDlaZXYzY1o1Ymc2dWJRVTZQS25KdlZS?= =?utf-8?B?ak1NalhUZHp4emJYSmpjUEhMdHZhbVRLckZrY1lnaURQekJKMndWbmVzeWNS?= =?utf-8?B?K3l1OG9wUi9QRkp3eTY0WEQrTXpUSlNIcU1xQ050MGJRalNxNCswR1k0M2Fy?= =?utf-8?B?dGFkUzYzMWQrSnQrWHowTW55TS9rOTdDWHIvRk5pa0VNcWFrZTZuaHg1RFhL?= =?utf-8?B?R2cySGJpbWYrZjVnR2xxOVgyUW9kdFBmVENXTGdrdHRDc1VXZjAzTW5BaDlZ?= =?utf-8?B?VXU4YlJPRWNZRE5yZDN3S2VJMStxck9EQ1NVSG1zdXhiZTRudnBYZ3JMaEhh?= =?utf-8?B?TDlWWkkzR0ozWTJ3ZHhqeHphT1lFbzN6NHZVdVNDNlBXMEZxY3NyZ0FlRkN0?= =?utf-8?B?ZlVvU2haN3pnTVRWNlNzN1NvU05OOFRUK2xYYU1sSFo4cTQveEpEZ3htYzVa?= =?utf-8?B?U3lRZGcrMVB4OWJNNFRsZ1hPWWVyYkFQSTQ3VU5uaEs5ZzRJQUhpYVlueXVk?= =?utf-8?B?enRCME1GMGtkQU5LVWZBSGhqUmVOOXZQNlpXdmNtOVJnTi9Sd25sTW5XN21t?= =?utf-8?B?ODY5ODFtUG54K3ZSZmttNHhSUzd5c1QwZEVSVXBSbXF5R2p2eTJPTUc1eURO?= =?utf-8?B?VlZDaUpJSm1QY0xxdzBLb3cxd05IYzg5bkR3anlpTUFNNWdKNEpLWFNpSEJD?= =?utf-8?Q?V7NuN0vNDWiYN+vfIcx9?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4c2373eb-1035-4472-e170-08dbd99ce3f8 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Oct 2023 23:06:46.8491 (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: PR3P250MB0082 Subject: Re: [FFmpeg-devel] [PATCH 01/61] avcodec/vlc: Add functions to init static VLCElem[] without VLC 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Andreas Rheinhardt: > For lots of static VLCs, the number of bits is not read from > VLC.bits, but rather a compile-constant that is hardcoded > at the callsite of get_vlc2(). Only VLC.table is ever used > and not using it directly is just an unnecessary indirection. > > This commit adds helper functions and macros to avoid the VLC > structure when initializing VLC tables; there are 2x2 functions: > Two choices for init_sparse or from_lengths and two choices > for "overlong" initialization (as used when multiple VLCs are > initialized that share the same underlying table). > > Signed-off-by: Andreas Rheinhardt > --- > libavcodec/vlc.c | 68 +++++++++++++++++++++++++++++++ > libavcodec/vlc.h | 102 +++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 170 insertions(+) > > diff --git a/libavcodec/vlc.c b/libavcodec/vlc.c > index 21b9fffe27..b5de0bd24e 100644 > --- a/libavcodec/vlc.c > +++ b/libavcodec/vlc.c > @@ -350,6 +350,74 @@ fail: > return AVERROR_INVALIDDATA; > } > > +av_cold void ff_vlc_init_table_from_lengths(VLCElem table[], int table_size, > + int nb_bits, int nb_codes, > + const int8_t *lens, int lens_wrap, > + const void *symbols, int symbols_wrap, int symbols_size, > + int offset, int flags) > +{ > + VLC vlc = { .table = table, .table_allocated = table_size }; > + > + ff_vlc_init_from_lengths(&vlc, nb_bits, nb_codes, lens, lens_wrap, > + symbols, symbols_wrap, symbols_size, > + offset, flags | VLC_INIT_USE_STATIC, NULL); > +} > + > +av_cold const VLCElem *ff_vlc_init_tables_from_lengths(VLCInitState *state, > + int nb_bits, int nb_codes, > + const int8_t *lens, int lens_wrap, > + const void *symbols, int symbols_wrap, int symbols_size, > + int offset, int flags) > +{ > + VLC vlc = { .table = state->table, .table_allocated = state->size }; > + > + ff_vlc_init_from_lengths(&vlc, nb_bits, nb_codes, lens, lens_wrap, > + symbols, symbols_wrap, symbols_size, > + offset, flags | VLC_INIT_STATIC_OVERLONG, NULL); > + > + state->table += vlc.table_size; > + state->size -= vlc.table_size; > + > + return vlc.table; > +} > + > +av_cold void ff_vlc_init_table_sparse(VLCElem table[], int table_size, > + int nb_bits, int nb_codes, > + const void *bits, int bits_wrap, int bits_size, > + const void *codes, int codes_wrap, int codes_size, > + const void *symbols, int symbols_wrap, int symbols_size, > + int flags) > +{ > + VLC vlc = { .table = table, .table_allocated = table_size }; > + > + ff_vlc_init_sparse(&vlc, nb_bits, nb_codes, > + bits, bits_wrap, bits_size, > + codes, codes_wrap, codes_size, > + symbols, symbols_wrap, symbols_size, > + flags | VLC_INIT_USE_STATIC); > +} > + > +av_cold const VLCElem *ff_vlc_init_tables_sparse(VLCInitState *state, > + int nb_bits, int nb_codes, > + const void *bits, int bits_wrap, int bits_size, > + const void *codes, int codes_wrap, int codes_size, > + const void *symbols, int symbols_wrap, int symbols_size, > + int flags) > +{ > + VLC vlc = { .table = state->table, .table_allocated = state->size }; > + > + ff_vlc_init_sparse(&vlc, nb_bits, nb_codes, > + bits, bits_wrap, bits_size, > + codes, codes_wrap, codes_size, > + symbols, symbols_wrap, symbols_size, > + flags | VLC_INIT_STATIC_OVERLONG); > + > + state->table += vlc.table_size; > + state->size -= vlc.table_size; > + > + return vlc.table; > +} > + > static void add_level(VLC_MULTI_ELEM *table, const int nb_elems, > const int num, const int numbits, > const VLCcode *buf, > diff --git a/libavcodec/vlc.h b/libavcodec/vlc.h > index 3f7c033a78..679666801a 100644 > --- a/libavcodec/vlc.h > +++ b/libavcodec/vlc.h > @@ -19,8 +19,11 @@ > #ifndef AVCODEC_VLC_H > #define AVCODEC_VLC_H > > +#include > #include > > +#include "libavutil/macros.h" > + > #define VLC_MULTI_MAX_SYMBOLS 6 > > // When changing this, be sure to also update tableprint_vlc.h accordingly. > @@ -223,4 +226,103 @@ void ff_vlc_free(VLC *vlc); > NULL); \ > } while (0) > > +/** > + * For static VLCs, the number of bits can often be hardcoded > + * at each get_vlc2() callsite. Then using a full VLC would be uneconomical, > + * because only VLC.table would ever be accessed after initialization. > + * The following functions provide wrappers around the relevant ff_vlc_init_* > + * functions suitable for said task. > + * > + * The ff_vlc_init_tables_* functions are intended to be used for initializing > + * a series of VLCs. The user initializes a VLCInitState with the details > + * about the underlying array of VLCElem; it is automatically updated by > + * the ff_vlc_init_tables_* functions (i.e. table is incremented and size > + * decremented by the number of elements of the current table). > + * The VLC_INIT_STATIC_OVERLONG flag is also automatically added. > + * These functions return a pointer to the table just initialized, > + * potentially to be used in arrays of pointer to VLC tables. > + * > + * The ff_vlc_init_table_* functions are intended to be used for initializing > + * a single VLC table, given by table and table_size. The VLC_INIT_USE_STATIC > + * flag is automatically added. > + */ > + > +typedef struct VLCInitState { > + VLCElem *table; ///< points to where the next VLC table will be placed > + unsigned size; ///< remaining number of elements in table > +} VLCInitState; > + > +#define VLC_INIT_STATE(_table) { .table = (_table), .size = FF_ARRAY_ELEMS(_table) } > + > +void ff_vlc_init_table_from_lengths(VLCElem table[], int table_size, > + int nb_bits, int nb_codes, > + const int8_t *lens, int lens_wrap, > + const void *symbols, int symbols_wrap, int symbols_size, > + int offset, int flags); > + > +const VLCElem *ff_vlc_init_tables_from_lengths(VLCInitState *state, > + int nb_bits, int nb_codes, > + const int8_t *lens, int lens_wrap, > + const void *symbols, int symbols_wrap, int symbols_size, > + int offset, int flags); > + > +void ff_vlc_init_table_sparse(VLCElem table[], int table_size, > + int nb_bits, int nb_codes, > + const void *bits, int bits_wrap, int bits_size, > + const void *codes, int codes_wrap, int codes_size, > + const void *symbols, int symbols_wrap, int symbols_size, > + int flags); > + > +const VLCElem *ff_vlc_init_tables_sparse(VLCInitState *state, > + int nb_bits, int nb_codes, > + const void *bits, int bits_wrap, int bits_size, > + const void *codes, int codes_wrap, int codes_size, > + const void *symbols, int symbols_wrap, int symbols_size, > + int flags); > + > +static inline > +const VLCElem *ff_vlc_init_tables(VLCInitState *state, > + int nb_bits, int nb_codes, > + const void *bits, int bits_wrap, int bits_size, > + const void *codes, int codes_wrap, int codes_size, > + int flags) > +{ > + return ff_vlc_init_tables_sparse(state, nb_bits, nb_codes, > + bits, bits_wrap, bits_size, > + codes, codes_wrap, codes_size, > + NULL, 0, 0, flags); > +} > + > +#define VLC_INIT_STATIC_SPARSE_TABLE(vlc_table, nb_bits, nb_codes, \ > + bits, bits_wrap, bits_size, \ > + codes, codes_wrap, codes_size, \ > + symbols, symbols_wrap, symbols_size, \ > + flags) \ > + ff_vlc_init_table_sparse(vlc_table, FF_ARRAY_ELEMS(vlc_table), \ > + (nb_bits), (nb_codes), \ > + (bits), (bits_wrap), (bits_size), \ > + (codes), (codes_wrap), (codes_size), \ > + (symbols), (symbols_wrap), (symbols_size), \ > + (flags)) > + > +#define VLC_INIT_STATIC_TABLE(vlc_table, nb_bits, nb_codes, \ > + bits, bits_wrap, bits_size, \ > + codes, codes_wrap, codes_size, \ > + flags) \ > + ff_vlc_init_table_sparse(vlc_table, FF_ARRAY_ELEMS(vlc_table), \ > + (nb_bits), (nb_codes), \ > + (bits), (bits_wrap), (bits_size), \ > + (codes), (codes_wrap), (codes_size), \ > + NULL, 0, 0, (flags)) > + > +#define VLC_INIT_STATIC_TABLE_FROM_LENGTHS(vlc_table, nb_bits, nb_codes, \ > + lens, lens_wrap, \ > + syms, syms_wrap, syms_size, \ > + offset, flags) \ > + ff_vlc_init_table_from_lengths(vlc_table, FF_ARRAY_ELEMS(vlc_table), \ > + (nb_bits), (nb_codes), \ > + (lens), (lens_wrap), \ > + (syms), (syms_wrap), (syms_size), \ > + (offset), (flags)) > + > #endif /* AVCODEC_VLC_H */ Will apply this patchset tonight (with the mobiclip bug fixed) unless there are objections. - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".