Skip to main content

piaf/
lib.rs

1//! PIAF — a Rust library for reading and interpreting EDID display capability data.
2//!
3//! The core pipeline is:
4//!
5//! 1. [`parse_edid`] — validate and decode raw bytes into [`ParsedEdidRef`] (zero-copy).
6//! 2. [`capabilities_from_edid`] — run extension handlers to produce [`DisplayCapabilities`].
7//!
8//! # Decoding philosophy
9//!
10//! PIAF decodes everything a specification defines. No field is omitted because it appears
11//! obscure or unlikely to be needed — that judgement belongs to the consumer. [`Option`]
12//! fields communicate presence or absence in the source data, not relative importance.
13//!
14//! # Quick start
15//!
16//! ```no_run
17//! use piaf::{parse_edid, capabilities_from_edid, ExtensionLibrary};
18//!
19//! let bytes = std::fs::read("/sys/class/drm/card0-HDMI-A-1/edid").unwrap();
20//! let library = ExtensionLibrary::with_standard_handlers();
21//! let parsed = parse_edid(&bytes, &library).unwrap();
22//! let caps = capabilities_from_edid(&parsed, &library);
23//! println!("{:?}", caps.display_name);
24//! ```
25#![cfg_attr(not(feature = "std"), no_std)]
26#![forbid(unsafe_code)]
27// In a bare no_std build (no alloc, no std) the handler layer is absent, so the
28// pub(crate) decode functions on model types appear unused. They are intentionally
29// kept available for consumers who want to call them directly without the handler
30// pipeline, so we suppress the warning rather than gating the items away.
31#![cfg_attr(
32    not(any(feature = "alloc", feature = "std")),
33    allow(dead_code, unused_imports)
34)]
35
36#[cfg(all(feature = "alloc", not(feature = "std")))]
37extern crate alloc;
38
39/// Types for the EDID data model.
40pub mod model;
41#[cfg(any(feature = "alloc", feature = "std"))]
42pub use model::ExtensionData;
43#[cfg(any(feature = "alloc", feature = "std"))]
44pub use model::ExtensionHandler;
45#[cfg(any(feature = "alloc", feature = "std"))]
46pub use model::ParseWarning;
47pub use model::{
48    AnalogColorType, AnalogSyncLevel, BacklightType, Chromaticity, ChromaticityPoint,
49    ColorBitDepth, ColorManagementData, CustomColorSpaceEotfCombo, CvtAlgorithm, CvtAspectRatio,
50    CvtAspectRatios, CvtScaling, CvtSupportParams, DcmChannel, DigitalColorEncoding,
51    DisplayCapabilities, DisplayFeatureFlags, DisplayGamma, DisplayIdInterface,
52    DisplayIdStereoInterface, DisplayIdStereoInterfaceV2, DisplayIdTiledTopology,
53    DisplayInterfaceFeatures, DisplayInterfaceType, DisplayTechnology, EdidError, EdidSource,
54    EdidVersion, EdidWarning, ExtensionLibrary, ExtensionMetadata, ExtensionTagRegistry,
55    GtfSecondaryParams, InterfaceContentProtection, KnownExtensions, ManufactureDate,
56    ManufacturerId, ModeSink, MonitorString, OperatingMode, ParsedEdid, ParsedEdidRef,
57    PhysicalOrientation, PowerSequencing, RefreshRate, RotationCapability, ScanDirection,
58    ScreenSize, StaticContext, StaticDisplayCapabilities, StaticExtensionHandler, StereoMode,
59    StereoSyncInterface, StereoTimingCode, StereoTimingCodeType, StereoTimingScopeV2,
60    StereoViewingMode, SubpixelLayout, SyncDefinition, TileBezelInfo, TileTopologyBehavior,
61    TimingFormula, TransferPointEncoding, TypeIxStereoMode, VideoInputFlags, VideoInterface,
62    VideoMode, WhitePoint, ZeroPixelLocation,
63};
64#[cfg(any(feature = "alloc", feature = "std"))]
65pub use model::{DisplayIdTransferCharacteristic, TransferCurve};
66
67/// EDID byte-level parser.
68pub mod parser;
69pub use parser::{parse_edid, parse_edid_owned};
70
71/// Capability extraction from a [`ParsedEdid`].
72pub mod capabilities;
73pub use capabilities::Cea861Flags;
74#[cfg(any(feature = "alloc", feature = "std"))]
75pub use capabilities::DisplayIdCapabilities;
76pub use capabilities::capabilities_from_edid;
77pub use capabilities::capabilities_from_edid_static;
78#[cfg(any(feature = "alloc", feature = "std"))]
79pub use capabilities::{
80    AudioFormat, AudioFormatInfo, AudioSampleRates, Cea861Capabilities, ColorimetryBlock,
81    ColorimetryFlags, DtcPointEncoding, HdmiAudioBlock, HdmiDscMaxSlices, HdmiForumDsc,
82    HdmiForumFrl, HdmiForumSinkCap, HdmiVsdb, HdmiVsdbFlags, HdrDynamicMetadataDescriptor, HdrEotf,
83    HdrStaticMetadata, InfoFrameDescriptor, RoomConfigurationBlock, ShortAudioDescriptor,
84    SpeakerAllocation, SpeakerAllocationFlags, SpeakerAllocationFlags2, SpeakerAllocationFlags3,
85    SpeakerLocationEntry, T7VtdbBlock, T8VtdbBlock, T10VtdbBlock, T10VtdbEntry,
86    VendorSpecificBlock, VesaDisplayDeviceBlock, VesaTransferCharacteristic, VideoCapability,
87    VideoCapabilityFlags, VtbExtBlock, infoframe_type,
88};
89pub use capabilities::{
90    CEA861_HANDLER, Cea861Handler, DISPLAYID_HANDLER, DisplayIdHandler, STANDARD_HANDLERS,
91};