app-starlock/star_lock/lib/talk/call/g711Decoder.dart

37 lines
887 B
Dart
Raw Normal View History

2023-12-11 10:43:41 +08:00
import 'dart:typed_data';
enum G711Type {
uLaw,
aLaw,
}
2023-12-11 10:43:41 +08:00
class G711Decoder {
Uint8List g711Decode(Uint8List g711Data, G711Type g711Type) {
List<int> pcmData = [];
int sign, exponent, mantissa, sample;
for (int i = 0; i < g711Data.length; i++) {
int value = g711Data[i];
if (g711Type == G711Type.uLaw) {
// μ-law decoding
value = ~value & 0xFF;
sign = (value & 0x80) == 0 ? 1 : -1;
exponent = (value & 0x70) >> 4;
mantissa = ((value & 0x0F) << 4) + 0x10;
sample = (mantissa << exponent) * sign;
} else {
// A-law decoding
sign = (value & 0x80) == 0 ? 1 : -1;
exponent = ((value & 0x70) >> 4) + 1;
mantissa = (value & 0x0F) + 0x10;
sample = (mantissa << exponent) * sign;
}
pcmData.add(sample);
2023-12-11 10:43:41 +08:00
}
return Uint8List.fromList(pcmData);
2023-12-11 10:43:41 +08:00
}
}