Expand description
Pure-Rust ITU-T H.261 video codec (decoder + encoder).
Scope (ITU-T Rec. H.261 03/93):
- Picture header — PSC (20 bits:
0000 0000 0000 0001 0000), TR (5), PTYPE (6) withsource formatbit (0 = QCIF, 1 = CIF), PEI/PSPARE loop. - GOB header — GBSC (16 bits), GN (4), GQUANT (5), GEI/GSPARE loop.
- Macroblock layer — MBA VLC (Table 1), MTYPE VLC (Table 2), MQUANT (5), MVD VLC (Table 3), CBP VLC (Table 4).
- Block layer — TCOEFF VLC (Table 5) + EOB + 20-bit
(escape | run | level)escape, zigzag scan per Figure 12, dequantisation per §4.2.4, 8x8 IDCT, INTRA DC as 8-bit FLC per Table 6. - INTRA / INTER / INTER+MC / INTER+MC+FIL macroblock types.
- Integer-pel motion compensation (range +-15 pels). Chroma MVs are the luma MV halved then truncated toward zero (§3.2.2).
- Loop filter (FIL bit of MTYPE) — separable 1/4, 1/2, 1/4 filter, §3.2.3.
- Output is YUV 4:2:0 in an
oxideav_core::VideoFrame. Two picture sizes: QCIF 176x144 and CIF 352x288. - Encoder: I + P pictures, integer-pel MC (spiral+diamond ME), per-GOB MQUANT rate control, FIL loop-filter RDO, full §4.2.3.4 MV-pred.
- BCH (511,493) error-correction framing (§5.4): the
bchmodule wraps / unwraps the outer FEC multiframe layer (alignment pattern,Fibit, BCH parity computation and per-frame syndrome check), and implements the spec-mandatedt = 1single-bit error correction viabch::locate_single_error/bch::decode_multiframe_with_correction. Sweep-tested across all 511 protected bit positions per frame. - Hypothetical Reference Decoder buffer model (§5.2 + Annex B): the
hrdmodule exposes the per-picture bit cap (256 kbits CIF / 64 kbits QCIF) and the HRD buffer-occupancy walk used to verify a coded sequence won’t underflow a conforming decoder’s receiving buffer at a given channel rate. - RTP payload-format wrapping (RFC 4587): the
rtpmodule packs an elementary stream into a sequence of GOB-aligned H.261 RTP payloads (4-byte header + bitstream slice) and unpacks them back, plus the §4.2 RECOMMENDED MB-level fragmentation (packetize_mb_fragmented) that parses the Huffman layer to split oversize GOBs on macroblock boundaries with the full §4.1 GOBN/MBAP/QUANT/HMVD/VMVD context. TheRtpPacketizerglue wraps each payload in a full RFC 3550 §5.1 RTP fixed header (V/P/X/CC/M/PT/seq/timestamp/SSRC) so callers can handpack_frameoutput straight to UDP / DTLS / SRTP. - RTCP report packets (RFC 3550 §6.4): the
rtcpmodule builds and parses Sender Report (SR, PT=200) and Receiver Report (RR, PT=201) packets — the control-channel companions to thertpdata path.RtpPacketizertracks the sender’s running packet / octet counts so a conformant SR can be emitted directly from its session state. - RTCP SDES / BYE / APP packets (RFC 3550 §6.5 / §6.6 / §6.7): the
rtcpmodule also builds and parses Source Description (SDES, PT=202), Goodbye (BYE, PT=203), and Application-Defined (APP, PT=204) packets, plus compound-packet (§6.1) concatenation and walking. APP carries a 4-byte ASCII name + 32-bit-aligned application-dependent data for application-layer extensions that do not warrant their own IANA-registered packet type. - SDP media-type signalling (RFC 4587 §6.1.1 / §6.2): the
sdpmodule maps thevideo/H261media type and its three optional parameters (CIF,QCIF,D) to the SDPa=rtpmap/a=fmtpattribute lines, with the §6.2.1 offer/answer helpers (per-format MPI frame-rate bound, the “at least one picture size” invariant, the RFC-2032 QCIF fallback). - Annex D still-image transmission (§D.2 + §D.3): the
annex_dmodule exposes theannex_d::SubImageIndexmapping to / from the 5-bitTRfield, the still-image dimensions (4× the currently transmitted video format), and the Figure D.1 2:1 × 2:1 sub-sample / reassemble transform between a full-resolution still image and its four sub-images.
Out of scope:
- Multi-bit (weight ≥ 2) BCH (511,493) error correction. The
generator polynomial has minimum distance
d = 3, so the spec’st = (d − 1) / 2 = 1correction capability is the upper bound; weight-2 or denser error patterns are flagged (uncorrectable_framesinbch::DecodedMultiframe) but cannot be uniquely resolved by this code on its own — the inner H.261 video VLC layer handles those via GOB resync.
No runtime dependencies beyond oxideav-core, oxideav-codec, and
oxideav-pixfmt.
Modules§
- annex_d
- H.261 Annex D — Still image transmission.
- bch
- H.261 §5.4 — BCH (511, 493) forward error-correction framing.
- block
- H.261 block-layer decoding — §4.2.4 of ITU-T Rec. H.261.
- decoder
- H.261 decoder front-end — walks start codes, dispatches picture / GOB / MB parsing.
- encoder
- H.261 encoder — Baseline (I + P pictures, integer-pel MC, FIL loop filter).
- fdct
- Forward 8x8 DCT for H.261 (inverse of
idct.rs). - gob
- H.261 GOB layer parser — §4.2.2 of ITU-T Rec. H.261.
- hrd
- H.261 §5.2 + Annex B — Hypothetical Reference Decoder (HRD) buffer model.
- idct
- 8x8 IDCT for H.261 (Annex A of ITU-T Rec. H.261).
- mb
- H.261 macroblock-layer decoding — §4.2.3 of ITU-T Rec. H.261.
- picture
- H.261 picture header parser — §4.2.1 of ITU-T Rec. H.261 (03/93).
- quant
- Forward quantisation for H.261 (inverse of the dequantisation in
block::dequant_ac). - rtcp
- RTCP control-channel packets — RFC 3550 §6.
- rtp
- H.261 RTP payload-format packing and unpacking — RFC 4587.
- sdp
- H.261 SDP media-type and
fmtp/rtpmapparameter mapping — RFC 4587 §6.1.1 and §6.2. - start_
code - Start-code scanning for H.261.
- tables
- VLC tables from ITU-T Rec. H.261 §4.2 (transcribed directly from the PDF).
Constants§
- CODEC_
ID_ STR - The canonical oxideav codec id for ITU-T H.261 video.
Functions§
- register
- Unified registration entry point: install the H.261 codec factories
into the codec sub-registry of a
RuntimeContext. - register_
codecs - Register the H.261 decoder and encoder with a codec registry.