diff --git a/audio/audio.c b/audio/audio.c index ae85a4bf08..306401b5a4 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -257,13 +257,21 @@ void mp_audio_skip_samples(struct mp_audio *data, int samples) data->pts += samples / (double)data->rate; } +// Return the timestamp of the sample just after the end of this frame. +double mp_audio_end_pts(struct mp_audio *f) +{ + if (f->pts == MP_NOPTS_VALUE || f->rate < 1) + return MP_NOPTS_VALUE; + return f->pts + f->samples / (double)f->rate; +} + // Clip the given frame to the given timestamp range. Adjusts the frame size // and timestamp. void mp_audio_clip_timestamps(struct mp_audio *f, double start, double end) { - if (f->pts == MP_NOPTS_VALUE || f->rate < 1) + double f_end = mp_audio_end_pts(f); + if (f_end == MP_NOPTS_VALUE) return; - double f_end = f->pts + f->samples / (double)f->rate; if (end != MP_NOPTS_VALUE) { if (f_end >= end) { if (f->pts >= end) { diff --git a/audio/audio.h b/audio/audio.h index c469f7a21e..e126e93b66 100644 --- a/audio/audio.h +++ b/audio/audio.h @@ -73,6 +73,7 @@ void mp_audio_copy(struct mp_audio *dst, int dst_offset, void mp_audio_copy_attributes(struct mp_audio *dst, struct mp_audio *src); void mp_audio_skip_samples(struct mp_audio *data, int samples); void mp_audio_clip_timestamps(struct mp_audio *f, double start, double end); +double mp_audio_end_pts(struct mp_audio *data); bool mp_audio_is_writeable(struct mp_audio *data); int mp_audio_make_writeable(struct mp_audio *data);