Skip to main content

Crate codec_core

Crate codec_core 

Source
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 -- --nocapture

The 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

CodecSample RateChannelsBitrateFrame SizeFeature
G.711 μ-law (PCMU)8 kHz164 kbps160 samplesg711, default
G.711 A-law (PCMA)8 kHz164 kbps160 samplesg711, default
G.729A / G.729AB8 kHz18 kbps80 samplesg729
Opus8–48 kHz1–26–510 kbps2.5–60 msopus
AMR-NB8 kHz14.75–12.2 kbps, 8 modes160 samplesamr-nb
AMR-WB (G.722.2)16 kHz16.6–23.85 kbps, 9 modes320 samplesamr-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.729AB
  • opus: Opus, backed by libopus
  • amr-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. See docs/AMR_IMPLEMENTATION_STATUS.md for 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§

LibraryInfo
Library information structure

Constants§

SUPPORTED_CODECS
Supported codec types
VERSION
Version information for the codec library

Functions§

info
Get library information
init
Initialize the codec library