Skip to content

Commit 90bb4a3

Browse files
authored
enum Rav1dColorRange: make Rav1dSequenceHeader::color_range Rav1dColorRange instead of u8 (#1480)
For use by #1439.
2 parents 9d78516 + 2bd105b commit 90bb4a3

2 files changed

Lines changed: 51 additions & 19 deletions

File tree

src/include/dav1d/headers.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,36 @@ impl TryFrom<Dav1dChromaSamplePosition> for Rav1dChromaSamplePosition {
762762
}
763763
}
764764

765+
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
766+
pub enum Rav1dColorRange {
767+
Limited,
768+
Full,
769+
}
770+
771+
impl Rav1dColorRange {
772+
pub const fn is_full(&self) -> bool {
773+
matches!(self, Self::Full)
774+
}
775+
776+
pub const fn to_dav1d(&self) -> u8 {
777+
self.is_full() as u8
778+
}
779+
}
780+
781+
impl Rav1dColorRange {
782+
pub const fn from_is_full(is_full: bool) -> Self {
783+
if is_full {
784+
Self::Full
785+
} else {
786+
Self::Limited
787+
}
788+
}
789+
790+
pub const fn from_dav1d(value: u8) -> Self {
791+
Self::from_is_full(value != 0)
792+
}
793+
}
794+
765795
#[repr(C)]
766796
pub struct Rav1dContentLightLevel {
767797
/// Maximum content light level (MaxCLL) in candela per square metre.
@@ -1052,7 +1082,7 @@ pub struct Rav1dSequenceHeader {
10521082
pub mtrx: Rav1dMatrixCoefficients,
10531083
pub chr: Rav1dChromaSamplePosition,
10541084
pub hbd: u8,
1055-
pub color_range: u8,
1085+
pub color_range: Rav1dColorRange,
10561086
pub num_operating_points: u8,
10571087
pub operating_points: [Rav1dSequenceHeaderOperatingPoint; RAV1D_MAX_OPERATING_POINTS],
10581088
pub still_picture: u8,
@@ -1286,7 +1316,7 @@ impl From<Dav1dSequenceHeader> for Rav1dSequenceHeader {
12861316
mtrx: mtrx.try_into().unwrap(),
12871317
chr: chr.try_into().unwrap(),
12881318
hbd,
1289-
color_range,
1319+
color_range: Rav1dColorRange::from_dav1d(color_range),
12901320
num_operating_points,
12911321
operating_points: operating_points.map(|c| c.into()),
12921322
still_picture,
@@ -1401,7 +1431,7 @@ impl From<Rav1dSequenceHeader> for Dav1dSequenceHeader {
14011431
mtrx: mtrx.into(),
14021432
chr: chr.into(),
14031433
hbd,
1404-
color_range,
1434+
color_range: color_range.to_dav1d(),
14051435
num_operating_points,
14061436
operating_points: operating_points.map(|rust| rust.into()),
14071437
still_picture,

src/obu.rs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@ use crate::include::dav1d::data::Rav1dData;
1616
use crate::include::dav1d::dav1d::Rav1dDecodeFrameType;
1717
use crate::include::dav1d::headers::{
1818
DRav1d, Dav1dSequenceHeader, Rav1dAdaptiveBoolean, Rav1dChromaSamplePosition,
19-
Rav1dColorPrimaries, Rav1dContentLightLevel, Rav1dFilmGrainData, Rav1dFilterMode,
20-
Rav1dFrameHeader, Rav1dFrameHeaderCdef, Rav1dFrameHeaderDelta, Rav1dFrameHeaderDeltaLF,
21-
Rav1dFrameHeaderDeltaQ, Rav1dFrameHeaderFilmGrain, Rav1dFrameHeaderLoopFilter,
22-
Rav1dFrameHeaderOperatingPoint, Rav1dFrameHeaderQuant, Rav1dFrameHeaderRestoration,
23-
Rav1dFrameHeaderSegmentation, Rav1dFrameHeaderSuperRes, Rav1dFrameHeaderTiling, Rav1dFrameSize,
24-
Rav1dFrameSkipMode, Rav1dFrameType, Rav1dITUTT35, Rav1dLoopfilterModeRefDeltas,
25-
Rav1dMasteringDisplay, Rav1dMatrixCoefficients, Rav1dObuType, Rav1dPixelLayout, Rav1dProfile,
26-
Rav1dRestorationType, Rav1dSegmentationData, Rav1dSegmentationDataSet, Rav1dSequenceHeader,
27-
Rav1dSequenceHeaderOperatingParameterInfo, Rav1dSequenceHeaderOperatingPoint,
28-
Rav1dTransferCharacteristics, Rav1dTxfmMode, Rav1dWarpedMotionParams, Rav1dWarpedMotionType,
29-
RAV1D_MAX_CDEF_STRENGTHS, RAV1D_MAX_OPERATING_POINTS, RAV1D_MAX_TILE_COLS, RAV1D_MAX_TILE_ROWS,
30-
RAV1D_PRIMARY_REF_NONE, RAV1D_REFS_PER_FRAME,
19+
Rav1dColorPrimaries, Rav1dColorRange, Rav1dContentLightLevel, Rav1dFilmGrainData,
20+
Rav1dFilterMode, Rav1dFrameHeader, Rav1dFrameHeaderCdef, Rav1dFrameHeaderDelta,
21+
Rav1dFrameHeaderDeltaLF, Rav1dFrameHeaderDeltaQ, Rav1dFrameHeaderFilmGrain,
22+
Rav1dFrameHeaderLoopFilter, Rav1dFrameHeaderOperatingPoint, Rav1dFrameHeaderQuant,
23+
Rav1dFrameHeaderRestoration, Rav1dFrameHeaderSegmentation, Rav1dFrameHeaderSuperRes,
24+
Rav1dFrameHeaderTiling, Rav1dFrameSize, Rav1dFrameSkipMode, Rav1dFrameType, Rav1dITUTT35,
25+
Rav1dLoopfilterModeRefDeltas, Rav1dMasteringDisplay, Rav1dMatrixCoefficients, Rav1dObuType,
26+
Rav1dPixelLayout, Rav1dProfile, Rav1dRestorationType, Rav1dSegmentationData,
27+
Rav1dSegmentationDataSet, Rav1dSequenceHeader, Rav1dSequenceHeaderOperatingParameterInfo,
28+
Rav1dSequenceHeaderOperatingPoint, Rav1dTransferCharacteristics, Rav1dTxfmMode,
29+
Rav1dWarpedMotionParams, Rav1dWarpedMotionType, RAV1D_MAX_CDEF_STRENGTHS,
30+
RAV1D_MAX_OPERATING_POINTS, RAV1D_MAX_TILE_COLS, RAV1D_MAX_TILE_ROWS, RAV1D_PRIMARY_REF_NONE,
31+
RAV1D_REFS_PER_FRAME,
3132
};
3233
use crate::internal::{Rav1dContext, Rav1dState, Rav1dTileGroup, Rav1dTileGroupHeader};
3334
use crate::levels::ObuMetaType;
@@ -363,13 +364,13 @@ fn parse_seq_hdr(
363364
trc = Default::default();
364365
mtrx = Default::default();
365366
}
366-
let color_range;
367+
let full_color_range;
367368
let layout;
368369
let ss_ver;
369370
let ss_hor;
370371
let chr;
371372
if monochrome != 0 {
372-
color_range = gb.get_bit() as u8;
373+
full_color_range = gb.get_bit();
373374
layout = Rav1dPixelLayout::I400;
374375
ss_ver = 1;
375376
ss_hor = ss_ver;
@@ -379,7 +380,7 @@ fn parse_seq_hdr(
379380
&& mtrx == Rav1dMatrixCoefficients::Identity
380381
{
381382
layout = Rav1dPixelLayout::I444;
382-
color_range = 1;
383+
full_color_range = true;
383384
if profile != Rav1dProfile::High && !(profile == Rav1dProfile::Professional && hbd == 2) {
384385
return Err(Rav1dError::InvalidArgument);
385386
}
@@ -389,7 +390,7 @@ fn parse_seq_hdr(
389390
ss_ver = Default::default();
390391
chr = Rav1dChromaSamplePosition::Unknown;
391392
} else {
392-
color_range = gb.get_bit() as u8;
393+
full_color_range = gb.get_bit();
393394
match profile {
394395
Rav1dProfile::Main => {
395396
layout = Rav1dPixelLayout::I420;
@@ -435,6 +436,7 @@ fn parse_seq_hdr(
435436
Rav1dChromaSamplePosition::Unknown
436437
};
437438
}
439+
let color_range = Rav1dColorRange::from_is_full(full_color_range);
438440
if strict_std_compliance
439441
&& mtrx == Rav1dMatrixCoefficients::Identity
440442
&& layout != Rav1dPixelLayout::I444

0 commit comments

Comments
 (0)