diff --git a/Cargo.lock b/Cargo.lock index 09870ced6..bcc27002c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -72,9 +72,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -87,9 +87,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -102,29 +102,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" @@ -140,7 +140,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -172,9 +172,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.30" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" +checksum = "0e86f6d3dc9dc4352edeea6b8e499e13e3f5dc3b964d7ca5fd411415a3498473" dependencies = [ "compression-codecs", "compression-core", @@ -202,7 +202,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -224,7 +224,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -241,7 +241,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -257,10 +257,10 @@ dependencies = [ "futures-util", "log", "pin-project-lite", - "rustls-native-certs 0.8.1", + "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tungstenite 0.27.0", ] @@ -308,23 +308,23 @@ dependencies = [ "log", "num-rational", "num-traits", - "pastey", + "pastey 0.1.1", "rayon", - "thiserror 2.0.16", + "thiserror 2.0.17", "v_frame", "y4m", ] [[package]] name = "av1-grain" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" dependencies = [ "anyhow", "arrayvec", "log", - "nom 7.1.3", + "nom 8.0.0", "num-rational", "v_frame", ] @@ -630,7 +630,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.3.1", + "http 1.4.0", "once_cell", "p256", "percent-encoding", @@ -644,9 +644,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" +checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" dependencies = [ "futures-util", "pin-project-lite", @@ -677,9 +677,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.11" +version = "0.60.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "182b03393e8c677347fb5705a04a9392695d47d20ef0a2f8cfe28c8e6b9b9778" +checksum = "e29a304f8319781a39808847efb39561351b1bb76e933da7aa90232673638658" dependencies = [ "aws-smithy-types", "bytes", @@ -730,18 +730,18 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.5" +version = "0.61.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa31b350998e703e9826b2104dd6f63be0508666e1aba88137af060e8944047" +checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-query" -version = "0.60.7" +version = "0.60.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" +checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" dependencies = [ "aws-smithy-types", "urlencoding", @@ -784,7 +784,7 @@ dependencies = [ "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.3.1", + "http 1.4.0", "pin-project-lite", "tokio", "tracing", @@ -793,16 +793,16 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.2" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" +checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.3.1", + "http 1.4.0", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", @@ -819,9 +819,9 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.10" +version = "0.60.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" +checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" dependencies = [ "xmlparser", ] @@ -842,9 +842,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -852,7 +852,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -897,9 +897,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bincode" @@ -916,7 +916,7 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -927,7 +927,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -936,7 +936,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -947,7 +947,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -956,7 +956,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -967,7 +967,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -978,9 +978,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bitreader" @@ -993,9 +993,9 @@ dependencies = [ [[package]] name = "bitstream-io" -version = "4.6.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd3ca0e6861b2a2d785a7f0c267193e8d423d8ae3475aad1842f725d6a380c9" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" dependencies = [ "core2", ] @@ -1009,11 +1009,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "bstr" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", ] @@ -1038,9 +1047,9 @@ checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -1065,9 +1074,9 @@ dependencies = [ [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "bytes-utils" @@ -1082,29 +1091,29 @@ dependencies = [ [[package]] name = "cairo-rs" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cairo-sys-rs", - "glib", + "glib 0.22.0", "libc", ] [[package]] name = "cairo-sys-rs" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "glib-sys", + "glib-sys 0.22.0", "libc", "system-deps", ] [[package]] name = "cc" -version = "1.2.37" +version = "1.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" dependencies = [ "find-msvc-tools", "jobserver", @@ -1136,7 +1145,7 @@ checksum = "332ca05a88e143d80a245f9aa6c65b6e6383ee3e332017005647c27c6a62f902" dependencies = [ "cea708-types", "log", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -1146,7 +1155,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfc9d3f5161702cf339e6337203ac26b64279383468247e45b36e221cb06cae" dependencies = [ "log", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -1157,7 +1166,7 @@ checksum = "de28b1d549e7f8f53a746fb36ae4c10c776a8e004950b527be1669a58667ae0b" dependencies = [ "log", "muldiv", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -1177,9 +1186,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.18.0" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2b34126159980f92da2a08bdec0694fd80fb5eb9e48aff25d20a0d8dfa710d" +checksum = "9acd0bdbbf4b2612d09f52ba61da432140cb10930354079d0d53fafc12968726" dependencies = [ "smallvec", "target-lexicon", @@ -1187,9 +1196,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -1208,7 +1217,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -1234,9 +1243,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.47" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -1244,9 +1253,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.47" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -1256,21 +1265,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.47" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "claxon" @@ -1326,9 +1335,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.30" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485abf41ac0c8047c07c87c72c8fb3eb5197f6e9d7ded615dfd1a00ae00a0f64" +checksum = "302266479cb963552d11bd042013a58ef1adc56768016c8b82b4199488f2d4ad" dependencies = [ "compression-core", "flate2", @@ -1337,9 +1346,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.29" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" [[package]] name = "concurrent-queue" @@ -1449,9 +1458,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ "crc-catalog", ] @@ -1482,9 +1491,9 @@ dependencies = [ [[package]] name = "crc64fast-nvme" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4955638f00a809894c947f85a024020a20815b65a5eea633798ea7924edab2b3" +checksum = "38fe9239af6a04e140c7424d36d1615f37f1804700c17d5339af162add9022e0" dependencies = [ "crc", ] @@ -1538,9 +1547,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -1579,13 +1588,13 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ - "dispatch", + "dispatch2", "nix", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -1594,8 +1603,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -1609,7 +1628,21 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.111", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.111", ] [[package]] @@ -1618,9 +1651,20 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1644,7 +1688,7 @@ dependencies = [ "serde", "serde_path_to_error", "serde_with", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", "url", "webm-iterable", @@ -1778,12 +1822,12 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "dav1d" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6cf827d3349972e28999ad957d9fb6d6bf2dee306af76640855e9488e769798" +checksum = "3ee89cb860616069c67520dcd66cacdb900b57c799f634a0eb6d91f6e2a82b61" dependencies = [ "av-data", - "bitflags 2.9.4", + "bitflags 2.10.0", "dav1d-sys", "static_assertions", ] @@ -1821,12 +1865,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -1855,10 +1899,10 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1868,7 +1912,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1888,7 +1932,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1910,10 +1954,16 @@ dependencies = [ ] [[package]] -name = "dispatch" -version = "0.2.0" +name = "dispatch2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", +] [[package]] name = "displaydoc" @@ -1923,23 +1973,23 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] [[package]] name = "dssim-core" -version = "3.2.11" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5baa7723d29512337a4694b2a9a06618ce86bac66c0bcf42c3149cb09791648" +checksum = "e3c601412450ff29a9258b2f85b18b38f658caf70fad1692f40ca863d86cb753" dependencies = [ "imgref", "itertools 0.14.0", @@ -2058,14 +2108,14 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "env_filter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", "regex", @@ -2101,7 +2151,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2117,7 +2167,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -2162,7 +2212,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18c1ddb9231d8554c2d6bdf4cfaabf0c59251658c68b6c95cd52dd0c513a912a" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libm", "rand 0.9.2", "siphasher", @@ -2226,9 +2276,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.1" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fixedbitset" @@ -2238,9 +2288,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -2278,6 +2328,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2304,9 +2360,9 @@ dependencies = [ [[package]] name = "fs-err" -version = "3.1.2" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f150ffc8782f35521cec2b23727707cb4045706ba3c854e86bef66b3a8cdbd" +checksum = "62d91fd049c123429b018c47887d3f75a265540dd3c30ba9cb7bae9197edb03a" dependencies = [ "autocfg", ] @@ -2373,7 +2429,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2415,22 +2471,22 @@ dependencies = [ [[package]] name = "gdk-pixbuf" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ "gdk-pixbuf-sys", "gio", - "glib", + "glib 0.22.0", "libc", ] [[package]] name = "gdk-pixbuf-sys" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.22.0", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "libc", "system-deps", ] @@ -2438,13 +2494,13 @@ dependencies = [ [[package]] name = "gdk4" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "cairo-rs", "gdk-pixbuf", "gdk4-sys", "gio", - "glib", + "glib 0.22.0", "libc", "pango", ] @@ -2452,13 +2508,13 @@ dependencies = [ [[package]] name = "gdk4-sys" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.22.0", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "libc", "pango-sys", "pkg-config", @@ -2468,21 +2524,21 @@ dependencies = [ [[package]] name = "gdk4-wayland" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "gdk4", "gdk4-wayland-sys", "gio", - "glib", + "glib 0.22.0", "libc", ] [[package]] name = "gdk4-wayland-sys" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ - "glib-sys", + "glib-sys 0.22.0", "libc", "system-deps", ] @@ -2490,12 +2546,13 @@ dependencies = [ [[package]] name = "gdk4-win32" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ + "cairo-rs", "gdk4", "gdk4-win32-sys", "gio", - "glib", + "glib 0.22.0", "khronos-egl", "libc", ] @@ -2503,10 +2560,11 @@ dependencies = [ [[package]] name = "gdk4-win32-sys" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ + "cairo-sys-rs", "gdk4-sys", - "glib-sys", + "glib-sys 0.22.0", "libc", "system-deps", ] @@ -2514,22 +2572,22 @@ dependencies = [ [[package]] name = "gdk4-x11" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "gdk4", "gdk4-x11-sys", "gio", - "glib", + "glib 0.22.0", "libc", ] [[package]] name = "gdk4-x11-sys" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "gdk4-sys", - "glib-sys", + "glib-sys 0.22.0", "libc", "system-deps", ] @@ -2550,7 +2608,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7b2d14d6cb5b573aaeb37d2f9baac2623f8b7de35742046fb4cc1c7b90c97d2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "windows-sys 0.59.0", ] @@ -2564,21 +2622,21 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] @@ -2594,53 +2652,85 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "gio" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-util", - "gio-sys", - "glib", + "gio-sys 0.22.0", + "glib 0.22.0", "libc", "pin-project-lite", "smallvec", ] +[[package]] +name = "gio-sys" +version = "0.20.12" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=0.20#337dde55bb1665a0a1286e689ec2819383d4e299" +dependencies = [ + "glib-sys 0.20.12", + "gobject-sys 0.20.12", + "libc", + "system-deps", + "windows-sys 0.59.0", +] + [[package]] name = "gio-sys" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "libc", "system-deps", - "windows-sys 0.61.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "glib" +version = "0.20.12" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=0.20#337dde55bb1665a0a1286e689ec2819383d4e299" +dependencies = [ + "bitflags 2.10.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys 0.20.12", + "glib-macros 0.20.12", + "glib-sys 0.20.12", + "gobject-sys 0.20.12", + "libc", + "memchr", + "smallvec", ] [[package]] name = "glib" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "futures-channel", "futures-core", "futures-executor", "futures-task", "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", + "gio-sys 0.22.0", + "glib-macros 0.22.0", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "libc", "memchr", "smallvec", @@ -2648,20 +2738,40 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +version = "0.20.12" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=0.20#337dde55bb1665a0a1286e689ec2819383d4e299" dependencies = [ "heck 0.5.0", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", +] + +[[package]] +name = "glib-macros" +version = "0.22.0" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "glib-sys" +version = "0.20.12" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=0.20#337dde55bb1665a0a1286e689ec2819383d4e299" +dependencies = [ + "libc", + "system-deps", ] [[package]] name = "glib-sys" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ "libc", "system-deps", @@ -2673,28 +2783,38 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[package]] +name = "gobject-sys" +version = "0.20.12" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=0.20#337dde55bb1665a0a1286e689ec2819383d4e299" +dependencies = [ + "glib-sys 0.20.12", + "libc", + "system-deps", +] + [[package]] name = "gobject-sys" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "glib-sys", + "glib-sys 0.22.0", "libc", "system-deps", ] [[package]] name = "governor" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444405bbb1a762387aa22dd569429533b54a1d8759d35d3b64cb39b0293eaa19" +checksum = "6e23d5986fd4364c2fb7498523540618b4b8d92eec6c36a02e565f66748e2f79" dependencies = [ "cfg-if", "futures-sink", "futures-timer", "futures-util", - "getrandom 0.3.3", - "hashbrown 0.15.5", + "getrandom 0.3.4", + "hashbrown 0.16.1", "nonzero_ext", "parking_lot", "portable-atomic", @@ -2707,9 +2827,9 @@ dependencies = [ [[package]] name = "graphene-rs" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "glib", + "glib 0.22.0", "graphene-sys", "libc", ] @@ -2717,9 +2837,9 @@ dependencies = [ [[package]] name = "graphene-sys" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "glib-sys", + "glib-sys 0.22.0", "libc", "pkg-config", "system-deps", @@ -2739,11 +2859,11 @@ dependencies = [ [[package]] name = "gsk4" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "cairo-rs", "gdk4", - "glib", + "glib 0.22.0", "graphene-rs", "gsk4-sys", "libc", @@ -2753,12 +2873,12 @@ dependencies = [ [[package]] name = "gsk4-sys" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "cairo-sys-rs", "gdk4-sys", - "glib-sys", - "gobject-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "graphene-sys", "libc", "pango-sys", @@ -2770,14 +2890,14 @@ name = "gst-plugin-analytics" version = "0.15.0-alpha.1" dependencies = [ "chrono", - "glib", - "gst-plugin-version-helper", - "gstreamer", + "glib 0.22.0", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-analytics", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", "gstreamer-rtp", - "gstreamer-video", + "gstreamer-video 0.25.0", "xmltree", ] @@ -2789,11 +2909,11 @@ dependencies = [ "atomic_refcell", "byte-slice-cast", "ebur128", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", "hrtf", "nnnoiseless", @@ -2806,8 +2926,8 @@ dependencies = [ name = "gst-plugin-audioparsers" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", ] [[package]] @@ -2831,12 +2951,12 @@ dependencies = [ "env_logger", "futures", "gio", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "percent-encoding", "rand 0.9.2", "serde", @@ -2856,11 +2976,11 @@ version = "0.15.0-alpha.1" dependencies = [ "cdg", "cdg_renderer", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", - "gstreamer-base", - "gstreamer-video", + "gstreamer-base 0.25.0", + "gstreamer-video 0.25.0", "image", ] @@ -2871,8 +2991,8 @@ dependencies = [ "atomic_refcell", "byte-slice-cast", "claxon", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", "gstreamer-check", ] @@ -2892,11 +3012,11 @@ dependencies = [ "chrono", "clap", "either", - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "itertools 0.14.0", "pango", "pangocairo", @@ -2915,10 +3035,10 @@ version = "0.15.0-alpha.1" dependencies = [ "byte-slice-cast", "csound", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", ] @@ -2927,13 +3047,37 @@ name = "gst-plugin-dav1d" version = "0.15.0-alpha.1" dependencies = [ "dav1d", - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", - "gstreamer-video", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", + "gstreamer-video 0.25.0", "num_cpus", ] +[[package]] +name = "gst-plugin-dsc" +version = "0.1.0" +dependencies = [ + "anyhow", + "atomic_refcell", + "base64ct", + "glib 0.22.0", + "gst-plugin-originalbuffer 0.13.0", + "gst-plugin-version-helper 0.8.1 (git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs)", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", + "gstreamer-check", + "gstreamer-video 0.25.0", + "hex", + "hound", + "human_bytes", + "once_cell", + "openssl", + "rand 0.9.2", + "rsa", + "sha2", +] + [[package]] name = "gst-plugin-elevenlabs" version = "0.15.0-alpha.1" @@ -2941,12 +3085,12 @@ dependencies = [ "anyhow", "bytes", "futures", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", - "reqwest 0.12.23", - "rustls 0.23.31", + "gstreamer-base 0.25.0", + "reqwest 0.12.24", + "rustls 0.23.35", "serde", "serde_json", "signalsmith-stretch", @@ -2959,13 +3103,13 @@ version = "0.15.0-alpha.1" dependencies = [ "gio", "gst-plugin-gtk4", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "gtk4", "parking_lot", "rand 0.9.2", @@ -2977,19 +3121,19 @@ version = "0.15.0-alpha.1" dependencies = [ "byte-slice-cast", "ffv1", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", ] [[package]] name = "gst-plugin-file" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "url", ] @@ -2999,10 +3143,10 @@ version = "0.15.0-alpha.1" dependencies = [ "byteorder", "flavors", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "nom 7.1.3", "num-rational", "smallvec", @@ -3016,17 +3160,17 @@ dependencies = [ "bitstream-io", "chrono", "dash-mpd", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", "gstreamer-pbutils", "gstreamer-tag", - "gstreamer-video", + "gstreamer-video 0.25.0", "m3u8-rs", - "quick-xml 0.38.3", + "quick-xml 0.38.4", "serde", ] @@ -3036,10 +3180,10 @@ version = "0.15.0-alpha.1" dependencies = [ "atomic_refcell", "gif", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", ] [[package]] @@ -3047,11 +3191,11 @@ name = "gst-plugin-gopbuffer" version = "0.15.0-alpha.1" dependencies = [ "anyhow", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", ] [[package]] @@ -3062,17 +3206,17 @@ dependencies = [ "gdk4-wayland", "gdk4-win32", "gdk4-x11", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-allocators", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-gl", "gstreamer-gl-egl", "gstreamer-gl-wayland", "gstreamer-gl-x11", - "gstreamer-video", + "gstreamer-video 0.25.0", "gtk4", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -3088,16 +3232,16 @@ dependencies = [ "gio", "gst-plugin-fmp4", "gst-plugin-hlssink3", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-audio", "gstreamer-check", "gstreamer-pbutils", - "gstreamer-video", + "gstreamer-video 0.25.0", "m3u8-rs", "serial_test", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -3108,13 +3252,13 @@ dependencies = [ "chrono", "gio", "gst-plugin-fmp4", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-audio", "gstreamer-check", "gstreamer-pbutils", - "gstreamer-video", + "gstreamer-video 0.25.0", "m3u8-rs", "sprintf", ] @@ -3124,12 +3268,12 @@ name = "gst-plugin-hsv" version = "0.15.0-alpha.1" dependencies = [ "byte-slice-cast", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "num-traits", ] @@ -3139,8 +3283,8 @@ version = "0.15.0-alpha.1" dependencies = [ "anyhow", "futures", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-check", "gstreamer-utils", @@ -3154,8 +3298,8 @@ dependencies = [ name = "gst-plugin-json" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", "serde", "serde_json", @@ -3167,8 +3311,8 @@ version = "0.15.0-alpha.1" dependencies = [ "atomic_refcell", "byte-slice-cast", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", "gstreamer-check", "lewton", @@ -3180,8 +3324,8 @@ version = "0.15.0-alpha.1" dependencies = [ "gio", "gst-plugin-gtk4", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", "gstreamer-check", "gtk4", @@ -3195,13 +3339,13 @@ version = "0.15.0-alpha.1" dependencies = [ "anyhow", "bitstream-io", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-pbutils", "gstreamer-tag", - "gstreamer-video", + "gstreamer-video 0.25.0", "mp4-atom", "num-integer", "tempfile", @@ -3214,8 +3358,8 @@ version = "0.15.0-alpha.1" dependencies = [ "anyhow", "bitstream-io", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "smallvec", ] @@ -3227,16 +3371,16 @@ dependencies = [ "byte-slice-cast", "byteorder", "data-encoding", - "glib", - "gst-plugin-version-helper", - "gstreamer", + "glib 0.22.0", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", - "gstreamer-video", + "gstreamer-base 0.25.0", + "gstreamer-video 0.25.0", "libloading", - "quick-xml 0.38.3", + "quick-xml 0.38.4", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -3245,36 +3389,49 @@ version = "0.15.0-alpha.1" dependencies = [ "cairo-rs", "chrono", - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "gstreamer-rtp", - "gstreamer-video", + "gstreamer-video 0.25.0", "pango", "pangocairo", "xmlparser", "xmltree", ] +[[package]] +name = "gst-plugin-originalbuffer" +version = "0.13.0" +source = "git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs?tag=0.13.0#fea2343968da83f3cce860f5a76fa2a2b0f22c16" +dependencies = [ + "atomic_refcell", + "glib 0.20.12", + "gst-plugin-version-helper 0.8.1 (git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs?tag=0.13.0)", + "gstreamer 0.23.7", + "gstreamer-video 0.23.7", + "once_cell", +] + [[package]] name = "gst-plugin-originalbuffer" version = "0.15.0-alpha.1" dependencies = [ "atomic_refcell", - "glib", - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-video", + "glib 0.22.0", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-video 0.25.0", ] [[package]] name = "gst-plugin-png" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "parking_lot", "png", ] @@ -3289,20 +3446,20 @@ dependencies = [ "ctrlc", "env_logger", "futures", - "glib", - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "glib 0.22.0", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "gstreamer-check", "itertools 0.14.0", "quinn", "quinn-proto", "rcgen", - "rustls 0.23.31", + "rustls 0.23.35", "rustls-pemfile 2.2.0", "rustls-pki-types", "serial_test", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "url", "web-transport-quinn", @@ -3312,9 +3469,9 @@ dependencies = [ name = "gst-plugin-raptorq" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "gstreamer-check", "gstreamer-rtp", "rand 0.9.2", @@ -3326,10 +3483,10 @@ name = "gst-plugin-rav1e" version = "0.15.0-alpha.1" dependencies = [ "atomic_refcell", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "rav1e", ] @@ -3337,8 +3494,8 @@ dependencies = [ name = "gst-plugin-regex" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", "regex", ] @@ -3349,16 +3506,16 @@ version = "0.15.0-alpha.1" dependencies = [ "bytes", "futures", - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "headers", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "mime", "pin-project-lite", - "reqwest 0.12.23", - "rustls 0.23.31", + "reqwest 0.12.24", + "rustls 0.23.35", "tokio", "url", ] @@ -3374,16 +3531,16 @@ dependencies = [ "chrono", "futures", "gio", - "glib", - "gst-plugin-version-helper", - "gstreamer", + "glib 0.22.0", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", "gstreamer-net", "gstreamer-rtp", - "gstreamer-video", + "gstreamer-video 0.25.0", "hex", "itertools 0.14.0", "log", @@ -3392,7 +3549,7 @@ dependencies = [ "rtp-types", "slab", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", "tokio", "tokio-util", @@ -3406,16 +3563,16 @@ dependencies = [ "atomic_refcell", "data-encoding", "futures", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-net", "gstreamer-pbutils", - "lru 0.16.1", + "lru 0.16.2", "rtsp-types", "sdp-types", - "socket2 0.6.0", - "thiserror 2.0.16", + "socket2 0.6.1", + "thiserror 2.0.17", "tokio", "tokio-stream", "url", @@ -3425,11 +3582,11 @@ dependencies = [ name = "gst-plugin-skia" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "skia-safe", ] @@ -3438,10 +3595,10 @@ name = "gst-plugin-sodium" version = "0.15.0-alpha.1" dependencies = [ "clap", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-check", "hex", "pretty_assertions", @@ -3459,12 +3616,12 @@ dependencies = [ "async-tungstenite", "atomic_refcell", "futures", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", - "http 1.3.1", - "rustls 0.23.31", + "gstreamer-base 0.25.0", + "http 1.4.0", + "rustls 0.23.35", "serde", "serde_json", "tokio", @@ -3477,9 +3634,9 @@ version = "0.15.0-alpha.1" dependencies = [ "anyhow", "futures", - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "librespot-core", "librespot-metadata", "librespot-playback", @@ -3491,8 +3648,8 @@ dependencies = [ name = "gst-plugin-streamgrouper" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", ] @@ -3501,8 +3658,8 @@ name = "gst-plugin-textaccumulate" version = "0.15.0-alpha.1" dependencies = [ "anyhow", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "icu_locale", "icu_provider", "icu_segmenter", @@ -3514,16 +3671,16 @@ dependencies = [ name = "gst-plugin-textahead" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", ] [[package]] name = "gst-plugin-textwrap" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", "hyphenation", "textwrap", @@ -3544,8 +3701,8 @@ dependencies = [ "getifaddrs", "gio", "gst-plugin-rtp", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-audio", "gstreamer-check", @@ -3558,10 +3715,10 @@ dependencies = [ "rtp-types", "rustix 1.1.2", "slab", - "socket2 0.6.0", - "thiserror 2.0.16", + "socket2 0.6.1", + "thiserror 2.0.17", "waker-fn", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -3571,11 +3728,11 @@ dependencies = [ "either", "gio", "gst-plugin-gtk4", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "gtk4", "parking_lot", ] @@ -3590,8 +3747,8 @@ dependencies = [ "chrono", "etherparse", "futures", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "pcap-file", "regex", "serde", @@ -3608,11 +3765,11 @@ name = "gst-plugin-tutorial" version = "0.15.0-alpha.1" dependencies = [ "byte-slice-cast", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", - "gstreamer-base", - "gstreamer-video", + "gstreamer-base 0.25.0", + "gstreamer-video 0.25.0", "num-traits", ] @@ -3622,13 +3779,13 @@ version = "0.15.0-alpha.1" dependencies = [ "anyhow", "clap", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-app", "more-asserts", - "reqwest 0.12.23", + "reqwest 0.12.24", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", ] @@ -3637,7 +3794,25 @@ name = "gst-plugin-version-helper" version = "0.8.1" dependencies = [ "chrono", - "toml_edit 0.23.5", + "toml_edit 0.23.7", +] + +[[package]] +name = "gst-plugin-version-helper" +version = "0.8.1" +source = "git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs?tag=0.13.0#fea2343968da83f3cce860f5a76fa2a2b0f22c16" +dependencies = [ + "chrono", + "toml_edit 0.22.27", +] + +[[package]] +name = "gst-plugin-version-helper" +version = "0.8.1" +source = "git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs#284c3c3df35bdb3fe35d34bb4ab91e556148d960" +dependencies = [ + "chrono", + "toml_edit 0.23.7", ] [[package]] @@ -3649,11 +3824,11 @@ dependencies = [ "color-name", "color-thief", "dssim-core", - "gst-plugin-version-helper", - "gstreamer", - "gstreamer-base", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "image", "image_hasher", "rgb", @@ -3663,11 +3838,11 @@ dependencies = [ name = "gst-plugin-vvdec" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-audio", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "vvdec", ] @@ -3675,10 +3850,10 @@ dependencies = [ name = "gst-plugin-webp" version = "0.15.0-alpha.1" dependencies = [ - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-check", - "gstreamer-video", + "gstreamer-video 0.25.0", "libwebp-sys2", "pretty_assertions", ] @@ -3708,20 +3883,20 @@ dependencies = [ "fastrand", "futures", "gst-plugin-rtp", - "gst-plugin-version-helper", + "gst-plugin-version-helper 0.8.1", "gst-plugin-webrtc-signalling", "gst-plugin-webrtc-signalling-protocol", - "gstreamer", + "gstreamer 0.25.0", "gstreamer-app", "gstreamer-audio", - "gstreamer-base", + "gstreamer-base 0.25.0", "gstreamer-net", "gstreamer-rtp", "gstreamer-sdp", "gstreamer-utils", - "gstreamer-video", + "gstreamer-video 0.25.0", "gstreamer-webrtc", - "http 1.3.1", + "http 1.4.0", "human_bytes", "hyper-util", "itertools 0.14.0", @@ -3730,15 +3905,15 @@ dependencies = [ "parse_link_header", "rand 0.9.2", "regex", - "reqwest 0.12.23", - "rustls 0.23.31", + "reqwest 0.12.24", + "rustls 0.23.35", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tokio-stream", "tracing", "tracing-log", @@ -3759,15 +3934,15 @@ dependencies = [ "futures", "gst-plugin-webrtc-signalling-protocol", "pin-project-lite", - "rustls 0.23.31", + "rustls 0.23.35", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", "test-log", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tracing", "tracing-log", "tracing-subscriber", @@ -3789,49 +3964,73 @@ dependencies = [ "async-recursion", "bytes", "futures", - "gst-plugin-version-helper", - "gstreamer", + "gst-plugin-version-helper 0.8.1", + "gstreamer 0.25.0", "gstreamer-sdp", "gstreamer-webrtc", "parse_link_header", - "reqwest 0.12.23", - "rustls 0.23.31", + "reqwest 0.12.24", + "rustls 0.23.35", "tokio", ] +[[package]] +name = "gstreamer" +version = "0.23.7" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=0.23#0f9f71821ada8ec7c16c27e08181523cfb5d2a30" +dependencies = [ + "cfg-if", + "futures-channel", + "futures-core", + "futures-util", + "glib 0.20.12", + "gstreamer-sys 0.23.7", + "itertools 0.14.0", + "libc", + "muldiv", + "num-integer", + "num-rational", + "once_cell", + "option-operations 0.5.0", + "paste", + "pin-project-lite", + "smallvec", + "thiserror 2.0.17", +] + [[package]] name = "gstreamer" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ "cfg-if", "futures-channel", "futures-core", "futures-util", - "glib", - "gstreamer-sys", + "glib 0.22.0", + "gstreamer-sys 0.25.0", "itertools 0.14.0", "kstring", "libc", "muldiv", "num-integer", "num-rational", - "option-operations", - "pastey", + "option-operations 0.6.0", + "pastey 0.2.0", "pin-project-lite", "serde", "serde_bytes", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gstreamer-allocators" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-allocators-sys", "libc", ] @@ -3839,11 +4038,11 @@ dependencies = [ [[package]] name = "gstreamer-allocators-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gobject-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -3851,10 +4050,10 @@ dependencies = [ [[package]] name = "gstreamer-analytics" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-analytics-sys", "libc", ] @@ -3862,10 +4061,10 @@ dependencies = [ [[package]] name = "gstreamer-analytics-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -3873,25 +4072,25 @@ dependencies = [ [[package]] name = "gstreamer-app" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ "futures-core", "futures-sink", - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-app-sys", - "gstreamer-base", + "gstreamer-base 0.25.0", "libc", ] [[package]] name = "gstreamer-app-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gstreamer-base-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gstreamer-base-sys 0.25.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -3899,13 +4098,13 @@ dependencies = [ [[package]] name = "gstreamer-audio" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ "cfg-if", - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-audio-sys", - "gstreamer-base", + "gstreamer-base 0.25.0", "libc", "serde", "smallvec", @@ -3914,37 +4113,62 @@ dependencies = [ [[package]] name = "gstreamer-audio-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gobject-sys", - "gstreamer-base-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", + "gstreamer-base-sys 0.25.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] +[[package]] +name = "gstreamer-base" +version = "0.23.7" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=0.23#0f9f71821ada8ec7c16c27e08181523cfb5d2a30" +dependencies = [ + "atomic_refcell", + "cfg-if", + "glib 0.20.12", + "gstreamer 0.23.7", + "gstreamer-base-sys 0.23.7", + "libc", +] + [[package]] name = "gstreamer-base" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ "atomic_refcell", "cfg-if", - "glib", - "gstreamer", - "gstreamer-base-sys", + "glib 0.22.0", + "gstreamer 0.25.0", + "gstreamer-base-sys 0.25.0", + "libc", +] + +[[package]] +name = "gstreamer-base-sys" +version = "0.23.7" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=0.23#0f9f71821ada8ec7c16c27e08181523cfb5d2a30" +dependencies = [ + "glib-sys 0.20.12", + "gobject-sys 0.20.12", + "gstreamer-sys 0.23.7", "libc", + "system-deps", ] [[package]] name = "gstreamer-base-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gobject-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -3952,21 +4176,21 @@ dependencies = [ [[package]] name = "gstreamer-check" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-check-sys", ] [[package]] name = "gstreamer-check-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gobject-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -3974,23 +4198,23 @@ dependencies = [ [[package]] name = "gstreamer-gl" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", - "gstreamer-base", + "glib 0.22.0", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", "gstreamer-gl-sys", - "gstreamer-video", + "gstreamer-video 0.25.0", "libc", ] [[package]] name = "gstreamer-gl-egl" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-gl", "gstreamer-gl-egl-sys", "libc", @@ -3999,9 +4223,9 @@ dependencies = [ [[package]] name = "gstreamer-gl-egl-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", + "glib-sys 0.22.0", "gstreamer-gl-sys", "libc", "system-deps", @@ -4010,13 +4234,13 @@ dependencies = [ [[package]] name = "gstreamer-gl-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gobject-sys", - "gstreamer-base-sys", - "gstreamer-sys", - "gstreamer-video-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", + "gstreamer-base-sys 0.25.0", + "gstreamer-sys 0.25.0", + "gstreamer-video-sys 0.25.0", "libc", "system-deps", ] @@ -4024,10 +4248,10 @@ dependencies = [ [[package]] name = "gstreamer-gl-wayland" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-gl", "gstreamer-gl-wayland-sys", "libc", @@ -4036,9 +4260,9 @@ dependencies = [ [[package]] name = "gstreamer-gl-wayland-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", + "glib-sys 0.22.0", "gstreamer-gl-sys", "libc", "system-deps", @@ -4047,10 +4271,10 @@ dependencies = [ [[package]] name = "gstreamer-gl-x11" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-gl", "gstreamer-gl-x11-sys", "libc", @@ -4059,9 +4283,9 @@ dependencies = [ [[package]] name = "gstreamer-gl-x11-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", + "glib-sys 0.22.0", "gstreamer-gl-sys", "libc", "system-deps", @@ -4070,22 +4294,22 @@ dependencies = [ [[package]] name = "gstreamer-net" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ "gio", - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-net-sys", ] [[package]] name = "gstreamer-net-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "gio-sys", - "glib-sys", - "gstreamer-sys", + "gio-sys 0.22.0", + "glib-sys 0.22.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -4093,27 +4317,27 @@ dependencies = [ [[package]] name = "gstreamer-pbutils" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-audio", "gstreamer-pbutils-sys", - "gstreamer-video", + "gstreamer-video 0.25.0", "libc", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gstreamer-pbutils-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "gstreamer-audio-sys", - "gstreamer-sys", - "gstreamer-video-sys", + "gstreamer-sys 0.25.0", + "gstreamer-video-sys 0.25.0", "libc", "system-deps", ] @@ -4121,10 +4345,10 @@ dependencies = [ [[package]] name = "gstreamer-rtp" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-rtp-sys", "libc", ] @@ -4132,11 +4356,11 @@ dependencies = [ [[package]] name = "gstreamer-rtp-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gstreamer-base-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gstreamer-base-sys 0.25.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -4144,20 +4368,31 @@ dependencies = [ [[package]] name = "gstreamer-sdp" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-sdp-sys", ] [[package]] name = "gstreamer-sdp-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" +dependencies = [ + "glib-sys 0.22.0", + "gstreamer-sys 0.25.0", + "libc", + "system-deps", +] + +[[package]] +name = "gstreamer-sys" +version = "0.23.7" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=0.23#0f9f71821ada8ec7c16c27e08181523cfb5d2a30" dependencies = [ - "glib-sys", - "gstreamer-sys", + "glib-sys 0.20.12", + "gobject-sys 0.20.12", "libc", "system-deps", ] @@ -4165,11 +4400,11 @@ dependencies = [ [[package]] name = "gstreamer-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ "cfg-if", - "glib-sys", - "gobject-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "libc", "system-deps", ] @@ -4177,10 +4412,10 @@ dependencies = [ [[package]] name = "gstreamer-tag" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-tag-sys", "libc", ] @@ -4188,11 +4423,11 @@ dependencies = [ [[package]] name = "gstreamer-tag-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gobject-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -4200,39 +4435,68 @@ dependencies = [ [[package]] name = "gstreamer-utils" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "gstreamer", + "gstreamer 0.25.0", "gstreamer-app", - "gstreamer-video", - "thiserror 2.0.16", + "gstreamer-video 0.25.0", + "thiserror 2.0.17", +] + +[[package]] +name = "gstreamer-video" +version = "0.23.7" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=0.23#0f9f71821ada8ec7c16c27e08181523cfb5d2a30" +dependencies = [ + "cfg-if", + "futures-channel", + "glib 0.20.12", + "gstreamer 0.23.7", + "gstreamer-base 0.23.7", + "gstreamer-video-sys 0.23.7", + "libc", + "once_cell", + "thiserror 2.0.17", ] [[package]] name = "gstreamer-video" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ "cfg-if", "futures-channel", - "glib", - "gstreamer", - "gstreamer-base", - "gstreamer-video-sys", + "glib 0.22.0", + "gstreamer 0.25.0", + "gstreamer-base 0.25.0", + "gstreamer-video-sys 0.25.0", "libc", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", +] + +[[package]] +name = "gstreamer-video-sys" +version = "0.23.7" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=0.23#0f9f71821ada8ec7c16c27e08181523cfb5d2a30" +dependencies = [ + "glib-sys 0.20.12", + "gobject-sys 0.20.12", + "gstreamer-base-sys 0.23.7", + "gstreamer-sys 0.23.7", + "libc", + "system-deps", ] [[package]] name = "gstreamer-video-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", - "gobject-sys", - "gstreamer-base-sys", - "gstreamer-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", + "gstreamer-base-sys 0.25.0", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -4240,10 +4504,10 @@ dependencies = [ [[package]] name = "gstreamer-webrtc" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib", - "gstreamer", + "glib 0.22.0", + "gstreamer 0.25.0", "gstreamer-sdp", "gstreamer-webrtc-sys", "libc", @@ -4252,11 +4516,11 @@ dependencies = [ [[package]] name = "gstreamer-webrtc-sys" version = "0.25.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#8a41295b995e4154dee1c18cfea77efc25ec3817" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#d49c01e8d1ea68c6a15ea3520b0f2faa5048b29e" dependencies = [ - "glib-sys", + "glib-sys 0.22.0", "gstreamer-sdp-sys", - "gstreamer-sys", + "gstreamer-sys 0.25.0", "libc", "system-deps", ] @@ -4264,7 +4528,7 @@ dependencies = [ [[package]] name = "gtk4" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "cairo-rs", "field-offset", @@ -4272,7 +4536,7 @@ dependencies = [ "gdk-pixbuf", "gdk4", "gio", - "glib", + "glib 0.22.0", "graphene-rs", "gsk4", "gtk4-macros", @@ -4284,25 +4548,25 @@ dependencies = [ [[package]] name = "gtk4-macros" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "gtk4-sys" version = "0.11.0" -source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#e8b597d2285cebf2c13373dc883e9a7e2bec2a00" +source = "git+https://github.com/gtk-rs/gtk4-rs?branch=main#b0d393818198bfa99fbc4b3f68c5263c1b591e08" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk4-sys", - "gio-sys", - "glib-sys", - "gobject-sys", + "gio-sys 0.22.0", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "graphene-sys", "gsk4-sys", "libc", @@ -4322,7 +4586,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.11.3", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -4340,8 +4604,8 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.3.1", - "indexmap 2.11.3", + "http 1.4.0", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -4362,7 +4626,18 @@ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", ] [[package]] @@ -4374,7 +4649,7 @@ dependencies = [ "base64 0.22.1", "bytes", "headers-core", - "http 1.3.1", + "http 1.4.0", "httpdate", "mime", "sha1", @@ -4386,7 +4661,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.3.1", + "http 1.4.0", ] [[package]] @@ -4424,13 +4699,19 @@ dependencies = [ [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + [[package]] name = "hrtf" version = "0.8.1" @@ -4455,12 +4736,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -4482,7 +4762,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http 1.4.0", ] [[package]] @@ -4493,7 +4773,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "pin-project-lite", ] @@ -4548,16 +4828,16 @@ dependencies = [ [[package]] name = "hyper" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", "h2 0.4.12", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "httparse", "httpdate", @@ -4578,8 +4858,8 @@ dependencies = [ "bytes", "futures-util", "headers", - "http 1.3.1", - "hyper 1.7.0", + "http 1.4.0", + "hyper 1.8.1", "hyper-rustls 0.26.0", "hyper-util", "pin-project-lite", @@ -4613,8 +4893,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", - "http 1.3.1", - "hyper 1.7.0", + "http 1.4.0", + "hyper 1.8.1", "hyper-util", "log", "rustls 0.22.4", @@ -4631,14 +4911,14 @@ version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http 1.3.1", - "hyper 1.7.0", + "http 1.4.0", + "hyper 1.8.1", "hyper-util", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tower-service", "webpki-roots", ] @@ -4658,23 +4938,23 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", - "hyper 1.7.0", + "hyper 1.8.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", + "socket2 0.6.1", "system-configuration 0.6.1", "tokio", "tower-service", @@ -4717,7 +4997,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.0", + "windows-core 0.62.2", ] [[package]] @@ -4731,9 +5011,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -4744,11 +5024,10 @@ dependencies = [ [[package]] name = "icu_locale" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ae5921528335e91da1b6c695dbf1ec37df5ac13faa3f91e5640be93aa2fbefd" +checksum = "532b11722e350ab6bf916ba6eb0efe3ee54b932666afec989465f9243fe6dd60" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_locale_data", @@ -4760,12 +5039,13 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", + "serde", "tinystr", "writeable", "zerovec", @@ -4773,17 +5053,16 @@ dependencies = [ [[package]] name = "icu_locale_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fdef0c124749d06a743c69e938350816554eb63ac979166590e2b4ee4252765" +checksum = "f03e2fcaefecdf05619f3d6f91740e79ab969b4dd54f77cbf546b1d0d28e3147" [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -4794,42 +5073,40 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", + "serde", "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -4839,15 +5116,13 @@ dependencies = [ [[package]] name = "icu_segmenter" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e185fc13b6401c138cf40db12b863b35f5edf31b88192a545857b41aeaf7d3d3" +checksum = "43da5e7e9b540df15e53ca27f69b50e36e01b652584b40b3335ed65d18303834" dependencies = [ "core_maths", - "displaydoc", "icu_collections", "icu_locale", - "icu_locale_core", "icu_provider", "icu_segmenter_data", "potential_utf", @@ -4857,9 +5132,9 @@ dependencies = [ [[package]] name = "icu_segmenter_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5360a2fbe97f617c4f8b944356dedb36d423f7da7f13c070995cf89e59f01220" +checksum = "6ebbb7321d9e21d25f5660366cb6c08201d0175898a3a6f7a41ee9685af21c80" [[package]] name = "ident_case" @@ -4890,12 +5165,13 @@ dependencies = [ [[package]] name = "image" -version = "0.25.6" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", + "moxcms", "num-traits", ] @@ -4914,9 +5190,9 @@ dependencies = [ [[package]] name = "imgref" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" [[package]] name = "indexmap" @@ -4931,12 +5207,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.3" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92119844f513ffa41556430369ab02c295a3578af21cf945caa3e9e0c2481ac3" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -4958,18 +5234,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", + "syn 2.0.111", ] [[package]] @@ -4980,9 +5245,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -5009,9 +5274,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "iso8601" @@ -5066,26 +5331,26 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" dependencies = [ "jiff-static", "log", "portable-atomic", "portable-atomic-util", - "serde", + "serde_core", ] [[package]] name = "jiff-static" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -5116,15 +5381,15 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -5182,9 +5447,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libfuzzer-sys" @@ -5198,12 +5463,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-link 0.2.1", ] [[package]] @@ -5218,7 +5483,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "redox_syscall", ] @@ -5234,13 +5499,13 @@ dependencies = [ "ctr", "futures-util", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-util", "librespot-core", "log", "parking_lot", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", ] @@ -5261,10 +5526,10 @@ dependencies = [ "futures-util", "governor", "hmac", - "http 1.3.1", + "http 1.4.0", "http-body-util", "httparse", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-proxy2", "hyper-rustls 0.27.7", "hyper-util", @@ -5282,7 +5547,7 @@ dependencies = [ "priority-queue", "protobuf", "protobuf-json-mapping", - "quick-xml 0.38.3", + "quick-xml 0.38.4", "rand 0.9.2", "rand_distr", "rsa", @@ -5291,7 +5556,7 @@ dependencies = [ "sha1", "shannon", "sysinfo", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", "tokio", "tokio-stream", @@ -5316,7 +5581,7 @@ dependencies = [ "protobuf", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "uuid", ] @@ -5329,8 +5594,8 @@ dependencies = [ "log", "oauth2", "open", - "reqwest 0.12.23", - "thiserror 2.0.16", + "reqwest 0.12.24", + "thiserror 2.0.17", "url", ] @@ -5352,7 +5617,7 @@ dependencies = [ "rand_distr", "shell-words", "symphonia", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "zerocopy", ] @@ -5406,15 +5671,15 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "litrs" -version = "0.4.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "livekit-api" @@ -5457,11 +5722,10 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -5482,11 +5746,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe949189f46fabb938b3a9a0be30fdd93fd8a09260da863399a8cf3db756ec8" +checksum = "96051b46fc183dc9cd4a223960ef37b9af631b55191852a8274bfef064cda20f" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", ] [[package]] @@ -5536,9 +5800,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" @@ -5583,13 +5847,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -5598,6 +5862,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" +[[package]] +name = "moxcms" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608" +dependencies = [ + "num-traits", + "pxfm", +] + [[package]] name = "mp4-atom" version = "0.8.1" @@ -5634,11 +5908,12 @@ dependencies = [ [[package]] name = "nasm-rs" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12fcfa1bd49e0342ec1d07ed2be83b59963e7acbeb9310e1bb2c07b69dadd959" +checksum = "34f676553b60ccbb76f41f9ae8f2428dac3f259ff8f1c2468a174778d06a1af9" dependencies = [ "jobserver", + "log", ] [[package]] @@ -5670,7 +5945,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -5728,11 +6003,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -5761,11 +6036,10 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", @@ -5799,7 +6073,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -5872,9 +6146,9 @@ dependencies = [ "base64 0.22.1", "chrono", "getrandom 0.2.16", - "http 1.3.1", + "http 1.4.0", "rand 0.8.5", - "reqwest 0.12.23", + "reqwest 0.12.24", "serde", "serde_json", "serde_path_to_error", @@ -5883,20 +6157,35 @@ dependencies = [ "url", ] +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + [[package]] name = "objc2-core-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + [[package]] name = "objc2-io-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" dependencies = [ "libc", "objc2-core-foundation", @@ -5904,9 +6193,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -5928,15 +6217,15 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "open" -version = "5.3.2" +version = "5.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" dependencies = [ "is-wsl", "libc", @@ -5945,11 +6234,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "foreign-types", "libc", @@ -5966,7 +6255,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -5977,9 +6266,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -5987,13 +6276,22 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-operations" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0" +dependencies = [ + "paste", +] + [[package]] name = "option-operations" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b31ce827892359f23d3cd1cc4c75a6c241772bbd2db17a92dcf27cbefdf52689" dependencies = [ - "pastey", + "pastey 0.1.1", ] [[package]] @@ -6016,10 +6314,10 @@ dependencies = [ [[package]] name = "pango" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ "gio", - "glib", + "glib 0.22.0", "libc", "pango-sys", ] @@ -6027,10 +6325,10 @@ dependencies = [ [[package]] name = "pango-sys" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ - "glib-sys", - "gobject-sys", + "glib-sys 0.22.0", + "gobject-sys 0.22.0", "libc", "system-deps", ] @@ -6038,10 +6336,10 @@ dependencies = [ [[package]] name = "pangocairo" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ "cairo-rs", - "glib", + "glib 0.22.0", "libc", "pango", "pangocairo-sys", @@ -6050,10 +6348,10 @@ dependencies = [ [[package]] name = "pangocairo-sys" version = "0.22.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#bbe4d709b7337f1bfea7b2a347524689979c6756" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c0b9daec43e00bdd90fc067b2047074dac39c005" dependencies = [ "cairo-sys-rs", - "glib-sys", + "glib-sys 0.22.0", "libc", "pango-sys", "system-deps", @@ -6067,9 +6365,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -6077,9 +6375,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "backtrace", "cfg-if", @@ -6087,8 +6385,7 @@ dependencies = [ "petgraph", "redox_syscall", "smallvec", - "thread-id", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -6097,7 +6394,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbc23fdb8bbf668d582b0c17120bf6b7f91d85ccad3a5b39706f019a4efda005" dependencies = [ - "http 1.3.1", + "http 1.4.0", "lazy_static", "regex", "url", @@ -6115,6 +6412,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" +[[package]] +name = "pastey" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d6c094ee800037dff99e02cab0eaf3142826586742a270ab3d7a62656bd27a" + [[package]] name = "pathdiff" version = "0.2.3" @@ -6181,12 +6484,12 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ "base64 0.22.1", - "serde", + "serde_core", ] [[package]] @@ -6211,7 +6514,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.11.3", + "indexmap 2.12.1", ] [[package]] @@ -6231,7 +6534,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6289,7 +6592,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "crc32fast", "fdeflate", "flate2", @@ -6313,7 +6616,7 @@ dependencies = [ "hermit-abi", "pin-project-lite", "rustix 1.1.2", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -6333,11 +6636,12 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ - "serde", + "serde_core", + "writeable", "zerovec", ] @@ -6373,7 +6677,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6387,12 +6691,13 @@ dependencies = [ [[package]] name = "priority-queue" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e7f4ffd8645efad783fc2844ac842367aa2e912d484950192564d57dc039a3a" +checksum = "93980406f12d9f8140ed5abe7155acb10bb1e69ea55c88960b9c2f117445ef96" dependencies = [ "equivalent", - "indexmap 2.11.3", + "indexmap 2.12.1", + "serde", ] [[package]] @@ -6401,7 +6706,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.5", + "toml_edit 0.23.7", ] [[package]] @@ -6423,14 +6728,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -6451,7 +6756,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6481,7 +6786,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.106", + "syn 2.0.111", "tempfile", ] @@ -6495,7 +6800,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6551,7 +6856,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4aeaa1f2460f1d348eeaeed86aea999ce98c1bded6f089ff8514c9d9dbdc973" dependencies = [ "anyhow", - "indexmap 2.11.3", + "indexmap 2.12.1", "log", "protobuf", "protobuf-support", @@ -6585,6 +6890,15 @@ dependencies = [ "psl-types", ] +[[package]] +name = "pxfm" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3502d6155304a4173a5f2c34b52b7ed0dd085890326cb50fd625fdf39e86b3b" +dependencies = [ + "num-traits", +] + [[package]] name = "quick-xml" version = "0.37.5" @@ -6597,9 +6911,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.38.3" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" dependencies = [ "memchr", "serde", @@ -6617,9 +6931,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.31", - "socket2 0.6.0", - "thiserror 2.0.16", + "rustls 0.23.35", + "socket2 0.6.1", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -6633,16 +6947,16 @@ checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "fastbloom", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", "rand 0.9.2", "ring", "rustc-hash 2.1.1", - "rustls 0.23.31", + "rustls 0.23.35", "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror 2.0.16", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -6657,16 +6971,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.0", + "socket2 0.6.1", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -6733,7 +7047,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", ] [[package]] @@ -6784,7 +7098,7 @@ dependencies = [ "rand 0.9.2", "rand_chacha 0.9.0", "simd_helpers", - "thiserror 2.0.16", + "thiserror 2.0.17", "v_frame", ] @@ -6810,9 +7124,9 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c83367ba62b3f1dbd0f086ede4e5ebfb4713fb234dbbc5807772a31245ff46d" +checksum = "5fae430c6b28f1ad601274e78b7dffa0546de0b73b4cd32f46723c0c2a16f7a5" dependencies = [ "pem", "ring", @@ -6832,38 +7146,38 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -6873,9 +7187,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -6884,15 +7198,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" @@ -6936,9 +7250,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "async-compression", "base64 0.22.1", @@ -6950,10 +7264,10 @@ dependencies = [ "futures-core", "futures-util", "h2 0.4.12", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-rustls 0.27.7", "hyper-util", "js-sys", @@ -6962,15 +7276,15 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tokio-util", "tower", "tower-http", @@ -7018,9 +7332,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" dependencies = [ "const-oid", "digest", @@ -7135,7 +7449,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -7148,11 +7462,11 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -7183,15 +7497,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.6", + "rustls-webpki 0.103.8", "subtle", "zeroize", ] @@ -7223,14 +7537,14 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.4.0", + "security-framework 3.5.1", ] [[package]] @@ -7253,9 +7567,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" dependencies = [ "web-time", "zeroize", @@ -7263,23 +7577,23 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be59af91596cac372a6942530653ad0c3a246cdd491aaa9dcaee47f88d67d5a0" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", "once_cell", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-platform-verifier-android", - "rustls-webpki 0.103.6", - "security-framework 3.4.0", + "rustls-webpki 0.103.8", + "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7311,9 +7625,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.6" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "ring", "rustls-pki-types", @@ -7356,7 +7670,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -7373,9 +7687,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" dependencies = [ "dyn-clone", "ref-cast", @@ -7441,7 +7755,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -7450,11 +7764,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -7479,9 +7793,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -7499,22 +7813,22 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -7543,18 +7857,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2789234a13a53fc4be1b51ea1bab45a3c338bdb884862a257d10e5a74ae009e6" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ "serde_core", ] @@ -7573,19 +7878,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.0" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.3", + "indexmap 2.12.1", "schemars 0.9.0", - "schemars 1.0.4", - "serde", - "serde_derive", + "schemars 1.1.0", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -7593,14 +7897,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.0" +version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -7625,7 +7929,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -7692,18 +7996,18 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] [[package]] name = "signalsmith-stretch" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6b809d47705ed26a237cb032c4e9b781cd583ac5337d66a4501fca11c74c17f" +checksum = "51dae6f10b5532510f65c309c4d868babe3aecf6ce0782678081338311f176fd" dependencies = [ "bindgen 0.70.1", "cc", @@ -7765,7 +8069,7 @@ dependencies = [ "regex", "serde_json", "tar", - "toml 0.9.6", + "toml", ] [[package]] @@ -7774,7 +8078,7 @@ version = "0.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f488bd4ff0179b10e2a8e55b93707458ff37c5110458bf00a27518b957252074" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "skia-bindings", ] @@ -7808,12 +8112,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -7868,18 +8172,18 @@ dependencies = [ [[package]] name = "sprintf" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78222247fc55e10208ed1ba60f8296390bc67a489bc27a36231765d8d6f60ec5" +checksum = "b0e59842c3aac5c7901ea11bbb02e60e5d67263b43d4361dec9303cca8e764eb" dependencies = [ - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -7907,9 +8211,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "symphonia" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +checksum = "5773a4c030a19d9bfaa090f49746ff35c75dfddfa700df7a5939d5e076a57039" dependencies = [ "lazy_static", "symphonia-bundle-mp3", @@ -7921,9 +8225,9 @@ dependencies = [ [[package]] name = "symphonia-bundle-mp3" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" +checksum = "4872dd6bb56bf5eac799e3e957aa1981086c3e613b27e0ac23b176054f7c57ed" dependencies = [ "lazy_static", "log", @@ -7933,9 +8237,9 @@ dependencies = [ [[package]] name = "symphonia-codec-vorbis" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30" +checksum = "f025837c309cd69ffef572750b4a2257b59552c5399a5e49707cc5b1b85d1c73" dependencies = [ "log", "symphonia-core", @@ -7944,9 +8248,9 @@ dependencies = [ [[package]] name = "symphonia-core" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +checksum = "ea00cc4f79b7f6bb7ff87eddc065a1066f3a43fe1875979056672c9ef948c2af" dependencies = [ "arrayvec", "bitflags 1.3.2", @@ -7957,9 +8261,9 @@ dependencies = [ [[package]] name = "symphonia-format-ogg" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada3505789516bcf00fc1157c67729eded428b455c27ca370e41f4d785bfa931" +checksum = "2b4955c67c1ed3aa8ae8428d04ca8397fbef6a19b2b051e73b5da8b1435639cb" dependencies = [ "log", "symphonia-core", @@ -7969,9 +8273,9 @@ dependencies = [ [[package]] name = "symphonia-metadata" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +checksum = "36306ff42b9ffe6e5afc99d49e121e0bd62fe79b9db7b9681d48e29fa19e6b16" dependencies = [ "encoding_rs", "lazy_static", @@ -7981,9 +8285,9 @@ dependencies = [ [[package]] name = "symphonia-utils-xiph" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "484472580fa49991afda5f6550ece662237b00c6f562c7d9638d1b086ed010fe" +checksum = "ee27c85ab799a338446b68eec77abf42e1a6f1bb490656e121c6e27bfbab9f16" dependencies = [ "symphonia-core", "symphonia-metadata", @@ -8002,9 +8306,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -8034,7 +8338,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8068,7 +8372,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "system-configuration-sys 0.6.0", ] @@ -8095,14 +8399,14 @@ dependencies = [ [[package]] name = "system-deps" -version = "7.0.5" +version = "7.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4be53aa0cba896d2dc615bd42bbc130acdcffa239e0a2d965ea5b3b2a86ffdb" +checksum = "48c8f33736f986f16d69b6cb8b03f55ddcad5c41acc4ccc39dd88e84aa805e7f" dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.23", + "toml", "version-compare", ] @@ -8119,28 +8423,28 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "tempfile" -version = "3.22.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "rustix 1.1.2", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] name = "test-log" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e33b98a582ea0be1168eba097538ee8dd4bbe0f2b01b22ac92ea30054e5be7b" +checksum = "37d53ac171c92a39e4769491c4b4dde7022c60042254b5fc044ae409d34a24d4" dependencies = [ "test-log-macros", "tracing-subscriber", @@ -8148,26 +8452,26 @@ dependencies = [ [[package]] name = "test-log-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36" +checksum = "be35209fd0781c5401458ab66e4f98accf63553e8fae7425503e92fdd319783b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "test-with" -version = "0.15.3" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c82f52ec88a4992bd0c46b8ef271c070c52689bf34f7effae7a26708cbf13d" +checksum = "63b34ca6990bbf04e3d49c1e3ea4b4ad6c9e15602927d37ec48687df39c2ef8b" dependencies = [ "proc-macro-error2", "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8193,11 +8497,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -8208,28 +8512,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "thread-id" -version = "4.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe8f25bbdd100db7e1d34acf7fd2dc59c4bf8f7483f505eaa7d4f12f76cc0ea" -dependencies = [ - "libc", - "winapi", + "syn 2.0.111", ] [[package]] @@ -8243,11 +8537,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", + "itoa", "libc", "num-conv", "num_threads", @@ -8275,11 +8570,12 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", + "serde_core", "zerovec", ] @@ -8300,33 +8596,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.6.1", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8362,11 +8655,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.31", + "rustls 0.23.35", "tokio", ] @@ -8403,19 +8696,19 @@ checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" dependencies = [ "futures-util", "log", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tungstenite 0.27.0", ] [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -8426,26 +8719,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "0.9.6" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae2a4cf385da23d1d53bc15cdfa5c2109e93d8d362393c801e87da2f72f0e201" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "indexmap 2.11.3", + "indexmap 2.12.1", "serde_core", - "serde_spanned 1.0.1", - "toml_datetime 0.7.1", + "serde_spanned", + "toml_datetime 0.7.3", "toml_parser", "toml_writer", "winnow", @@ -8456,15 +8737,12 @@ name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] [[package]] name = "toml_datetime" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a197c0ec7d131bfc6f7e82c8442ba1595aeab35da7adbf05b6b73cd06a16b6be" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] @@ -8475,39 +8753,37 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.3", - "serde", - "serde_spanned 0.6.9", + "indexmap 2.12.1", "toml_datetime 0.6.11", "winnow", ] [[package]] name = "toml_edit" -version = "0.23.5" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ad0b7ae9cfeef5605163839cb9221f453399f15cfb5c10be9885fcf56611f9" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ - "indexmap 2.11.3", - "toml_datetime 0.7.1", + "indexmap 2.12.1", + "toml_datetime 0.7.3", "toml_parser", "winnow", ] [[package]] name = "toml_parser" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" [[package]] name = "tower" @@ -8526,14 +8802,14 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "iri-string", "pin-project-lite", @@ -8556,9 +8832,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "log", "pin-project-lite", @@ -8568,20 +8844,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", "valuable", @@ -8600,9 +8876,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", "nu-ansi-term", @@ -8660,23 +8936,23 @@ checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" dependencies = [ "bytes", "data-encoding", - "http 1.3.1", + "http 1.4.0", "httparse", "log", "rand 0.9.2", - "rustls 0.23.31", + "rustls 0.23.35", "rustls-pki-types", "sha1", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", "utf-8", ] [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicase" @@ -8686,9 +8962,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-linebreak" @@ -8698,9 +8974,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "untrusted" @@ -8759,7 +9035,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "js-sys", "wasm-bindgen", ] @@ -8833,9 +9109,9 @@ dependencies = [ [[package]] name = "version-compare" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" [[package]] name = "version_check" @@ -8855,7 +9131,7 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "689743f6dc5c608197123319f088d73d3048a9e5d93682b95b8a347243975cb0" dependencies = [ - "thiserror 2.0.16", + "thiserror 2.0.17", "vvdec-sys", ] @@ -8904,10 +9180,10 @@ dependencies = [ "bytes", "futures-util", "headers", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-util", "log", "mime", @@ -8930,15 +9206,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" @@ -8950,9 +9217,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", @@ -8961,25 +9228,11 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.53" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -8990,9 +9243,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9000,31 +9253,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.106", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.80" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -9042,13 +9295,13 @@ dependencies = [ [[package]] name = "web-transport-proto" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb650c577c46254d16041c7fe0dc9901d9a42df3f46e77e9d05d1b3c17294b19" +checksum = "974fa1e325e6cc5327de8887f189a441fcff4f8eedcd31ec87f0ef0cc5283fbc" dependencies = [ "bytes", - "http 1.3.1", - "thiserror 2.0.16", + "http 1.4.0", + "thiserror 2.0.17", "url", ] @@ -9060,12 +9313,12 @@ checksum = "ccba8a1ab2aae70119c9ada57e4a2324ebe1820a18814ca47a818f01dcd00f46" dependencies = [ "bytes", "futures", - "http 1.3.1", + "http 1.4.0", "log", "quinn", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", - "thiserror 2.0.16", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", + "thiserror 2.0.17", "tokio", "url", "web-transport-proto", @@ -9102,27 +9355,27 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" +checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] [[package]] name = "weezl" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "which" @@ -9158,7 +9411,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -9204,15 +9457,15 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.62.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.0", - "windows-result 0.4.0", - "windows-strings 0.5.0", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -9228,24 +9481,24 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -9256,9 +9509,9 @@ checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-numerics" @@ -9272,13 +9525,13 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -9292,11 +9545,11 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -9310,11 +9563,11 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -9359,16 +9612,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -9419,19 +9672,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.1.3", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -9463,9 +9716,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -9487,9 +9740,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -9511,9 +9764,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -9523,9 +9776,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -9547,9 +9800,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -9571,9 +9824,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -9595,9 +9848,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -9619,15 +9872,15 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -9650,15 +9903,15 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "xattr" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", "rustix 1.1.2", @@ -9666,9 +9919,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.27" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xmlparser" @@ -9708,11 +9961,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -9720,34 +9972,34 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -9767,21 +10019,21 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -9790,10 +10042,11 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ + "serde", "yoke", "zerofrom", "zerovec-derive", @@ -9801,11 +10054,11 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] diff --git a/Cargo.toml b/Cargo.toml index 5a1b3ad68..10fac954b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,6 +59,7 @@ members = [ "video/cdg", "video/closedcaption", "video/dav1d", + "video/dsc", "video/ffv1", "video/gif", "video/gtk4", diff --git a/video/dsc/Cargo.toml b/video/dsc/Cargo.toml new file mode 100644 index 000000000..03f463faa --- /dev/null +++ b/video/dsc/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "gst-plugin-dsc" +version = "0.1.0" +authors = ["Diego Nieto "] +edition = "2021" +description = "GStreamer Digital Signed Content plugin" +repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs" +license = "MPL-2.0" + +[dependencies] +hound = "3" +anyhow = "1" +glib.workspace = true +gst = { workspace = true, features = ["v1_20"] } +gst-base = { workspace = true, features = ["v1_20"] } +gst-video = { workspace = true, features = ["v1_30"] } +human_bytes = { version = "0.4", default-features = false } +atomic_refcell = "0.1" + +openssl = "0.10" +rsa = "0.9" +rand = "0.9.2" +sha2 = "0.10" +base64ct = "1.7.0" +once_cell = "1" +hex = "0.4" + +[lib] +name = "gstdsc" +crate-type = ["cdylib", "rlib"] +path = "src/lib.rs" + +[build-dependencies] +gst-plugin-version-helper = { git = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs" } + +[features] +capi = [] +static = [] +doc = ["gst/v1_16"] + +[dev-dependencies] +gst-check = { workspace = true, features = ["v1_20"] } \ No newline at end of file diff --git a/video/dsc/LICENSE-MPL-2.0 b/video/dsc/LICENSE-MPL-2.0 new file mode 100644 index 000000000..14e2f777f --- /dev/null +++ b/video/dsc/LICENSE-MPL-2.0 @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/video/dsc/README.md b/video/dsc/README.md new file mode 100644 index 000000000..071566136 --- /dev/null +++ b/video/dsc/README.md @@ -0,0 +1,36 @@ +# GStreamer DSC Plugin + +A GStreamer plugin for Digitaly Signed Content (DSC) that provides cryptographic signing and verification for some encoded video data based on OpenSSL library. DSC allows to verify the authenticity of the videos. +They are mechanisms for trustworthy authentication and verification of video content have recently been developed by JVET for inclusion into these video coding standards. This has been realized by three new supplemental enhancement information (SEI) messages which enable to attach cryptographic signatures to flexible chunks of data of a video stream at the network abstraction layer (NAL) unit level. + +The following are the references used for this implementation: +* Paper: https://www.hhi.fraunhofer.de/fileadmin/Events/2025/IBC_2025/IBC2025PaperAuthentication_HHI.pdf +* JVET Specs: https://www.jvet-experts.org/doc_end_user/documents/40_Geneva/wg11/JVET-AN1019-v1.zip +* DSC implementation in VVC VTM: https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/releases/VTM-23.13 + +## Elements + +- **DSC Signer**: Signs data packets based on the specified hash method +- **DSC Verifier**: Verifies the signed data + +## Generate certificate samples +### Create CA +```bash +openssl genrsa -out example_ca.key 4096 +openssl genrsa -aes256 -out example_ca.key 4096 +openssl req -x509 -new -nodes -key example_ca.key -sha256 -days 1826 -out example_ca.crt +openssl x509 -in example_ca.crt -noout -pubkey -out example_ca.pub +``` + +### Create Content Provider certificate +```bash +openssl genrsa -out example_content.key 4096 +openssl req -new -key example_content.key -out example_content.csr +openssl x509 -req -in example_content.csr -CA example_ca.crt -CAkey example_ca.key -out example_content.crt -days 730 -sha256 +openssl x509 -in example_content.crt -noout -pubkey -out example_content.pub +``` + +## Example +```bash +gst-launch-1.0 videotestsrc pattern=ball num-buffers=30 ! "video/x-raw,framerate=30/1" ! videoconvert ! x264enc key-int-max=5 ! dscsigner private-key-path= ./example_content.key public-key-uri= ./example_content.crt substream-length=5 ! dscverifier key-store-path= `pwd` ! h264parse ! avdec_h264 ! videoconvert ! autovideosink +``` diff --git a/video/dsc/build.rs b/video/dsc/build.rs new file mode 100644 index 000000000..19d5e1afb --- /dev/null +++ b/video/dsc/build.rs @@ -0,0 +1,12 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +fn main() { + gst_plugin_version_helper::info() +} diff --git a/video/dsc/src/common.rs b/video/dsc/src/common.rs new file mode 100644 index 000000000..add06d451 --- /dev/null +++ b/video/dsc/src/common.rs @@ -0,0 +1,75 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +use openssl::hash::MessageDigest; + +/// Hash method enum shared between signer and verifier +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum HashMethod { + Sha1, + Sha224, + Sha256, + Sha384, + Sha512, +} + +impl HashMethod { + pub fn to_openssl(self) -> MessageDigest { + match self { + HashMethod::Sha1 => MessageDigest::sha1(), + HashMethod::Sha224 => MessageDigest::sha224(), + HashMethod::Sha256 => MessageDigest::sha256(), + HashMethod::Sha384 => MessageDigest::sha384(), + HashMethod::Sha512 => MessageDigest::sha512(), + } + } +} + +impl Default for HashMethod { + fn default() -> Self { + HashMethod::Sha256 + } +} + +impl ToString for HashMethod { + fn to_string(&self) -> String { + match self { + HashMethod::Sha1 => "sha1", + HashMethod::Sha224 => "sha224", + HashMethod::Sha256 => "sha256", + HashMethod::Sha384 => "sha384", + HashMethod::Sha512 => "sha512", + }.to_string() + } +} + +impl From for HashMethod { + fn from(value: u8) -> Self { + match value { + 0 => HashMethod::Sha1, + 1 => HashMethod::Sha224, + 2 => HashMethod::Sha256, + 3 => HashMethod::Sha384, + 4 => HashMethod::Sha512, + _ => HashMethod::Sha256, // default + } + } +} + +impl Into for HashMethod { + fn into(self) -> u8 { + match self { + HashMethod::Sha1 => 0, + HashMethod::Sha224 => 1, + HashMethod::Sha256 => 2, + HashMethod::Sha384 => 3, + HashMethod::Sha512 => 4, + } + } +} diff --git a/video/dsc/src/dsc_substream.rs b/video/dsc/src/dsc_substream.rs new file mode 100644 index 000000000..52487b470 --- /dev/null +++ b/video/dsc/src/dsc_substream.rs @@ -0,0 +1,207 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +use anyhow::{Result, anyhow}; +use openssl::hash::Hasher; +use std::sync::LazyLock; + +static CAT: LazyLock = LazyLock::new(|| { + gst::DebugCategory::new( + "dsc-substream", + gst::DebugColorFlags::empty(), + Some("DSC Substream Manager") + ) +}); + +#[derive(Clone)] +pub struct DscSubstream { + hasher: Option, +} + +impl DscSubstream { + pub fn new(hash_method: openssl::hash::MessageDigest) -> Result { + let hasher = Hasher::new(hash_method)?; + Ok(Self { + hasher: Some(hasher), + }) + } + + pub fn add_to_substream(&mut self, data: &[u8]) -> Result<()> { + if self.hasher.is_none() { + return Err(anyhow!("Substream hasher not initialized")); + } + + if let Some(ref mut hasher) = self.hasher { + gst::trace!(*CAT, "DscSubstream::add_to_substream - adding {} bytes", data.len()); + gst::trace!(*CAT, " First 32 bytes: {:02x?}", &data[..std::cmp::min(32, data.len())]); + gst::trace!(*CAT, " Last 32 bytes: {:02x?}", &data[data.len().saturating_sub(32)..]); + + gst::debug!(*CAT, " → Hashing {} bytes: {:02x?}...", data.len(), &data[..std::cmp::min(16, data.len())]); + + hasher.update(data)?; + } + + Ok(()) + } + + pub fn finalize(&mut self) -> Result> { + if let Some(mut hasher) = self.hasher.take() { + let digest = hasher.finish()?; + gst::debug!(*CAT, "Finalized substream digest: {} bytes", digest.len()); + gst::debug!(*CAT, " Full digest: {:02x?}", digest.as_ref()); + Ok(digest.to_vec()) + } else { + Err(anyhow!("Substream already finalized")) + } + } +} + +pub struct DscSubstreamManager { + hash_method_byte: u8, + content_uuid: Option<[u8; 16]>, + + substreams: Vec>, + + last_digest: Option>, +} + +impl DscSubstreamManager { + pub fn new( + hash_method: openssl::hash::MessageDigest, + hash_method_byte: u8, + content_uuid: Option<[u8; 16]>, + ) -> Result { + // Initialize the first substream + let substream = DscSubstream::new(hash_method)?; + + Ok(Self { + hash_method_byte, + content_uuid, + substreams: vec![Some(substream)], + last_digest: None, + }) + } + + pub fn add_to_substream(&mut self, substream_id: usize, data: &[u8]) -> Result<()> { + if substream_id >= self.substreams.len() { + return Err(anyhow!("Invalid substream ID: {}", substream_id)); + } + + if self.substreams[substream_id].is_none() { + return Err(anyhow!("Substream {} not initialized", substream_id)); + } + + gst::trace!(*CAT, "DscSubstreamManager::add_to_substream - substream {}, {} bytes total", + substream_id, data.len()); + + if let Some(ref mut substream) = self.substreams[substream_id] { + substream.add_to_substream(data)?; + } + + Ok(()) + } + + // Creates the data packet that will be signed: [ref_digest][current_digest][hash_method][uuid?] + pub fn create_data_packet(&mut self, substream_id: usize) -> Result> { + let current_digest = self.finalize_substream(substream_id)?; + + gst::debug!(*CAT, "Creating data packet for substream {}", substream_id); + gst::debug!(*CAT, "Current digest ({} bytes): {:02x?}", current_digest.len(), current_digest); + + let mut data_packet = Vec::new(); + + // Reference digest (all 0xFF for first GOP, or last digest from previous GOP) + let ref_digest = if let Some(ref last) = self.last_digest { + gst::debug!(*CAT, "Using previous digest as reference ({} bytes)", last.len()); + last.clone() + } else { + gst::debug!(*CAT, "First GOP - using all 0xFF as reference digest"); + vec![0xFF; current_digest.len()] + }; + + gst::debug!(*CAT, "Reference digest ({} bytes): {:02x?}", ref_digest.len(), &ref_digest[..std::cmp::min(32, ref_digest.len())]); + data_packet.extend_from_slice(&ref_digest); + + // Current digest + data_packet.extend_from_slice(¤t_digest); + + // Hash method type byte + data_packet.push(self.hash_method_byte); + gst::debug!(*CAT, "Hash method byte: {}", self.hash_method_byte); + + // Content UUID (if present) + if let Some(ref uuid) = self.content_uuid { + data_packet.extend_from_slice(uuid); + gst::debug!(*CAT, "Added content UUID: {:02x?}", uuid); + } + + gst::debug!(*CAT, "Final data packet ({} bytes): first 32: {:02x?}, last 32: {:02x?}", + data_packet.len(), + &data_packet[..std::cmp::min(32, data_packet.len())], + &data_packet[data_packet.len().saturating_sub(32)..]); + + // Store current digest for next GOP + self.last_digest = Some(current_digest); + + Ok(data_packet) + } + + fn finalize_substream(&mut self, substream_id: usize) -> Result> { + if let Some(ref mut substream) = self.substreams.get_mut(substream_id).and_then(|s| s.as_mut()) { + let digest = substream.finalize()?; + self.substreams[substream_id] = None; + Ok(digest) + } else { + Err(anyhow!("Substream {} not found or already finalized", substream_id)) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_dsc_substream_manager_basic() { + let hash_method = openssl::hash::MessageDigest::sha256(); + let mut manager = DscSubstreamManager::new(hash_method, 2, None).unwrap(); + + // Add some test NAL unit data + let nal_data1 = vec![0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80]; // SPS-like + let nal_data2 = vec![0x00, 0x00, 0x00, 0x01, 0x68, 0x48, 0x90]; // PPS-like + + manager.add_to_substream(0, &nal_data1).unwrap(); + manager.add_to_substream(0, &nal_data2).unwrap(); + + // Create data packet (this finalizes the substream) + let data_packet = manager.create_data_packet(0).unwrap(); + + // Should contain: zero_digest + current_digest + hash_method_byte + // For SHA256: 32 + 32 + 1 = 65 bytes + assert_eq!(data_packet.len(), 65); + assert_eq!(data_packet[64], 2); // hash_method_byte + } + + #[test] + fn test_dsc_substream_manager_with_content_uuid() { + let hash_method = openssl::hash::MessageDigest::sha256(); + let content_uuid = Some([0u8; 16]); + let mut manager = DscSubstreamManager::new(hash_method, 2, content_uuid).unwrap(); + + let nal_data = vec![0x00, 0x00, 0x00, 0x01, 0x67]; + manager.add_to_substream(0, &nal_data).unwrap(); + + let data_packet = manager.create_data_packet(0).unwrap(); + + // Should contain: zero_digest + current_digest + hash_method_byte + uuid + // For SHA256: 32 + 32 + 1 + 16 = 81 bytes + assert_eq!(data_packet.len(), 81); + assert_eq!(&data_packet[65..81], &[0u8; 16]); // UUID at the end + } +} diff --git a/video/dsc/src/lib.rs b/video/dsc/src/lib.rs new file mode 100644 index 000000000..ea59653c9 --- /dev/null +++ b/video/dsc/src/lib.rs @@ -0,0 +1,34 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +use gst::glib; + +mod common; +mod signer; +mod verifier; +mod nal_parser; +mod dsc_substream; + +fn plugin_init(plugin: &gst::Plugin) -> Result<(), glib::BoolError> { + signer::register(plugin)?; + verifier::register(plugin)?; + Ok(()) +} + +gst::plugin_define!( + dsc, + env!("CARGO_PKG_DESCRIPTION"), + plugin_init, + concat!(env!("CARGO_PKG_VERSION"), "-", env!("COMMIT_ID")), + "MPL-2.0", + env!("CARGO_PKG_NAME"), + env!("CARGO_PKG_NAME"), + env!("CARGO_PKG_REPOSITORY"), + env!("BUILD_REL_DATE") +); diff --git a/video/dsc/src/nal_parser.rs b/video/dsc/src/nal_parser.rs new file mode 100644 index 000000000..da2bb0447 --- /dev/null +++ b/video/dsc/src/nal_parser.rs @@ -0,0 +1,241 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL--2.0 was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +use anyhow::{Result, bail}; +use std::sync::LazyLock; + +static CAT: LazyLock = LazyLock::new(|| { + gst::DebugCategory::new( + "dsc-nal-parser", + gst::DebugColorFlags::empty(), + Some("NAL Unit Parser") + ) +}); + +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum VideoCodec { + H264, + H265, + H266, +} + +impl VideoCodec { + pub fn from_caps(caps: &gst::Caps) -> Result { + if let Some(structure) = caps.structure(0) { + let name = structure.name(); + if name == "video/x-h264" { + Ok(VideoCodec::H264) + } else if name == "video/x-h265" { + Ok(VideoCodec::H265) + } else if name == "video/x-h266" { + Ok(VideoCodec::H266) + } else { + bail!("Unsupported codec in caps") + } + } else { + bail!("No structure in caps") + } + } +} + +pub struct NalParser { + codec: VideoCodec, +} + +impl NalParser { + pub fn new(codec: VideoCodec) -> Self { + gst::info!(*CAT, "Created NAL parser for {:?} (using manual parsing)", codec); + Self { codec } + } + + pub fn extract_signable_data(&self, data: &[u8]) -> Result>> { + let mut nal_units = Vec::new(); + let mut start = 0; + + while start < data.len() { + let start_code_len = if data[start..].starts_with(&[0, 0, 0, 1]) { + 4 + } else if data[start..].starts_with(&[0, 0, 1]) { + 3 + } else { + bail!("Invalid NAL unit - no start code at position {}", start); + }; + + let mut end = start + start_code_len; + while end < data.len() { + if (end + 4 <= data.len() && &data[end..end + 4] == &[0, 0, 0, 1]) || + (end + 3 <= data.len() && &data[end..end + 3] == &[0, 0, 1]) { + break; + } + end += 1; + } + + let nal_start = start + start_code_len; + let nal_data = &data[nal_start..end]; + + let nal_type = self.extract_nal_type_from_header(nal_data)?; + + if self.should_include_nal(nal_type) { + gst::info!(*CAT, "Including NAL type {} ({} bytes) - first 32: {:02x?}", + nal_type, nal_data.len(), + &nal_data[..std::cmp::min(32, nal_data.len())]); + + nal_units.push(nal_data.to_vec()); + } + + start = end; + } + + gst::info!(*CAT, "Total signable data: {} NAL units extracted", nal_units.len()); + Ok(nal_units) + } + + fn extract_nal_type_from_header(&self, nal_data: &[u8]) -> Result { + if nal_data.is_empty() { + bail!("Empty NAL data"); + } + + let nal_type = match self.codec { + VideoCodec::H264 => { + nal_data[0] & 0x1F + }, + VideoCodec::H265 => { + if nal_data.len() < 2 { + bail!("H.265 NAL header too short"); + } + (nal_data[0] >> 1) & 0x3F + }, + VideoCodec::H266 => { + if nal_data.len() < 2 { + bail!("H.266 NAL header too short"); + } + (nal_data[1] >> 3) & 0x1F + }, + }; + + Ok(nal_type) + } + + fn should_include_nal(&self, nal_type: u8) -> bool { + match self.codec { + VideoCodec::H264 => self.should_include_h264_nal(nal_type), + VideoCodec::H265 => self.should_include_h265_nal(nal_type), + VideoCodec::H266 => self.should_include_h266_nal(nal_type), + } + } + + fn should_include_h264_nal(&self, nal_type: u8) -> bool { + let nal_unit_type = nal_type & 0x1F; + match nal_unit_type { + // VCL NAL units (actual video content) + 1..=5 => true, // Coded slice units + + // Essential Non-VCL NAL units + 7 => true, // SPS + 8 => true, // PPS + + // Excluded Non-VCL units + 6 => false, // SEI + 9 => false, // AUD + 12 => false, // Filler + _ => false, + } + } + + fn should_include_h265_nal(&self, nal_type: u8) -> bool { + let nal_unit_type = (nal_type >> 1) & 0x3F; + match nal_unit_type { + // VCL NAL units + 0..=31 => true, // Coded slice units (VCL) + + // Essential Non-VCL parameter sets + 33 => true, // SPS + 34 => true, // PPS + + // Excluded Non-VCL units + 32 => false, // VPS + 35 => false, // AUD + 38 => false, // Filler + 39 => false, // PREFIX_SEI + 40 => false, // SUFFIX_SEI + _ => false, + } + } + + fn should_include_h266_nal(&self, nal_type: u8) -> bool { + match nal_type { + // VCL NAL units (0-12) + 0..=12 => true, + + // Non-VCL parameter sets (INCLUDE) + 15 => true, // VPS + 16 => true, // SPS + 17 => true, // PPS + 19 => true, // APS (Prefix) + + // Non-VCL units to EXCLUDE + 13 => false, // DCI + 14 => false, // OPI + 18 => false, // Picture Header + 20 => false, // AUD + 21 => false, // EOS + 22 => false, // EOB + 23 => false, // PREFIX_SEI + 24 => false, // SUFFIX_SEI + 25 => false, // FD (Filler Data) + + _ => { + gst::warning!(*CAT, "Unknown H.266 NAL type: {}", nal_type); + false + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn init() { + use std::sync::Once; + static INIT: Once = Once::new(); + INIT.call_once(|| { + gst::init().unwrap(); + }); + } + + #[test] + fn test_h264_nal_extraction() { + init(); + + // Simple H.264 NAL unit with start code + let data = vec![ + 0x00, 0x00, 0x00, 0x01, // Start code + 0x67, // SPS NAL header (type 7) + 0x42, 0x80, 0x1e, // Some SPS data + ]; + + let parser = NalParser::new(VideoCodec::H264); + let nal_units = parser.extract_signable_data(&data).unwrap(); + + assert_eq!(nal_units.len(), 1); + assert_eq!(nal_units[0][0], 0x67); + } + + #[test] + fn test_h266_support() { + init(); + + let caps = gst::Caps::builder("video/x-h266").build(); + let codec = VideoCodec::from_caps(&caps).unwrap(); + assert_eq!(codec, VideoCodec::H266); + + let _parser = NalParser::new(VideoCodec::H266); + } +} diff --git a/video/dsc/src/signer/imp.rs b/video/dsc/src/signer/imp.rs new file mode 100644 index 000000000..1adb1d5cf --- /dev/null +++ b/video/dsc/src/signer/imp.rs @@ -0,0 +1,532 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +use glib::{ParamSpec, ParamSpecString, ParamSpecUInt, Value}; + +use gst::glib; +use gst::prelude::*; +use gst::subclass::prelude::*; +use gst_base::subclass::prelude::*; + +use openssl::pkey::PKey; +use openssl::sign::Signer; + +use std::fs; +use std::sync::Mutex; +use std::sync::RwLock; +use std::sync::LazyLock; +use std::ffi::CString; + +use anyhow::Result; + +use crate::common::HashMethod; +use crate::nal_parser::{NalParser, VideoCodec}; +use crate::dsc_substream::DscSubstreamManager; + +static CAT: LazyLock = LazyLock::new(|| { + gst::DebugCategory::new( + "dscsigner", + gst::DebugColorFlags::empty(), + Some("GstDscSigner"), + ) +}); + +struct GopSigningState { + dsc_manager: Option, + gop_started: bool, + buffers_in_substream: u32, + nal_parser: Option, +} + +impl Default for GopSigningState { + fn default() -> Self { + Self { + dsc_manager: None, + gop_started: false, + buffers_in_substream: 0, + nal_parser: None, + } + } +} + +#[derive(Default)] +pub struct DscSigner { + pub hash_method: RwLock, + pub private_key: Mutex>>, + pub private_key_path: RwLock>, + pub public_key_uri: RwLock>, + pub content_uuid: RwLock>, + pub substream_length: RwLock, + gop_state: Mutex, +} + +#[glib::object_subclass] +impl ObjectSubclass for DscSigner { + const NAME: &'static str = "DscSigner"; + type Type = super::DscSigner; + type ParentType = gst_base::BaseTransform; + type Interfaces = (); +} + +impl ObjectImpl for DscSigner { + fn constructed(&self) { + self.parent_constructed(); + } + + fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { + let obj = self.obj(); + match pspec.name() { + "hash-method" => { + let s = value.get::().unwrap(); + let method = match s.as_str() { + "sha1" => HashMethod::Sha1, + "sha224" => HashMethod::Sha224, + "sha256" => HashMethod::Sha256, + "sha384" => HashMethod::Sha384, + "sha512" => HashMethod::Sha512, + _ => HashMethod::Sha512, + }; + *self.hash_method.write().unwrap() = method; + gst::info!(*CAT, "Set hash-method property to {}", s); + } + "private-key-path" => { + let path = value.get::().unwrap(); + *self.private_key_path.write().unwrap() = Some(path.clone()); + match fs::read(&path) { + Ok(key_data) => { + match PKey::private_key_from_pem(&key_data) { + Ok(pkey) => { + let key_type = pkey.id(); + if key_type != openssl::pkey::Id::RSA && key_type != openssl::pkey::Id::EC { + gst::error!(*CAT, "Unsupported private key type: {:?}", key_type); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Unsupported private key type: {:?}", key_type), + ); + let _ = obj.post_message(msg); + return; + } + *self.private_key.lock().unwrap() = Some(pkey); + gst::info!(*CAT, "Loaded private key from {}", path); + }, + Err(e) => { + gst::error!(*CAT, "Invalid private key at {}: {}", path, e); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Invalid private key at {}: {}", path, e), + ); + let _ = obj.post_message(msg); + } + } + }, + Err(e) => { + gst::error!(*CAT, "Failed to read private key file {}: {}", path, e); + let msg = gst::message::Error::new( + gst::ResourceError::NotFound, + &format!("Failed to read private key file {}: {}", path, e), + ); + let _ = obj.post_message(msg); + } + } + } + "public-key-uri" => { + let uri = value.get::().unwrap(); + *self.public_key_uri.write().unwrap() = Some(uri.clone()); + gst::info!(*CAT, "Set public-key-uri property to {}", uri); + } + "content-uuid" => { + let uuid_str = value.get::().unwrap(); + if uuid_str.len() == 32 { + let mut uuid = [0u8; 16]; + if hex::decode_to_slice(&uuid_str, &mut uuid).is_ok() { + *self.content_uuid.write().unwrap() = Some(uuid); + gst::info!(*CAT, "Set content-uuid property to {}", uuid_str); + } else { + gst::error!(*CAT, "Invalid hex string for content-uuid: {}", uuid_str); + } + } else { + gst::error!(*CAT, "Content UUID must be 32 hex characters, got: {}", uuid_str.len()); + } + } + "substream-length" => { + let length = value.get::().unwrap(); + *self.substream_length.write().unwrap() = length; + gst::info!(*CAT, "Set substream-length property to {}", length); + } + _ => {} + } + } + + fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { + match pspec.name() { + "hash-method" => self.hash_method.read().unwrap().to_string().to_value(), + "private-key-path" => self.private_key_path.read().unwrap().clone().to_value(), + "public-key-uri" => self.public_key_uri.read().unwrap().clone().to_value(), + "content-uuid" => { + if let Some(uuid) = *self.content_uuid.read().unwrap() { + hex::encode(uuid).to_value() + } else { + String::new().to_value() + } + } + "substream-length" => self.substream_length.read().unwrap().to_value(), + _ => Value::from_type(pspec.value_type()), + } + } + + fn properties() -> &'static [ParamSpec] { + static PROPERTIES: LazyLock> = LazyLock::new(|| vec![ + ParamSpecString::builder("hash-method") + .nick("Hash Method") + .blurb("Hash algorithm to use (sha1, sha224, sha256, sha384, sha512)") + .default_value(Some("sha512")) + .readwrite() + .build(), + ParamSpecString::builder("private-key-path") + .nick("Private Key Path") + .blurb("Path to PEM-encoded private key") + .readwrite() + .build(), + ParamSpecString::builder("public-key-uri") + .nick("Public Key URI") + .blurb("URI of the public key for signature verification") + .readwrite() + .build(), + ParamSpecString::builder("content-uuid") + .nick("Content UUID") + .blurb("Content UUID as hex string (32 characters)") + .readwrite() + .build(), + ParamSpecUInt::builder("substream-length") + .nick("Substream Length") + .blurb("Number of buffers per substream (GOP length)") + .default_value(5) + .minimum(1) + .readwrite() + .build(), + ]); + PROPERTIES.as_ref() + } +} + +impl GstObjectImpl for DscSigner {} +impl ElementImpl for DscSigner { + fn metadata() -> Option<&'static gst::subclass::ElementMetadata> { + static ELEMENT_METADATA: LazyLock = LazyLock::new(|| { + gst::subclass::ElementMetadata::new( + "DSC Signer", + "Generic", + "Signs video buffers using H.274 DSC SEI metadata", + "Diego Nieto ", + ) + }); + + Some(&*ELEMENT_METADATA) + } + + fn pad_templates() -> &'static [gst::PadTemplate] { + static TEMPLATES: LazyLock> = LazyLock::new(|| { + let caps = gst::Caps::builder_full() + .structure(gst::Structure::builder("video/x-h264").build()) + .structure(gst::Structure::builder("video/x-h265").build()) + .structure(gst::Structure::builder("video/x-h266").build()) + .build(); + vec![ + gst::PadTemplate::new( + "sink", + gst::PadDirection::Sink, + gst::PadPresence::Always, + &caps, + ).unwrap(), + gst::PadTemplate::new( + "src", + gst::PadDirection::Src, + gst::PadPresence::Always, + &caps, + ).unwrap(), + ] + }); + TEMPLATES.as_ref() + } +} + +impl BaseTransformImpl for DscSigner { + const MODE: gst_base::subclass::BaseTransformMode = gst_base::subclass::BaseTransformMode::AlwaysInPlace; + const PASSTHROUGH_ON_SAME_CAPS: bool = false; + const TRANSFORM_IP_ON_PASSTHROUGH: bool = false; + + fn set_caps(&self, incaps: &gst::Caps, outcaps: &gst::Caps) -> Result<(), gst::LoggableError> { + gst::debug!(*CAT, imp = self, "Negotiating caps"); + gst::debug!(*CAT, imp = self, "Input caps: {}", incaps); + gst::debug!(*CAT, imp = self, "Output caps: {}", outcaps); + + if let Ok(codec) = VideoCodec::from_caps(incaps) { + let mut gop_state = self.gop_state.lock().unwrap(); + gop_state.nal_parser = Some(NalParser::new(codec)); + gst::info!(*CAT, imp = self, "Initialized NAL parser for codec: {:?}", codec); + } else { + gst::warning!(*CAT, imp = self, "Could not determine codec from caps"); + } + + Ok(()) + } + + fn transform_ip( + &self, + buffer: &mut gst::BufferRef, + ) -> Result { + gst::trace!(*CAT, imp = self, "DscSigner transform_ip called"); + + let obj = self.obj(); + let mut gop_state = self.gop_state.lock().unwrap(); + let substream_length = *self.substream_length.read().unwrap(); + + let is_first_buffer_in_substream = gop_state.buffers_in_substream == 0; + + if is_first_buffer_in_substream { + gst::info!(*CAT, imp = self, "📝 Starting NEW substream (buffer 1/{})", substream_length); + + let hash_method_byte: u8 = (*self.hash_method.read().unwrap()).into(); + let content_uuid = *self.content_uuid.read().unwrap(); + let public_key_uri = self.public_key_uri.read().unwrap().clone(); + + self.add_initialization_meta(buffer, hash_method_byte, &content_uuid, public_key_uri.as_deref())?; + + let hash_method = self.hash_method.read().unwrap().to_openssl(); + let new_dsc_manager = match DscSubstreamManager::new( + hash_method, + hash_method_byte, + content_uuid, + ) { + Ok(manager) => manager, + Err(e) => { + gst::error!(*CAT, imp = self, "Failed to create DscSubstreamManager: {}", e); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Failed to create DscSubstreamManager: {}", e), + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + }; + + gop_state.dsc_manager = Some(new_dsc_manager); + gop_state.gop_started = true; + } + + self.add_selection_meta(buffer, 0)?; + + let map = buffer.map_readable().map_err(|_| { + gst::error!(*CAT, imp = self, "Failed to map buffer for reading"); + gst::FlowError::Error + })?; + + let nal_units_to_hash = if let Some(ref nal_parser) = gop_state.nal_parser { + match nal_parser.extract_signable_data(&map) { + Ok(nal_units) => { + gst::debug!(*CAT, imp = self, "Extracted {} NAL units from {} raw bytes", + nal_units.len(), map.len()); + nal_units + }, + Err(e) => { + gst::error!(*CAT, imp = self, "NAL parsing failed: {}", e); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("NAL parsing failed: {}", e), + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + } + } else { + gst::error!(*CAT, imp = self, "No NAL parser available"); + return Err(gst::FlowError::Error); + }; + + drop(map); + + if let Some(ref mut dsc_manager) = gop_state.dsc_manager { + for nal_data in &nal_units_to_hash { + if let Err(e) = dsc_manager.add_to_substream(0, nal_data) { + gst::error!(*CAT, imp = self, "Failed to add NAL to substream: {}", e); + return Err(gst::FlowError::Error); + } + + gst::trace!(*CAT, imp = self, "Added NAL to substream, size: {}", nal_data.len()); + } + } + + gop_state.buffers_in_substream += 1; + gst::debug!(*CAT, imp = self, "Buffer {}/{} in current substream", + gop_state.buffers_in_substream, substream_length); + + let is_last_buffer_in_substream = gop_state.buffers_in_substream >= substream_length; + + if is_last_buffer_in_substream { + gst::info!(*CAT, imp = self, "🔐 LAST buffer in substream - creating signature"); + + if let Some(ref mut dsc_manager) = gop_state.dsc_manager { + match dsc_manager.create_data_packet(0) { + Ok(data_packet) => { + gst::debug!(*CAT, imp = self, "Created data packet: {} bytes", data_packet.len()); + + let signature = self.create_signature_from_data_packet(&data_packet)?; + gst::info!(*CAT, imp = self, "✅ Created signature ({} bytes) for substream", signature.len()); + + self.add_verification_meta(buffer, &signature, 0)?; + + gst::info!(*CAT, imp = self, "✅ Attached verification metadata to last buffer"); + }, + Err(e) => { + gst::error!(*CAT, imp = self, "Failed to create data packet: {}", e); + return Err(gst::FlowError::Error); + } + } + } + + gop_state.dsc_manager = None; + gop_state.gop_started = false; + gop_state.buffers_in_substream = 0; + } + + Ok(gst::FlowSuccess::Ok) + } +} + +impl DscSigner { + fn add_initialization_meta( + &self, + buffer: &mut gst::BufferRef, + hash_method_type: u8, + content_uuid: &Option<[u8; 16]>, + key_source_uri: Option<&str>, + ) -> Result<(), gst::FlowError> { + use gst_video::video_meta::VideoDSCInitializationMeta; + + let key_source_uri_cstring = key_source_uri.map(|uri| CString::new(uri).unwrap()); + + let dsc_init = gst_video::ffi::GstH274DigitallySignedContentInitialization { + id: 0, + hash_method_type, + key_retrieval_mode_idc: 0, // URI-based + use_key_register_idx_flag: 0, + key_register_idx: 0, + content_uuid_present_flag: if content_uuid.is_some() { 1 } else { 0 }, + content_uuid: content_uuid.unwrap_or([0u8; 16]), + num_verification_substreams: 1, + ref_substream_flag: std::ptr::null_mut(), + vss_implicit_association_mode_flag: 0, + signed_content_start_flag: 1, + sei_signing_flag: 0, + key_source_uri: key_source_uri_cstring + .as_ref() + .map(|s| s.as_ptr() as *mut u8) + .unwrap_or(std::ptr::null_mut()), + }; + + VideoDSCInitializationMeta::add(buffer, &dsc_init); + + gst::info!(*CAT, imp = self, "📝 Added DSC initialization metadata (hash_method: {}, uuid_present: {}, uri: {:?})", + hash_method_type, dsc_init.content_uuid_present_flag, key_source_uri); + + Ok(()) + } + + fn add_selection_meta( + &self, + buffer: &mut gst::BufferRef, + substream_id: u8, + ) -> Result<(), gst::FlowError> { + use gst_video::video_meta::VideoDSCSelectionMeta; + + let dsc_selection = gst_video::ffi::GstH274DigitallySignedContentSelection { + id: 0, + verification_substream_id: substream_id, + }; + + VideoDSCSelectionMeta::add(buffer, &dsc_selection); + + gst::trace!(*CAT, imp = self, "Added DSC selection metadata (substream: {})", substream_id); + + Ok(()) + } + + fn add_verification_meta( + &self, + buffer: &mut gst::BufferRef, + signature: &[u8], + substream_id: u8, + ) -> Result<(), gst::FlowError> { + use gst_video::video_meta::VideoDSCVerificationMeta; + + // Create GArray for signature + let signature_array = unsafe { + let array = glib::ffi::g_array_new(0, 0, std::mem::size_of::() as u32); + glib::ffi::g_array_append_vals( + array, + signature.as_ptr() as *const _, + signature.len() as u32, + ); + array + }; + + let dsc_verification = gst_video::ffi::GstH274DigitallySignedContentVerification { + id: 0, + verification_substream_id: substream_id, + signature_length_in_octets_minus1: (signature.len() - 1) as u32, + signature: signature_array, + signed_content_end_flag: 1, + }; + + VideoDSCVerificationMeta::add(buffer, &dsc_verification); + + gst::info!(*CAT, imp = self, "🔐 Added DSC verification metadata (signature: {} bytes)", signature.len()); + + Ok(()) + } + + fn create_signature_from_data_packet( + &self, + data_packet: &[u8], + ) -> Result, gst::FlowError> { + let pkey_guard = self.private_key.lock().unwrap(); + let pkey = match pkey_guard.as_ref() { + Some(k) => k, + None => { + gst::error!(*CAT, imp = self, "No private key loaded"); + return Err(gst::FlowError::Error); + } + }; + + let hash_method = self.hash_method.read().unwrap().to_openssl(); + + gst::debug!(*CAT, imp = self, "SIGNER: Data packet first 32: {:02x?}", + &data_packet[..std::cmp::min(32, data_packet.len())]); + gst::debug!(*CAT, imp = self, "SIGNER: Data packet last 32: {:02x?}", + &data_packet[data_packet.len().saturating_sub(32)..]); + + let mut signer = Signer::new(hash_method, pkey).map_err(|e| { + gst::error!(*CAT, imp = self, "Failed to create signer: {}", e); + gst::FlowError::Error + })?; + + signer.update(data_packet).map_err(|e| { + gst::error!(*CAT, imp = self, "Failed to update signer: {}", e); + gst::FlowError::Error + })?; + + let signature = signer.sign_to_vec().map_err(|e| { + gst::error!(*CAT, imp = self, "Failed to create signature: {}", e); + gst::FlowError::Error + })?; + + gst::debug!(*CAT, imp = self, "Created signature: {} bytes", signature.len()); + Ok(signature) + } +} \ No newline at end of file diff --git a/video/dsc/src/signer/mod.rs b/video/dsc/src/signer/mod.rs new file mode 100644 index 000000000..a7d185f92 --- /dev/null +++ b/video/dsc/src/signer/mod.rs @@ -0,0 +1,40 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +/** + * element-dscsigner: + * @short-description: Based on Digital Signature Content (DSC), signs video buffers + * using provided private keys. Signatures are added as metadata to the buffers. + * + * ## Example signing a stream + * ```bash + * gst-launch-1.0 videotestsrc num-buffers=30 ! videoconvert ! x264enc key-int-max=5 ! + * h264parse ! dscsigner private-key-path=./example_ca.key public-key-uri= ./example_ca.pub ! + * fakesink + * ``` + */ + +use gst::glib; +use gst::prelude::*; +use gst_base::BaseTransform; + +mod imp; + +glib::wrapper! { + pub struct DscSigner(ObjectSubclass) @extends BaseTransform, gst::Element, gst::Object; +} + +pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> { + gst::Element::register( + Some(plugin), + "dscsigner", + gst::Rank::NONE, + DscSigner::static_type(), + ) +} diff --git a/video/dsc/src/verifier/imp.rs b/video/dsc/src/verifier/imp.rs new file mode 100644 index 000000000..896c42cc5 --- /dev/null +++ b/video/dsc/src/verifier/imp.rs @@ -0,0 +1,705 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +use glib::{ParamSpec, ParamSpecString, Value}; + +use gst::glib; +use gst::prelude::*; +use gst::subclass::prelude::*; +use gst_base::subclass::prelude::*; + +use openssl::pkey::PKey; +use openssl::sign::Verifier; +use openssl::x509::X509; + +use std::fs; +use std::path::Path; +use std::sync::{Mutex, RwLock}; +use std::sync::LazyLock; +use std::collections::HashMap; + +use anyhow::Result; + +use crate::common::HashMethod; +use crate::nal_parser::{NalParser, VideoCodec}; +use crate::dsc_substream::DscSubstreamManager; + +static CAT: LazyLock = LazyLock::new(|| { + gst::DebugCategory::new( + "dscverifier", + gst::DebugColorFlags::empty(), + Some("GstDscVerifier"), + ) +}); + +struct GopVerificationState { + dsc_manager: Option, + gop_started: bool, + nal_parser: Option, + public_key_cache: HashMap>, + current_hash_method: Option, + current_cert_uri: Option, +} + +impl Default for GopVerificationState { + fn default() -> Self { + Self { + dsc_manager: None, + gop_started: false, + nal_parser: None, + public_key_cache: HashMap::new(), + current_hash_method: None, + current_cert_uri: None, + } + } +} + +#[derive(Default)] +pub struct DscVerifier { + key_store_path: RwLock>, + gop_state: Mutex, + fail_on_verification_error: RwLock, +} + +#[glib::object_subclass] +impl ObjectSubclass for DscVerifier { + const NAME: &'static str = "DscVerifier"; + type Type = super::DscVerifier; + type ParentType = gst_base::BaseTransform; + type Interfaces = (); +} + +impl ObjectImpl for DscVerifier { + fn constructed(&self) { + self.parent_constructed(); + } + + fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { + match pspec.name() { + "key-store-path" => { + let path = value.get::().unwrap(); + *self.key_store_path.write().unwrap() = Some(path.clone()); + gst::info!(*CAT, "Set key-store-path property to {}", path); + } + "fail-on-verification-error" => { + let fail = value.get::().unwrap(); + *self.fail_on_verification_error.write().unwrap() = fail; + gst::info!(*CAT, "Set fail-on-verification-error property to {}", fail); + } + _ => {} + } + } + + fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { + match pspec.name() { + "key-store-path" => self.key_store_path.read().unwrap().clone().to_value(), + "fail-on-verification-error" => self.fail_on_verification_error.read().unwrap().to_value(), + _ => Value::from_type(pspec.value_type()), + } + } + + fn properties() -> &'static [ParamSpec] { + static PROPERTIES: LazyLock> = LazyLock::new(|| vec![ + ParamSpecString::builder("key-store-path") + .nick("Key Store Path") + .blurb("Directory path where public key files are stored (keyStoreDir)") + .readwrite() + .build(), + glib::ParamSpecBoolean::builder("fail-on-verification-error") + .nick("Fail on Verification Error") + .blurb("Whether to fail the pipeline when signature verification fails (default: false)") + .default_value(false) + .readwrite() + .build(), + ]); + PROPERTIES.as_ref() + } +} + +impl GstObjectImpl for DscVerifier {} +impl ElementImpl for DscVerifier { + fn metadata() -> Option<&'static gst::subclass::ElementMetadata> { + static ELEMENT_METADATA: LazyLock = LazyLock::new(|| { + gst::subclass::ElementMetadata::new( + "DSC Verifier", + "Generic", + "Verifies video buffer signatures using metadata-provided keys", + "Diego Nieto ", + ) + }); + + Some(&*ELEMENT_METADATA) + } + + fn pad_templates() -> &'static [gst::PadTemplate] { + static TEMPLATES: LazyLock> = LazyLock::new(|| { + let caps = gst::Caps::builder_full() + .structure( + gst::Structure::builder("video/x-h264") + .field("stream-format", "byte-stream") + .field("alignment", "au") + .build(), + ) + .structure( + gst::Structure::builder("video/x-h265") + .field("stream-format", "byte-stream") + .field("alignment", "au") + .build(), + ) + .structure( + gst::Structure::builder("video/x-h266") + .field("stream-format", "byte-stream") + .field("alignment", "au") + .build(), + ) + .build(); + vec![ + gst::PadTemplate::new( + "sink", + gst::PadDirection::Sink, + gst::PadPresence::Always, + &caps, + ).unwrap(), + gst::PadTemplate::new( + "src", + gst::PadDirection::Src, + gst::PadPresence::Always, + &caps, + ).unwrap(), + ] + }); + TEMPLATES.as_ref() + } +} + +impl DscVerifier { + fn load_public_key_from_cert_uri( + &self, + cert_uri: &str, + gop_state: &mut GopVerificationState, + ) -> std::result::Result, openssl::error::ErrorStack> { + if let Some(cached_key) = gop_state.public_key_cache.get(cert_uri) { + gst::debug!(*CAT, imp = self, "Using cached public key for cert_uri: {}", cert_uri); + return Ok(cached_key.clone()); + } + + gst::info!(*CAT, imp = self, "Loading public key from cert_uri: {}", cert_uri); + + let final_key_path = if let Some(key_store_path) = &*self.key_store_path.read().unwrap() { + let key_store_dir = Path::new(key_store_path); + + let uri_lower = cert_uri.to_lowercase(); + let uri_to_process = if uri_lower.starts_with("file://") { + cert_uri + } else { + gst::warning!(*CAT, imp = self, "URI does not start with file://, treating as filename: {}", cert_uri); + cert_uri + }; + + let mut uri = uri_to_process.to_string(); + + if uri.ends_with('/') { + uri.pop(); + } + + if let Some(last_slash_pos) = uri.rfind('/') { + let filename = &uri[(last_slash_pos + 1)..]; + let final_path = key_store_dir.join(filename); + + gst::debug!(*CAT, imp = self, "Extracted filename '{}' from URI '{}'", filename, cert_uri); + + final_path.to_string_lossy().to_string() + } else { + key_store_dir.join(uri).to_string_lossy().to_string() + } + } else { + cert_uri.to_string() + }; + + gst::debug!(*CAT, imp = self, "Final key path constructed: {}", final_key_path); + + // Load the certificate file and extract the public key + match fs::read(&final_key_path) { + Ok(cert_data) => { + // Parse the X.509 certificate + match X509::from_pem(&cert_data) { + Ok(cert) => { + match cert.public_key() { + Ok(pkey) => { + gop_state.public_key_cache.insert(cert_uri.to_string(), pkey.clone()); + gst::info!(*CAT, imp = self, "Loaded and cached public key from certificate: {}", final_key_path); + Ok(pkey) + }, + Err(e) => { + gst::error!(*CAT, imp = self, "Failed to extract public key from certificate {}: {}", final_key_path, e); + Err(e) + } + } + }, + Err(e) => { + gst::error!(*CAT, imp = self, "Invalid X.509 certificate at {}: {}", final_key_path, e); + Err(e) + } + } + }, + Err(e) => { + gst::error!(*CAT, imp = self, "Failed to read certificate file from {}: {}", final_key_path, e); + Err(openssl::error::ErrorStack::get()) + } + } + } + + fn handle_initialization_meta( + &self, + init_meta: &gst_video::video_meta::VideoDSCInitializationMeta, + gop_state: &mut GopVerificationState, + ) -> Result<(), gst::FlowError> { + let obj = self.obj(); + let dsc_init = init_meta.dsc_initialization(); + + gst::debug!(*CAT, imp = self, "DSC initialization - id: {}, hash_method: {}, key_retrieval_mode: {}", + dsc_init.id, dsc_init.hash_method_type, dsc_init.key_retrieval_mode_idc); + + let hash_method = HashMethod::from(dsc_init.hash_method_type); + let openssl_hash_method = hash_method.to_openssl(); + + let content_uuid = if dsc_init.content_uuid_present_flag != 0 { + Some(dsc_init.content_uuid) + } else { + None + }; + + let cert_uri = if !dsc_init.key_source_uri.is_null() { + unsafe { + std::ffi::CStr::from_ptr(dsc_init.key_source_uri as *const i8) + .to_str() + .ok() + .map(|s| s.to_string()) + } + } else { + None + }; + + gop_state.current_hash_method = Some(hash_method); + gop_state.current_cert_uri = cert_uri.clone(); + + let new_dsc_manager = match DscSubstreamManager::new( + openssl_hash_method, + dsc_init.hash_method_type, + content_uuid, + ) { + Ok(manager) => manager, + Err(e) => { + gst::error!(*CAT, imp = self, "Failed to create DscSubstreamManager: {}", e); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Failed to create DscSubstreamManager: {}", e), + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + }; + + gop_state.dsc_manager = Some(new_dsc_manager); + gop_state.gop_started = true; + + gst::debug!(*CAT, imp = self, "DSC parameters - hash_method: {:?}, content_uuid_present: {}, num_verification_substreams: {}, cert_uri: {:?}", + hash_method, dsc_init.content_uuid_present_flag, dsc_init.num_verification_substreams, cert_uri); + + Ok(()) + } + + fn extract_nal_units( + &self, + buffer: &gst::BufferRef, + gop_state: &GopVerificationState, + ) -> Result>, gst::FlowError> { + let obj = self.obj(); + + let map = match buffer.map_readable() { + Ok(m) => m, + Err(_) => { + gst::error!(*CAT, imp = self, "Failed to map buffer for reading"); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + "Failed to map buffer for reading", + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + }; + + if let Some(ref nal_parser) = gop_state.nal_parser { + match nal_parser.extract_signable_data(&map) { + Ok(nal_units) => { + gst::trace!(*CAT, imp = self, "Extracted {} NAL units from {} raw bytes", + nal_units.len(), map.len()); + Ok(nal_units) + }, + Err(e) => { + gst::error!(*CAT, imp = self, "NAL parsing failed: {}", e); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("NAL parsing failed: {}", e), + ); + let _ = obj.post_message(msg); + Err(gst::FlowError::Error) + } + } + } else { + gst::error!(*CAT, imp = self, "No NAL parser available"); + Err(gst::FlowError::Error) + } + } + + fn add_nal_units_to_substream( + &self, + nal_units: &[Vec], + substream_id: usize, + gop_state: &mut GopVerificationState, + is_verification_buffer: bool, + ) -> Result<(), gst::FlowError> { + if let Some(ref mut dsc_manager) = gop_state.dsc_manager { + for nal_data in nal_units { + if let Err(e) = dsc_manager.add_to_substream(substream_id, nal_data) { + gst::error!(*CAT, imp = self, "Failed to add NAL to substream: {}", e); + return Err(gst::FlowError::Error); + } + + if is_verification_buffer { + gst::debug!(*CAT, imp = self, "Added verification NAL to substream {}, size: {}, first 32: {:02x?}", + substream_id, nal_data.len(), &nal_data[..std::cmp::min(32, nal_data.len())]); + } else { + gst::trace!(*CAT, imp = self, "Added NAL to substream {}, size: {}, first 32: {:02x?}, last 32: {:02x?}", + substream_id, nal_data.len(), + &nal_data[..std::cmp::min(32, nal_data.len())], + &nal_data[nal_data.len().saturating_sub(32)..]); + } + } + } + Ok(()) + } + + fn get_substream_id( + &self, + selection_meta: Option<&gst_video::video_meta::VideoDSCSelectionMeta>, + default_id: usize, + ) -> usize { + if let Some(sel_meta) = selection_meta { + let substream = sel_meta.dsc_selection().verification_substream_id as usize; + gst::trace!(*CAT, imp = self, "Found DSC selection metadata, using substream: {}", substream); + substream + } else { + default_id + } + } + + fn get_verification_params( + &self, + gop_state: &mut GopVerificationState, + ) -> Result<(HashMethod, openssl::hash::MessageDigest, PKey), gst::FlowError> { + let obj = self.obj(); + + let hash_method = match gop_state.current_hash_method { + Some(method) => method, + None => { + gst::error!(*CAT, imp = self, "No hash method stored from initialization metadata"); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + "No hash method stored from initialization metadata", + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + }; + + let openssl_hash_method = hash_method.to_openssl(); + + let cert_uri = gop_state.current_cert_uri.clone(); + + let pkey = if let Some(uri) = cert_uri { + match self.load_public_key_from_cert_uri(&uri, gop_state) { + Ok(key) => key, + Err(e) => { + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Failed to load public key from cert_uri '{}': {}", uri, e), + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + } + } else { + gst::error!(*CAT, imp = self, "No key_source_uri stored from DSC initialization metadata"); + let msg = gst::message::Error::new( + gst::ResourceError::NotFound, + "No key_source_uri stored from DSC initialization metadata", + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + }; + + Ok((hash_method, openssl_hash_method, pkey)) + } + + fn finalize_and_verify( + &self, + dsc_verification: &gst_video::ffi::GstH274DigitallySignedContentVerification, + substream_id: usize, + gop_state: &mut GopVerificationState, + ) -> Result<(), gst::FlowError> { + let obj = self.obj(); + + let (hash_method, openssl_hash_method, pkey) = self.get_verification_params(gop_state)?; + + if let Some(ref mut dsc_manager) = gop_state.dsc_manager { + gst::debug!(*CAT, imp = self, "About to create data packet from accumulated substream data"); + match dsc_manager.create_data_packet(substream_id) { + Ok(data_packet) => { + self.verify_signature(dsc_verification, &data_packet, hash_method, openssl_hash_method, &pkey)?; + }, + Err(e) => { + gst::error!(*CAT, imp = self, "Failed to create data packet for verification: {}", e); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Failed to create data packet: {}", e), + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + } + + gop_state.dsc_manager = None; + gop_state.gop_started = false; + gop_state.current_hash_method = None; + gop_state.current_cert_uri = None; + } else { + gst::warning!(*CAT, imp = self, "Received verification metadata but no DSC manager available"); + } + + Ok(()) + } + + fn handle_verification_meta( + &self, + buffer: &gst::BufferRef, + verif_meta: &gst_video::video_meta::VideoDSCVerificationMeta, + selection_meta: Option<&gst_video::video_meta::VideoDSCSelectionMeta>, + gop_state: &mut GopVerificationState, + ) -> Result { + let dsc_verification = verif_meta.dsc_verification(); + + let signature_len = unsafe { + if dsc_verification.signature.is_null() { + 0 + } else { + (*dsc_verification.signature).len as usize + } + }; + + gst::debug!(*CAT, imp = self, "Found DSC verification metadata - verifying substream, signature length: {}", + signature_len); + + if !gop_state.gop_started { + gst::warning!(*CAT, imp = self, "Received verification metadata but no initialization metadata was received"); + return Ok(gst::FlowSuccess::Ok); + } + + let nal_units_to_hash = self.extract_nal_units(buffer, gop_state)?; + let substream_id = self.get_substream_id(selection_meta, dsc_verification.verification_substream_id as usize); + + self.add_nal_units_to_substream(&nal_units_to_hash, substream_id, gop_state, true)?; + self.finalize_and_verify(&dsc_verification, substream_id, gop_state)?; + + Ok(gst::FlowSuccess::Ok) + } + + fn verify_signature( + &self, + dsc_verification: &gst_video::ffi::GstH274DigitallySignedContentVerification, + data_packet: &[u8], + hash_method: HashMethod, + openssl_hash_method: openssl::hash::MessageDigest, + pkey: &PKey, + ) -> Result<(), gst::FlowError> { + let obj = self.obj(); + + gst::debug!(*CAT, imp = self, "Verifying substream data packet: {} bytes with hash method: {:?}", data_packet.len(), hash_method); + + let signature = unsafe { + if dsc_verification.signature.is_null() { + &[] + } else { + std::slice::from_raw_parts( + (*dsc_verification.signature).data as *const u8, + (*dsc_verification.signature).len as usize, + ) + } + }; + + gst::log!(*CAT, imp = self, "Data packet content (first 32 bytes): {:02x?}", &data_packet[..std::cmp::min(32, data_packet.len())]); + gst::log!(*CAT, imp = self, "Data packet content (last 32 bytes): {:02x?}", &data_packet[data_packet.len().saturating_sub(32)..]); + gst::log!(*CAT, imp = self, "Signature content (hex): {:02x?}", &signature[..std::cmp::min(32, signature.len())]); + gst::log!(*CAT, imp = self, "Signature content (dec): {:?}", &signature[..std::cmp::min(32, signature.len())]); + gst::log!(*CAT, imp = self, "Verifying signature ({} bytes) against substream data packet", signature.len()); + + let mut verifier = match Verifier::new(openssl_hash_method, pkey) { + Ok(v) => v, + Err(e) => { + gst::error!(*CAT, imp = self, "Failed to create verifier with hash method {:?}: {}", hash_method, e); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Failed to create verifier: {}", e), + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + }; + + if let Err(e) = verifier.update(data_packet) { + gst::error!(*CAT, imp = self, "Failed to update verifier: {}", e); + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Failed to update verifier: {}", e), + ); + let _ = obj.post_message(msg); + return Err(gst::FlowError::Error); + } + + let fail_on_error = *self.fail_on_verification_error.read().unwrap(); + + match verifier.verify(signature) { + Ok(true) => { + gst::info!(*CAT, imp = self, "✅ Substream signature verified successfully"); + + let s = gst::Structure::builder("dsc-verification-result") + .field("verified", true) + .field("data-packet-size", data_packet.len() as u64) + .field("signature-size", signature.len() as u64) + .build(); + let msg = gst::message::Element::new(s); + let _ = obj.post_message(msg); + + Ok(()) + }, + Ok(false) => { + gst::error!(*CAT, imp = self, "❌ Substream signature verification FAILED"); + + let s = gst::Structure::builder("dsc-verification-result") + .field("verified", false) + .field("data-packet-size", data_packet.len() as u64) + .field("signature-size", signature.len() as u64) + .field("error", "Signature verification failed") + .build(); + let msg = gst::message::Element::new(s); + let _ = obj.post_message(msg); + + if fail_on_error { + let msg = gst::message::Error::new( + gst::CoreError::Failed, + "Substream signature verification failed", + ); + let _ = obj.post_message(msg); + Err(gst::FlowError::Error) + } else { + gst::warning!(*CAT, imp = self, "Continuing despite verification failure (fail-on-verification-error=false)"); + Ok(()) + } + }, + Err(e) => { + gst::error!(*CAT, imp = self, "Error during signature verification: {}", e); + + let s = gst::Structure::builder("dsc-verification-result") + .field("verified", false) + .field("data-packet-size", data_packet.len() as u64) + .field("signature-size", signature.len() as u64) + .field("error", format!("Verification error: {}", e)) + .build(); + let msg = gst::message::Element::new(s); + let _ = obj.post_message(msg); + + if fail_on_error { + let msg = gst::message::Error::new( + gst::CoreError::Failed, + &format!("Error during signature verification: {}", e), + ); + let _ = obj.post_message(msg); + Err(gst::FlowError::Error) + } else { + gst::warning!(*CAT, imp = self, "Continuing despite verification error (fail-on-verification-error=false)"); + Ok(()) + } + } + } + } + + fn handle_regular_buffer( + &self, + buffer: &gst::BufferRef, + selection_meta: Option<&gst_video::video_meta::VideoDSCSelectionMeta>, + gop_state: &mut GopVerificationState, + ) -> Result<(), gst::FlowError> { + if !gop_state.gop_started || gop_state.dsc_manager.is_none() { + return Ok(()); + } + + let nal_units_to_hash = self.extract_nal_units(buffer, gop_state)?; + let substream_id = self.get_substream_id(selection_meta, 0); + + self.add_nal_units_to_substream(&nal_units_to_hash, substream_id, gop_state, false)?; + + Ok(()) + } +} + +impl BaseTransformImpl for DscVerifier { + const MODE: gst_base::subclass::BaseTransformMode = gst_base::subclass::BaseTransformMode::AlwaysInPlace; + const PASSTHROUGH_ON_SAME_CAPS: bool = false; + const TRANSFORM_IP_ON_PASSTHROUGH: bool = false; + + fn set_caps(&self, incaps: &gst::Caps, outcaps: &gst::Caps) -> Result<(), gst::LoggableError> { + gst::debug!(*CAT, imp = self, "Negotiating caps"); + gst::debug!(*CAT, imp = self, "Input caps: {}", incaps); + gst::debug!(*CAT, imp = self, "Output caps: {}", outcaps); + + // Initialize NAL parser based on codec + if let Ok(codec) = VideoCodec::from_caps(incaps) { + let mut gop_state = self.gop_state.lock().unwrap(); + gop_state.nal_parser = Some(NalParser::new(codec)); + gst::info!(*CAT, imp = self, "Initialized NAL parser for codec: {:?}", codec); + } else { + gst::warning!(*CAT, imp = self, "Could not determine codec from caps, falling back to raw frame verification"); + } + + Ok(()) + } + + fn transform_ip( + &self, + buffer: &mut gst::BufferRef, + ) -> Result { + let mut gop_state = self.gop_state.lock().unwrap(); + + let initialization_meta = buffer.meta::(); + let verification_meta = buffer.meta::(); + let selection_meta = buffer.meta::(); + + if let Some(init_meta) = initialization_meta { + self.handle_initialization_meta(&init_meta, &mut gop_state)?; + } + + if let Some(verif_meta) = verification_meta { + return self.handle_verification_meta(buffer, &verif_meta, selection_meta.as_deref(), &mut gop_state); + } + + self.handle_regular_buffer(buffer, selection_meta.as_deref(), &mut gop_state)?; + + Ok(gst::FlowSuccess::Ok) + } +} diff --git a/video/dsc/src/verifier/mod.rs b/video/dsc/src/verifier/mod.rs new file mode 100644 index 000000000..07e4be536 --- /dev/null +++ b/video/dsc/src/verifier/mod.rs @@ -0,0 +1,40 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +/** + * element-dscverifier: + * @short-description: Based on Digital Signature Content (DSC), verifies video buffer + * signatures using metadata-provided keys. + * + * ## Example verifiying a signed stream + * ```bash + * gst-launch-1.0 videotestsrc num-buffers=30 ! videoconvert ! x264enc key-int-max=5 ! + * h264parse ! dscsigner private-key-path=./example_ca.key public-key-uri= ./example_ca.pub ! + * dscverifier key-store-path= `pwd` ! avdec_h264 ! videoconvert ! autovideosink + * ``` + */ + +use gst::glib; +use gst::prelude::*; +use gst_base::BaseTransform; + +mod imp; + +glib::wrapper! { + pub struct DscVerifier(ObjectSubclass) @extends BaseTransform, gst::Element, gst::Object; +} + +pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> { + gst::Element::register( + Some(plugin), + "dscverifier", + gst::Rank::NONE, + DscVerifier::static_type(), + ) +} diff --git a/video/dsc/tests/dsc.rs b/video/dsc/tests/dsc.rs new file mode 100644 index 000000000..54d305b4c --- /dev/null +++ b/video/dsc/tests/dsc.rs @@ -0,0 +1,479 @@ +// Copyright (C) 2025, Fluendo S.A. +// Author: Diego Nieto +// +// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at +// . +// +// SPDX-License-Identifier: MPL-2.0 + +use gst::prelude::*; +use openssl::pkey::PKey; +use openssl::rsa::Rsa; +use openssl::x509::X509; +use openssl::asn1::Asn1Time; +use openssl::bn::{BigNum, MsbOption}; +use openssl::hash::MessageDigest; +use openssl::x509::X509NameBuilder; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicU64, Ordering}; + +static KEY_COUNTER: AtomicU64 = AtomicU64::new(0); + +fn init() { + use std::sync::Once; + static INIT: Once = Once::new(); + + INIT.call_once(|| { + gst::init().unwrap(); + gstdsc::plugin_register_static().expect("dsc test"); + }); +} + +fn create_test_keys() -> (PathBuf, PathBuf) { + let temp_dir = std::env::temp_dir(); + let unique_id = KEY_COUNTER.fetch_add(1, Ordering::SeqCst); + let private_key_path = temp_dir.join(format!("test_private_key_{}.pem", unique_id)); + let cert_path = temp_dir.join(format!("test_cert_{}.pem", unique_id)); + + let rsa = Rsa::generate(2048).unwrap(); + let pkey = PKey::from_rsa(rsa).unwrap(); + + let private_pem = pkey.private_key_to_pem_pkcs8().unwrap(); + fs::write(&private_key_path, private_pem).unwrap(); + + let mut x509_name = X509NameBuilder::new().unwrap(); + x509_name.append_entry_by_text("C", "US").unwrap(); + x509_name.append_entry_by_text("ST", "Test").unwrap(); + x509_name.append_entry_by_text("O", "Test Org").unwrap(); + x509_name.append_entry_by_text("CN", "test.example.com").unwrap(); + let x509_name = x509_name.build(); + + let mut cert_builder = X509::builder().unwrap(); + cert_builder.set_version(2).unwrap(); + + let serial_number = { + let mut serial = BigNum::new().unwrap(); + serial.rand(159, MsbOption::MAYBE_ZERO, false).unwrap(); + serial.to_asn1_integer().unwrap() + }; + cert_builder.set_serial_number(&serial_number).unwrap(); + + cert_builder.set_subject_name(&x509_name).unwrap(); + cert_builder.set_issuer_name(&x509_name).unwrap(); + cert_builder.set_pubkey(&pkey).unwrap(); + + let not_before = Asn1Time::days_from_now(0).unwrap(); + cert_builder.set_not_before(¬_before).unwrap(); + let not_after = Asn1Time::days_from_now(365).unwrap(); + cert_builder.set_not_after(¬_after).unwrap(); + + cert_builder.sign(&pkey, MessageDigest::sha256()).unwrap(); + let cert = cert_builder.build(); + + let cert_pem = cert.to_pem().unwrap(); + fs::write(&cert_path, cert_pem).unwrap(); + + (private_key_path, cert_path) +} + +fn create_test_h264_buffer(index: usize, is_i_frame: bool) -> gst::Buffer { + // Create a simple H.264 NAL unit with start code + let nal_type = if is_i_frame { 0x65 } else { 0x41 }; // IDR slice or non-IDR slice + + let mut data = vec![ + 0x00, 0x00, 0x00, 0x01, // Start code + nal_type, // NAL header + ]; + + // Add some payload data + for j in 0..100 { + data.push(((index * 100 + j) % 256) as u8); + } + + let mut buffer = gst::Buffer::from_slice(data); + { + let buffer_ref = buffer.get_mut().unwrap(); + if !is_i_frame { + buffer_ref.set_flags(gst::BufferFlags::DELTA_UNIT); + } + } + buffer +} + +fn cleanup_test_keys(private_key_path: &PathBuf, cert_path: &PathBuf) { + let _ = fs::remove_file(private_key_path); + let _ = fs::remove_file(cert_path); +} + +#[test] +fn test_signer_verifier_sha256() { + test_signer_verifier_with_hash("sha256"); +} + +#[test] +fn test_signer_verifier_sha384() { + test_signer_verifier_with_hash("sha384"); +} + +#[test] +fn test_signer_verifier_sha512() { + test_signer_verifier_with_hash("sha512"); +} + +#[test] +fn test_signer_verifier_sha1() { + test_signer_verifier_with_hash("sha1"); +} + +#[test] +fn test_signer_verifier_sha224() { + test_signer_verifier_with_hash("sha224"); +} + +fn test_signer_verifier_with_hash(hash_method: &str) { + init(); + + let (private_key_path, cert_path) = create_test_keys(); + let key_store_path = cert_path.parent().unwrap().to_str().unwrap(); + + let pipeline = gst::Pipeline::new(); + + let videotestsrc = gst::ElementFactory::make("videotestsrc") + .property("num-buffers", 10i32) + .build() + .unwrap(); + + let capsfilter1 = gst::ElementFactory::make("capsfilter") + .build() + .unwrap(); + let caps1 = gst::Caps::builder("video/x-raw") + .field("framerate", gst::Fraction::new(30, 1)) + .build(); + capsfilter1.set_property("caps", caps1); + + let videoconvert = gst::ElementFactory::make("videoconvert") + .build() + .unwrap(); + + let x264enc = gst::ElementFactory::make("x264enc") + .property("key-int-max", 5u32) + .build() + .unwrap(); + + let capsfilter2 = gst::ElementFactory::make("capsfilter") + .build() + .unwrap(); + let caps2 = gst::Caps::builder("video/x-h264") + .field("stream-format", "byte-stream") + .field("alignment", "au") + .build(); + capsfilter2.set_property("caps", caps2); + + let signer = gst::ElementFactory::make("dscsigner") + .property("hash-method", hash_method) + .property("private-key-path", private_key_path.to_str().unwrap()) + .property("public-key-uri", cert_path.to_str().unwrap()) + .property("substream-length", 5u32) + .build() + .unwrap(); + + let verifier = gst::ElementFactory::make("dscverifier") + .property("key-store-path", key_store_path) + .build() + .unwrap(); + + let fakesink = gst::ElementFactory::make("fakesink") + .build() + .unwrap(); + + pipeline.add_many([ + &videotestsrc, + &capsfilter1, + &videoconvert, + &x264enc, + &capsfilter2, + &signer, + &verifier, + &fakesink, + ]).unwrap(); + + gst::Element::link_many([ + &videotestsrc, + &capsfilter1, + &videoconvert, + &x264enc, + &capsfilter2, + &signer, + &verifier, + &fakesink, + ]).unwrap(); + + let bus = pipeline.bus().unwrap(); + let mut verification_count = 0; + let mut verification_success = true; + let mut pipeline_finished = false; + + pipeline.set_state(gst::State::Playing).unwrap(); + + while !pipeline_finished { + let msg = bus.timed_pop(gst::ClockTime::from_seconds(5)); + + match msg { + Some(msg) => { + use gst::MessageView; + + match msg.view() { + MessageView::Eos(..) => { + println!("EOS received"); + pipeline_finished = true; + } + MessageView::Error(err) => { + panic!( + "Error from {:?}: {} ({:?})", + err.src().map(|s| s.path_string()), + err.error(), + err.debug() + ); + } + MessageView::Element(element_msg) => { + if let Some(structure) = element_msg.structure() { + if structure.name() == "dsc-verification-result" { + if let Ok(verified) = structure.get::("verified") { + verification_count += 1; + verification_success &= verified; + + if verified { + println!("Verification #{} succeeded", verification_count); + } else { + eprintln!("Verification #{} failed", verification_count); + } + } + } + } + } + _ => {} + } + } + None => { + eprintln!("Timeout waiting for message"); + pipeline_finished = true; + } + } + } + + pipeline.set_state(gst::State::Null).unwrap(); + + assert_eq!(verification_count, 2, + "Expected 2 verification messages (one per GOP), got {}", verification_count); + assert!(verification_success, + "All verifications should succeed"); + + cleanup_test_keys(&private_key_path, &cert_path); +} + +#[test] +fn test_signer_without_key() { + init(); + + let mut h = gst_check::Harness::new("dscsigner"); + h.play(); + + let caps = gst::Caps::builder("video/x-h264") + .field("stream-format", "byte-stream") + .field("alignment", "au") + .build(); + h.set_src_caps(caps); + + let buffer1 = create_test_h264_buffer(0, true); + let result = h.push(buffer1); + + for i in 1..5 { + let buffer = create_test_h264_buffer(i, false); + let _ = h.push(buffer); // These might pass or fail + } + + assert!( + result.is_err(), + "Expected signer to fail without private key when creating signature" + ); +} + +#[test] +fn test_verifier_without_signature_meta() { + init(); + + let (_, cert_path) = create_test_keys(); + let key_store_path = cert_path.parent().unwrap().to_str().unwrap(); + + let mut h = gst_check::Harness::new("dscverifier"); + h.play(); + + let verifier = h.element().unwrap(); + verifier.set_property("key-store-path", key_store_path); + + let caps = gst::Caps::builder("video/x-h264") + .field("stream-format", "byte-stream") + .field("alignment", "au") + .build(); + h.set_src_caps(caps); + + let buffer = create_test_h264_buffer(0, true); + + let result = h.push(buffer); + assert!(result.is_ok(), "First I-frame without signature should pass"); + + cleanup_test_keys(&PathBuf::new(), &cert_path); +} + +#[test] +fn test_signature_meta_preservation() { + init(); + + let (private_key_path, cert_path) = create_test_keys(); + + let mut h = gst_check::Harness::new("dscsigner"); + + let caps = gst::Caps::builder("video/x-h264") + .field("stream-format", "byte-stream") + .field("alignment", "au") + .build(); + h.set_src_caps(caps); + + let signer = h.element().unwrap(); + signer.set_property("hash-method", "sha256"); + signer.set_property( + "private-key-path", + private_key_path.to_str().unwrap(), + ); + signer.set_property("public-key-uri", cert_path.to_str().unwrap()); + signer.set_property("substream-length", 5u32); + + h.play(); + + let buffer1 = create_test_h264_buffer(0, true); + h.push(buffer1).unwrap(); + + for i in 1..5 { + let buffer = create_test_h264_buffer(i, false); + h.push(buffer).unwrap(); + } + + h.push_event(gst::event::Eos::new()); + + let mut signed_buffer_with_meta = None; + for _ in 0..5 { + let signed_buffer = h.pull().unwrap(); + if signed_buffer.meta::().is_some() { + signed_buffer_with_meta = Some(signed_buffer); + break; + } + } + + // Verify signature meta exists on at least one buffer + let signed_buffer = signed_buffer_with_meta.expect("Should have at least one buffer with signature meta"); + + let has_signature_meta = signed_buffer.foreach_meta(|meta| { + if meta.api().name() == "GstVideoDSCVerificationMeta" { + std::ops::ControlFlow::Break(()) + } else { + std::ops::ControlFlow::Continue(()) + } + }); + + assert!(has_signature_meta, "Buffer should have signature meta"); + + // Test that signature meta is preserved when copying + let copied_buffer = signed_buffer.copy_deep().unwrap(); + let copied_has_signature_meta = copied_buffer.foreach_meta(|meta| { + if meta.api().name() == "GstVideoDSCVerificationMeta" { + std::ops::ControlFlow::Break(()) + } else { + std::ops::ControlFlow::Continue(()) + } + }); + + assert!(copied_has_signature_meta, "Copied buffer should have signature meta"); + + cleanup_test_keys(&private_key_path, &cert_path); +} + +#[test] +fn test_multiple_hash_methods_sequential() { + init(); + + let (private_key_path, cert_path) = create_test_keys(); + let key_store_path = cert_path.parent().unwrap().to_str().unwrap(); + let hash_methods = ["sha1", "sha224", "sha256", "sha384", "sha512"]; + + for hash_method in &hash_methods { + println!("Testing hash method: {}", hash_method); + + let pipeline = gst::Pipeline::new(); + + let videotestsrc = gst::ElementFactory::make("videotestsrc") + .property("num-buffers", 10i32) + .build() + .unwrap(); + + let capsfilter1 = gst::ElementFactory::make("capsfilter").build().unwrap(); + capsfilter1.set_property("caps", gst::Caps::builder("video/x-raw") + .field("framerate", gst::Fraction::new(30, 1)) + .build()); + + let videoconvert = gst::ElementFactory::make("videoconvert").build().unwrap(); + let x264enc = gst::ElementFactory::make("x264enc") + .property("key-int-max", 5u32) + .build() + .unwrap(); + + let capsfilter2 = gst::ElementFactory::make("capsfilter").build().unwrap(); + capsfilter2.set_property("caps", gst::Caps::builder("video/x-h264") + .field("stream-format", "byte-stream") + .field("alignment", "au") + .build()); + + let signer = gst::ElementFactory::make("dscsigner") + .property("hash-method", *hash_method) + .property("private-key-path", private_key_path.to_str().unwrap()) + .property("public-key-uri", cert_path.to_str().unwrap()) + .build() + .unwrap(); + + let verifier = gst::ElementFactory::make("dscverifier") + .property("key-store-path", key_store_path) + .build() + .unwrap(); + + let fakesink = gst::ElementFactory::make("fakesink").build().unwrap(); + + pipeline.add_many([&videotestsrc, &capsfilter1, &videoconvert, &x264enc, + &capsfilter2, &signer, &verifier, &fakesink]).unwrap(); + gst::Element::link_many([&videotestsrc, &capsfilter1, &videoconvert, &x264enc, + &capsfilter2, &signer, &verifier, &fakesink]).unwrap(); + + let bus = pipeline.bus().unwrap(); + pipeline.set_state(gst::State::Playing).unwrap(); + + let mut pipeline_finished = false; + while !pipeline_finished { + if let Some(msg) = bus.timed_pop(gst::ClockTime::from_seconds(5)) { + use gst::MessageView; + match msg.view() { + MessageView::Eos(..) => pipeline_finished = true, + MessageView::Error(err) => { + panic!("Error in {}: {} ({:?})", hash_method, err.error(), err.debug()); + } + _ => {} + } + } else { + pipeline_finished = true; + } + } + + pipeline.set_state(gst::State::Null).unwrap(); + } + + cleanup_test_keys(&private_key_path, &cert_path); +}