Skip to main content

ContentLightLevel

Struct ContentLightLevel 

Source
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: u16

Maximum Content Light Level (MaxCLL) in cd/m² (nits). Peak luminance of any single pixel in the content.

§max_frame_average_light_level: u16

Maximum Frame-Average Light Level (MaxFALL) in cd/m². Peak average luminance of any single frame.

Implementations§

Source§

impl ContentLightLevel

Source

pub const fn new( max_content_light_level: u16, max_frame_average_light_level: u16, ) -> ContentLightLevel

Create content light level metadata.

Source

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

Source§

fn clone(&self) -> ContentLightLevel

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for ContentLightLevel

Source§

impl Debug for ContentLightLevel

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Default for ContentLightLevel

Source§

fn default() -> ContentLightLevel

Returns the “default value” for a type. Read more
Source§

impl Eq for ContentLightLevel

Source§

impl Hash for ContentLightLevel

Source§

fn hash<__H>(&self, state: &mut __H)
where __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ContentLightLevel

Source§

fn eq(&self, other: &ContentLightLevel) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for ContentLightLevel

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.