pub struct ContentLightLevel {
pub max_content_light_level: u16,
pub max_frame_average_light_level: u16,
}Expand description
HDR content light level metadata (CEA-861.3 / CTA-861-H).
Describes the peak brightness characteristics of HDR content. Used by AVIF, JXL, PNG (cLLi chunk), and video containers.
Fields§
§max_content_light_level: u16Maximum Content Light Level (MaxCLL) in cd/m² (nits). Peak luminance of any single pixel in the content.
max_frame_average_light_level: u16Maximum Frame-Average Light Level (MaxFALL) in cd/m². Peak average luminance of any single frame.
Implementations§
Source§impl ContentLightLevel
impl ContentLightLevel
Sourcepub const fn new(
max_content_light_level: u16,
max_frame_average_light_level: u16,
) -> ContentLightLevel
pub const fn new( max_content_light_level: u16, max_frame_average_light_level: u16, ) -> ContentLightLevel
Create content light level metadata.
Sourcepub fn measure(
px: PixelSlice<'_>,
white: DiffuseWhite,
) -> Option<ContentLightLevel>
pub fn measure( px: PixelSlice<'_>, white: DiffuseWhite, ) -> Option<ContentLightLevel>
Measure MaxCLL / MaxFALL (CTA-861.3-A) from relative-linear RGB(A) f32
pixels, with white anchoring the scale (sample 1.0 = white nits;
DiffuseWhite::BT2408 — 203 — is the convention).
Semantics per CTA-861.3-A as PNG 3rd ed §11.3.2.8 imports it for stills
(one still = one frame): MaxCLL is the brightest pixel’s
max(R, G, B) in cd/m², MaxFALL is the image’s average of per-pixel
max(R, G, B). Negative/NaN samples clamp to 0; an alpha lane is
ignored; strided rows are handled.
Returns None if the descriptor is not relative-linear
RgbF32/RgbaF32. This is deliberate, not a missing case: cd/m² is
only defined in linear light, so a transfer function would have to
be inverted first — and inverting one (PQ/HLG/sRGB → linear) is the
conversion pipeline’s job, which the foundational zenpixels crate has
no dependency on. To measure an integer or non-linear HDR buffer,
linearize it to RgbaF32 first (zenpixels_convert::convert_buffer),
then call this. Zero-area input yields Some(0, 0).
RgbF32 and RgbaF32 share one reduction (generic over the channel
count); the inner loop reads whole f32s from the channel-aligned buffer
so it vectorizes rather than decoding sample-by-sample.
Trait Implementations§
Source§impl Clone for ContentLightLevel
impl Clone for ContentLightLevel
Source§fn clone(&self) -> ContentLightLevel
fn clone(&self) -> ContentLightLevel
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for ContentLightLevel
Source§impl Debug for ContentLightLevel
impl Debug for ContentLightLevel
Source§impl Default for ContentLightLevel
impl Default for ContentLightLevel
Source§fn default() -> ContentLightLevel
fn default() -> ContentLightLevel
impl Eq for ContentLightLevel
Source§impl Hash for ContentLightLevel
impl Hash for ContentLightLevel
Source§impl PartialEq for ContentLightLevel
impl PartialEq for ContentLightLevel
Source§fn eq(&self, other: &ContentLightLevel) -> bool
fn eq(&self, other: &ContentLightLevel) -> bool
self and other values to be equal, and is used by ==.