use ::quickcheck::{Arbitrary, Gen};
macro_rules! arb_via_code {
($($fn:ident => $ty:path),* $(,)?) => { $(
#[inline]
pub(crate) fn $fn(g: &mut Gen) -> $ty {
<$ty>::from_u32(u32::arbitrary(g))
}
)* };
}
macro_rules! qc_via_named_variants {
($($fn:ident => $ty:path, [$($variant:ident),+ $(,)?]);* $(;)?) => { $(
#[inline]
pub(crate) fn $fn(g: &mut Gen) -> $ty {
const NAMED: &[$ty] = &[$(<$ty>::$variant),+];
*g.choose(NAMED).expect("non-empty NAMED slice")
}
)* };
}
arb_via_code! {
track_disposition => crate::disposition::TrackDisposition,
}
qc_open_string_enum!(
matrix,
crate::color::Matrix,
[
"bt709",
"bt601",
"bt470bg",
"smpte170m",
"bt2020nc",
"unspecified"
]
);
qc_open_string_enum!(
primaries,
crate::color::Primaries,
[
"bt709",
"bt470bg",
"smpte170m",
"bt2020",
"smpte431",
"unspecified"
]
);
qc_open_string_enum!(
transfer,
crate::color::Transfer,
[
"bt709",
"smpte170m",
"iec61966-2-1",
"smpte2084",
"arib-std-b67",
"unspecified"
]
);
qc_open_string_enum!(
dynamic_range,
crate::color::DynamicRange,
["tv", "pc", "unspecified"]
);
qc_open_string_enum!(
chroma_location,
crate::color::ChromaLocation,
[
"left",
"center",
"topleft",
"top",
"bottomleft",
"unspecified"
]
);
qc_open_string_enum!(
dcp_target_gamut,
crate::color::DcpTargetGamut,
["dci-p3", "rec709", "rec2020"]
);
qc_open_string_enum!(
pixel_format,
crate::pixel_format::PixelFormat,
["yuv420p", "yuv422p10le", "nv12", "rgb24", "rgba", "p010le"]
);
qc_open_string_enum!(rotation, crate::frame::Rotation, ["0", "90", "180", "270"]);
qc_open_string_enum!(
field_order,
crate::frame::FieldOrder,
["unknown", "progressive", "tt", "bb", "tb", "bt"]
);
qc_open_string_enum!(
stereo_mode,
crate::frame::StereoMode,
[
"mono",
"side-by-side",
"top-bottom",
"frame-sequence",
"checkerboard",
"lines"
]
);
qc_via_named_variants! {
bit_rate_mode => crate::audio::BitRateMode, [Cbr, Vbr, Abr];
channel_order => crate::audio::ChannelOrder, [Unspecified, Native, Custom, Ambisonic];
}
#[inline]
pub(crate) fn info(g: &mut Gen) -> crate::color::Info {
crate::color::Info::new(
primaries(g),
transfer(g),
matrix(g),
dynamic_range(g),
chroma_location(g),
)
}
#[inline]
pub(crate) fn content_light_level(g: &mut Gen) -> crate::color::ContentLightLevel {
crate::color::ContentLightLevel::new(u32::arbitrary(g), u32::arbitrary(g))
}
#[inline]
pub(crate) fn chroma_coord(g: &mut Gen) -> crate::color::ChromaCoord {
crate::color::ChromaCoord::new(u32::arbitrary(g), u32::arbitrary(g))
}
#[inline]
pub(crate) fn mastering_display(g: &mut Gen) -> crate::color::MasteringDisplay {
let primaries = [chroma_coord(g), chroma_coord(g), chroma_coord(g)];
let white_point = chroma_coord(g);
crate::color::MasteringDisplay::new(primaries, white_point, u32::arbitrary(g), u32::arbitrary(g))
}
#[inline]
pub(crate) fn hdr_static_metadata(g: &mut Gen) -> crate::color::HdrStaticMetadata {
let md = if bool::arbitrary(g) {
Some(mastering_display(g))
} else {
None
};
let cll = if bool::arbitrary(g) {
Some(content_light_level(g))
} else {
None
};
crate::color::HdrStaticMetadata::new(md, cll)
}
#[inline]
pub(crate) fn dolby_vision_config(g: &mut Gen) -> crate::color::DolbyVisionConfig {
crate::color::DolbyVisionConfig::new(
u8::arbitrary(g),
u8::arbitrary(g),
bool::arbitrary(g),
bool::arbitrary(g),
u8::arbitrary(g),
)
}
#[inline]
pub(crate) fn dimensions(g: &mut Gen) -> crate::frame::Dimensions {
crate::frame::Dimensions::new(u32::arbitrary(g), u32::arbitrary(g))
}
#[inline]
pub(crate) fn rect(g: &mut Gen) -> crate::frame::Rect {
crate::frame::Rect::new(
u32::arbitrary(g),
u32::arbitrary(g),
u32::arbitrary(g),
u32::arbitrary(g),
)
}
#[inline]
fn parts(g: &mut Gen) -> (i64, ::core::num::NonZeroI64) {
#[allow(clippy::cast_possible_wrap)] let num = (u64::arbitrary(g) >> 1) as i64;
#[allow(clippy::cast_possible_wrap)]
let den = ((u64::arbitrary(g) >> 1) as i64).max(1);
let den = ::core::num::NonZeroI64::new(den).unwrap_or(crate::frame::DEN_ONE);
(num, den)
}
#[inline]
pub(crate) fn rational(g: &mut Gen) -> crate::frame::Rational {
let (num, den) = parts(g);
crate::frame::Rational::new(num, den)
}
#[inline]
pub(crate) fn sample_aspect_ratio(g: &mut Gen) -> crate::frame::SampleAspectRatio {
let (num, den) = parts(g);
crate::frame::SampleAspectRatio::new(num, den)
}
#[inline]
pub(crate) fn frame_rate(g: &mut Gen) -> crate::frame::FrameRate {
crate::frame::FrameRate::new(rational(g), bool::arbitrary(g))
}
#[cfg(feature = "bayer")]
qc_via_named_variants! {
bayer_pattern => crate::frame::BayerPattern, [Rggb, Bggr, Grbg, Gbrg];
bayer_demosaic => crate::frame::BayerDemosaic, [Bilinear];
wb_channel => crate::frame::WbChannel, [R, G, B];
}
#[cfg(feature = "bayer")]
pub(crate) fn white_balance(g: &mut Gen) -> crate::frame::WhiteBalance {
let gain = |g: &mut Gen| (u32::arbitrary(g) % 8_001) as f32 / 1_000.0;
let (r, gr, b) = (gain(g), gain(g), gain(g));
crate::frame::WhiteBalance::try_new(r, gr, b).expect("gains are finite and non-negative")
}
#[cfg(feature = "bayer")]
pub(crate) fn color_correction_matrix(g: &mut Gen) -> crate::frame::ColorCorrectionMatrix {
let mut m = [[0.0f32; 3]; 3];
for row in &mut m {
for cell in row {
*cell = (i32::arbitrary(g).rem_euclid(16_001) - 8_000) as f32 / 1_000.0;
}
}
crate::frame::ColorCorrectionMatrix::try_new(m).expect("coefficients are finite and bounded")
}