1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
//! 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) with `source format` bit (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 [`bch`] module
//! wraps / unwraps the outer FEC multiframe layer (alignment pattern,
//! `Fi` bit, BCH parity computation and per-frame syndrome check), and
//! implements the spec-mandated `t = 1` single-bit error correction
//! via [`bch::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
//! [`hrd`] module 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 [`rtp`] module 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.
//! The `RtpPacketizer` glue 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
//! hand `pack_frame` output straight to UDP / DTLS / SRTP.
//! * RTCP report packets (RFC 3550 §6.4): the [`rtcp`] module builds and
//! parses Sender Report (SR, PT=200) and Receiver Report (RR, PT=201)
//! packets — the control-channel companions to the [`rtp`] data path.
//! `RtpPacketizer` tracks 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
//! [`rtcp`] module 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 [`sdp`] module
//! maps the `video/H261` media type and its three optional parameters
//! (`CIF`, `QCIF`, `D`) to the SDP `a=rtpmap` / `a=fmtp` attribute 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_d`] module
//! exposes the [`annex_d::SubImageIndex`] mapping to / from the 5-bit `TR`
//! field, 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's
//! `t = (d − 1) / 2 = 1` correction capability is the upper bound;
//! weight-2 or denser error patterns are flagged
//! (`uncorrectable_frames` in [`bch::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`.
use ;
use ;
/// The canonical oxideav codec id for ITU-T H.261 video.
///
/// AVI FourCC `H261` maps to this id; raw `.h261` elementary-stream files
/// probe to it as well.
pub const CODEC_ID_STR: &str = "h261";
/// Register the H.261 decoder and encoder with a codec registry.
/// Unified registration entry point: install the H.261 codec factories
/// into the codec sub-registry of a [`RuntimeContext`].
///
/// This is the preferred entry point for new code — it matches the
/// convention every sibling crate now follows. Direct callers that need
/// only the codec sub-registry can keep using [`register_codecs`].
///
/// Also wired into [`oxideav_meta::register_all`] via the
/// [`oxideav_core::register!`] macro below.
register!;