From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 2256C4C394 for ; Thu, 4 Sep 2025 14:23:45 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (Bad 0 bit rsa-sha256 signature.) header.d=tflc.us header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1756995811; h=to : date : message-id : mime-version : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=uH3T8TZUyr4cVkuIbCMBG3kZCal5YKVY2ZWNhDoDE80=; b=AEZ68KQBefwPBRjl9kEu+wd0fEPFxdsUEtr+m/MU29jUrr7SMaj2nw/8P1hJYywdz6LIN 7jBlI5LQx8Yzfsy/nt/gUWvp+zLhtTTGuIRbvj0N0OXWsqgdl26JRqanXxT0x5dlUzDfImQ SffIePKClqq6bbktgYKrONMcb9B8PLJwIb5C0tnAVK49ANa4r9URQUfFe/oYqH7RgMyZj3r SWlp8QAzusQKWONEKj9/LAbXUE5xCXKXfAbCc9fQY7jcyEuTMoFDxavNTzHKkGHLiujZCPq kwSPEc7mJdRH25CCYJw/Z1DDhvrWq3iwBd6Pm7TOAxC8TEYJeHviWP+te4AA== Received: from [172.19.0.4] (unknown [172.19.0.4]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 56E7568E793; Thu, 4 Sep 2025 17:23:31 +0300 (EEST) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1756995810; b=FSrCtzqP3e3IB7iu/4+ct4ruJ3wFG3wHIHhCRJWmUElFb+rvOth2ZeE+HmRpfZEHihZnZ h7sDL9KA+144tlPoTZXpNW3QDL3IEk96n5ujizUlZR5C3l7VpV31VYHdrvubsoLqARzCyYh HSOuXEC2Oo0CFHFR5gkBvrW8pwxxfhJfD3c+4J3OOcI1TVXoYygK3m2YATIP0fyxM9756oV lO+ycI9zg4RmQGgedX2k3GuHmqNXsG+2613x2Sam9lL6P6unf8i6k385DsSSp9qbj4dtkkB piFw8Z4PuTvrsGAt3/8oTCtOfItbrTtGxSNkXVz7XZTgEPdo4Y+rABXG3vTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1756995810; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=XwOdDvna8UQRmbhqQZW49hIJ+l0hxhybtNTeE2LDp0Y=; b=jDGPP9beVa7TZDF1Wyo6g+IKLDAfa853Ax3Wo3bp2yNqDxJL2PGMeOSHcF/qL9bwYQZE2 i6Z/HI47ZHIU35TvJEYxT/Pmh3/f36BaO2Y3Wq5do3FHTTLnE6FwXY88tg20+ptMHHk385l R5T+2Hs6SCJ3VF8rW1rCIRGJDmmKCF+Ab5FvH9Gphd33HBFxrB5EPVO+6yrQfnn1kKvIBQN EottVHV/TTJp+VRvUYh8K0QthWXvahd+1M6xxDxyuW03UO5Wec6yvGn+Ei9sXtdMra/9zUT wX2wNEOFr6+OXr3PLe0OIo9x/Tt9FPjmlyQ6ZflMlK9np1y7wTszVSYJh8CQ== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=fail header.d=tflc.us; arc=none; dmarc=none Authentication-Results: ffmpeg.org; dkim=fail header.d=tflc.us; arc=none (Message is not ARC signed); dmarc=none Received: from outbound.st.icloud.com (p-east2-cluster1-host1-snip4-9.eps.apple.com [57.103.76.32]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id ADD72687B87 for ; Thu, 4 Sep 2025 17:23:15 +0300 (EEST) Received: from outbound.st.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-1a-10-percent-2 (Postfix) with ESMTPS id 8E28C180231F; Thu, 4 Sep 2025 14:23:12 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tflc.us; s=sig1; bh=hjLBKZXwH9OGgaT3Lp/712dGOJT8OX0uUwkVKMP/mN8=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=sCzi5h+CIIMZTuxnUTZobBsk45kwo2Q08GFvV3iSr9YrHX9QfRTKgBM8P4fyfcxflP99HWE1fB226OKLH5tAxHCphJcWIoqbODrlxohOIaUj3sBJOX1lG4w8kjWOpExjmTxHJkPjXwHr81bgkOF2zfGeJWePGWX21E0FJ5mqAGO68pjBQAn0SvAVmRCVGlDqJKE9m1YtFq1z6a8B5Uru/B7v7eXV/7TWKYzsCdbENOgkbviiSvbaPcNxYJ45jl/ErH8N+BILIUGtnN0sOMmNc/30AUiRDoNUHejYq9BqzpPO7QCLRQoKIff159uveq3Sqh9ECCcghEPx95lRbIsMUA== mail-alias-created-date: 1727727383918 Received: from tainaka (st-asmtp-me-k8s.p00.prod.me.com [17.42.251.67]) by p00-icloudmta-asmtp-us-east-1a-10-percent-2 (Postfix) with ESMTPSA id 901C2180076C; Thu, 4 Sep 2025 14:21:25 +0000 (UTC) To: ffmpeg-devel@ffmpeg.org Date: Thu, 4 Sep 2025 10:21:46 -0400 Message-ID: <20250904142146.9228-1-paper@tflc.us> X-Mailer: git-send-email 2.51.0 MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: N6ZGhbNudS8tN0dMDUvwCqTZsOOoHfMF X-Proofpoint-GUID: N6ZGhbNudS8tN0dMDUvwCqTZsOOoHfMF X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTA0MDE0MiBTYWx0ZWRfX5ySh5vD2COqf Oyw1ZvK4qFRFO+0hveKXmdb1zQwMmMlvibdn2mIFuTBsTXD3SGO2fm8bkEW530V5oqSyxBvZo73 dBqCabQSbXFja9UyVxh/mRyl2IHpCmnudIn+JOY2xalAoeFLKcrUTcdS4mq4e+CeQ61pLC4nExk 11CaAW4Zode5hoD1FPYHSCbUhWnugmZF9TknIZz5QOei2I1hdfYcG19ywYe4g57qWMOyd6TrXXf f7MajO8YqCKaRGNSGE4cU5QYHc7LSNAIClEmQXd6wMui3ZBzjH22JxP35SbLZLgp371gqp6RI= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-04_05,2025-09-04_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 adultscore=0 bulkscore=0 clxscore=1030 spamscore=0 mlxscore=0 mlxlogscore=907 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.22.0-2506270000 definitions=main-2509040142 X-JNJ: AAAAAAABhPTEJYcVWcLCRG4qTGVDutHM5Ce6QCaAFJavX1/kEcvN2jv/xyhn/q8kvEP8DiQCH9VzdSjpnqTlXGOFFFVEWhrj4IAL1t0PHkQUUcrbuB0m87kZF6hhGKgT1qEU0s8e23zhU3Vb+bQ7ckNR/Fc79PNH62LyabukV2NHFJUhQ0Ca8S+78Ij+sqQSbBPVYYzTCC3soPTjaTzKmSkNcZlBxw+wEB1DxpdXF5g6nl+980jZRydmW5CDMKSI+jUpZE9F1gLRJnC5HJcoRKcuK2LpLhOrBFNgI6kCVrqb6kJN2grJd2C9720xb2jaoqHffGG31DLykTnfKq8DMnYqYEuN5XnRRy8JMuOkQlqUX28pvFzy29rnMreFnhSKsHwuC/0e8h6EIqqVUNy3HeenW/R9TVjRg9/EJYOXLYHr5zN3EcRuE/rvyQdZUHbQG5Bi1yeNeZyEv2YzS8/XAuzdoo15Opb8GPVdBM1m7IrKw1DJYw40fulQl+TnIEC15hGRRbLoE2Kjq7mhp6Gwav8XFI2KBsFq6JM= Message-ID-Hash: GQQRQSVLOVQJ5RDFCO3QSCNBNRSMUFQA X-Message-ID-Hash: GQQRQSVLOVQJ5RDFCO3QSCNBNRSMUFQA X-MailFrom: SRS0=t9bV=3P=tflc.us=paper@ffmpeg.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH v2] avformat/libopenmpt: implement file reading callbacks List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Paper via ffmpeg-devel Cc: Paper Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: Before, this code would unnecessarily waste quite a bit of memory reading the entire file in, and in many cases just freeing the result and throwing it out anyway. This commit changes the behavior to use libopenmpt's callback structure. This is much more memory efficient, especially for particularly large files. Both pre-0.3.0 and post-0.3.0 preprocessor branches have been tested working with a plain amiga-style 'M.K.' module in ffplay. Signed-off-by: Paper --- libavformat/libopenmpt.c | 66 ++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/libavformat/libopenmpt.c b/libavformat/libopenmpt.c index 46af4bff22..52f4ab2b7d 100644 --- a/libavformat/libopenmpt.c +++ b/libavformat/libopenmpt.c @@ -69,6 +69,51 @@ static void openmpt_logfunc(const char *message, void *userdata) av_log(userdata, level, "%s\n", message); } +static size_t av_openmpt_read(void *stream, void *dst, size_t bytes) +{ + AVIOContext *ioctx = stream; + int r; + + /* avio_read takes an int, cap the size accordingly */ + if (bytes > (size_t)INT_MAX) + bytes = (size_t)INT_MAX; + + r = avio_read(ioctx, dst, bytes); + + return (r >= 0) ? r : 0; +} + +static int av_openmpt_seek(void *stream, int64_t offset, int whence) +{ + AVIOContext *ioctx = stream; + int whence_av; + + switch (whence) { + case OPENMPT_STREAM_SEEK_SET: whence_av = SEEK_SET; break; + case OPENMPT_STREAM_SEEK_CUR: whence_av = SEEK_CUR; break; + case OPENMPT_STREAM_SEEK_END: whence_av = SEEK_END; break; + /* invalid value, punt */ + default: return -1; + } + + /* openmpt expects stdio-style seek; don't return new position */ + return (avio_seek(ioctx, offset, whence_av) < 0) ? -1 : 0; +} + +static int64_t av_openmpt_tell(void *stream) +{ + AVIOContext *ioctx = stream; + int64_t r = avio_tell(ioctx); + + return (r < 0) ? -1 : r; +} + +static const openmpt_stream_callbacks openmpt_cbs = { + av_openmpt_read, + av_openmpt_seek, + av_openmpt_tell +}; + #define add_meta(s, name, meta) \ do { \ const char *value = meta; \ @@ -81,30 +126,14 @@ static int read_header_openmpt(AVFormatContext *s) { AVStream *st; OpenMPTContext *openmpt = s->priv_data; - int64_t size; - char *buf; #if OPENMPT_API_VERSION_AT_LEAST(0,3,0) int error; #endif int ret; - size = avio_size(s->pb); - if (size <= 0) - return AVERROR_INVALIDDATA; - buf = av_malloc(size); - if (!buf) - return AVERROR(ENOMEM); - size = avio_read(s->pb, buf, size); - if (size < 0) { - av_log(s, AV_LOG_ERROR, "Reading input buffer failed.\n"); - av_freep(&buf); - return size; - } - #if OPENMPT_API_VERSION_AT_LEAST(0,3,0) error = OPENMPT_ERROR_OK; - openmpt->module = openmpt_module_create_from_memory2(buf, size, openmpt_logfunc, s, NULL, NULL, &error, NULL, NULL); - av_freep(&buf); + openmpt->module = openmpt_module_create2(openmpt_cbs, s->pb, openmpt_logfunc, s, NULL, NULL, &error, NULL, NULL); if (!openmpt->module) { if (error == OPENMPT_ERROR_OUT_OF_MEMORY) return AVERROR(ENOMEM); @@ -114,8 +143,7 @@ static int read_header_openmpt(AVFormatContext *s) return AVERROR_UNKNOWN; } #else - openmpt->module = openmpt_module_create_from_memory(buf, size, openmpt_logfunc, s, NULL); - av_freep(&buf); + openmpt->module = openmpt_module_create(openmpt_cbs, s->pb, openmpt_logfunc, s, NULL); if (!openmpt->module) return AVERROR_INVALIDDATA; #endif -- 2.51.0 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org