decoder/opus: implement End Trimming (RFC7845 4.4)

Closes https://github.com/MusicPlayerDaemon/MPD/issues/867
This commit is contained in:
Max Kellermann 2020-07-01 21:21:38 +02:00
parent 7befab7e83
commit faee5bbb78
2 changed files with 18 additions and 1 deletions

2
NEWS
View File

@ -5,7 +5,7 @@ ver 0.21.25 (not yet released)
- file: detect premature end of file - file: detect premature end of file
- smbclient: don't send credentials to MPD clients - smbclient: don't send credentials to MPD clients
* decoder * decoder
- opus: apply pre-skip - opus: apply pre-skip and end trimming
- opus: fix memory leak - opus: fix memory leak
* output * output
- osx: improve sample rate selection - osx: improve sample rate selection

View File

@ -286,6 +286,23 @@ MPDOpusDecoder::HandleAudio(const ogg_packet &packet)
AddGranulepos(skip); AddGranulepos(skip);
skip = 0; skip = 0;
if (packet.e_o_s && packet.granulepos > 0 && granulepos >= 0) {
/* End Trimming (RFC7845 4.4): "The page with the 'end
of stream' flag set MAY have a granule position
that indicates the page contains less audio data
than would normally be returned by decoding up
through the final packet. This is used to end the
stream somewhere other than an even frame
boundary. [...] The remaining samples are
discarded. */
ogg_int64_t remaining = packet.granulepos - granulepos;
if (remaining <= 0)
return;
if (remaining < nframes)
nframes = remaining;
}
/* submit decoded samples to the DecoderClient */ /* submit decoded samples to the DecoderClient */
const size_t nbytes = nframes * frame_size; const size_t nbytes = nframes * frame_size;
auto cmd = client.SubmitData(input_stream, auto cmd = client.SubmitData(input_stream,