Skip to content

Commit

Permalink
Move libgav1 to a sys crate
Browse files Browse the repository at this point in the history
  • Loading branch information
vigneshvg committed Jan 31, 2024
1 parent a9adb98 commit 74cfc55
Show file tree
Hide file tree
Showing 11 changed files with 92 additions and 358 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
/out_comparison.txt
/sys/dav1d-sys/src/dav1d.rs
/sys/dav1d-sys/dav1d
/sys/libgav1-sys/src/libgav1.rs
/sys/libgav1-sys/libgav1
/sys/libyuv-sys/src/libyuv.rs
/sys/libyuv-sys/libyuv
/target
/third_party/googletest
/third_party/libgav1
5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
workspace = { members = ["sys/dav1d-sys", "sys/libyuv-sys"] }
workspace = { members = ["sys/dav1d-sys", "sys/libyuv-sys", "sys/libgav1-sys"] }

[package]
name = "crabby-avif"
Expand All @@ -14,6 +14,7 @@ byteorder = "1.5.0"
libc = {version = "0.2.152", optional = true}
ndk = {version = "0.8.0", features = ["media"], optional = true}
dav1d-sys = { version = "0.1.0", path="sys/dav1d-sys", optional = true}
libgav1-sys = { version = "0.1.0", path="sys/libgav1-sys", optional = true}
libyuv-sys = { version = "0.1.0", path="sys/libyuv-sys", optional = true}

[dev-dependencies]
Expand All @@ -30,7 +31,7 @@ bindgen = "0.69.1"
default = ["dav1d", "libyuv"]
capi = []
dav1d = ["dep:libc", "dep:dav1d-sys"]
libgav1 = []
libgav1 = ["dep:libgav1-sys"]
libyuv = ["dep:libyuv-sys"]
android_mediacodec = ["dep:ndk"]
use_ahash = ["dep:ahash"]
Expand Down
91 changes: 0 additions & 91 deletions build.rs
Original file line number Diff line number Diff line change
@@ -1,97 +1,6 @@
// Build the required native library bindings.

// Not everything in this file is used in all the configurations.
#![allow(dead_code, unused_variables)]

use std::env;
use std::path::Path;
use std::path::PathBuf;

fn path_buf(inputs: &[&str]) -> PathBuf {
let path: PathBuf = inputs.iter().collect();
path
}

fn add_native_library(
library_name: &str,
library_dir: &str,
library_path: PathBuf,
header_file: PathBuf,
extra_include_dir: PathBuf,
allowlist_items: &[&str],
bindings_path: PathBuf,
) {
let project_root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
let third_party = PathBuf::from(&project_root).join("third_party");
let abs_library_dir = PathBuf::from(&third_party).join(library_dir);
let abs_object_dir = PathBuf::from(&abs_library_dir).join(library_path);
let object_file = format!("lib{library_name}.a");
let library_file = PathBuf::from(&abs_object_dir).join(object_file);
if !Path::new(&library_file).exists() {
panic!("{library_name} not found. Run third_party/{library_dir}.cmd.");
}
println!("cargo:rustc-link-search={}", abs_object_dir.display());
println!("cargo:rustc-link-lib=static={library_name}");

// Generate bindings.
let abs_header_file = PathBuf::from(&abs_library_dir).join(header_file);
let extra_includes = PathBuf::from(&abs_library_dir).join(extra_include_dir);
let extra_includes_str = format!("-I{}", extra_includes.display());
let mut bindings = bindgen::Builder::default()
.header(abs_header_file.into_os_string().into_string().unwrap())
.clang_arg(extra_includes_str)
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.layout_tests(false)
.generate_comments(false)
.raw_line("#![allow(warnings)]");
for allowlist_item in allowlist_items {
bindings = bindings.allowlist_item(allowlist_item);
}
let bindings = bindings
.generate()
.unwrap_or_else(|_| panic!("Unable to generate bindings for {library_dir}"));
bindings
.write_to_file(bindings_path.as_path())
.unwrap_or_else(|_| panic!("Couldn't write bindings for {library_dir}"));
}

fn main() {
println!("cargo:rerun-if-changed=build.rs");

let build_target = std::env::var("TARGET").unwrap();
let build_dir = if build_target.contains("android") {
if build_target.contains("x86_64") {
"build.android/x86_64"
} else if build_target.contains("x86") {
"build.android/x86"
} else if build_target.contains("aarch64") {
"build.android/aarch64"
} else if build_target.contains("arm") {
"build.android/arm"
} else {
panic!("Unknown target_arch for android. Must be one of x86, x86_64, arm, aarch64.");
}
} else {
"build"
};

#[cfg(feature = "libgav1")]
{
add_native_library(
"gav1",
"libgav1",
path_buf(&[build_dir]),
path_buf(&["src", "gav1", "decoder.h"]),
path_buf(&["src"]),
&[
"Libgav1DecoderCreate",
"Libgav1DecoderDequeueFrame",
"Libgav1DecoderDestroy",
"Libgav1DecoderEnqueueFrame",
"Libgav1DecoderSettingsInitDefault",
],
path_buf(&["src", "codecs", "bindings", "libgav1.rs"]),
);
// libgav1 needs libstdc++ on *nix and libc++ on mac. TODO: what about windows?
if cfg!(target_os = "macos") {
println!("cargo:rustc-link-arg=-lc++");
Expand Down
257 changes: 0 additions & 257 deletions src/codecs/bindings/libgav1.rs

This file was deleted.

4 changes: 0 additions & 4 deletions src/codecs/bindings/mod.rs

This file was deleted.

Loading

0 comments on commit 74cfc55

Please sign in to comment.