Expand description
§Codec-Core: Audio Codec Library for VoIP
Audio codecs for VoIP applications: ITU-T compliant G.711 μ-law and
A-law in the default build, and G.729A/G.729AB, Opus and AMR-NB/AMR-WB
behind feature flags. Every codec reaches the same types::AudioCodec
interface, so the layers above pick one by negotiation rather than by type.
§Features
- ITU-T G.711 Compliant: Passes official compliance tests
- Reference-validated speech codecs: G.729 and both AMR variants are checked against their reference implementations, not just round-tripped
- Real Audio Tested: Validated with actual speech samples
- Good Quality: ~37 dB SNR with real speech
- Lookup Table Optimized: Fast O(1) encoding/decoding for G.711
§Implementation
- Lookup Tables: Pre-computed tables for O(1) operations
- Simple APIs: Straightforward encoding/decoding functions
§Usage
§Quick Start
use codec_core::codecs::g711::G711Codec;
use codec_core::types::{AudioCodec, CodecConfig, CodecType, SampleRate};
// Create a G.711 μ-law codec
let config = CodecConfig::new(CodecType::G711Pcmu)
.with_sample_rate(SampleRate::Rate8000)
.with_channels(1);
let mut codec = G711Codec::new_pcmu(config)?;
// Encode audio samples (20ms at 8kHz = 160 samples)
let samples = vec![0i16; 160];
let encoded = codec.encode(&samples)?;
// Decode back to samples
let decoded = codec.decode(&encoded)?;§Testing & Validation
The library includes comprehensive testing including real audio validation:
# Run all codec tests including WAV roundtrip tests
cargo test
# Run only G.711 WAV roundtrip tests (downloads real speech audio)
cargo test wav_roundtrip_test -- --nocaptureThe WAV roundtrip tests automatically download real speech samples and validate:
- Signal-to-Noise Ratio (SNR) measurement
- Round-trip audio quality preservation
- Proper encoding/decoding with real audio data
- Output WAV files for manual quality assessment
§Error Handling
All codec operations return Result types with detailed error information:
use codec_core::codecs::g711::G711Codec;
use codec_core::types::{CodecConfig, CodecType, SampleRate};
use codec_core::error::CodecError;
// Handle configuration errors
let config = CodecConfig::new(CodecType::G711Pcmu)
.with_sample_rate(SampleRate::Rate48000) // Invalid for G.711
.with_channels(1);
match G711Codec::new_pcmu(config) {
Ok(codec) => println!("Codec created successfully"),
Err(CodecError::InvalidSampleRate { rate, supported }) => {
println!("Invalid sample rate {}, supported: {:?}", rate, supported);
}
Err(e) => println!("Other error: {}", e),
}§Performance Tips
- Use appropriate frame sizes (160 samples for G.711 at 8kHz/20ms)
§Direct G.711 Functions
use codec_core::codecs::g711::{alaw_compress, alaw_expand, ulaw_compress, ulaw_expand};
// Single sample processing
let sample = 1024i16;
let alaw_encoded = alaw_compress(sample);
let alaw_decoded = alaw_expand(alaw_encoded);
let ulaw_encoded = ulaw_compress(sample);
let ulaw_decoded = ulaw_expand(ulaw_encoded);§Frame-Based Processing
use codec_core::codecs::g711::{G711Codec, G711Variant};
let mut codec = G711Codec::new(G711Variant::MuLaw);
// Process 160 samples (20ms at 8kHz)
let input_frame = vec![1000i16; 160]; // Some test samples
let encoded = codec.compress(&input_frame).unwrap();
// Decode back to samples (same count for G.711)
let decoded = codec.expand(&encoded).unwrap();
assert_eq!(input_frame.len(), decoded.len());§Supported Codecs
| Codec | Sample Rate | Channels | Bitrate | Frame Size | Feature |
|---|---|---|---|---|---|
| G.711 μ-law (PCMU) | 8 kHz | 1 | 64 kbps | 160 samples | g711, default |
| G.711 A-law (PCMA) | 8 kHz | 1 | 64 kbps | 160 samples | g711, default |
| G.729A / G.729AB | 8 kHz | 1 | 8 kbps | 80 samples | g729 |
| Opus | 8–48 kHz | 1–2 | 6–510 kbps | 2.5–60 ms | opus |
| AMR-NB | 8 kHz | 1 | 4.75–12.2 kbps, 8 modes | 160 samples | amr-nb |
| AMR-WB (G.722.2) | 16 kHz | 1 | 6.6–23.85 kbps, 9 modes | 320 samples | amr-wb |
§Quality Metrics
Based on real audio testing with the included WAV roundtrip tests:
- G.711: 37+ dB SNR (excellent quality, industry standard)
The speech codecs are lossy by design, so SNR is not the useful measure for them. They are validated against their reference implementations instead:
- AMR-NB / AMR-WB: bit-exact against the 3GPP reference encoders and decoders over the committed fixtures, plus the normative test sequences the reference distributions ship. Bit-exactness is not certification — see the status document linked under Feature Flags for the boundary.
§Feature Flags
§Core Codecs (enabled by default)
g711: G.711 μ-law/A-law codecs
§Optional Codecs
g729: G.729A/G.729ABopus: Opus, backed by libopusamr-nb/amr-wb/amr: AMR narrowband and wideband (G.722.2), with RFC 4867 payload framing, DTX, CMR and mode negotiation. Encoders and decoders are bit-exact against the 3GPP reference implementations over the committed fixtures. Seedocs/AMR_IMPLEMENTATION_STATUS.mdfor the evidence and its boundaries.all-codecs: every codec above
Re-exports§
pub use codecs::CodecFactory;pub use codecs::CodecRegistry;pub use error::CodecError;pub use error::Result;pub use types::AudioCodec;pub use types::AudioFrame;pub use types::CodecCapability;pub use types::CodecConfig;pub use types::CodecInfo;pub use types::CodecType;pub use types::CodedFrame;pub use types::FrameKind;pub use types::SampleRate;pub use types::VariableRateCodec;
Modules§
- codecs
- Audio Codec Implementations
- error
- Error handling for the codec library
- types
- Core types and traits for the codec library
- utils
- Utility functions and helpers for the codec library
Structs§
- Library
Info - Library information structure
Constants§
- SUPPORTED_
CODECS - Supported codec types
- VERSION
- Version information for the codec library