[opus] Issue with decoding 8-bit PCM data
giles at thaumas.net
Thu Jan 7 10:21:57 PST 2016
On 07/01/16 10:04 AM, Amit Ashara wrote:
> opus_decoder_ctl(sOpusDec, OPUS_SET_LSB_DEPTH(ui32BitsPerSample));
OPUS_SET_LSB_DEPTH only affects the encoder. If you check the return
value here you should get OPUS_UNIMPLEMENTED.
> output_samples = opus_decode(sOpusDec, (const unsigned char
> *)&pcRdBuf, len, opi16_out, (ui32SizeOfWrBuf/ui8ScaleFactor), 0);
I suspect the issue is dividing by ui8ScaleFactor = 1 here.
OPUS_SET_LSB_DEPTH works as a precision hint to the encoder about where
to set the noise floor, but opus_decode still returns 16 bit samples. It
always returns 16 bit samples, regardless of whether the original input
as 8 bit, 16 bit or 24 bit precision (from opus_encode_float).
To actually output 8-bit wav, you have to keep track of this out-of-band
and truncate each sample before writing it out.
Likewise opus_encode() takes 16 bit samples, so you need to extend each
sample from an 8 bit source before encoding.
More information about the opus