You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-04 22:03:09 +02:00
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.
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user