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 146D343472 for ; Mon, 12 Sep 2022 10:56:26 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F324568BB10; Mon, 12 Sep 2022 13:56:22 +0300 (EEST) Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075071.outbound.protection.outlook.com [40.92.75.71]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8514968B9AE for ; Mon, 12 Sep 2022 13:56:16 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fF2D8BzeaafIzgdKLFbP0djBEja3luLo/ngkJ0bcuwtAmFILC22GduF3/+Utx+DmaIHb6OvzLZHvZpBTVbVj0sdlTjiQXea5dNFV674MZzz2GpQVlvc8AAXwT9YbPTELl2jykVJotMH8c+oUxOV4vTESIz3UvDxr6h53uGJodB7Ukxzif58RaKYfrZOz8oL/MGidMmEFwIH0axcv2nYA2Y1QexxANnWnwBaOou8foBBNKKJ5hUdybuuhf+tUUNCU+3DdRwc9wtNVaoUYSVWl35WeLSZ/hqFsMN7t03v12yMaH7/3u8Vwc4Xn+T6QsPvPKkXBuqcrpSX4qgJyLH4Lkg== 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=bY5gUt0xwVsEXqz84S9YweOF2FWQ/rCsEOSi6oJOTOk=; b=QNGOTAFZdsRGZoPnqeEDmj+1W3g9blkMrW9VdnQ6hAAsICLtUI+HbYm5EI05kV36VmZLKRjufqiQOt/AOSX3J9SYQ0g7bnD76bCX9+qjHCnb6Ob06yMIwGzQG4YCjqkoRoMkuwKZrlr92eOUn3sdPGF+BobBvkgma4J17fbPM46q1XMqFtjKxTnb2jPK2eBjt54/c/gDWEcwkunlJv/cqq9ukYGKJV0qJut+SzeQPhe6rrd5vAaHodEK7RRdXmafQ3EktnpVVkwV57EQY1otgLj1g4hQfbhZtUl/dy7AMUiNKZiDclgcmcYiKQo/AbAidgo0jBI9aetXX8IVXL8VPA== 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=bY5gUt0xwVsEXqz84S9YweOF2FWQ/rCsEOSi6oJOTOk=; b=P1g9NqPmThi1O5LYstyk9We7Zt/UM5Nm+8ZJuldhlzcHWtIn1usvIS/vPln+84yj+ZXXLH+yYWivwKkIMpFBpnBXjwVFfUxzjyJ1w1Cb07yQz7BckQzpa63pdhT5qRiEV9578QVijylB0tKRRCzRSKoQGWoBrsMJOiqAiidIHotuE+EdY8IJd7c3az/o8xTFD5ew2edN5Tm6XZdLrLsQRiXgkLFd3CPiL8YLLNBgBI04NTDeZtXKE21r2ziGcGsnEMu9mzSCFLjZo22okr1sG0afsJlj6HUTc9qor0lY4fT4CMVT3W89MHqT3Kp3zkQW6J2XoQ4Q5ATyL8z6hC3DIw== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DU0P250MB0746.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3ca::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.12; Mon, 12 Sep 2022 10:56:14 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::611e:1608:45cb:b58a]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::611e:1608:45cb:b58a%4]) with mapi id 15.20.5612.019; Mon, 12 Sep 2022 10:56:09 +0000 Message-ID: Date: Mon, 12 Sep 2022 12:56:11 +0200 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Andreas Rheinhardt In-Reply-To: X-TMN: [uoq48uNE+3VTFnoj7MO0nXH7qyhNw2dtLrduSmiEhLg=] X-ClientProxiedBy: ZRAP278CA0006.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:10::16) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <30ddbc82-1564-aefd-9760-143277f6a005@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|DU0P250MB0746:EE_ X-MS-Office365-Filtering-Correlation-Id: e0f02235-85bc-4f16-93c5-08da94ad6605 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: usiVFuQB5O4WLZecjk6vzCSJZIaXnhOlETlfB9D3LvC5WIt3T07Q6ubAljUsmOtGG3WghBKaWCZ1+DynPxzUVaXZ4G1Dc6095JU8kQZLntS06S48seyYH7QGmFQp9jKhL24jLoj1GtxPKKcuD7ODpildL0WEvS5r6F+rH/K3KVfuMcKfBHxuqTl+5XExfO05QN4/87prvLeMjgtti3uTT3RCB4cspSz1zoYajMP9nevlAbPuMRizPUR6D+KIVX5I9gzoaE0HabA5Z7B6YQe6R0Eyj57akHNJ09D19T17uCj1cOP0LMaoN8Sy74ZH1+xLqEEMQp0QoNWwqDBYxmFmVFVuZ5a8rM/4bV+iqqPzSkawbfSuALDjawCOK5i+hCKTGIBiPiWVdS1W/GXV5uo2b9vu3u3dogBawr4zZfipexRoXPPOTA3Ef4t4f59TA/Og8SiwFK1D1t5j4+EKQONAc8xPfGGIjod1Bu4ObpJtMjtIgxD6ml913moQxKd0NoJ6eJifPASfc+Wv8JdxfqLBLF/as7zFJA8cbKZgi1DTJgwbCZYa6JRp6J3VCqDWfr6wyyY6w7kU+CIt5CCOFqdSyEPWi+2gZyRTxTmX8OtchwhsLqLYt9jfd8Lt/zrYR+THkcMhQur/P7alKvgVg6mA/YJlUoxCQHQ3Tb9LcojOXO1/cKCzyZ4POPJ6/JHIdoBv X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?c0ZQZTVLdjhqbGk5dVQ2L0M1b2lNdy8wRUthSVp1aS83NXFVNGFnRUlpUFhk?= =?utf-8?B?V2NPd0p0WWhucEV4ZFd2SFpnUGgxMHpUR0xaMldTaDY1NVd4TzF6dFllUWhp?= =?utf-8?B?VG9VbytUVUVJcE9IZFU4bDlJQk9HcGtMcmFhOHFoMWNVYnJHTk1sZ3VvNXBH?= =?utf-8?B?bG40UFhHKzBMUklNYVdicmNnc3gxRmxUczl3T0toaHVHbWplb0xCTElocFhR?= =?utf-8?B?V1E0bDBLK1FLMHM1V2NWS3NmN1llUmRYVFVJKzUxNEUxVUJYUlV1VHhXV3Rx?= =?utf-8?B?bVdvK29vSlNITWZ3djM0bTBLNmRhc0ZCcnVPNzRuVkNvVk4xMUFWS1ZtZitv?= =?utf-8?B?Lzh6dy9SdTAwdDJXWS93bE1tNFVzMWVsQ1Brc3hlaEtwVlh4OEY4VXBFVmdK?= =?utf-8?B?SmgvRDE3eFgvc1BLNGg4YzB4Sjg1OHZQdERzQ3VyQndQTCtuL1dZYUU1aGdx?= =?utf-8?B?bWNjeVJYNThENDdDUkJMbkpVNUNOTHovRmpDYjF2NHlrUTI5VEFEUmMzVXYw?= =?utf-8?B?WDBCeHl0cW8rQXZVYm10K29qd1VWNkJiRmJhZHBtRG8veitsaE9XN2JCSmRp?= =?utf-8?B?Y2dsK1lxckZ3WElaMlgyYkJySXYvWm9DNDB6UXFLdnBLK05PVE4rdnB4TTdX?= =?utf-8?B?ZDk1am9jMHpDQVN1b09NSmRvRkFDQ0ozdzdKU3ByeFp3c25sdU94RzhheXc5?= =?utf-8?B?aFlWM3FTNDUva0JVT2JYTC8yajU0SXRPSDJuaFUrMkI2SDVvYTBsRnlQUDVJ?= =?utf-8?B?WTFvNVlha255TWYzM2xQbXlLT1dIWThFVzJoTmJNUFhONFNSekVaVFR6dTZr?= =?utf-8?B?dVFuVTBsZmlHTTFhQzZ4YlI0UWdxbEpYUFdIZ0NhK0NNcDRFQ2tFQnF4RExk?= =?utf-8?B?U2xRRzZnNTZJTkFkaUtTU0dFc1Jsb3N2azlWWWN1Q3ZVZyt4V1RrQWFJM1BP?= =?utf-8?B?eDNtT3B5enlnNFdBVzZReWg1Q0lzMmpNMm8rT0ZUb1ZycCtJbWRteWF6T1RB?= =?utf-8?B?bWlpaXl0c1p6bkFwNUZ2T3AybVc5TmV1TkFTcHpmeVpqVHhTSDVFNUtRTFdx?= =?utf-8?B?bG9xcS9HaVBBSnRIZUxxYXZmUHJVUVVmY2lWd3RqOXRBZG11TDJtZVg1ZXJa?= =?utf-8?B?YmdKNE1pdnJaUkJYT0FJb2dMQ0JFOE5HZnJsUEZsR1RjZXg5VDU2azhIZXhw?= =?utf-8?B?aHZyMmdaaTF4V0wxV2RQdE9BSDdSSjFMejRrV1lIT2FLcjNLaVNHUFZJS2xU?= =?utf-8?B?TXNnWjBsSi8zVnlyZ1BMWUFLZ2xxSEJzbHBMazRxWW9iZER5cGlTRGQ4NjM0?= =?utf-8?B?SkxQOENLaE4zZ1ZFTWxybmlPcXc1RzArZTRVR1hzYUtNT2tLbmZpbTdXUnRH?= =?utf-8?B?QzBQRWREYWJQQmJkcm1pWDhjTGJlWUhmdGJxcm5aZWpLYTJLcFI5TjlySjha?= =?utf-8?B?V3RwU1N0ZXFwU05TSUUzY3B3S0c2dW9hNk5Lc2dDajBBVjRyVk9seUl2THVI?= =?utf-8?B?YnlYdmdVMVcwOFA2NlE3Y2FUdFZpbFJaMlRDb2I5K0JVQXZ0Z25ydytqQ1E5?= =?utf-8?B?WVRCMExjTHdqNTE3cTVRYWM3QXR2Q2hEN0QxSTIzM3VsVk5vYnRCdEROdFh6?= =?utf-8?B?QnhZUFR4cU5sRVFSS1llcHUzWTFDQUdNTXA1cDVOMUFDMllDcjNGeXdydk4y?= =?utf-8?B?MkZEQlNPR0trM2c3ajlKTDBZcE90OUlLaGxtSjNHSXVhQktENWVlRHhKUVV5?= =?utf-8?Q?Tgt+7rky02jNSZhaJg5Giq1R0EG5pUtEKqMNSZh?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: e0f02235-85bc-4f16-93c5-08da94ad6605 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Sep 2022 10:56:09.1366 (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: DU0P250MB0746 Subject: Re: [FFmpeg-devel] [PATCH] avformat: add Limitless Audio Format demuxer 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: Paul B Mahol: > +static int laf_read_header(AVFormatContext *ctx) > +{ > + LAFContext *s = ctx->priv_data; > + AVIOContext *pb = ctx->pb; > + unsigned st_count, mode; > + unsigned sample_rate; > + int64_t duration; > + int codec_id; > + int quality; > + int bpp; > + > + avio_skip(pb, 9); > + if (avio_rb32(pb) != MKBETAG('H','E','A','D')) > + return AVERROR_INVALIDDATA; > + > + quality = avio_r8(pb); > + if (quality > 3) > + return AVERROR_INVALIDDATA; > + mode = avio_r8(pb); > + if (mode > 1) > + return AVERROR_INVALIDDATA; > + st_count = avio_rl32(pb); > + if (st_count == 0 || st_count > 1024) I don't know whether the limit of 1024 is arbitrary or something from some spec. If it is the latter, you should use a #define for it and also for the size of the StreamParams array in the ctx. If it is the former, you might just use FF_ARRAY_ELEMS(s->p) instead of 1024 here. Or a define, as you prefer. > + return AVERROR_INVALIDDATA; > + > + for (int i = 0; i < st_count; i++) { > + StreamParams *stp = &s->p[i]; > + > + stp->vertical = av_int2float(avio_rl32(pb)); > + stp->horizontal = av_int2float(avio_rl32(pb)); > + stp->lfe = avio_r8(pb); > + if (stp->lfe) { > + stp->layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MASK(1, (AV_CH_LOW_FREQUENCY)); > + } else if (stp->vertical == 0.f && > + stp->horizontal == 0.f) { > + stp->layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MASK(1, (AV_CH_FRONT_CENTER)); > + } else if (stp->vertical == 0.f && > + stp->horizontal == -30.f) { > + stp->layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MASK(1, (AV_CH_FRONT_LEFT)); > + } else if (stp->vertical == 0.f && > + stp->horizontal == 30.f) { > + stp->layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MASK(1, (AV_CH_FRONT_RIGHT)); > + } else if (stp->vertical == 0.f && > + stp->horizontal == -110.f) { > + stp->layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MASK(1, (AV_CH_SIDE_LEFT)); > + } else if (stp->vertical == 0.f && > + stp->horizontal == 110.f) { > + stp->layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MASK(1, (AV_CH_SIDE_RIGHT)); > + } else { > + stp->layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; > + } > + } > + > + sample_rate = avio_rl32(pb); > + duration = avio_rl64(pb) / st_count; > + switch (quality) { > + case 0: > + codec_id = AV_CODEC_ID_PCM_U8; > + bpp = 1; > + break; > + case 1: > + codec_id = AV_CODEC_ID_PCM_S16LE; > + bpp = 2; > + break; > + case 2: > + codec_id = AV_CODEC_ID_PCM_F32LE; > + bpp = 4; > + break; > + case 3: > + codec_id = AV_CODEC_ID_PCM_S24LE; > + bpp = 3; > + break; > + } > + > + s->index = 0; > + s->stored_index = 0; > + s->bpp = bpp; > + s->data = av_mallocz(st_count * sample_rate * bpp); sample_rate is read via avio_rl32() and therefore the multiplication on the right can overflow (it's performed in 32bits, so this can happen even on 64bit systems). Maybe use av_calloc(sample_rate, st_count * bpp). But you also need to ensure that sample_rate actually fits into an int and that st_count * sample_rate * bpp performed in the avio_read() below also fits into an int, so you should probably just ensure this here. > + if (!s->data) > + return AVERROR(ENOMEM); > + > + for (int st = 0; st < st_count; st++) { > + StreamParams *stp = &s->p[st]; > + LAFStream *lafst; > + AVCodecParameters *par; > + AVStream *st = avformat_new_stream(ctx, NULL); > + if (!st) > + return AVERROR(ENOMEM); > + > + par = st->codecpar; > + par->codec_id = codec_id; > + par->codec_type = AVMEDIA_TYPE_AUDIO; > + par->ch_layout.nb_channels = 1; > + par->ch_layout = stp->layout; > + par->sample_rate = sample_rate; > + st->duration = duration; > + st->priv_data = lafst = av_mallocz(sizeof(LAFStream)); lafst is set-but-unused. And given that you are already imposing a hardcoded limit on the number of streams you could just add an array of 1024 uint8_t to your context. > + if (!st->priv_data) > + return AVERROR(ENOMEM); > + > + avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate); > + } > + > + return 0; > +} > + > +static int laf_read_packet(AVFormatContext *ctx, AVPacket *pkt) > +{ > + AVIOContext *pb = ctx->pb; > + LAFContext *s = ctx->priv_data; > + AVStream *st = ctx->streams[0]; > + LAFStream *lafst = st->priv_data; > + const int bpp = s->bpp; > + int header_len = (ctx->nb_streams / 8) + !!(ctx->nb_streams & 7); (ctx->nb_streams + 7) / 8. > + int64_t pos; > + int ret; > + > +again: > + if (avio_feof(pb)) > + return AVERROR_EOF; > + > + pos = avio_tell(pb); > + > + if (s->index >= ctx->nb_streams) { > + int cur_st = 0, st_count = 0, st_index = 0; > + > + for (int i = 0; i < header_len; i++) { > + uint8_t val = avio_r8(pb); Given that you impose a limit of 1024 for the number of streams, you can actually put an uint8_t [128] on the stack in this loop and read all the values at once. This would allow to remove the outer loop. (If you used an array of uint8_t instead of the st->priv_data for stored, you could also use that array.) > + > + for (int j = 0; j < 8 && cur_st < ctx->nb_streams; j++, cur_st++) { > + AVStream *st = ctx->streams[st_index]; > + LAFStream *lafst = st->priv_data; > + > + lafst->stored = 0; > + if (val & 1) { > + lafst->stored = 1; > + st_count++; > + } > + val >>= 1; > + st_index++; > + } > + } > + > + s->index = s->stored_index = 0; > + s->nb_stored = st_count; > + if (!st_count) > + return AVERROR_INVALIDDATA; > + ret = avio_read(pb, s->data, st_count * st->codecpar->sample_rate * bpp); > + if (ret < 0) > + return ret; > + } > + > + st = ctx->streams[s->index]; > + lafst = st->priv_data; > + while (!lafst->stored) { > + s->index++; > + if (s->index >= ctx->nb_streams) > + goto again; > + lafst = ctx->streams[s->index]->priv_data; > + } > + st = ctx->streams[s->index]; > + > + ret = av_new_packet(pkt, st->codecpar->sample_rate * bpp); > + if (ret < 0) > + return ret; > + > + for (int n = 0; n < st->codecpar->sample_rate; n++) > + memcpy(pkt->data + n * bpp, s->data + n * s->nb_stored * bpp + s->stored_index * bpp, bpp); This looks like something that can easily trigger a timeout. > + > + pkt->stream_index = s->index; > + pkt->pos = pos; If you have data from multiple streams interleaved, then the first stream will get the position from before reading header_len bytes, but all the other streams will get the position from after reading the common data. IMO all packets should get the position of the common data. > + s->index++; > + s->stored_index++; > + > + return ret; return 0 -- it is not really defined what happens in case read_packet callbacks return positive values (it is currently ignored and some demuxers return the size of the packet, but that is a remnant of an earlier API) which could happen if av_new_packet() were changed to allow to return positive values. > +} > + > +static int laf_read_seek(AVFormatContext *ctx, int stream_index, > + int64_t timestamp, int flags) > +{ > + LAFContext *s = ctx->priv_data; > + > + s->stored_index = s->index = 0; > + > + return -1; > +} > + > +const AVInputFormat ff_laf_demuxer = { > + .name = "laf", > + .long_name = NULL_IF_CONFIG_SMALL("LAF (Limitless Audio Format)"), > + .priv_data_size = sizeof(LAFContext), > + .read_probe = laf_probe, > + .read_header = laf_read_header, > + .read_packet = laf_read_packet, > + .read_seek = laf_read_seek, > + .extensions = "laf", > + .flags = AVFMT_GENERIC_INDEX, > +}; _______________________________________________ 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".