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
//! FFV1 (FF Video Codec 1) lossless video codec.
//!
//! This module implements the FFV1 lossless video codec as specified in
//! RFC 9043 / ISO/IEC 24114. FFV1 is a patent-free, intra-frame-only
//! lossless video codec widely used for archival and professional workflows.
//!
//! # Features
//!
//! - Lossless compression (bit-perfect round-trip)
//! - YCbCr 4:2:0, 4:2:2, and 4:4:4 colorspaces
//! - 8-bit sample depth
//! - Range coder entropy coding (version 3)
//! - Per-slice CRC-32 error detection (version 3)
//! - Median prediction for spatial decorrelation
//!
//! # Architecture
//!
//! - [`Ffv1Encoder`] implements [`VideoEncoder`](crate::traits::VideoEncoder)
//! - [`Ffv1Decoder`] implements [`VideoDecoder`](crate::traits::VideoDecoder)
//! - Entropy coding: [`range_coder`] (v3) and [`golomb`] (v0/v1)
//! - Prediction: [`prediction`] (median predictor)
//! - Error detection: [`crc32`] (MPEG-2 CRC-32)
//!
//! # Example
//!
//! ```ignore
//! use oximedia_codec::ffv1::{Ffv1Encoder, Ffv1Decoder};
//! use oximedia_codec::traits::{VideoEncoder, VideoDecoder, EncoderConfig};
//!
//! // Encode
//! let config = EncoderConfig { /* ... */ };
//! let mut encoder = Ffv1Encoder::new(config)?;
//! encoder.send_frame(&frame)?;
//! let packet = encoder.receive_packet()?;
//!
//! // Decode
//! let extradata = encoder.extradata();
//! let mut decoder = Ffv1Decoder::with_extradata(&extradata)?;
//! decoder.send_packet(&packet?.data, 0)?;
//! let decoded_frame = decoder.receive_frame()?;
//! ```
// Public re-exports
pub use Ffv1Decoder;
pub use Ffv1Encoder;
pub use ;