Crate chd

source ·
Expand description

An implementation of the MAME CHD (Compressed Hunks of Data) format in pure Safe Rust, with support for CHD V1-5.

§Supported Compression Codecs

chd-rs supports the following compression codecs.

  • None
  • Zlib/Zlib+/Zlib V5
  • CDZL (CD Zlib)
  • CDLZ (CD LZMA)
  • CDFL (CD FLAC)
  • FLAC (Raw FLAC)
  • LZMA (Raw LZMA)
  • Huff (MAME Static Huffman)
  • AVHU (AV Huffman)
  • Zstandard
  • CDZS (CD Zstandard)

§Iterating over hunks

Because Hunk keeps a mutable reference to its owning Chd, direct iteration of hunks is not possible without Generic Associated Types. Instead, the hunk indices should be iterated over.

 use std::fs::File;
 use std::io::BufReader;
 use chd::Chd;

 let mut f = BufReader::new(File::open("file.chd")?);
 let mut chd = Chd::open(&mut f, None)?;
 let hunk_count = chd.header().hunk_count();
 let hunk_size = chd.header().hunk_size();

 // buffer to store uncompressed hunk data must be the same length as the hunk size.
 let mut hunk_buf = chd.get_hunksized_buffer();
 // buffer to store compressed data.
 let mut cmp_buf = Vec::new();

 for hunk_num in 0..hunk_count {
     let mut hunk = chd.hunk(hunk_num)?;
     hunk.read_hunk_in(&mut cmp_buf, &mut hunk_buf)?;
 }

§Iterating over metadata

Metadata in a CHD file consists of a list of entries that contain offsets to the byte data of the metadata contents in the CHD file. The individual metadata entries can be iterated directly, but a reference to the source stream has to be provided to read the data.

use std::fs::File;
use std::io::BufReader;
use chd::Chd;

let mut f = BufReader::new(File::open("file.chd")?);
let mut chd = Chd::open(&mut f, None)?;
let entries = chd.metadata_refs()?;
for entry in entries {
    let metadata = entry.read(&mut f)?;
}

Vec<Metadata> implements TryFrom<MetadataRefs> so all metadata entries can be collected at once without requiring a reference to the file.

use std::fs::File;
use std::io::BufReader;
use chd::Chd;
use chd::metadata::Metadata;

let mut f = BufReader::new(File::open("file.chd")?);
// chd takes ownership of f here
let mut chd = Chd::open(f, None)?;

let metadatas: Vec<Metadata> = chd.metadata_refs()?.try_into()?;

Modules§

  • codecscodec_api
    Implementations of decompression codecs used in MAME CHD.
  • Types and methods relating to header data for a CHD file.
  • huffmanhuffman_api
    Implementation of the MAME CHD Huffman Decoder.
  • iterunstable_lending_iterators
    Traits and implementations for lending iterators for hunks and metadata. These APIs should be considered unstable and will be replaced with APIs based around GATs and LendingIterator once stabilized. See rust#44265 for the tracking issue on GAT stabilization.
  • Types and methods relating to the CHD hunk map.
  • Types and methods relating to metadata stored in a CHD file.
  • Helpers and adapters for reading CHD files and hunks.

Structs§

  • A CHD (MAME Compressed Hunks of Data) file.
  • A reference to a compressed Hunk in a CHD file.

Enums§

  • Error types that may occur when reading a CHD file or hunk.

Type Aliases§