[opus] Issue with decoding 8-bit PCM data

Mark Harris mark.hsj at gmail.com
Sat Jan 9 10:28:31 PST 2016

opus_decode() produces 16-bit signed linear PCM, and
opus_decode_float() produces 32-bit floating point PCM that is useful
when you want a higher bit depth.

If you need 8-bit linear PCM then a simple solution would be to use
only the top 8 bits of each 16-bit sample from opus_decode().  Note
that the WAV format uses unsigned rather than signed integers for
8-bit linear PCM.  (It uses signed for larger sample sizes and AIFF
uses signed for all sizes.)  So if you are writing 8-bit linear PCM to
WAV then you would need something like (((unsigned short)sample ^
0x8000) >> 8) to convert from signed to unsigned and get the top 8
bits of each sample.

You will achieve better quality, however, if you apply dither.
opusdec applies dither by default if the output is not floating point,
although it does not support 8-bit output.

 - Mark

More information about the opus mailing list