diff --git a/yuv-sys/build.rs b/yuv-sys/build.rs index e5f01f56b..aa691427a 100644 --- a/yuv-sys/build.rs +++ b/yuv-sys/build.rs @@ -16,29 +16,30 @@ use cc; use rayon::prelude::*; use regex::Regex; use std::borrow::Cow; -use std::path::Path; -use std::{env, path::PathBuf}; -use std::{fs, io}; +use std::path::{Path, PathBuf}; +use std::{env, fs, io}; -//const LIBYUV_REPO: &str = "https://chromium.googlesource.com/libyuv/libyuv"; -//const LIBYUV_COMMIT: &str = "af6ac82"; const FNC_PREFIX: &str = "rs_"; -/*fn run_git_cmd(current_dir: &PathBuf, args: &[&str]) -> ExitStatus { - Command::new("git") - .current_dir(current_dir) - .args(args) - .status() - .unwrap() -}*/ +// Architecture-specific source files compiled as separate units with special +// compiler flags. Matches the compilation units in libyuv's CMakeLists.txt. + +const NEON_FILES: &[&str] = &["compare_neon.cc", "rotate_neon.cc", "row_neon.cc", "scale_neon.cc"]; + +const NEON64_FILES: &[&str] = + &["compare_neon64.cc", "rotate_neon64.cc", "row_neon64.cc", "scale_neon64.cc"]; + +const SVE_FILES: &[&str] = &["row_sve.cc"]; + +const SME_FILES: &[&str] = &["rotate_sme.cc", "row_sme.cc", "scale_sme.cc"]; +/// Prefix public API symbols with FNC_PREFIX to avoid conflicts with other +/// statically linked libyuv instances (e.g. libwebrtc). fn rename_symbols( fnc_list: &[&str], include_files: &[fs::DirEntry], source_files: &[fs::DirEntry], ) { - // Find all occurences of the function in every header and source files - // and prefix it with FNC_PREFIX include_files.par_iter().chain(source_files).for_each(|file| { let mut content = fs::read_to_string(&file.path()).unwrap(); for line in fnc_list { @@ -47,7 +48,6 @@ fn rename_symbols( continue; } - // Split line using space as delimiter (If there is two words, the second word is the new name instead of using prefix) let split: Vec<&str> = fnc.split_whitespace().collect(); let fnc = split[0]; @@ -82,21 +82,9 @@ fn copy_dir(source: impl AsRef, destination: impl AsRef) -> io::Resu fn clone_if_needed(_output_dir: &PathBuf, libyuv_dir: &PathBuf) -> bool { if libyuv_dir.exists() { - return false; // Already cloned + return false; } - /*let status = run_git_cmd(output_dir, &["clone", LIBYUV_REPO]); - if !status.success() { - fs::remove_dir_all(&libyuv_dir).unwrap(); - panic!("failed to clone libyuv, is git installed?"); - } - - let status = run_git_cmd(&libyuv_dir, &["checkout", LIBYUV_COMMIT]); - if !status.success() { - fs::remove_dir_all(&libyuv_dir).unwrap(); - panic!("failed to checkout to {}", LIBYUV_COMMIT); - }*/ - if let Err(err) = copy_dir("libyuv", libyuv_dir) { fs::remove_dir_all(&libyuv_dir).unwrap(); panic!("failed to copy libyuv: {:?}", err); @@ -105,12 +93,47 @@ fn clone_if_needed(_output_dir: &PathBuf, libyuv_dir: &PathBuf) -> bool { true } +fn can_compile_sme(out_dir: &Path) -> bool { + let test_file = out_dir.join("sme_check.c"); + fs::write(&test_file, "__arm_locally_streaming void func(void) { }\n").unwrap(); + + cc::Build::new() + .warnings(false) + .flag("-march=armv9-a+i8mm+sme") + .file(&test_file) + .try_compile("sme_check") + .is_ok() +} + +fn can_compile_sve(out_dir: &Path) -> bool { + let test_file = out_dir.join("sve_check.c"); + fs::write(&test_file, "void func(void) { asm volatile(\"cnth x0\"); }\n").unwrap(); + + cc::Build::new() + .warnings(false) + .flag("-march=armv8.5-a+i8mm+sve2") + .file(&test_file) + .try_compile("sve_check") + .is_ok() +} + +fn new_build(libyuv_dir: &Path) -> cc::Build { + let mut build = cc::Build::new(); + build.warnings(false).include(libyuv_dir.join("include")); + build +} + fn main() { let output_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); let libyuv_dir = output_dir.join("libyuv"); let include_dir = libyuv_dir.join("include"); let source_dir = libyuv_dir.join("source"); + let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default(); + let is_msvc = env::var("CARGO_CFG_TARGET_ENV").unwrap_or_default() == "msvc"; + let is_aarch64 = target_arch == "aarch64"; + let is_arm32 = target_arch == "arm"; + let cloned = clone_if_needed(&output_dir, &libyuv_dir); let include_files = fs::read_dir(include_dir.join("libyuv")) @@ -119,7 +142,7 @@ fn main() { .filter(|f| f.path().extension().unwrap() == "h") .collect::>(); - let source_files = fs::read_dir(source_dir) + let all_source_files = fs::read_dir(&source_dir) .unwrap() .map(Result::unwrap) .filter(|f| f.path().extension().unwrap() == "cc") @@ -129,20 +152,43 @@ fn main() { let fnc_list = fnc_content.lines().collect::>(); if cloned { - // Rename symbols to avoid conflicts with other libraries - // that have libyuv statically linked (e.g libwebrtc). - rename_symbols(&fnc_list, &include_files, &source_files); + rename_symbols(&fnc_list, &include_files, &all_source_files); } - let mut build = cc::Build::new(); - build - .warnings(false) - .include(libyuv_dir.join("include")) - .files(source_files.iter().map(|f| f.path())); + // Check compiler support before compiling, since we need to define + // LIBYUV_DISABLE_SVE/SME globally if unsupported. + let sve_supported = is_aarch64 && !is_msvc && can_compile_sve(&output_dir); + let sme_supported = is_aarch64 && !is_msvc && can_compile_sme(&output_dir); + + let all_arch_files: Vec<&str> = [NEON_FILES, NEON64_FILES, SVE_FILES, SME_FILES].concat(); + + let common_files: Vec = all_source_files + .iter() + .filter(|f| { + let name = f.file_name().to_string_lossy().to_string(); + !all_arch_files.contains(&name.as_str()) + }) + .map(|f| f.path()) + .collect(); + + let mut common_build = new_build(&libyuv_dir); + common_build.files(&common_files); + + if is_arm32 && !is_msvc { + common_build.define("LIBYUV_NEON", "1"); + } + + if is_aarch64 && !is_msvc { + if !sme_supported { + common_build.define("LIBYUV_DISABLE_SME", None); + } + if !sve_supported { + common_build.define("LIBYUV_DISABLE_SVE", None); + } + } #[cfg(feature = "jpeg")] { - // Try to detect system libjpeg (or libjpeg-turbo) via pkg-config to enable MJPEG fast path let jpeg_pkg = pkg_config::Config::new() .probe("libjpeg") .or_else(|_| pkg_config::Config::new().probe("libjpeg-turbo")) @@ -150,14 +196,43 @@ fn main() { .ok(); if let Some(pkg) = &jpeg_pkg { - build.define("HAVE_JPEG", None); + common_build.define("HAVE_JPEG", None); for p in &pkg.include_paths { - build.include(p); + common_build.include(p); } } } - build.compile("yuv"); + common_build.compile("yuv"); + + if !is_msvc { + if is_arm32 { + new_build(&libyuv_dir) + .define("LIBYUV_NEON", "1") + .flag("-mfpu=neon") + .files(NEON_FILES.iter().map(|f| source_dir.join(f))) + .compile("yuv_neon"); + } else if is_aarch64 { + new_build(&libyuv_dir) + .flag("-march=armv8.2-a+dotprod+i8mm") + .files(NEON64_FILES.iter().map(|f| source_dir.join(f))) + .compile("yuv_neon64"); + + if sve_supported { + new_build(&libyuv_dir) + .flag("-march=armv8.5-a+i8mm+sve2") + .files(SVE_FILES.iter().map(|f| source_dir.join(f))) + .compile("yuv_sve"); + } + + if sme_supported { + new_build(&libyuv_dir) + .flag("-march=armv9-a+i8mm+sme") + .files(SME_FILES.iter().map(|f| source_dir.join(f))) + .compile("yuv_sme"); + } + } + } let mut bindgen = bindgen::Builder::default() .header(include_dir.join("libyuv.h").to_string_lossy()) diff --git a/yuv-sys/libyuv b/yuv-sys/libyuv index 3e435fe6d..917276084 160000 --- a/yuv-sys/libyuv +++ b/yuv-sys/libyuv @@ -1 +1 @@ -Subproject commit 3e435fe6d4910ae1adbb4e116317072118ff210d +Subproject commit 917276084a49be726c90292ff0a6b0a3d571a6af diff --git a/yuv-sys/yuv_functions.txt b/yuv-sys/yuv_functions.txt index 4a57a51f0..8565a9e3f 100644 --- a/yuv-sys/yuv_functions.txt +++ b/yuv-sys/yuv_functions.txt @@ -1504,4 +1504,834 @@ MultiplyRow_16_NEON DivideRow_16_NEON Convert16To8Row_NEON TransposeWx8_Any_NEON -TransposeWx8_NEON \ No newline at end of file +TransposeWx8_NEON +ABGRToAR30Row_Any_NEON +ABGRToAR30Row_NEON +ABGRToUVJRow_Any_NEON_I8MM +ABGRToUVJRow_Any_SME +ABGRToUVJRow_Any_SVE2 +ABGRToUVJRow_NEON_I8MM +ABGRToUVJRow_SME +ABGRToUVJRow_SVE2 +ABGRToUVRow_Any_NEON_I8MM +ABGRToUVRow_Any_SME +ABGRToUVRow_Any_SVE2 +ABGRToUVRow_NEON_I8MM +ABGRToUVRow_SME +ABGRToUVRow_SVE2 +ABGRToYJRow_Any_NEON_DotProd +ABGRToYJRow_NEON_DotProd +ABGRToYRow_Any_NEON_DotProd +ABGRToYRow_NEON_DotProd +ARGB1555ToARGBRow_SVE2 +ARGBColorMatrixRow_NEON_I8MM +ARGBGrayRow_NEON_DotProd +ARGBMultiplyRow_SME +ARGBSepiaRow_NEON_DotProd +ARGBToAR30Row_Any_NEON +ARGBToAR30Row_NEON +ARGBToJ444 +ARGBToRAWRow_SVE2 +ARGBToRGB24Row_SVE2 +ARGBToRGB565DitherRow_SVE2 +ARGBToRGB565Row_SVE2 +ARGBToUV444Row_Any_AVX2 +ARGBToUV444Row_Any_NEON_I8MM +ARGBToUV444Row_AVX2 +ARGBToUV444Row_NEON_I8MM +ARGBToUVJ444Row_Any_AVX2 +ARGBToUVJ444Row_Any_NEON +ARGBToUVJ444Row_Any_NEON_I8MM +ARGBToUVJ444Row_Any_SSSE3 +ARGBToUVJ444Row_AVX2 +ARGBToUVJ444Row_C +ARGBToUVJ444Row_NEON_I8MM +ARGBToUVJ444Row_SSSE3 +ARGBToUVJRow_Any_NEON_I8MM +ARGBToUVJRow_Any_SME +ARGBToUVJRow_Any_SVE2 +ARGBToUVJRow_NEON_I8MM +ARGBToUVJRow_SME +ARGBToUVJRow_SVE2 +ARGBToUVRow_Any_NEON_I8MM +ARGBToUVRow_Any_SME +ARGBToUVRow_Any_SVE2 +ARGBToUVRow_NEON_I8MM +ARGBToUVRow_SME +ARGBToUVRow_SVE2 +ARGBToYJRow_Any_NEON_DotProd +ARGBToYJRow_NEON_DotProd +ARGBToYRow_Any_NEON_DotProd +ARGBToYRow_NEON_DotProd +ArmCpuCaps +AYUVToUVRow_Any_SVE2 +AYUVToUVRow_SVE2 +AYUVToVURow_Any_SVE2 +AYUVToVURow_SVE2 +BGRAToUVRow_Any_NEON_I8MM +BGRAToUVRow_Any_SME +BGRAToUVRow_Any_SVE2 +BGRAToUVRow_NEON_I8MM +BGRAToUVRow_SME +BGRAToUVRow_SVE2 +BGRAToYRow_Any_NEON_DotProd +BGRAToYRow_NEON_DotProd +CanonicalFourCC +Convert16To8Row_Any_AVX512BW +Convert16To8Row_AVX512BW +Convert16To8Row_SME +Convert8To16Row_Any_NEON +Convert8To16Row_NEON +Convert8To16Row_SME +Convert8To8Plane +Convert8To8Row_Any_AVX2 +Convert8To8Row_Any_NEON +Convert8To8Row_AVX2 +Convert8To8Row_C +Convert8To8Row_NEON +Convert8To8Row_SME +Convert8To8Row_SVE2 +CopyRow_Any_AVX512BW +CopyRow_AVX512BW +CopyRow_SME +CpuId +DivideRow_16_SVE2 +FixedDiv_C +FixedDiv1_C +HalfFloat1Row_SVE2 +HalfFloatRow_SVE2 +HammingDistance_C +HammingDistance_NEON_DotProd +HashDjb2_C +HashDjb2_NEON +I010ToNV12 +I210AlphaToARGBRow_Any_NEON +I210AlphaToARGBRow_NEON +I210AlphaToARGBRow_SME +I210AlphaToARGBRow_SVE2 +I210ToAR30Row_Any_NEON +I210ToAR30Row_NEON +I210ToAR30Row_SME +I210ToAR30Row_SVE2 +I210ToARGBRow_Any_NEON +I210ToARGBRow_NEON +I210ToARGBRow_SME +I210ToARGBRow_SVE2 +I212ToAR30Row_Any_NEON +I212ToAR30Row_NEON +I212ToAR30Row_SME +I212ToAR30Row_SVE2 +I212ToARGBRow_Any_NEON +I212ToARGBRow_NEON +I212ToARGBRow_SME +I212ToARGBRow_SVE2 +I400ToARGBRow_SME +I400ToARGBRow_SVE2 +I410AlphaToARGBRow_Any_NEON +I410AlphaToARGBRow_NEON +I410AlphaToARGBRow_SME +I410AlphaToARGBRow_SVE2 +I410ToAR30Row_Any_NEON +I410ToAR30Row_NEON +I410ToAR30Row_SME +I410ToAR30Row_SVE2 +I410ToARGBRow_Any_NEON +I410ToARGBRow_NEON +I410ToARGBRow_SME +I410ToARGBRow_SVE2 +I422AlphaToARGBRow_SME +I422AlphaToARGBRow_SVE2 +I422ToAR30Row_Any_NEON +I422ToAR30Row_NEON +I422ToAR30Row_SME +I422ToAR30Row_SVE2 +I422ToARGB1555Row_SME +I422ToARGB1555Row_SVE2 +I422ToARGB4444Row_SME +I422ToARGB4444Row_SVE2 +I422ToARGBRow_SME +I422ToARGBRow_SVE2 +I422ToRGB24Row_SME +I422ToRGB24Row_SVE2 +I422ToRGB565Row_SME +I422ToRGB565Row_SVE2 +I422ToRGBARow_SME +I422ToRGBARow_SVE2 +I444AlphaToARGBRow_SME +I444AlphaToARGBRow_SVE2 +I444ToARGBRow_SME +I444ToARGBRow_SVE2 +I444ToRGB24Row_SME +I444ToRGB24Row_SVE2 +InitCpuFlags +InterpolateRow_16_SME +InterpolateRow_16To8_SME +InterpolateRow_SME +J420ToI420 +MaskCpuFlags +MergeUVRow_16_SME +MergeUVRow_SME +MultiplyRow_16_SME +NV12ToARGBRow_SME +NV12ToARGBRow_SVE2 +NV12ToRGB24Row_SME +NV12ToRGB24Row_SVE2 +NV21ToARGBRow_SME +NV21ToARGBRow_SVE2 +NV21ToRGB24Row_SME +NV21ToRGB24Row_SVE2 +NV24Scale +P010ToNV12 +P210ToAR30Row_Any_NEON +P210ToAR30Row_NEON +P210ToAR30Row_SME +P210ToAR30Row_SVE2 +P210ToARGBRow_Any_NEON +P210ToARGBRow_NEON +P210ToARGBRow_SME +P210ToARGBRow_SVE2 +P410ToAR30Row_Any_NEON +P410ToAR30Row_NEON +P410ToAR30Row_SME +P410ToAR30Row_SVE2 +P410ToARGBRow_Any_NEON +P410ToARGBRow_NEON +P410ToARGBRow_SME +P410ToARGBRow_SVE2 +RAWToARGBRow_Any_AVX2 +RAWToARGBRow_AVX2 +RAWToARGBRow_SVE2 +RAWToI444 +RAWToJ444 +RAWToRGB24Row_SVE2 +RAWToRGBARow_SVE2 +RGB24ToARGBRow_SVE2 +RGBAToUVRow_Any_NEON_I8MM +RGBAToUVRow_Any_SME +RGBAToUVRow_Any_SVE2 +RGBAToUVRow_NEON_I8MM +RGBAToUVRow_SME +RGBAToUVRow_SVE2 +RGBAToYJRow_Any_NEON_DotProd +RGBAToYJRow_NEON_DotProd +RGBAToYRow_Any_NEON_DotProd +RGBAToYRow_NEON_DotProd +RiscvCpuCaps +ScaleAddRow_16_C +ScaleAddRow_C +ScaleARGBCols_C +ScaleARGBCols64_C +ScaleARGBColsUp2_C +ScaleARGBFilterCols_C +ScaleARGBFilterCols_RVV +ScaleARGBFilterCols64_C +ScaleARGBRowDown2_C +ScaleARGBRowDown2_SME +ScaleARGBRowDown2Box_C +ScaleARGBRowDown2Box_SME +ScaleARGBRowDown2Linear_C +ScaleARGBRowDown2Linear_SME +ScaleARGBRowDownEven_C +ScaleARGBRowDownEvenBox_C +ScaleCols_16_C +ScaleCols_C +ScaleColsUp2_16_C +ScaleColsUp2_C +ScaleFilterCols_16_C +ScaleFilterCols_C +ScaleFilterCols64_16_C +ScaleFilterCols64_C +ScaleFilterReduce +ScalePlaneVertical +ScalePlaneVertical_16 +ScalePlaneVertical_16To8 +ScaleRowDown2_16_C +ScaleRowDown2_16_NEON +ScaleRowDown2_16_SME +ScaleRowDown2_16To8_C +ScaleRowDown2_16To8_Odd_C +ScaleRowDown2_C +ScaleRowDown2_SME +ScaleRowDown2Box_16_C +ScaleRowDown2Box_16_SME +ScaleRowDown2Box_16To8_C +ScaleRowDown2Box_16To8_Odd_C +ScaleRowDown2Box_C +ScaleRowDown2Box_Odd_C +ScaleRowDown2Box_SME +ScaleRowDown2Linear_16_C +ScaleRowDown2Linear_16_NEON +ScaleRowDown2Linear_16_SME +ScaleRowDown2Linear_16To8_C +ScaleRowDown2Linear_16To8_Odd_C +ScaleRowDown2Linear_C +ScaleRowDown2Linear_SME +ScaleRowDown34_0_Box_16_C +ScaleRowDown34_0_Box_C +ScaleRowDown34_1_Box_16_C +ScaleRowDown34_1_Box_C +ScaleRowDown34_16_C +ScaleRowDown34_C +ScaleRowDown38_16_C +ScaleRowDown38_2_Box_16_C +ScaleRowDown38_2_Box_C +ScaleRowDown38_3_Box_16_C +ScaleRowDown38_3_Box_C +ScaleRowDown38_C +ScaleRowDown4_16_C +ScaleRowDown4_C +ScaleRowDown4Box_16_C +ScaleRowDown4Box_C +ScaleRowUp2_Bilinear_16_C +ScaleRowUp2_Bilinear_C +ScaleRowUp2_Linear_16_C +ScaleRowUp2_Linear_C +ScaleSlope +ScaleUVCols_C +ScaleUVCols64_C +ScaleUVColsUp2_C +ScaleUVFilterCols_C +ScaleUVFilterCols64_C +ScaleUVRowDown2_C +ScaleUVRowDown2_SME +ScaleUVRowDown2Box_C +ScaleUVRowDown2Box_SME +ScaleUVRowDown2Linear_C +ScaleUVRowDown2Linear_SME +ScaleUVRowDownEven_C +ScaleUVRowDownEvenBox_C +ScaleUVRowUp2_Bilinear_16_C +ScaleUVRowUp2_Bilinear_C +ScaleUVRowUp2_Linear_16_C +ScaleUVRowUp2_Linear_C +SplitRGBRow_Any_AVX2 +SplitRGBRow_Any_SSE41 +SplitRGBRow_AVX2 +SplitRGBRow_SSE41 +SumSquareError_C +SumSquareError_NEON_DotProd +TransposeUVWxH_SME +TransposeWx16_Any_NEON +TransposeWx16_C +TransposeWx16_NEON +TransposeWxH_SME +UYVYToARGBRow_SME +UYVYToARGBRow_SVE2 +ValidateJpeg +YUY2ToARGBRow_SME +YUY2ToARGBRow_SVE2 +AArch64CpuCaps +kP210LoadShuffleIndices +kP410LoadShuffleIndices +cpu_info_ +AB64ToARGBRow_RVV +ABGRToUVRow_Any_LSX +ABGRToUVRow_LSX +ABGRToYJRow_Any_LASX +ABGRToYJRow_Any_LSX +ABGRToYJRow_LASX +ABGRToYJRow_LSX +ABGRToYJRow_RVV +ABGRToYRow_Any_LASX +ABGRToYRow_Any_LSX +ABGRToYRow_LASX +ABGRToYRow_LSX +ABGRToYRow_RVV +AR64ToAB64Row_RVV +AR64ToARGBRow_RVV +ARGB1555ToARGBRow_Any_AVX2 +ARGB1555ToARGBRow_Any_LASX +ARGB1555ToARGBRow_Any_LSX +ARGB1555ToARGBRow_AVX2 +ARGB1555ToARGBRow_LASX +ARGB1555ToARGBRow_LSX +ARGB1555ToUVRow_Any_LASX +ARGB1555ToUVRow_Any_LSX +ARGB1555ToUVRow_LASX +ARGB1555ToUVRow_LSX +ARGB1555ToYRow_Any_LASX +ARGB1555ToYRow_Any_LSX +ARGB1555ToYRow_LASX +ARGB1555ToYRow_LSX +ARGB4444ToARGBRow_Any_AVX2 +ARGB4444ToARGBRow_Any_LASX +ARGB4444ToARGBRow_Any_LSX +ARGB4444ToARGBRow_AVX2 +ARGB4444ToARGBRow_LASX +ARGB4444ToARGBRow_LSX +ARGBAddRow_Any_LASX +ARGBAddRow_Any_LSX +ARGBAddRow_LASX +ARGBAddRow_LSX +ARGBAttenuateRow_Any_LASX +ARGBAttenuateRow_Any_LSX +ARGBAttenuateRow_LASX +ARGBAttenuateRow_LSX +ARGBAttenuateRow_RVV +ARGBBlendRow_LSX +ARGBBlendRow_RVV +ARGBColorMatrixRow_LSX +ARGBCopyYToAlphaRow_RVV +ARGBExtractAlphaRow_Any_LSX +ARGBExtractAlphaRow_LSX +ARGBExtractAlphaRow_RVV +ARGBGrayRow_LASX +ARGBGrayRow_LSX +ARGBMirrorRow_Any_LASX +ARGBMirrorRow_Any_LSX +ARGBMirrorRow_LASX +ARGBMirrorRow_LSX +ARGBMultiplyRow_Any_LASX +ARGBMultiplyRow_Any_LSX +ARGBMultiplyRow_LASX +ARGBMultiplyRow_LSX +ARGBQuantizeRow_LSX +ARGBSepiaRow_LASX +ARGBSepiaRow_LSX +ARGBSetRow_Any_LSX +ARGBSetRow_LSX +ARGBShadeRow_LASX +ARGBShadeRow_LSX +ARGBShuffleRow_Any_LASX +ARGBShuffleRow_Any_LSX +ARGBShuffleRow_LASX +ARGBShuffleRow_LSX +ARGBSubtractRow_Any_LASX +ARGBSubtractRow_Any_LSX +ARGBSubtractRow_LASX +ARGBSubtractRow_LSX +ARGBToAB64Row_RVV +ARGBToABGRRow_RVV +ARGBToAR64Row_RVV +ARGBToARGB1555Row_Any_AVX2 +ARGBToARGB1555Row_Any_LASX +ARGBToARGB1555Row_Any_LSX +ARGBToARGB1555Row_AVX2 +ARGBToARGB1555Row_LASX +ARGBToARGB1555Row_LSX +ARGBToARGB4444Row_Any_AVX2 +ARGBToARGB4444Row_Any_LASX +ARGBToARGB4444Row_Any_LSX +ARGBToARGB4444Row_AVX2 +ARGBToARGB4444Row_LASX +ARGBToARGB4444Row_LSX +ARGBToBGRARow_RVV +ARGBToRAWRow_Any_LASX +ARGBToRAWRow_Any_LSX +ARGBToRAWRow_LASX +ARGBToRAWRow_LSX +ARGBToRAWRow_RVV +ARGBToRGB24Row_Any_LASX +ARGBToRGB24Row_Any_LSX +ARGBToRGB24Row_LASX +ARGBToRGB24Row_LSX +ARGBToRGB24Row_RVV +ARGBToRGB565DitherRow_Any_LASX +ARGBToRGB565DitherRow_Any_LSX +ARGBToRGB565DitherRow_LASX +ARGBToRGB565DitherRow_LSX +ARGBToRGB565Row_Any_AVX2 +ARGBToRGB565Row_Any_LASX +ARGBToRGB565Row_Any_LSX +ARGBToRGB565Row_AVX2 +ARGBToRGB565Row_LASX +ARGBToRGB565Row_LSX +ARGBToRGBARow_RVV +ARGBToUV444Row_Any_LASX +ARGBToUV444Row_Any_LSX +ARGBToUV444Row_LASX +ARGBToUV444Row_LSX +ARGBToUVJRow_Any_LASX +ARGBToUVJRow_Any_LSX +ARGBToUVJRow_LASX +ARGBToUVJRow_LSX +ARGBToUVRow_Any_LASX +ARGBToUVRow_Any_LSX +ARGBToUVRow_LASX +ARGBToUVRow_LSX +ARGBToYJRow_Any_LASX +ARGBToYJRow_Any_LSX +ARGBToYJRow_LASX +ARGBToYJRow_LSX +ARGBToYJRow_RVV +ARGBToYRow_Any_LASX +ARGBToYRow_Any_LSX +ARGBToYRow_LASX +ARGBToYRow_LSX +ARGBToYRow_RVV +BGRAToUVRow_Any_LSX +BGRAToUVRow_LSX +BGRAToYRow_Any_LASX +BGRAToYRow_Any_LSX +BGRAToYRow_LASX +BGRAToYRow_LSX +BGRAToYRow_RVV +BlendPlaneRow_RVV +CopyRow_RVV +DetileRow_Any_AVX +DetileRow_AVX +FixedDiv_X86 +FixedDiv1_X86 +HalfFloat1Row_Any_F16C +HalfFloat1Row_F16C +HalfFloatRow_Any_F16C +HalfFloatRow_Any_LSX +HalfFloatRow_F16C +HalfFloatRow_LSX +I400ToARGBRow_Any_LSX +I400ToARGBRow_LSX +I400ToARGBRow_RVV +I422AlphaToARGBRow_Any_LASX +I422AlphaToARGBRow_Any_LSX +I422AlphaToARGBRow_LASX +I422AlphaToARGBRow_LSX +I422AlphaToARGBRow_RVV +I422ToARGB1555Row_Any_LASX +I422ToARGB1555Row_Any_LSX +I422ToARGB1555Row_LASX +I422ToARGB1555Row_LSX +I422ToARGB4444Row_Any_LASX +I422ToARGB4444Row_Any_LSX +I422ToARGB4444Row_LASX +I422ToARGB4444Row_LSX +I422ToARGBRow_Any_LASX +I422ToARGBRow_Any_LSX +I422ToARGBRow_LASX +I422ToARGBRow_LSX +I422ToARGBRow_RVV +I422ToRGB24Row_Any_LASX +I422ToRGB24Row_Any_LSX +I422ToRGB24Row_LASX +I422ToRGB24Row_LSX +I422ToRGB24Row_RVV +I422ToRGB565Row_Any_LASX +I422ToRGB565Row_Any_LSX +I422ToRGB565Row_LASX +I422ToRGB565Row_LSX +I422ToRGBARow_Any_LASX +I422ToRGBARow_Any_LSX +I422ToRGBARow_LASX +I422ToRGBARow_LSX +I422ToRGBARow_RVV +I422ToUYVYRow_Any_LASX +I422ToUYVYRow_Any_LSX +I422ToUYVYRow_LASX +I422ToUYVYRow_LSX +I422ToYUY2Row_Any_LASX +I422ToYUY2Row_Any_LSX +I422ToYUY2Row_LASX +I422ToYUY2Row_LSX +I444AlphaToARGBRow_RVV +I444ToARGBRow_Any_LSX +I444ToARGBRow_LSX +I444ToARGBRow_RVV +I444ToRGB24Row_RVV +InterpolateRow_Any_LSX +InterpolateRow_LSX +InterpolateRow_RVV +J400ToARGBRow_Any_AVX2 +J400ToARGBRow_Any_LSX +J400ToARGBRow_AVX2 +J400ToARGBRow_LSX +J400ToARGBRow_RVV +MergeARGBRow_RVV +MergeRGBRow_Any_NEON +MergeRGBRow_RVV +MergeUVRow_Any_LSX +MergeUVRow_LSX +MergeUVRow_RVV +MergeXRGBRow_RVV +MirrorRow_Any_LASX +MirrorRow_Any_LSX +MirrorRow_Any_SSE2 +MirrorRow_LASX +MirrorRow_LSX +MirrorSplitUVRow_LSX +MirrorUVRow_Any_LASX +MirrorUVRow_Any_LSX +MirrorUVRow_LASX +MirrorUVRow_LSX +NV12ToARGBRow_Any_LASX +NV12ToARGBRow_Any_LSX +NV12ToARGBRow_LASX +NV12ToARGBRow_LSX +NV12ToARGBRow_RVV +NV12ToRGB24Row_RVV +NV12ToRGB565Row_Any_LASX +NV12ToRGB565Row_Any_LSX +NV12ToRGB565Row_LASX +NV12ToRGB565Row_LSX +NV21ToARGBRow_Any_LASX +NV21ToARGBRow_Any_LSX +NV21ToARGBRow_LASX +NV21ToARGBRow_LSX +NV21ToARGBRow_RVV +NV21ToRGB24Row_RVV +RAWToARGBRow_Any_LASX +RAWToARGBRow_Any_LSX +RAWToARGBRow_LASX +RAWToARGBRow_LSX +RAWToARGBRow_RVV +RAWToRGB24Row_Any_LSX +RAWToRGB24Row_LSX +RAWToRGB24Row_RVV +RAWToRGBARow_RVV +RAWToUVRow_Any_LASX +RAWToUVRow_Any_LSX +RAWToUVRow_LASX +RAWToUVRow_LSX +RAWToYJRow_Any_LASX +RAWToYJRow_Any_LSX +RAWToYJRow_LASX +RAWToYJRow_LSX +RAWToYJRow_RVV +RAWToYRow_Any_LASX +RAWToYRow_Any_LSX +RAWToYRow_Any_SSSE3 +RAWToYRow_LASX +RAWToYRow_LSX +RAWToYRow_RVV +RAWToYRow_SSSE3 +RGB24ToARGBRow_Any_LASX +RGB24ToARGBRow_Any_LSX +RGB24ToARGBRow_LASX +RGB24ToARGBRow_LSX +RGB24ToARGBRow_RVV +RGB24ToUVRow_Any_LASX +RGB24ToUVRow_Any_LSX +RGB24ToUVRow_LASX +RGB24ToUVRow_LSX +RGB24ToYJRow_Any_LASX +RGB24ToYJRow_Any_LSX +RGB24ToYJRow_LASX +RGB24ToYJRow_LSX +RGB24ToYJRow_RVV +RGB24ToYRow_Any_LASX +RGB24ToYRow_Any_LSX +RGB24ToYRow_Any_SSSE3 +RGB24ToYRow_LASX +RGB24ToYRow_LSX +RGB24ToYRow_RVV +RGB24ToYRow_SSSE3 +RGB565ToARGBRow_Any_AVX2 +RGB565ToARGBRow_Any_LASX +RGB565ToARGBRow_Any_LSX +RGB565ToARGBRow_AVX2 +RGB565ToARGBRow_LASX +RGB565ToARGBRow_LSX +RGB565ToUVRow_Any_LASX +RGB565ToUVRow_Any_LSX +RGB565ToUVRow_LASX +RGB565ToUVRow_LSX +RGB565ToYRow_Any_LASX +RGB565ToYRow_Any_LSX +RGB565ToYRow_LASX +RGB565ToYRow_LSX +RGBAToARGBRow_RVV +RGBAToUVRow_Any_LSX +RGBAToUVRow_LSX +RGBAToYJRow_Any_LASX +RGBAToYJRow_Any_LSX +RGBAToYJRow_LASX +RGBAToYJRow_LSX +RGBAToYJRow_RVV +RGBAToYRow_Any_LASX +RGBAToYRow_Any_LSX +RGBAToYRow_LASX +RGBAToYRow_LSX +RGBAToYRow_RVV +ScaleAddRow_Any_LSX +ScaleAddRow_AVX2 +ScaleAddRow_LSX +ScaleAddRow_RVV +ScaleAddRow_SSE2 +ScaleARGBCols_Any_LSX +ScaleARGBCols_LSX +ScaleARGBCols_SSE2 +ScaleARGBColsUp2_SSE2 +ScaleARGBFilterCols_Any_LSX +ScaleARGBFilterCols_LSX +ScaleARGBFilterCols_SSSE3 +ScaleARGBRowDown2_Any_LSX +ScaleARGBRowDown2_LSX +ScaleARGBRowDown2_RVV +ScaleARGBRowDown2_SSE2 +ScaleARGBRowDown2Box_Any_LSX +ScaleARGBRowDown2Box_LSX +ScaleARGBRowDown2Box_RVV +ScaleARGBRowDown2Box_SSE2 +ScaleARGBRowDown2Linear_Any_LSX +ScaleARGBRowDown2Linear_LSX +ScaleARGBRowDown2Linear_RVV +ScaleARGBRowDown2Linear_SSE2 +ScaleARGBRowDownEven_Any_LSX +ScaleARGBRowDownEven_LSX +ScaleARGBRowDownEven_RVV +ScaleARGBRowDownEven_SSE2 +ScaleARGBRowDownEvenBox_Any_LSX +ScaleARGBRowDownEvenBox_LSX +ScaleARGBRowDownEvenBox_RVV +ScaleARGBRowDownEvenBox_SSE2 +ScaleColsUp2_SSE2 +ScaleFilterCols_Any_LSX +ScaleFilterCols_LSX +ScaleFilterCols_SSSE3 +ScaleRowDown2_Any_LSX +ScaleRowDown2_AVX2 +ScaleRowDown2_LSX +ScaleRowDown2_RVV +ScaleRowDown2_SSSE3 +ScaleRowDown2Box_Any_LSX +ScaleRowDown2Box_AVX2 +ScaleRowDown2Box_LSX +ScaleRowDown2Box_RVV +ScaleRowDown2Box_SSSE3 +ScaleRowDown2Linear_Any_LSX +ScaleRowDown2Linear_AVX2 +ScaleRowDown2Linear_LSX +ScaleRowDown2Linear_RVV +ScaleRowDown2Linear_SSSE3 +ScaleRowDown34_0_Box_Any_LSX +ScaleRowDown34_0_Box_LSX +ScaleRowDown34_0_Box_RVV +ScaleRowDown34_0_Box_SSSE3 +ScaleRowDown34_1_Box_Any_LSX +ScaleRowDown34_1_Box_LSX +ScaleRowDown34_1_Box_RVV +ScaleRowDown34_1_Box_SSSE3 +ScaleRowDown34_Any_LSX +ScaleRowDown34_LSX +ScaleRowDown34_RVV +ScaleRowDown34_SSSE3 +ScaleRowDown38_2_Box_Any_LSX +ScaleRowDown38_2_Box_LSX +ScaleRowDown38_2_Box_RVV +ScaleRowDown38_2_Box_SSSE3 +ScaleRowDown38_3_Box_Any_LSX +ScaleRowDown38_3_Box_LSX +ScaleRowDown38_3_Box_RVV +ScaleRowDown38_3_Box_SSSE3 +ScaleRowDown38_Any_LSX +ScaleRowDown38_LSX +ScaleRowDown38_RVV +ScaleRowDown38_SSSE3 +ScaleRowDown4_Any_LSX +ScaleRowDown4_AVX2 +ScaleRowDown4_LSX +ScaleRowDown4_RVV +ScaleRowDown4_SSSE3 +ScaleRowDown4Box_Any_LSX +ScaleRowDown4Box_AVX2 +ScaleRowDown4Box_LSX +ScaleRowDown4Box_RVV +ScaleRowDown4Box_SSSE3 +ScaleRowUp2_Bilinear_12_AVX2 +ScaleRowUp2_Bilinear_12_SSSE3 +ScaleRowUp2_Bilinear_16_AVX2 +ScaleRowUp2_Bilinear_16_SSE2 +ScaleRowUp2_Bilinear_AVX2 +ScaleRowUp2_Bilinear_RVV +ScaleRowUp2_Bilinear_SSE2 +ScaleRowUp2_Bilinear_SSSE3 +ScaleRowUp2_Linear_12_AVX2 +ScaleRowUp2_Linear_12_SSSE3 +ScaleRowUp2_Linear_16_AVX2 +ScaleRowUp2_Linear_16_SSE2 +ScaleRowUp2_Linear_AVX2 +ScaleRowUp2_Linear_RVV +ScaleRowUp2_Linear_SSE2 +ScaleRowUp2_Linear_SSSE3 +ScaleUVRowDown2_Any_SSSE3 +ScaleUVRowDown2_RVV +ScaleUVRowDown2_SSSE3 +ScaleUVRowDown2Box_AVX2 +ScaleUVRowDown2Box_RVV +ScaleUVRowDown2Box_SSSE3 +ScaleUVRowDown2Linear_Any_SSSE3 +ScaleUVRowDown2Linear_RVV +ScaleUVRowDown2Linear_SSSE3 +ScaleUVRowDown4_RVV +ScaleUVRowDownEven_Any_SSSE3 +ScaleUVRowDownEven_RVV +ScaleUVRowDownEven_SSSE3 +ScaleUVRowDownEvenBox_Any_NEON +ScaleUVRowDownEvenBox_Any_SSSE3 +ScaleUVRowDownEvenBox_NEON +ScaleUVRowDownEvenBox_SSSE3 +ScaleUVRowUp2_Bilinear_16_AVX2 +ScaleUVRowUp2_Bilinear_16_SSE41 +ScaleUVRowUp2_Bilinear_AVX2 +ScaleUVRowUp2_Bilinear_RVV +ScaleUVRowUp2_Bilinear_SSSE3 +ScaleUVRowUp2_Linear_16_AVX2 +ScaleUVRowUp2_Linear_16_SSE41 +ScaleUVRowUp2_Linear_AVX2 +ScaleUVRowUp2_Linear_RVV +ScaleUVRowUp2_Linear_SSSE3 +SetRow_Any_LSX +SetRow_LSX +SobelRow_Any_LSX +SobelRow_LSX +SobelToPlaneRow_Any_LSX +SobelToPlaneRow_LSX +SobelXYRow_Any_LSX +SobelXYRow_LSX +SplitARGBRow_RVV +SplitRGBRow_RVV +SplitUVRow_Any_LSX +SplitUVRow_LSX +SplitUVRow_RVV +SplitXRGBRow_RVV +Transpose4x4_32_AVX2 +Transpose4x4_32_SSE2 +TransposeUVWx16_Any_LSX +TransposeUVWx16_C +TransposeUVWx16_LSX +TransposeUVWx8_Any_SSE2 +TransposeUVWx8_SSE2 +TransposeWx1_16_C +TransposeWx16_Any_LSX +TransposeWx16_LSX +TransposeWx8_Any_SSSE3 +TransposeWx8_Fast_Any_SSSE3 +TransposeWx8_Fast_SSSE3 +TransposeWx8_SSSE3 +UYVYToARGBRow_Any_LSX +UYVYToARGBRow_LSX +UYVYToUV422Row_Any_LASX +UYVYToUV422Row_Any_LSX +UYVYToUV422Row_LASX +UYVYToUV422Row_LSX +UYVYToUVRow_Any_LASX +UYVYToUVRow_Any_LSX +UYVYToUVRow_LASX +UYVYToUVRow_LSX +UYVYToYRow_Any_LASX +UYVYToYRow_Any_LSX +UYVYToYRow_LASX +UYVYToYRow_LSX +YUY2ToARGBRow_Any_LSX +YUY2ToARGBRow_LSX +YUY2ToUV422Row_Any_LASX +YUY2ToUV422Row_Any_LSX +YUY2ToUV422Row_LASX +YUY2ToUV422Row_LSX +YUY2ToUVRow_Any_LASX +YUY2ToUVRow_Any_LSX +YUY2ToUVRow_LASX +YUY2ToUVRow_LSX +YUY2ToYRow_Any_LASX +YUY2ToYRow_Any_LSX +YUY2ToYRow_LASX +YUY2ToYRow_LSX +ARGBToUV444MatrixRow_AVX2 +ARGBToUV444MatrixRow_SSSE3 +ARGBToUVMatrixRow_AVX2 +ARGBToUVMatrixRow_SSSE3 +ErrorHandler +HammingDistance_AVX2 +HammingDistance_SSE42 +HammingDistance_SSSE3 +HashDjb2_SSE41 +NV21ToYUV24Row_AVX512 +SumSquareError_SSE2