oximedia-bitstream 0.1.7

Bitstream I/O for OxiMedia — derived from bitstream-io 4.9.0, std-only (no core2 dependency)
Documentation

oximedia-bitstream

Bit-level I/O for OxiMedia — a std-only fork of bitstream-io 4.9.0.

Part of the OxiMedia multimedia framework.

Version: 0.1.7 — 2026-05-16 — 2 tests

Features

  • Read and write individual bits and multi-bit integers from any std::io::Read / std::io::Write
  • Big-endian and little-endian streams, chosen at compile time as zero-cost type parameters
  • Constant-bit-count reads/writes validated at compile time (Rust 1.79+)
  • Variable-bit-count reads/writes via read_var / write_var
  • Huffman coding traits: [FromBits] and [ToBits] for encoding/decoding symbols
  • Struct-level serialisation via [FromBitStream] / [ToBitStream] derive targets
  • BitRecorder (feature alloc) for recording a write pass and replaying it
  • BitsWritten counter for measuring output size without a backing writer
  • No unsafe code (#![forbid(unsafe_code)])

Usage

[dependencies]
oximedia-bitstream = { version = "0.1.7" }

Reading bits

use std::io::Cursor;
use oximedia_bitstream::{BigEndian, BitReader, BitRead};

let data = [0b1011_0100u8, 0b1100_1010u8];
let mut r = BitReader::endian(Cursor::new(&data), BigEndian);

// Compile-time validated (requires Rust 1.79+)
let high: u8 = r.read::<4, _>().unwrap();
assert_eq!(high, 0b1011);

// Runtime variable width
let low: u8 = r.read_var(4).unwrap();
assert_eq!(low, 0b0100);

Writing bits

use oximedia_bitstream::{BigEndian, BitWriter, BitWrite};

let mut output = Vec::new();
let mut w = BitWriter::endian(&mut output, BigEndian);

w.write::<4, _>(0b1011u8).unwrap();
w.write::<4, _>(0b0100u8).unwrap();
w.byte_align().unwrap();

assert_eq!(output, [0b1011_0100]);

Little-endian streams

use std::io::Cursor;
use oximedia_bitstream::{LittleEndian, BitReader, BitRead};

let data = [0b1011_0100u8];
let mut r = BitReader::endian(Cursor::new(&data), LittleEndian);

// Bits are read LSB first in little-endian mode
let low: u8 = r.read::<4, _>().unwrap();
assert_eq!(low, 0b0100);

API Overview

Type Role
BitReader<R, E> Bit-level reader wrapping any io::Read
BitWriter<W, E> Bit-level writer wrapping any io::Write
ByteReader<R, E> Whole-byte reader wrapping any io::Read
ByteWriter<W, E> Whole-byte writer wrapping any io::Write
BitRecorder<N, E> Records bits for replay (requires alloc)
BitsWritten Counts bits without backing storage
BigEndian / LittleEndian Zero-sized endianness type parameters

Feature Flags

Flag Default Effect
std yes Enables the alloc feature
alloc via std Enables BitRecorder

Upstream Attribution

Derived from bitstream-io 4.9.0 by Brian Langenberger (Apache-2.0 / MIT). The OxiMedia fork removes the core2 / no_std shim and adopts workspace conventions (version, authors, lint configuration).

Status

Alpha — API may change between minor versions.

License

Apache-2.0 / MIT — Copyright 2017 Brian Langenberger; 2024-2026 COOLJAPAN OU (Team Kitasan)