1#![allow(unsafe_code)]
2
3mod neon;
4mod ssse3;
5mod wasm;
6
7#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
8use std::is_x86_feature_detected;
9
10/// Arch-specific implementation of YCbCr conversion. Returns the number of pixels that were
11/// converted.
12#[allow(clippy::type_complexity)]
13pub fn get_color_convert_line_ycbcr() -> Option<unsafe fn(&[u8], &[u8], &[u8], &mut [u8]) -> usize>
14{
15 #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
16 #[allow(unsafe_code)]
17 {
18 if is_x86_feature_detected!("ssse3") {
19 return Some(ssse3::color_convert_line_ycbcr);
20 }
21 }
22 // Runtime detection is not needed on aarch64.
23 #[cfg(all(feature = "nightly_aarch64_neon", target_arch = "aarch64"))]
24 {
25 return Some(neon::color_convert_line_ycbcr);
26 }
27 #[cfg(all(target_feature = "simd128", target_arch = "wasm32"))]
28 {
29 return Some(wasm::color_convert_line_ycbcr);
30 }
31 #[allow(unreachable_code)]
32 None
33}
34
35/// Arch-specific implementation of 8x8 IDCT.
36#[allow(clippy::type_complexity)]
37pub fn get_dequantize_and_idct_block_8x8(
38) -> Option<unsafe fn(&[i16; 64], &[u16; 64], usize, &mut [u8])> {
39 #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
40 #[allow(unsafe_code)]
41 {
42 if is_x86_feature_detected!("ssse3") {
43 return Some(ssse3::dequantize_and_idct_block_8x8);
44 }
45 }
46 // Runtime detection is not needed on aarch64.
47 #[cfg(all(feature = "nightly_aarch64_neon", target_arch = "aarch64"))]
48 {
49 return Some(neon::dequantize_and_idct_block_8x8);
50 }
51 #[cfg(all(target_feature = "simd128", target_arch = "wasm32"))]
52 {
53 return Some(wasm::dequantize_and_idct_block_8x8);
54 }
55 #[allow(unreachable_code)]
56 None
57}
58