#![allow(
clippy::many_single_char_names,
clippy::similar_names,
clippy::cast_possible_truncation,
clippy::cast_sign_loss,
clippy::cast_possible_wrap,
clippy::too_many_arguments,
clippy::doc_markdown
)]
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
#[cfg(feature = "x86")]
pub use crate::color_convert::avx::{ycbcr_to_rgb_avx2, ycbcr_to_rgba_avx2, ycbcr_to_rgbx_avx2};
#[cfg(feature = "x86")]
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
pub use crate::color_convert::sse::{ycbcr_to_rgb_sse, ycbcr_to_rgb_sse_16, ycbcr_to_rgba_sse_16};
use crate::decoder::ColorConvert16Ptr;
mod avx;
mod scalar;
mod sse;
pub use scalar::{ycbcr_to_grayscale, ycbcr_to_ycbcr};
use crate::misc::ColorSpace;
pub fn choose_ycbcr_to_rgb_convert_func(
type_need: ColorSpace, use_unsafe: bool,
) -> Option<ColorConvert16Ptr>
{
if use_unsafe
{
#[cfg(feature = "x86")]
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
if is_x86_feature_detected!("avx2")
{
debug!("Using AVX optimised color conversion functions");
return match type_need
{
ColorSpace::RGB => Some(ycbcr_to_rgb_avx2),
ColorSpace::RGBA => Some(ycbcr_to_rgba_avx2),
ColorSpace::RGBX => Some(ycbcr_to_rgbx_avx2),
_ => None,
};
}
else if is_x86_feature_detected!("sse4.1")
{
debug!("No support for avx2 switching to sse");
debug!("Using sse color convert functions");
return match type_need
{
ColorSpace::RGB => Some(ycbcr_to_rgb_sse_16),
ColorSpace::RGBA | ColorSpace::RGBX => Some(ycbcr_to_rgba_sse_16),
_ => None,
};
}
}
}
return match type_need
{
ColorSpace::RGB => Some(scalar::ycbcr_to_rgb_16_scalar),
ColorSpace::RGBA | ColorSpace::RGBX => Some(scalar::ycbcr_to_rgba_16_scalar),
_ => None,
};
}