Commit faee5bbb authored by Max Kellermann's avatar Max Kellermann

decoder/opus: implement End Trimming (RFC7845 4.4)

parent 7befab7e
......@@ -5,7 +5,7 @@ ver 0.21.25 (not yet released)
- file: detect premature end of file
- smbclient: don't send credentials to MPD clients
* decoder
- opus: apply pre-skip
- opus: apply pre-skip and end trimming
- opus: fix memory leak
* output
- osx: improve sample rate selection
......
......@@ -286,6 +286,23 @@ MPDOpusDecoder::HandleAudio(const ogg_packet &packet)
AddGranulepos(skip);
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 */
const size_t nbytes = nframes * frame_size;
auto cmd = client.SubmitData(input_stream,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment