decoder/opus: implement End Trimming (RFC7845 4.4)
Closes https://github.com/MusicPlayerDaemon/MPD/issues/867
This commit is contained in:
parent
7befab7e83
commit
faee5bbb78
2
NEWS
2
NEWS
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue