decoder/faad: estimate song duration for remote files
Previously, MPD tried to slurp the whole song file, count the number of frames and calculate the song duration from that. That however is extremely expensive for remote files, and will delay playback for a long time. Workaround: check only the first 128 frames and try to extrapolate from here. Fixes Mantis ticket 0004035.
This commit is contained in:
parent
4fe272a7fb
commit
a960e2ef48
1
NEWS
1
NEWS
|
@ -6,6 +6,7 @@ ver 0.18.12 (not yet released)
|
||||||
- audiofile: improve responsiveness
|
- audiofile: improve responsiveness
|
||||||
- audiofile: fix WAV stream playback
|
- audiofile: fix WAV stream playback
|
||||||
- dsdiff, dsf: fix stream playback
|
- dsdiff, dsf: fix stream playback
|
||||||
|
- faad: estimate song duration for remote files
|
||||||
- sndfile: improve responsiveness
|
- sndfile: improve responsiveness
|
||||||
* randomize next song when enabling "random" mode while not playing
|
* randomize next song when enabling "random" mode while not playing
|
||||||
* randomize next song when adding to single-song queue
|
* randomize next song when adding to single-song queue
|
||||||
|
|
|
@ -122,6 +122,12 @@ adts_find_frame(DecoderBuffer *buffer)
|
||||||
static float
|
static float
|
||||||
adts_song_duration(DecoderBuffer *buffer)
|
adts_song_duration(DecoderBuffer *buffer)
|
||||||
{
|
{
|
||||||
|
const InputStream &is = decoder_buffer_get_stream(buffer);
|
||||||
|
const bool estimate = !is.CheapSeeking();
|
||||||
|
const auto file_size = is.GetSize();
|
||||||
|
if (estimate && file_size <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
unsigned sample_rate = 0;
|
unsigned sample_rate = 0;
|
||||||
|
|
||||||
/* Read all frames to ensure correct time and bitrate */
|
/* Read all frames to ensure correct time and bitrate */
|
||||||
|
@ -145,6 +151,22 @@ adts_song_duration(DecoderBuffer *buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
decoder_buffer_consume(buffer, frame_length);
|
decoder_buffer_consume(buffer, frame_length);
|
||||||
|
|
||||||
|
if (estimate && frames == 128) {
|
||||||
|
/* if this is a remote file, don't slurp the
|
||||||
|
whole file just for checking the song
|
||||||
|
duration; instead, stop after some time and
|
||||||
|
extrapolate the song duration from what we
|
||||||
|
have until now */
|
||||||
|
|
||||||
|
const auto offset = is.GetOffset()
|
||||||
|
- decoder_buffer_available(buffer);
|
||||||
|
if (offset <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
frames = (frames * file_size) / offset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sample_rate == 0)
|
if (sample_rate == 0)
|
||||||
|
|
Loading…
Reference in New Issue