On 2025/08/05 01:02, kimapr via ffmpeg-devel wrote: > Hi! it would be nice if my bug fix > > avformat/libopenmpt: fix seeking weirdness > > was backported to 6.1.3 and 7.0.3 (dunno about 5.1.7 as i haven't checked > if libopenmpt even exists there). not sure how that would work from my side
I just checked, and it seems that my patch can be backported as far back as 3.2 (it cannot be backported to 3.1 or earlier because libopenmpt demuxer does not exist there, 3.2 code is similar enough to today's code) On 5.0 and earlier there is a merge conflict because a line of code near my change had changed a little bit so here's a version of the patch with conflict solved for convenience, for later versions (including 5.1) just rebase ecef5f9e1f i haven't tested the patch on top of anything older than 6.1.1 so i don't know if the seeking problems exist there, but the patch shouldn't break anything either as it doesn't depend on any APIs that were changed between 3.2 and latest
From 3dc81264cf6e5190c69ae35c87e0c2547b36b29b Mon Sep 17 00:00:00 2001 From: Kimapr <r...@kimapr.net> Date: Mon, 28 Jul 2025 06:32:27 +0500 Subject: [PATCH] avformat/libopenmpt: fix seeking weirdness - proper pts for packets. leaving it blank leaves it up for guessing, but the guess doesn't take seeking into account, causing weirdness. - clamp to 0 when seeking to negative ts. libopenmpt docs are unclear on this but not doing this causes an immediate EOF when seeking backwards to the beginning in mpv. - only set song duration and packet pts when they are non-negative and in int64 range. NaNs count as out of range. this isn't a fix for any specific issue but might be helpful still, and shouldn't break anything. --- libavformat/libopenmpt.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libavformat/libopenmpt.c b/libavformat/libopenmpt.c index 8006c085df..1ed48fa900 100644 --- a/libavformat/libopenmpt.c +++ b/libavformat/libopenmpt.c @@ -150,7 +150,8 @@ static int read_header_openmpt(AVFormatContext *s) if (!st) return AVERROR(ENOMEM); avpriv_set_pts_info(st, 64, 1, AV_TIME_BASE); - st->duration = llrint(openmpt->duration*AV_TIME_BASE); + if (openmpt->duration >= 0 && openmpt->duration < ((double)INT64_MAX + 1) / AV_TIME_BASE) + st->duration = llrint(openmpt->duration*AV_TIME_BASE); st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; st->codecpar->codec_id = AV_NE(AV_CODEC_ID_PCM_F32BE, AV_CODEC_ID_PCM_F32LE); @@ -171,6 +172,8 @@ static int read_packet_openmpt(AVFormatContext *s, AVPacket *pkt) if ((ret = av_new_packet(pkt, AUDIO_PKT_SIZE)) < 0) return ret; + double pos = openmpt_module_get_position_seconds(openmpt->module); + switch (openmpt->channels) { case 1: ret = openmpt_module_read_float_mono(openmpt->module, openmpt->sample_rate, @@ -196,6 +199,9 @@ static int read_packet_openmpt(AVFormatContext *s, AVPacket *pkt) pkt->size = ret * (openmpt->channels * 4); + if (pos >= 0 && pos < ((double)INT64_MAX + 1) / AV_TIME_BASE) + pkt->pts = llrint(pos * AV_TIME_BASE); + return 0; } @@ -212,6 +218,8 @@ static int read_close_openmpt(AVFormatContext *s) static int read_seek_openmpt(AVFormatContext *s, int stream_idx, int64_t ts, int flags) { OpenMPTContext *openmpt = s->priv_data; + if (ts < 0) + ts = 0; openmpt_module_set_position_seconds(openmpt->module, (double)ts/AV_TIME_BASE); return 0; } -- 2.49.0
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".