diff --git a/.gitignore b/.gitignore index c8a2095..0e22058 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,4 @@ !/vendor/iced_video_player/ !/vendor/iced_video_player/** /vendor.tar -.idea/ +.idea/ \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 1170c9c..b32d567 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -723,9 +723,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" +checksum = "553c5d846a6ba5150c65e3b1b8ec073bcf1abc20f9b7220de384a4443ea4e20a" dependencies = [ "bytes", "cfg_aliases", @@ -754,6 +754,10 @@ dependencies = [ [[package]] name = "build_helpers" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "cfg_aliases", ] @@ -955,9 +959,9 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "combine" -version = "4.6.7" +version = "4.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" dependencies = [ "bytes", "memchr", @@ -1069,6 +1073,10 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1089,6 +1097,10 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "quote", "syn 2.0.119", @@ -1109,7 +1121,7 @@ dependencies = [ [[package]] name = "cosmic-player" -version = "1.7.0" +version = "1.8.0" dependencies = [ "ashpd 0.12.3", "clap_lex", @@ -1181,6 +1193,10 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "almost", "configparser", @@ -1197,9 +1213,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ "libc", ] @@ -1629,7 +1645,7 @@ dependencies = [ "bit_field", "half", "lebe", - "miniz_oxide", + "miniz_oxide 0.8.9", "num-complex", "pulp", "rayon-core", @@ -1675,12 +1691,13 @@ checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "flate2" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.9.1", + "zlib-rs", ] [[package]] @@ -2029,14 +2046,14 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.22.8" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353fdc7da7cd16da916104b1e0e4e7de380ec9c8aaa20d4d742d66310ab4b0d5" +checksum = "6c28739f914c15b87a9856000bed9cbd5b3a8afbca5e982d9a299e1601422cb5" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps", + "system-deps 9.0.0", "windows-sys 0.61.2", ] @@ -2059,9 +2076,9 @@ checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" [[package]] name = "glib" -version = "0.22.8" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddbcf514bd1881fc1b960e4e52b4e82873f4da3bceddbd58d42827b508888100" +checksum = "18b9b8d350db41f690ec1b87109f202782748bbd8ab2f2ede17cb40d29e2838c" dependencies = [ "bitflags 2.13.1", "futures-channel", @@ -2080,24 +2097,24 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.22.6" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "506d23499707c7142898429757e8d9a3871d965239a2cb66dfa05052be6d6f19" +checksum = "c9597c68fa7bdf4154a3079642cd21c4dccac0b0bdd2897d82861523bf91e7b9" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] name = "glib-sys" -version = "0.22.8" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030967459f9f676851872c6304adea7825c6d462ec9b72554c733cf0c5952233" +checksum = "99b38907e67e40dec9b60f858bcada952598719cb512a13eb13d6cdcd16f8295" dependencies = [ "libc", - "system-deps", + "system-deps 9.0.0", ] [[package]] @@ -2123,13 +2140,13 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.22.6" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a861859b887a79cf461359c192c97a57d8fb0229dd291232e57aa11f6fa72c" +checksum = "07595c9ba696bd9819cb6a8df39f08078f3dd679508fe052dd558492c2053834" dependencies = [ "glib-sys", "libc", - "system-deps", + "system-deps 9.0.0", ] [[package]] @@ -2222,7 +2239,7 @@ dependencies = [ "gstreamer-base-sys", "gstreamer-sys", "libc", - "system-deps", + "system-deps 7.0.8", ] [[package]] @@ -2251,7 +2268,7 @@ dependencies = [ "gstreamer-base-sys", "gstreamer-sys", "libc", - "system-deps", + "system-deps 7.0.8", ] [[package]] @@ -2278,7 +2295,7 @@ dependencies = [ "gobject-sys", "gstreamer-sys", "libc", - "system-deps", + "system-deps 7.0.8", ] [[package]] @@ -2308,7 +2325,7 @@ dependencies = [ "gstreamer-sys", "gstreamer-video-sys", "libc", - "system-deps", + "system-deps 7.0.8", ] [[package]] @@ -2321,7 +2338,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps", + "system-deps 7.0.8", ] [[package]] @@ -2346,7 +2363,7 @@ dependencies = [ "gobject-sys", "gstreamer-sys", "libc", - "system-deps", + "system-deps 7.0.8", ] [[package]] @@ -2376,7 +2393,7 @@ dependencies = [ "gstreamer-base-sys", "gstreamer-sys", "libc", - "system-deps", + "system-deps 7.0.8", ] [[package]] @@ -2448,9 +2465,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" [[package]] name = "hex" @@ -2560,6 +2577,10 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "build_helpers", "dnd", @@ -2581,6 +2602,10 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "accesskit", "accesskit_winit", @@ -2589,6 +2614,10 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "bitflags 2.13.1", "build_helpers", @@ -2614,6 +2643,10 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "iced_core", "iced_futures", @@ -2623,6 +2656,10 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "futures", "iced_core", @@ -2636,6 +2673,10 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "bitflags 2.13.1", "bytemuck", @@ -2656,6 +2697,10 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "iced_graphics", "iced_runtime", @@ -2664,6 +2709,10 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2675,6 +2724,10 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "build_helpers", "bytes", @@ -2690,6 +2743,10 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "bytemuck", "cosmic-text", @@ -2706,6 +2763,10 @@ dependencies = [ [[package]] name = "iced_video_player" version = "0.6.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/wash2/iced_video_player.git?branch=iced-rebase#2e82b6b08d1751924b7b21b8c56683cdbc57bc33" +>>>>>>> epoch-1.8.0 dependencies = [ "glib", "gstreamer", @@ -2723,6 +2784,10 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "bitflags 2.13.1", "build_helpers", @@ -2751,6 +2816,10 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -2769,6 +2838,10 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" +<<<<<<< HEAD +======= +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "build_helpers", "cosmic-client-toolkit", @@ -3022,9 +3095,9 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" +checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" [[package]] name = "indexmap" @@ -3375,8 +3448,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] +<<<<<<< HEAD name = "libcosmic-yoda" version = "0.1.0-yoda.2" +======= +name = "libcosmic" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#9cc82abd9ca5601bb0341edd12a9acbc97e77801" +>>>>>>> epoch-1.8.0 dependencies = [ "apply", "ashpd 0.12.3", @@ -3449,9 +3528,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.20" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a" +checksum = "8d8f1ea3f21fd3405dcaf6c9b5c1630af9afc422d9073ea39c5f6d6c772e08ed" dependencies = [ "bitflags 2.13.1", "libc", @@ -3540,9 +3619,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" +checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" dependencies = [ "lyon_path", "num-traits", @@ -3571,9 +3650,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" +checksum = "dabea159dc6eea9171a541b458134b70ca95e3162d068132b2b3b9bc01aad06e" dependencies = [ "float_next_after", "lyon_path", @@ -3681,10 +3760,20 @@ dependencies = [ ] [[package]] -name = "mio" -version = "1.2.2" +name = "miniz_oxide" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -4445,7 +4534,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.8.9", ] [[package]] @@ -4458,7 +4547,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.8.9", ] [[package]] @@ -4539,9 +4628,9 @@ dependencies = [ [[package]] name = "proc-macro-error-attr3" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0084e6206a967a2dad822180626b2f6b07a3b379325e8f1ec0438e33a469ba7" +checksum = "9e564d14133360e1ae169ffde5da25881b5fa47261665b8e5713c212c27799da" dependencies = [ "proc-macro2", "quote", @@ -4549,9 +4638,9 @@ dependencies = [ [[package]] name = "proc-macro-error3" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cf066225f2373bc711684792b69bdeac0356019b007e721090c24d92d5d5a50" +checksum = "8f0d4471b3436c22106b21913b1dda531558918ae9b7ec55d58aa84b43552233" dependencies = [ "proc-macro-error-attr3", "proc-macro2", @@ -5328,9 +5417,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "smithay-client-toolkit" @@ -5535,6 +5624,19 @@ dependencies = [ "version-compare", ] +[[package]] +name = "system-deps" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0dae2cbca1f0ff93795713cfe0a4c02f760e3c0b8ae2ab4ec4045808ff429f" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 1.1.0+spec-1.1.0", + "version-compare", +] + [[package]] name = "taffy" version = "0.9.2" @@ -6081,9 +6183,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.25.0" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f053576934f05a761a402421fbbe3d425d9366f75f978806a037b3ca481abecc" +checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" dependencies = [ "js-sys", "serde_core", @@ -7551,6 +7653,12 @@ dependencies = [ "syn 3.0.4", ] +[[package]] +name = "zlib-rs" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + [[package]] name = "zmij" version = "1.0.23" diff --git a/Cargo.toml b/Cargo.toml index 6642c74..5b8c75b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-player" -version = "1.7.0" +version = "1.8.0" edition = "2024" rust-version = "1.93" diff --git a/debian/changelog b/debian/changelog index 13ec616..5dee624 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cosmic-player (1.8.0) noble; urgency=medium + + * Epoch 1.8.0 version update + + -- Jeremy Soller Wed, 02 Sep 2026 08:15:23 -0600 + cosmic-player (1.7.0) noble; urgency=medium * Epoch 1.7.0 version update diff --git a/src/main.rs b/src/main.rs index 016e7b4..bbfbe17 100644 --- a/src/main.rs +++ b/src/main.rs @@ -82,7 +82,32 @@ fn get_framerate(video: &Video) -> Option { let caps = pad.current_caps()?; let structure = caps.structure(0)?; let framerate = structure.get::("framerate").ok()?; - Some(framerate.numer() as f64 / framerate.denom() as f64) + positive_framerate(framerate) +} + +fn positive_framerate(framerate: gst::Fraction) -> Option { + if framerate.numer() <= 0 || framerate.denom() <= 0 { + return None; + } + + let fps = framerate.numer() as f64 / framerate.denom() as f64; + fps.is_finite().then_some(fps) +} + +#[cfg(test)] +mod tests { + use super::positive_framerate; + use iced_video_player::gst; + + #[test] + fn variable_framerate_uses_fallback() { + assert_eq!(positive_framerate(gst::Fraction::new(0, 1)), None); + } + + #[test] + fn fixed_framerate_is_preserved() { + assert_eq!(positive_framerate(gst::Fraction::new(30, 1)), Some(30.0)); + } } /// Runs application with these settings diff --git a/src/video.rs b/src/video.rs index a4d3652..866ff7e 100644 --- a/src/video.rs +++ b/src/video.rs @@ -4,6 +4,40 @@ use iced_video_player::{Video, gst, gst_app, gst_pbutils}; use cosmic::action; use cosmic::app::Task; +const SUSPICIOUS_AUDIO_GAP_DURATION: gst::ClockTime = gst::ClockTime::SECOND; + +fn is_suspicious_audio_gap(duration: Option) -> bool { + duration.is_some_and(|duration| duration >= SUSPICIOUS_AUDIO_GAP_DURATION) +} + +fn suppress_suspicious_audio_gaps(audio_filter: &gst::Element) { + let Some(src_pad) = audio_filter.static_pad("src") else { + log::warn!("audio filter has no source pad; malformed audio gaps will not be suppressed"); + return; + }; + + let _ = src_pad.add_probe(gst::PadProbeType::EVENT_DOWNSTREAM, |_, info| { + let Some(event) = info.event() else { + return gst::PadProbeReturn::Ok; + }; + let gst::EventView::Gap(gap) = event.view() else { + return gst::PadProbeReturn::Ok; + }; + let (timestamp, duration) = gap.get(); + if !is_suspicious_audio_gap(duration) { + return gst::PadProbeReturn::Ok; + } + + // Some malformed MP4 edit lists cause streamsynchronizer to emit a + // long GAP before almost every audio buffer. The next buffer's PTS is + // still continuous, so forwarding those events makes audio sinks + // repeatedly wait or resynchronise and produces choppy playback. + log::debug!("suppressing audio GAP at {timestamp} with duration {duration:?}"); + drop(info.take_event()); + gst::PadProbeReturn::Handled + }); +} + #[derive(Debug, Default)] pub struct VideoSettings { pub mute: bool, @@ -33,11 +67,14 @@ pub fn new_video( .downcast::() .map_err(|_| iced_video_player::Error::Cast) .unwrap(); - if let Ok(scaletempo) = gst::ElementFactory::make("scaletempo").build() { - pipeline.set_property("audio-filter", &scaletempo); - } else { - log::warn!("scaletempo element not available; speed changes will affect pitch"); - } + let audio_filter = gst::ElementFactory::make("scaletempo") + .build() + .unwrap_or_else(|_| { + log::warn!("scaletempo element not available; speed changes will affect pitch"); + gst::ElementFactory::make("identity").build().unwrap() + }); + suppress_suspicious_audio_gaps(&audio_filter); + pipeline.set_property("audio-filter", &audio_filter); pipeline.connect("element-setup", false, |vals| { let Ok(elem) = vals[1].get::() else { return None; @@ -111,3 +148,25 @@ fn disable_broken_hardware_decoders() { } } } + +#[cfg(test)] +mod tests { + use super::is_suspicious_audio_gap; + use iced_video_player::gst; + + #[test] + fn long_audio_gap_is_suspicious() { + assert!(is_suspicious_audio_gap(Some(gst::ClockTime::SECOND))); + assert!(is_suspicious_audio_gap(Some( + gst::ClockTime::from_seconds(3) + ))); + } + + #[test] + fn short_or_unknown_audio_gap_is_preserved() { + assert!(!is_suspicious_audio_gap(Some( + gst::ClockTime::from_mseconds(999) + ))); + assert!(!is_suspicious_audio_gap(None)); + } +}