diff --git a/media-converter/Cargo.lock b/media-converter/Cargo.lock index 6ef6281a..45939ca7 100644 --- a/media-converter/Cargo.lock +++ b/media-converter/Cargo.lock @@ -89,6 +89,18 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "filetime" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys", +] + [[package]] name = "futures-channel" version = "0.3.24" @@ -525,6 +537,7 @@ version = "7.0.0" dependencies = [ "array-init", "crc32fast", + "filetime", "glib", "gst-plugin-version-helper", "gstreamer", @@ -543,6 +556,15 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + [[package]] name = "serde" version = "1.0.145" @@ -710,3 +732,60 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff --git a/media-converter/Cargo.toml b/media-converter/Cargo.toml index ca681355..43c36d95 100644 --- a/media-converter/Cargo.toml +++ b/media-converter/Cargo.toml @@ -20,6 +20,7 @@ gstreamer-audio = "0.19.0" once_cell = "1.9" crc32fast = "1.3" array-init = "2.0" +filetime = "0.2" [lib] name = "protonmediaconverter" diff --git a/media-converter/src/audioconv/imp.rs b/media-converter/src/audioconv/imp.rs index 4103f10b..b7289a32 100644 --- a/media-converter/src/audioconv/imp.rs +++ b/media-converter/src/audioconv/imp.rs @@ -31,6 +31,8 @@ use crate::format_hash; use crate::HASH_SEED; use crate::discarding_disabled; +use crate::steam_compat_shader_path; +use crate::touch_file; use gst::glib; use gst::prelude::*; @@ -633,6 +635,14 @@ impl AudioConvState { let buf = Box::new(*include_bytes!("../../blank.ptna")); + match steam_compat_shader_path() { + None => gst::log!(CAT, "env STEAM_COMPAT_SHADER_PATH not set"), + Some(mut path) => { + path.push("placeholder-audio-used"); + if let Err(e) = touch_file(path) { gst::log!(CAT, "Failed to touch placeholder-audio-used file: {:?}", e) } + }, + }; + Ok(buf) } } diff --git a/media-converter/src/lib.rs b/media-converter/src/lib.rs index 59d48160..ce36d414 100644 --- a/media-converter/src/lib.rs +++ b/media-converter/src/lib.rs @@ -35,8 +35,14 @@ extern crate gstreamer_video as gst_video; extern crate gstreamer_audio as gst_audio; extern crate once_cell; +use std::fs::File; use std::io; use std::io::Read; +use std::path::Path; +use std::path::PathBuf; + +use filetime::FileTime; +use filetime::set_file_handle_times; #[cfg(target_arch = "x86")] mod murmur3_x86_128; @@ -76,6 +82,24 @@ where a } +fn touch_file

(p: P) -> io::Result<()> +where + P: AsRef + std::fmt::Debug +{ + let f = File::create(p)?; + let now = FileTime::now(); + set_file_handle_times(&f, Some(now), Some(now))?; + Ok(()) +} + +fn steam_compat_shader_path() -> Option +{ + match std::env::var("STEAM_COMPAT_SHADER_PATH") { + Err(_) => None, + Ok(c) => Some(Path::new(&c).to_path_buf()), + } +} + /* rust has a hard time with large heap allocations. below macro works around that. * * by @simias from https://github.com/rust-lang/rust/issues/53827 */ diff --git a/media-converter/src/videoconv/imp.rs b/media-converter/src/videoconv/imp.rs index 2a170d37..a40f816d 100644 --- a/media-converter/src/videoconv/imp.rs +++ b/media-converter/src/videoconv/imp.rs @@ -34,6 +34,8 @@ use crate::box_array; use crate::copy_into_array; use crate::BufferedReader; use crate::discarding_disabled; +use crate::steam_compat_shader_path; +use crate::touch_file; use gst::glib; use gst::prelude::*; @@ -346,6 +348,14 @@ impl VideoConvState { self.transcode_hash = None; self.our_duration = Some(include_bytes!("../../blank.mkv").len() as u64); + match steam_compat_shader_path() { + None => gst::log!(CAT, "env STEAM_COMPAT_SHADER_PATH not set"), + Some(mut path) => { + path.push("placeholder-video-used"); + if let Err(e) = touch_file(path) { gst::log!(CAT, "Failed to touch placeholder-video-used file: {:?}", e) } + }, + }; + false }