diff options
author | Kimapr <root@kimapr.net> | 2025-07-28 06:32:27 +0500 |
---|---|---|
committer | Kacper Michajłow <kasper93@gmail.com> | 2025-08-04 19:51:59 +0000 |
commit | ecef5f9e1fb70b38f3e325c8e613349344c97de4 (patch) | |
tree | 567df9996d550d529b6d6cca88be8789e055fea2 | |
parent | 09828e7fe214a28cacfb805605bd5b19041d1f68 (diff) | |
download | ffmpeg-ecef5f9e1fb70b38f3e325c8e613349344c97de4.tar.gz |
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.
-rw-r--r-- | libavformat/libopenmpt.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/libavformat/libopenmpt.c b/libavformat/libopenmpt.c index dee975c9c2..46af4bff22 100644 --- a/libavformat/libopenmpt.c +++ b/libavformat/libopenmpt.c @@ -148,7 +148,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->ch_layout.nb_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->ch_layout.nb_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; } |