use core::arch::x86_64::*;
#[allow(unused_imports)]
#[cfg(feature = "rgb")]
pub(super) use crate::row::arch::x86_common::{
abgr_to_rgb_16_pixels, abgr_to_rgba_4_pixels, argb_to_rgb_16_pixels, argb_to_rgba_4_pixels,
bgra_to_rgb_16_pixels, bgrx_to_rgba_4_pixels, drop_alpha_16_pixels, rgbx_to_rgba_4_pixels,
swap_rb_16_pixels, swap_rb_alpha_4_pixels, x2bgr10_to_rgb_16_pixels, x2bgr10_to_rgb_u16_8_pixels,
x2bgr10_to_rgba_16_pixels, x2rgb10_to_rgb_16_pixels, x2rgb10_to_rgb_u16_8_pixels,
x2rgb10_to_rgba_16_pixels, xbgr_to_rgba_4_pixels, xrgb_to_rgba_4_pixels,
};
#[allow(unused_imports)]
#[cfg(any(
feature = "yuv-444-packed",
feature = "rgb-legacy",
feature = "mono",
feature = "rgb",
feature = "yuv-packed",
feature = "gbr",
feature = "yuv-semi-planar",
feature = "yuv-planar",
feature = "y2xx",
feature = "xyz",
))]
pub(super) use crate::row::arch::x86_common::{write_rgb_16, write_rgba_16};
#[allow(unused_imports)]
#[cfg(any(
feature = "yuv-444-packed",
feature = "rgb-legacy",
feature = "mono",
feature = "rgb",
feature = "gbr",
feature = "yuv-planar",
feature = "yuv-semi-planar",
feature = "y2xx",
))]
pub(super) use crate::row::arch::x86_common::{write_rgb_u16_8, write_rgba_u16_8};
#[allow(unused_imports)]
pub(super) use crate::{
ColorMatrix,
row::{
arch::x86_common::{deinterleave_rgb_16, rgb_to_hsv_16_pixels, rgb_to_luma_16_pixels},
scalar,
},
};
#[cfg(any(feature = "gbr", feature = "yuv-444-packed", feature = "yuva"))]
mod alpha_extract;
#[cfg(feature = "yuv-444-packed")]
mod ayuv64;
pub(crate) mod endian;
#[cfg(feature = "gray")]
mod gray;
mod hsv;
#[cfg(feature = "rgb-legacy")]
pub(crate) mod legacy_rgb;
#[cfg(feature = "mono")]
pub(crate) mod mono1bit;
#[cfg(feature = "rgb")]
mod packed_rgb;
#[cfg(feature = "rgb")]
mod packed_rgb_16bit;
#[cfg(feature = "rgb-float")]
mod packed_rgb_float;
#[cfg(feature = "yuv-packed")]
mod packed_yuv_4_1_1;
#[cfg(feature = "yuv-packed")]
mod packed_yuv_8bit;
#[cfg(feature = "gbr")]
mod planar_gbr;
#[cfg(feature = "gbr")]
mod planar_gbr_float;
#[cfg(feature = "gbr")]
mod planar_gbr_high_bit;
#[cfg(feature = "yuv-semi-planar")]
mod semi_planar_8bit;
#[cfg(all(feature = "yuv-planar", feature = "yuv-semi-planar"))]
mod subsampled_high_bit_pn_4_2_0;
#[cfg(feature = "yuv-semi-planar")]
mod subsampled_high_bit_pn_4_4_4;
#[cfg(feature = "v210")]
mod v210;
#[cfg(feature = "yuv-444-packed")]
mod v30x;
#[cfg(feature = "yuv-444-packed")]
mod v410;
#[cfg(feature = "yuv-444-packed")]
mod vuya;
#[cfg(feature = "yuv-444-packed")]
mod xv36;
#[cfg(all(feature = "xyz", any(feature = "std", feature = "alloc")))]
pub(crate) mod xyz12;
#[cfg(feature = "y2xx")]
mod y216;
#[cfg(feature = "y2xx")]
mod y2xx;
#[cfg(any(
feature = "gray",
feature = "yuv-planar",
feature = "yuv-semi-planar",
feature = "yuva",
))]
mod y_plane_to_luma_u16;
#[cfg(feature = "yuv-planar")]
mod yuv_planar_16bit;
#[cfg(feature = "yuv-planar")]
mod yuv_planar_8bit;
#[cfg(feature = "yuv-planar")]
mod yuv_planar_high_bit;
#[cfg(any(feature = "gbr", feature = "yuv-444-packed", feature = "yuva"))]
pub(crate) use alpha_extract::*;
#[cfg(feature = "yuv-444-packed")]
pub(crate) use ayuv64::*;
#[cfg(feature = "gray")]
pub(crate) use gray::*;
pub(crate) use hsv::*;
#[cfg(feature = "rgb-legacy")]
#[allow(unused_imports)] pub(crate) use legacy_rgb::*;
#[cfg(feature = "mono")]
pub(crate) use mono1bit::*;
#[cfg(feature = "rgb")]
pub(crate) use packed_rgb::*;
#[cfg(feature = "rgb")]
#[allow(unused_imports)] pub(crate) use packed_rgb_16bit::*;
#[cfg(feature = "rgb-float")]
pub(crate) use packed_rgb_float::*;
#[cfg(feature = "yuv-packed")]
pub(crate) use packed_yuv_4_1_1::*;
#[cfg(feature = "yuv-packed")]
pub(crate) use packed_yuv_8bit::*;
#[cfg(feature = "gbr")]
pub(crate) use planar_gbr::*;
#[cfg(feature = "gbr")]
#[allow(unused_imports)] pub(crate) use planar_gbr_float::*;
#[cfg(feature = "gbr")]
#[allow(unused_imports)] pub(crate) use planar_gbr_high_bit::*;
#[cfg(feature = "yuv-semi-planar")]
pub(crate) use semi_planar_8bit::*;
#[cfg(all(feature = "yuv-planar", feature = "yuv-semi-planar"))]
pub(crate) use subsampled_high_bit_pn_4_2_0::*;
#[cfg(feature = "yuv-semi-planar")]
pub(crate) use subsampled_high_bit_pn_4_4_4::*;
#[cfg(feature = "yuv-444-packed")]
pub(crate) use v30x::*;
#[cfg(feature = "v210")]
pub(crate) use v210::*;
#[cfg(feature = "yuv-444-packed")]
pub(crate) use v410::*;
#[cfg(feature = "yuv-444-packed")]
pub(crate) use vuya::*;
#[cfg(feature = "yuv-444-packed")]
pub(crate) use xv36::*;
#[cfg(any(
feature = "gray",
feature = "yuv-planar",
feature = "yuv-semi-planar",
feature = "yuva",
))]
pub(crate) use y_plane_to_luma_u16::*;
#[cfg(feature = "y2xx")]
pub(crate) use y2xx::*;
#[cfg(feature = "y2xx")]
pub(crate) use y216::*;
#[cfg(feature = "yuv-planar")]
pub(crate) use yuv_planar_8bit::*;
#[cfg(feature = "yuv-planar")]
pub(crate) use yuv_planar_16bit::*;
#[cfg(feature = "yuv-planar")]
pub(crate) use yuv_planar_high_bit::*;
#[cfg(any(
feature = "yuv-planar",
feature = "yuv-semi-planar",
feature = "v210",
feature = "yuv-444-packed",
feature = "y2xx",
))]
#[inline(always)]
pub(super) fn clamp_u16_max(v: __m128i, zero_v: __m128i, max_v: __m128i) -> __m128i {
unsafe { _mm_min_epi16(_mm_max_epi16(v, zero_v), max_v) }
}
#[cfg(feature = "yuv-semi-planar")]
#[inline(always)]
pub(super) unsafe fn deinterleave_uv_u16(ptr: *const u16) -> (__m128i, __m128i) {
unsafe {
let split_mask = _mm_setr_epi8(0, 1, 4, 5, 8, 9, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15);
let chunk0 = _mm_loadu_si128(ptr.cast());
let chunk1 = _mm_loadu_si128(ptr.add(8).cast());
let s0 = _mm_shuffle_epi8(chunk0, split_mask);
let s1 = _mm_shuffle_epi8(chunk1, split_mask);
let u_vec = _mm_unpacklo_epi64(s0, s1);
let v_vec = _mm_unpackhi_epi64(s0, s1);
(u_vec, v_vec)
}
}
#[cfg(any(
feature = "yuv-444-packed",
feature = "yuv-packed",
feature = "yuv-semi-planar",
feature = "v210",
feature = "y2xx",
feature = "yuv-planar",
))]
#[inline(always)]
pub(super) fn q15_shift(v: __m128i) -> __m128i {
unsafe { _mm_srai_epi32::<15>(v) }
}
#[cfg(any(
feature = "yuv-444-packed",
feature = "yuv-packed",
feature = "yuv-semi-planar",
feature = "v210",
feature = "y2xx",
feature = "yuv-planar",
))]
#[inline(always)]
pub(super) fn chroma_i16x8(
cu: __m128i,
cv: __m128i,
u_d_lo: __m128i,
v_d_lo: __m128i,
u_d_hi: __m128i,
v_d_hi: __m128i,
rnd: __m128i,
) -> __m128i {
unsafe {
let lo = _mm_srai_epi32::<15>(_mm_add_epi32(
_mm_add_epi32(_mm_mullo_epi32(cu, u_d_lo), _mm_mullo_epi32(cv, v_d_lo)),
rnd,
));
let hi = _mm_srai_epi32::<15>(_mm_add_epi32(
_mm_add_epi32(_mm_mullo_epi32(cu, u_d_hi), _mm_mullo_epi32(cv, v_d_hi)),
rnd,
));
_mm_packs_epi32(lo, hi)
}
}
#[cfg(any(
feature = "yuv-444-packed",
feature = "yuv-packed",
feature = "yuv-semi-planar",
feature = "v210",
feature = "y2xx",
feature = "yuv-planar",
))]
#[inline(always)]
pub(super) fn scale_y(
y_i16: __m128i,
y_off_v: __m128i,
y_scale_v: __m128i,
rnd: __m128i,
) -> __m128i {
unsafe {
let shifted = _mm_sub_epi16(y_i16, y_off_v);
let lo_i32 = _mm_cvtepi16_epi32(shifted);
let hi_i32 = _mm_cvtepi16_epi32(_mm_srli_si128::<8>(shifted));
let lo_scaled = _mm_srai_epi32::<15>(_mm_add_epi32(_mm_mullo_epi32(lo_i32, y_scale_v), rnd));
let hi_scaled = _mm_srai_epi32::<15>(_mm_add_epi32(_mm_mullo_epi32(hi_i32, y_scale_v), rnd));
_mm_packs_epi32(lo_scaled, hi_scaled)
}
}
#[cfg(any(
feature = "yuv-444-packed",
feature = "yuv-planar",
feature = "yuv-semi-planar",
feature = "y2xx",
))]
#[inline(always)]
pub(super) fn scale_y_u16(
y_u16: __m128i,
y_off_v: __m128i,
y_scale_v: __m128i,
rnd_v: __m128i,
) -> __m128i {
unsafe {
let y_lo_i32 = _mm_sub_epi32(_mm_cvtepu16_epi32(y_u16), y_off_v);
let y_hi_u16 = _mm_srli_si128::<8>(y_u16);
let y_hi_i32 = _mm_sub_epi32(_mm_cvtepu16_epi32(y_hi_u16), y_off_v);
let lo = _mm_srai_epi32::<15>(_mm_add_epi32(_mm_mullo_epi32(y_lo_i32, y_scale_v), rnd_v));
let hi = _mm_srai_epi32::<15>(_mm_add_epi32(_mm_mullo_epi32(y_hi_i32, y_scale_v), rnd_v));
_mm_packs_epi32(lo, hi)
}
}
#[cfg(any(
feature = "yuv-444-packed",
feature = "yuv-semi-planar",
feature = "y2xx",
feature = "yuv-planar",
))]
#[inline(always)]
pub(super) fn srai64_15(x: __m128i) -> __m128i {
unsafe {
let biased = _mm_add_epi64(x, _mm_set1_epi64x(1i64 << 32));
let shifted = _mm_srli_epi64::<15>(biased);
_mm_sub_epi64(shifted, _mm_set1_epi64x(1i64 << 17))
}
}
#[cfg(any(
feature = "yuv-444-packed",
feature = "yuv-semi-planar",
feature = "y2xx",
feature = "yuv-planar",
))]
#[inline(always)]
pub(super) fn chroma_i64x2(
cu: __m128i,
cv: __m128i,
u_d: __m128i,
v_d: __m128i,
rnd_v: __m128i,
) -> __m128i {
unsafe {
srai64_15(_mm_add_epi64(
_mm_add_epi64(_mm_mul_epi32(cu, u_d), _mm_mul_epi32(cv, v_d)),
rnd_v,
))
}
}
#[cfg(any(
feature = "yuv-444-packed",
feature = "yuv-semi-planar",
feature = "y2xx",
feature = "yuv-planar",
))]
#[inline(always)]
pub(super) fn scale_y16_i64(y_minus_off: __m128i, y_scale_v: __m128i, rnd_v: __m128i) -> __m128i {
unsafe { srai64_15(_mm_add_epi64(_mm_mul_epi32(y_minus_off, y_scale_v), rnd_v)) }
}
#[cfg(all(test, feature = "std"))]
mod tests;