jpeg_decoder/arch/
mod.rs

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}