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 3163F49055 for ; Mon, 1 Apr 2024 20:41:52 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CB9E168CDA6; Mon, 1 Apr 2024 23:41:50 +0300 (EEST) Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04olkn2023.outbound.protection.outlook.com [40.92.74.23]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 10A8D68CB86 for ; Mon, 1 Apr 2024 23:41:44 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NW/rQm9REEHKv5iLnGq6r4wj/tb+VNcuNX8gMih1kVmEVLS9XrEZIu9wnkbusN8qSWv0Yu/CDrd6YVAPfBOIcxAPZE0EDvgJDO223Uluxjy0FscMBbaxoarUdKs6QXZVwWNPNSpeowqul4SY0Jqjp7c+1VISNIWUaGmpaq4svmcP9Ik/S1szieIxXBjJczxRk5wTycndXKpPcjtUgjfnm8vDwYAIXfaPFv3skYlJJxykHIh3bNmatT/PAC/00cZOT+vElkl3E8XwydexiDYK9+XdrUO3bNXAmfVk/hkYXivwUQQFLSzNgtP4DADT7QK4SDleVMiD2lwmBWwRh5BN9g== 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=7aS1hIcLzn29mDPgwqd9uCLIMF37Mdq7YAzL02ycbpg=; b=YXoyYstWrDxfQPkG3gCDPaOQTNDS/O71HppJIY2/d78oz+AMIa4rMlcrp/EXHfVCbnKZzCMuZF2VSiB9QdSEfqI0UMedxrpFPmq49Llbk3nEa8mdAyG+OBkeotuZcKEC2WPKIyZYvddNRnWV0BndrcODJKWKwZBZIOQ0ryDEeYGsj6hDzV92Tg+2idpDlW1nfMnMxMAcbMmfQZTISsZQVp8VzawtS7TIq42P5/0WpvWElF5z6s2i63yOF8VFnnvYUA6ekjaTROEIQgRS0wgRgXXaeZD/aC6jIjB/9nOJJnKq4dv+vllbqckTkgqoh5bDEvNxfPK6w33fCM/ADJpuXQ== 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=7aS1hIcLzn29mDPgwqd9uCLIMF37Mdq7YAzL02ycbpg=; b=mN1du5Z+cvJ0Y5r9hxovbCCO5KqMOeqkxemugN433fbmaZgtN00y6XzTGld107AO+JDIDOwuPYZFTr5p5VqnE6WNjDzikRc7vHBqIwPVOuXMeMn7XPF8pYC4O5s7rtepWwnsiUMZsUN0hTIPlUDppCOMhbeSMsb8+xq+bZh+hbkTH6B02yejetVRwg3j2uBt9CJc+bRQ3B7FvKt9wxoi6XE19/TfGzLaLFwzPeokmcT7/Yu1QEodywIBBrGREm4bYDtIJiykYd0o/G4xZxQ2JgztXUd/itQsxmn1d3ye74QKIBJUOWkm9/WU0+oNamt3S1vOshSM4V0j+QwmyxFqsw== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by AS8P250MB0364.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:37f::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Mon, 1 Apr 2024 20:41:43 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d%4]) with mapi id 15.20.7409.042; Mon, 1 Apr 2024 20:41:43 +0000 Message-ID: Date: Mon, 1 Apr 2024 22:41:40 +0200 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <20240401185621.15297-1-cus@passwd.hu> Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: <20240401185621.15297-1-cus@passwd.hu> X-TMN: [nqZo1mEEuerWaoGKzX+YnmmSIyidlIwNNlGIDH9lDnY=] X-ClientProxiedBy: ZR0P278CA0090.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:22::23) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <1d4b1382-0812-4dbe-9576-1a328f23b699@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|AS8P250MB0364:EE_ X-MS-Office365-Filtering-Correlation-Id: 9996d6d2-6dcd-4c16-0bb2-08dc528c23ab X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: UAhQYNJwO2UTBEPxpILN7lHDE+uf0f7ToXToZ8g9Nr0FbAbd/dNHWa/W2kNu7AkbmuwvMa7G/soqZbvPTIekdwTyJIzbTp9n/xtsJZuDNfR9OmWrK54Y55MxxDUJ9BUhHGHugOlSzWMK58JdvhXyfEZf7U5Dv1ROadMMuArOhfU4qhC7ZhrW2q1W2WAHaBTJPaspog+WW/W8qAyjFnRYcJMgdh6JQx2MQItcoXQB2P3zvwlWV8F6OvDD6j3l3ngcAkq9Jr5ED1XdClzoVQfAsAArZtVMmKpL4QTP93CMsk5rBflr6pB6ZvPsRqoHygRQXPMU3G1iz1OXCjZwrfCSULWV3mfreRA9S8L9TyxXULS1DhKcgfilBLD5ifCvNpEsf0uDn044GvgeJWUSJyHFQvt+A2Mk83lTsGqBU9vJv531oistQWpn5KscH5G92eAtWre36K1MnoCh2S6hiydLKLOPWbRs0MhcblpjSduwT32MUVZ5F9hlTYDQ0BjY4dOCPJbcoRrhMnWdNl7jHQqTQKfq8y6dTJ+7frHmYCDPSUIimGPPK3FG5XfCrIfhZMf9 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?aE1NeVJ6ZFpabXR6ZnBqVVg5eElyUy9yTUdNVFkrVHFkQlFLUkFBd3RZQitk?= =?utf-8?B?UGtKM21XNWNreXhxdUNIZ2RVcDdINUF1cnYxY1FtbjlOdHZOcG5TdktyTDJ5?= =?utf-8?B?cFpMb2txSGhQTzMyaUZXYXVKdHhiT2ZjWnI4bGtxa3ZFTG9zQ1YrbzUvaVE3?= =?utf-8?B?cmVjWkRKaVBsWGVGR2hSV2dLQ3JpdDQ1TXZHY2xqTXN5SW5jaEJJVzk2c2d0?= =?utf-8?B?YzZuMm9LVHdhQjhFTUc3MjNodlVsQUJiRm9xWmNlZnFKTGl6aFA4THl5THk3?= =?utf-8?B?a05VYjcxTXlCTENwS3M0L3ZHNk96a0dVcjUvcUpzbEFHd2lpd1NRNVpWOEdG?= =?utf-8?B?b3I2OEg4cmUvQkhTdlk0UHpjT2MvcWVHZnByWG1TMU9YSDJUZ09sT0Zudkx0?= =?utf-8?B?eWkzWmRQQUZOajdQOUJBelVvUlYzcTl6YWUzRVZrblFQYklFWUR4dFY5d0ww?= =?utf-8?B?N0xsNnI1RldHeEd5bmZPRi8wYnc0NzdmWm5BRko2Vk4zUnNhYzk3dVFoVlk4?= =?utf-8?B?YTlGZ3JKT3NaRmd5ZGVWenZUSWEyZjhMcDBZMHEramdDQ1gyaGZSQnVTbm9J?= =?utf-8?B?VHVqbmZWTmVXdzN5bVZXR3d1RndrMDQ3RXVXQlB3dGUxVXVsYkVTeUtGYmt5?= =?utf-8?B?ZlRJZVkxeHJyZEp3REJmY1dsRG5LdmhCVnB2RUJxMk0rZUlRSTl1ZDZZWUEx?= =?utf-8?B?WERkYWM2K2YycVFOVGdGTVFtdVhzSWFVOFhHa2VJVGlSSCs3TTNOVStjTW9O?= =?utf-8?B?MjZGSC9kcnFKaG5DU1MzWmsxcEI1Q2hYK29LMnJIVVZiZEZDRnV6SHlRR1hq?= =?utf-8?B?T0NabE1SbUJkc1JmSUN3WHhTVGVOTGZ5L1V3NGlFczBQdDFPNFhzZDlqd2p3?= =?utf-8?B?aU1rbmNDUUZSVEViTWJudngrdHF3ZkdlcWVLZ1N2blhrQ3gyNDhyeklFcTJJ?= =?utf-8?B?SHFXdGZkWXBJZVpUakhNVDh5R09rckg1ME1EaU1iSTI0TmRyTGd1ekx1UzFv?= =?utf-8?B?dXYrSWRlcGVZUXVGaGZUNjhUSlNKZVZ4REZmT1NxMEQvcVk3WGszajlZckFI?= =?utf-8?B?em4rN1UzdEpSQjMyUW54dW55dCtkTUFpTTAxWnkybWpzOWNVbUc0bXZyQ0Nk?= =?utf-8?B?TVFvV3ZEL3JSaEdlRzQwVzlZcnQ2djVhdXFlVnVFYyttbTdkMjJmdDBZVnhn?= =?utf-8?B?cVd5QUJXS1NzOFVPYnJtcWRtQjAwMEVsMlVuaWRNSmF4Qkd2bzJXMExzbGxY?= =?utf-8?B?V0xYbXdrRWpjK2dYLzN1a05tbjE5aUhpNVlFUVcrSkFDbzVjaUNFaGNldlVu?= =?utf-8?B?bW1OeXFSZDJ4WWF3c0l0Rkh4V0ZFcnRNTDVSU3YvQlVDdnlhams1UjNmRjRV?= =?utf-8?B?cEUvMUtteCtGZUZKeTVxL1lya0FnQUlmRlJBNElOT2lmaUJsbDIwMHoyUStB?= =?utf-8?B?S0dXZm95VlQ4c1QxaTdoUlFkekptT3paSnI1c1VJeksrSVRhdm1hRUM2RFls?= =?utf-8?B?SjZobHlqa2xBOWx1aHppTVZla1lJL0VXcE1vL2xyRXBjWnY2eU9yQmgwaFd2?= =?utf-8?B?Y05ZelA5MS9ZSXBoWlVKMGE0TXRUb09Qdk9sb2ZBanJEaVMwWWZXc2tSa2ZP?= =?utf-8?B?SXllV0NhUkNRVE51dTJtVkg0cWRiNVJSbGwyN2NuNGllMEZocytrREg2Uzdr?= =?utf-8?B?K2QxWldCS0pDYzlTMXZQNE5QMVRITGJkQ1FyMlBoeisvbkVDOXNDemV3PT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9996d6d2-6dcd-4c16-0bb2-08dc528c23ab X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Apr 2024 20:41:42.9577 (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: AS8P250MB0364 Subject: Re: [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression 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: Marton Balint: > If the channel tag does not match the number of channels, the constant > expression evaluation should fail. > > Signed-off-by: Marton Balint > --- > libavformat/mov_chan.c | 48 +++++++++++++++++++----------------------- > 1 file changed, 22 insertions(+), 26 deletions(-) > > diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c > index e7d181d71f..6ccc26b3f1 100644 > --- a/libavformat/mov_chan.c > +++ b/libavformat/mov_chan.c > @@ -81,24 +81,28 @@ struct MovChannelLayoutMap { > }; > }; > > -#define TAG(_0) {.tag = _0} > -#define ID(_0) {.id = c_##_0} > -#define CHLIST(_0, ...) TAG(_0), __VA_ARGS__ > -#define CHLIST01(_0, _1) CHLIST(_0, ID(_1)) > -#define CHLIST02(_0, _1, _2) CHLIST(_0, ID(_1), ID(_2)) > -#define CHLIST03(_0, _1, _2, _3) CHLIST(_0, ID(_1), ID(_2), ID(_3)) > -#define CHLIST04(_0, _1, _2, _3, _4) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4)) > -#define CHLIST05(_0, _1, _2, _3, _4, _5) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) > -#define CHLIST06(_0, _1, _2, _3, _4, _5, _6) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) > -#define CHLIST07(_0, _1, _2, _3, _4, _5, _6, _7) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) > -#define CHLIST08(_0, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) > -#define CHLIST09(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) > -#define CHLIST16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ > - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) > -#define CHLIST21(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ > - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) > +static int nonconst_expr(void) { > + return 0; > +} > + > +#define TAG(_tag, _cnt) {.tag = (_tag & 0xffff) == _cnt ? _tag : nonconst_expr()} > +#define ID(_0) {.id = c_##_0} > +#define CHLIST(_tag, _cnt, ...) TAG(_tag, _cnt), __VA_ARGS__ > +#define CHLIST01(_tag, _1) CHLIST(_tag, 1, ID(_1)) > +#define CHLIST02(_tag, _1, _2) CHLIST(_tag, 2, ID(_1), ID(_2)) > +#define CHLIST03(_tag, _1, _2, _3) CHLIST(_tag, 3, ID(_1), ID(_2), ID(_3)) > +#define CHLIST04(_tag, _1, _2, _3, _4) CHLIST(_tag, 4, ID(_1), ID(_2), ID(_3), ID(_4)) > +#define CHLIST05(_tag, _1, _2, _3, _4, _5) CHLIST(_tag, 5, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) > +#define CHLIST06(_tag, _1, _2, _3, _4, _5, _6) CHLIST(_tag, 6, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) > +#define CHLIST07(_tag, _1, _2, _3, _4, _5, _6, _7) CHLIST(_tag, 7, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) > +#define CHLIST08(_tag, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_tag, 8, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) > +#define CHLIST09(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_tag, 9, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) > +#define CHLIST16(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ > + CHLIST(_tag, 16, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) > +#define CHLIST21(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ > + CHLIST(_tag, 21, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) > > static const struct MovChannelLayoutMap mov_ch_layout_map[] = { > CHLIST01( MOV_CH_LAYOUT_MONO, C ), > @@ -281,14 +285,6 @@ static const struct { > > static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag) > { > -#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 > - { > - int i; > - for (i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) > - av_assert2(mov_ch_layout_map[i].tag & 0xffff0000); > - av_assert2(i == FF_ARRAY_ELEMS(mov_ch_layout_map)); > - } > -#endif > for (int i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) > if (mov_ch_layout_map[i].tag == tag) > return &mov_ch_layout_map[i + 1]; When you want to check something at compile-time, wouldn't a static_assert be the more appropriate tool? It allows to get nicer error messages. I see two ways how to use static_assert here (a) is preferred): a) Turn the table used to initialize mov_ch_layout_map into an X-macro and make TAG evaluate to static_assert((_tag & 0xffff) == _cnt, "Channel count of " #_tag " wrong");} in one pass. b) Shoehorn it into the TAG macro, e.g. like so: #define CHECK_CONSISTENCY(_tag, _cnt) \ sizeof(struct {int a; static_assert((_tag & 0xffff) == _cnt, \ "Channel count of " #_tag " wrong");}) #define TAG(_tag, _cnt) {.tag = CHECK_CONSISTENCY(_tag, (_cnt)) ? _tag : 0} static_assert may only be used where a declaration can be used; we use sizeof with a new struct type to circumvent this. This is legal C, but unfortunately MSVC warns about it (although it accepts it). - 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".