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".

Reply via email to