Files
go2rtc/pkg/pcm/pcma.go
2023-04-20 21:32:46 +03:00

54 lines
809 B
Go

// Package pcm
// https://www.codeproject.com/Articles/14237/Using-the-G711-standard
package pcm
const alawMax = 0x7FFF
func PCMAtoPCM(alaw byte) int16 {
alaw ^= 0xD5
data := int16(((alaw & 0x0F) << 4) + 8)
exponent := (alaw & 0x70) >> 4
if exponent != 0 {
data |= 0x100
}
if exponent > 1 {
data <<= exponent - 1
}
// sign
if alaw&0x80 == 0 {
return data
} else {
return -data
}
}
func PCMtoPCMA(pcm int16) byte {
var alaw byte
if pcm < 0 {
pcm = -pcm
alaw = 0x80
}
if pcm > alawMax {
pcm = alawMax
}
exponent := byte(7)
for expMask := int16(0x4000); (pcm&expMask) == 0 && exponent > 0; expMask >>= 1 {
exponent--
}
if exponent == 0 {
alaw |= byte(pcm>>4) & 0x0F
} else {
alaw |= (exponent << 4) | (byte(pcm>>(exponent+3)) & 0x0F)
}
return alaw ^ 0xD5
}