| Crates.io | frame-header |
| lib.rs | frame-header |
| version | 0.2.0 |
| created_at | 2024-12-24 12:21:38.348241+00 |
| updated_at | 2025-02-25 18:33:32.409173+00 |
| description | Efficient header for audio packets |
| homepage | |
| repository | https://github.com/wavey-ai/frame-header |
| max_upload_size | |
| id | 1493841 |
| size | 123,415 |
A Rust library implementing a compact and efficient binary frame header format for audio and video data. The header format supports multiple encodings, sample rates, and channel configurations while maintaining a small footprint.
The header uses a 32-bit base format with optional 64-bit fields:
Base Header (32 bits):
[31-26] Magic Word (6 bits) = 0x2A
[25-24] Sample Rate (2 bits)
[23-22] Bits Per Sample (2 bits)
[21] PTS Present Flag (1 bit)
[20] ID Present Flag (1 bit)
[19-17] Encoding Flag (3 bits)
[16] Endianness (1 bit)
[15-12] Channels-1 (4 bits)
[11-0] Sample Size (12 bits)
Optional Fields:
- 64-bit ID (if ID flag set)
- 64-bit PTS (if PTS flag set)
use frame_header::{FrameHeader, EncodingFlag, Endianness};
let header = FrameHeader::new(
EncodingFlag::PCMSigned,
1024, // sample_size
48000, // sample_rate
2, // channels
24, // bits_per_sample
Endianness::LittleEndian,
Some(12345), // optional id
Some(67890), // optional pts
)?;
// Encode to bytes
let mut buffer = Vec::new();
header.encode(&mut buffer)?;
// Decode from bytes
let decoded = FrameHeader::decode(&mut &buffer[..])?;
// Patch individual fields
FrameHeader::patch_sample_size(&mut header_bytes, 2048)?;
FrameHeader::patch_encoding(&mut header_bytes, EncodingFlag::FLAC)?;
FrameHeader::patch_sample_rate(&mut header_bytes, 96000)?;
FrameHeader::patch_channels(&mut header_bytes, 4)?;
FrameHeader::patch_bits_per_sample(&mut header_bytes, 32)?;
FrameHeader::patch_id(&mut header_bytes, Some(0xDEADBEEF))?;
FrameHeader::patch_pts(&mut header_bytes, Some(0xCAFEBABE))?;
// Extract specific fields without full header parsing
let sample_count = FrameHeader::extract_sample_count(&header_bytes)?;
let encoding = FrameHeader::extract_encoding(&header_bytes)?;
let id = FrameHeader::extract_id(&header_bytes)?;
let pts = FrameHeader::extract_pts(&header_bytes)?;
The total header size varies based on the presence of optional fields:
The library performs extensive validation:
The library includes special handling for 64-bit IDs in WASM environments:
The library includes comprehensive tests covering:
MIT