media-converter: Update dependencies
This commit is contained in:
parent
f002efd808
commit
725dd255fc
11 changed files with 490 additions and 412 deletions
37
dist.LICENSE
37
dist.LICENSE
|
@ -254,10 +254,7 @@ This software contains the following Rust libraries under the MIT license:
|
|||
gstreamer-rs <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs>
|
||||
|
||||
array-init <https://github.com/Manishearth/array-init/>
|
||||
Copyright (c) 2010 The Rust Project Developers
|
||||
|
||||
autocfg <https://github.com/cuviper/autocfg>
|
||||
Copyright (c) 2018 Josh Stone
|
||||
Copyright (c) 2017-2020 The array-init developers
|
||||
|
||||
bitflags <https://github.com/bitflags/bitflags>
|
||||
num-integer <https://github.com/rust-num/num-integer>
|
||||
|
@ -266,29 +263,21 @@ This software contains the following Rust libraries under the MIT license:
|
|||
Copyright (c) 2014 The Rust Project Developers
|
||||
|
||||
cfg-if <https://github.com/alexcrichton/cfg-if>
|
||||
pkg-config <https://github.com/rust-lang/pkg-config-rs>
|
||||
proc-macro2 <https://github.com/alexcrichton/proc-macro2>
|
||||
proc-macro2 <https://github.com/dtolnay/proc-macro2>
|
||||
toml <https://github.com/alexcrichton/toml-rs>
|
||||
Copyright (c) 2014 Alex Crichton
|
||||
|
||||
chrono <https://github.com/chronotope/chrono>
|
||||
Copyright (c) 2014 Kang Seonghoon
|
||||
|
||||
crc32fast <https://github.com/srijs/rust-crc32fast>
|
||||
Copyright (c) 2018 Sam Rijs, Alex Crichton and contributors
|
||||
|
||||
futures-channel <https://github.com/rust-lang/futures-rs>
|
||||
futures-core <https://github.com/rust-lang/futures-rs>
|
||||
futures-executor <https://github.com/rust-lang/futures-rs>
|
||||
futures-macro <https://github.com/rust-lang/futures-rs>
|
||||
futures-task <https://github.com/rust-lang/futures-rs>
|
||||
futures-util <https://github.com/rust-lang/futures-rs>
|
||||
Copyright (c) 2016 Alex Crichton
|
||||
Copyright (c) 2017 The Tokio Authors
|
||||
|
||||
glib <https://github.com/gtk-rs/glib>
|
||||
Copyright (c) 2013-2015 The Gtk-rs Project Developers
|
||||
|
||||
heck <https://github.com/withoutboats/heck>
|
||||
unicode-segmentation <https://github.com/unicode-rs/unicode-segmentation>
|
||||
unicode-xid <https://github.com/unicode-rs/unicode-xid>
|
||||
|
@ -303,41 +292,35 @@ This software contains the following Rust libraries under the MIT license:
|
|||
murmur3 <https://github.com/stusmall/murmur3>
|
||||
Copyright (c) 2016 Stu Small
|
||||
|
||||
pin-utils <https://github.com/rust-lang/pin-utils>
|
||||
pin-utils <https://github.com/rust-lang-nursery/pin-utils>
|
||||
Copyright (c) 2018 The pin-utils authors
|
||||
|
||||
pretty-hex <https://github.com/wolandr/pretty-hex>
|
||||
Copyright (c) 2018 Andrei Volnin
|
||||
|
||||
proc-macro-error <https://gitlab.com/CreepySkeleton/proc-macro-error>
|
||||
proc-macro-error-attr <https://gitlab.com/CreepySkeleton/proc-macro-error>
|
||||
Copyright (c) 2019-2020 CreepySkeleton
|
||||
|
||||
proc-macro-hack <https://github.com/dtolnay/proc-macro-hack>
|
||||
Copyright (c) 2018 David Tolnay
|
||||
|
||||
quote <https://github.com/dtolnay/quote>
|
||||
Copyright (c) 2016 The Rust Project Developers
|
||||
|
||||
slab <https://github.com/carllerche/slab>
|
||||
slab <https://github.com/tokio-rs/slab>
|
||||
Copyright (c) 2019 Carl Lerche
|
||||
|
||||
time <https://github.com/time-rs/time>
|
||||
Copyright (c) 2019 Jacob Pratt
|
||||
|
||||
version_check <https://github.com/SergioBenitez/version_check>
|
||||
Copyright (c) 2017-2018 Sergio Benitez
|
||||
smallvec <https://github.com/servo/rust-smallvec>
|
||||
Copyright (c) 2018 The Servo Project Developers
|
||||
|
||||
anyhow <https://github.com/dtolnay/anyhow>
|
||||
either <https://github.com/bluss/either>
|
||||
itertools <https://github.com/rust-itertools/itertools>
|
||||
glib <https://github.com/gtk-rs/gtk-rs-core>
|
||||
once_cell <https://github.com/matklad/once_cell>
|
||||
paste <https://github.com/dtolnay/paste>
|
||||
pin-project <https://github.com/taiki-e/pin-project>
|
||||
pin-project-lite <https://github.com/taiki-e/pin-project-lite>
|
||||
proc-macro-crate <https://github.com/bkchr/proc-macro-crate>
|
||||
serde <https://github.com/serde-rs/serde>
|
||||
syn <https://github.com/dtolnay/syn>
|
||||
syn-mid <https://github.com/taiki-e/syn-mid>
|
||||
thiserror <https://github.com/dtolnay/thiserror>
|
||||
thiserror-impl <https://github.com/dtolnay/thiserror>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
251
media-converter/Cargo.lock
generated
251
media-converter/Cargo.lock
generated
|
@ -1,16 +1,18 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.40"
|
||||
version = "1.0.51"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
|
||||
checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203"
|
||||
|
||||
[[package]]
|
||||
name = "array-init"
|
||||
version = "1.0.0"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a51c983d65b6691893a791e55aa8bda43bbd9b11f947e5a9581710362277cc95"
|
||||
checksum = "6945cc5422176fc5e602e590c2878d2c2acd9a4fe20a4baa7c28022521698ec6"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
|
@ -20,9 +22,18 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
|||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.2.1"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-expr"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e"
|
||||
dependencies = [
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
|
@ -45,9 +56,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "crc32fast"
|
||||
version = "1.2.1"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
|
||||
checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
@ -60,92 +71,76 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
|||
|
||||
[[package]]
|
||||
name = "futures-channel"
|
||||
version = "0.3.13"
|
||||
version = "0.3.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939"
|
||||
checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-core"
|
||||
version = "0.3.13"
|
||||
version = "0.3.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94"
|
||||
checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7"
|
||||
|
||||
[[package]]
|
||||
name = "futures-executor"
|
||||
version = "0.3.13"
|
||||
version = "0.3.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1"
|
||||
checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-task",
|
||||
"futures-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-macro"
|
||||
version = "0.3.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7"
|
||||
dependencies = [
|
||||
"proc-macro-hack",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-task"
|
||||
version = "0.3.13"
|
||||
version = "0.3.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80"
|
||||
checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72"
|
||||
|
||||
[[package]]
|
||||
name = "futures-util"
|
||||
version = "0.3.13"
|
||||
version = "0.3.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1"
|
||||
checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-macro",
|
||||
"futures-task",
|
||||
"pin-project-lite",
|
||||
"pin-utils",
|
||||
"proc-macro-hack",
|
||||
"proc-macro-nested",
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "glib"
|
||||
version = "0.10.3"
|
||||
version = "0.14.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c685013b7515e668f1b57a165b009d4d28cb139a8a989bbd699c10dad29d0c5"
|
||||
checksum = "7c515f1e62bf151ef6635f528d05b02c11506de986e43b34a5c920ef0b3796a4"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-executor",
|
||||
"futures-task",
|
||||
"futures-util",
|
||||
"glib-macros",
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "glib-macros"
|
||||
version = "0.10.1"
|
||||
version = "0.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41486a26d1366a8032b160b59065a59fb528530a46a49f627e7048fb8c064039"
|
||||
checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"itertools",
|
||||
"proc-macro-crate",
|
||||
"proc-macro-error",
|
||||
"proc-macro2",
|
||||
|
@ -155,9 +150,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "glib-sys"
|
||||
version = "0.10.1"
|
||||
version = "0.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c7e9b997a66e9a23d073f2b1abb4dbfc3925e0b8952f67efd8d9b6e168e4cdc1"
|
||||
checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"system-deps",
|
||||
|
@ -165,9 +160,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gobject-sys"
|
||||
version = "0.10.0"
|
||||
version = "0.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c"
|
||||
checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"libc",
|
||||
|
@ -176,16 +171,16 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gst-plugin-version-helper"
|
||||
version = "0.2.0"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs?tag=0.6.0#634d231269ab9b68c722c5037d1c94bed97ba45c"
|
||||
version = "0.7.2"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs?tag=0.7.2#d0466b3eee114207f851b37cae0015c0e718f021"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer"
|
||||
version = "0.16.7"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.16.7#30a323e24cd6020c872e5d5acf02b880497ff102"
|
||||
version = "0.17.4"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.17.4#6c9815f0594045ef668bf3fefbaf5e0846516d4b"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cfg-if",
|
||||
|
@ -193,11 +188,10 @@ dependencies = [
|
|||
"futures-core",
|
||||
"futures-util",
|
||||
"glib",
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
"gstreamer-sys",
|
||||
"libc",
|
||||
"muldiv",
|
||||
"num-integer",
|
||||
"num-rational",
|
||||
"once_cell",
|
||||
"paste",
|
||||
|
@ -207,27 +201,24 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gstreamer-audio"
|
||||
version = "0.16.7"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.16.7#30a323e24cd6020c872e5d5acf02b880497ff102"
|
||||
version = "0.17.4"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.17.4#6c9815f0594045ef668bf3fefbaf5e0846516d4b"
|
||||
dependencies = [
|
||||
"array-init",
|
||||
"bitflags",
|
||||
"cfg-if",
|
||||
"glib",
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
"gstreamer",
|
||||
"gstreamer-audio-sys",
|
||||
"gstreamer-base",
|
||||
"gstreamer-base-sys",
|
||||
"gstreamer-sys",
|
||||
"libc",
|
||||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-audio-sys"
|
||||
version = "0.9.1"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs-sys.git?branch=0.9#a20aae85e1bc976a97d1c942ff56f346fb2f8d4c"
|
||||
version = "0.17.4"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.17.4#6c9815f0594045ef668bf3fefbaf5e0846516d4b"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
|
@ -239,23 +230,21 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gstreamer-base"
|
||||
version = "0.16.7"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.16.7#30a323e24cd6020c872e5d5acf02b880497ff102"
|
||||
version = "0.17.4"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.17.4#6c9815f0594045ef668bf3fefbaf5e0846516d4b"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cfg-if",
|
||||
"glib",
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
"gstreamer",
|
||||
"gstreamer-base-sys",
|
||||
"gstreamer-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gstreamer-base-sys"
|
||||
version = "0.9.1"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs-sys.git?branch=0.9#a20aae85e1bc976a97d1c942ff56f346fb2f8d4c"
|
||||
version = "0.17.4"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.17.4#6c9815f0594045ef668bf3fefbaf5e0846516d4b"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
|
@ -266,8 +255,8 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gstreamer-sys"
|
||||
version = "0.9.1"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs-sys.git?branch=0.9#a20aae85e1bc976a97d1c942ff56f346fb2f8d4c"
|
||||
version = "0.17.4"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.17.4#6c9815f0594045ef668bf3fefbaf5e0846516d4b"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
|
@ -277,19 +266,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gstreamer-video"
|
||||
version = "0.16.7"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.16.7#30a323e24cd6020c872e5d5acf02b880497ff102"
|
||||
version = "0.17.4"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.17.4#6c9815f0594045ef668bf3fefbaf5e0846516d4b"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cfg-if",
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
"glib",
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
"gstreamer",
|
||||
"gstreamer-base",
|
||||
"gstreamer-base-sys",
|
||||
"gstreamer-sys",
|
||||
"gstreamer-video-sys",
|
||||
"libc",
|
||||
"once_cell",
|
||||
|
@ -297,8 +282,8 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gstreamer-video-sys"
|
||||
version = "0.9.1"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs-sys.git?branch=0.9#a20aae85e1bc976a97d1c942ff56f346fb2f8d4c"
|
||||
version = "0.17.4"
|
||||
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?tag=0.17.4#6c9815f0594045ef668bf3fefbaf5e0846516d4b"
|
||||
dependencies = [
|
||||
"glib-sys",
|
||||
"gobject-sys",
|
||||
|
@ -310,33 +295,33 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.3.2"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"
|
||||
checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
|
||||
dependencies = [
|
||||
"unicode-segmentation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.9.0"
|
||||
version = "0.10.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
||||
checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.91"
|
||||
version = "0.2.112"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8916b1f6ca17130ec6568feccee27c156ad12037880833a3b842a823236502e7"
|
||||
checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125"
|
||||
|
||||
[[package]]
|
||||
name = "muldiv"
|
||||
version = "0.2.1"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0419348c027fa7be448d2ae7ea0e4e04c2334c31dc4e74ab29f00a2a7ca69204"
|
||||
checksum = "b5136edda114182728ccdedb9f5eda882781f35fa6e80cc360af12a8932507f3"
|
||||
|
||||
[[package]]
|
||||
name = "num-integer"
|
||||
|
@ -350,9 +335,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.3.2"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
|
||||
checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
|
@ -370,21 +355,21 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.7.2"
|
||||
version = "1.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
|
||||
checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
version = "1.0.5"
|
||||
version = "1.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58"
|
||||
checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5"
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.6"
|
||||
version = "0.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
|
||||
checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
|
||||
|
||||
[[package]]
|
||||
name = "pin-utils"
|
||||
|
@ -394,9 +379,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
|||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.19"
|
||||
version = "0.3.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
|
||||
checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
|
||||
|
||||
[[package]]
|
||||
name = "pretty-hex"
|
||||
|
@ -406,10 +391,11 @@ checksum = "bc5c99d529f0d30937f6f4b8a86d988047327bb88d04d2c4afc356de74722131"
|
|||
|
||||
[[package]]
|
||||
name = "proc-macro-crate"
|
||||
version = "0.1.5"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
|
||||
checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83"
|
||||
dependencies = [
|
||||
"thiserror",
|
||||
"toml",
|
||||
]
|
||||
|
||||
|
@ -437,30 +423,18 @@ dependencies = [
|
|||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-hack"
|
||||
version = "0.5.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-nested"
|
||||
version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
version = "1.0.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
checksum = "2f84e92c0f7c9d58328b85a78557813e4bd845130db68d7184635344399423b1"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proton-media-converter"
|
||||
version = "6.3.0"
|
||||
version = "7.0.0"
|
||||
dependencies = [
|
||||
"array-init",
|
||||
"crc32fast",
|
||||
|
@ -475,36 +449,42 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.9"
|
||||
version = "1.0.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
|
||||
checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.125"
|
||||
version = "1.0.132"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171"
|
||||
checksum = "8b9875c23cf305cd1fd7eb77234cbb705f21ea6a72c637a5c6db5fe4b8e7f008"
|
||||
|
||||
[[package]]
|
||||
name = "slab"
|
||||
version = "0.4.2"
|
||||
version = "0.4.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
|
||||
checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
|
||||
|
||||
[[package]]
|
||||
name = "strum"
|
||||
version = "0.18.0"
|
||||
version = "0.21.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b"
|
||||
checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2"
|
||||
|
||||
[[package]]
|
||||
name = "strum_macros"
|
||||
version = "0.18.0"
|
||||
version = "0.21.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c"
|
||||
checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
|
@ -514,9 +494,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.67"
|
||||
version = "1.0.82"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702"
|
||||
checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -525,11 +505,14 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "system-deps"
|
||||
version = "1.3.2"
|
||||
version = "3.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b"
|
||||
checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"cfg-expr",
|
||||
"heck",
|
||||
"itertools",
|
||||
"pkg-config",
|
||||
"strum",
|
||||
"strum_macros",
|
||||
|
@ -540,18 +523,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.24"
|
||||
version = "1.0.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e"
|
||||
checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.24"
|
||||
version = "1.0.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0"
|
||||
checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -580,21 +563,21 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "unicode-segmentation"
|
||||
version = "1.7.1"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
|
||||
checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
|
||||
|
||||
[[package]]
|
||||
name = "version-compare"
|
||||
version = "0.0.10"
|
||||
version = "0.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1"
|
||||
checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
[package]
|
||||
name = "proton-media-converter"
|
||||
version = "6.3.0"
|
||||
version = "7.0.0"
|
||||
authors = ["Andrew Eikum <aeikum@codeweavers.com>"]
|
||||
repository = "https://github.com/ValveSoftware/Proton/"
|
||||
license = "MIT/Apache-2.0"
|
||||
edition = "2018"
|
||||
edition = "2021"
|
||||
description = "Proton media converter"
|
||||
|
||||
[dependencies]
|
||||
glib = "0.10"
|
||||
gstreamer = { git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", tag = "0.16.7" }
|
||||
gstreamer-base = { git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", tag = "0.16.7" }
|
||||
gstreamer-video = { git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", tag = "0.16.7" }
|
||||
gstreamer-audio = { git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", tag = "0.16.7" }
|
||||
once_cell = "1.7"
|
||||
crc32fast = "1.2"
|
||||
array-init = "1.0.*" # >=1.1 requires rust >= 1.51
|
||||
glib = "0.14"
|
||||
gstreamer = { git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", tag = "0.17.4" }
|
||||
gstreamer-base = { git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", tag = "0.17.4" }
|
||||
gstreamer-video = { git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", tag = "0.17.4" }
|
||||
gstreamer-audio = { git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", tag = "0.17.4" }
|
||||
once_cell = "1.9"
|
||||
crc32fast = "1.3"
|
||||
array-init = "2.0"
|
||||
|
||||
[lib]
|
||||
name = "protonmediaconverter"
|
||||
|
@ -23,7 +23,7 @@ crate-type = ["cdylib"]
|
|||
path = "src/lib.rs"
|
||||
|
||||
[build-dependencies]
|
||||
gst-plugin-version-helper = { git = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs", tag = "0.6.0" }
|
||||
gst-plugin-version-helper = { git = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs", tag = "0.7.2" }
|
||||
|
||||
[profile.release]
|
||||
lto = true
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
extern crate gst_plugin_version_helper;
|
||||
|
||||
fn main() {
|
||||
gst_plugin_version_helper::get_info()
|
||||
gst_plugin_version_helper::info()
|
||||
}
|
||||
|
|
|
@ -28,14 +28,11 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
use glib;
|
||||
use glib::subclass;
|
||||
use glib::subclass::prelude::*;
|
||||
|
||||
use crate::format_hash;
|
||||
use crate::HASH_SEED;
|
||||
|
||||
use gst;
|
||||
use gst::glib;
|
||||
use gst::prelude::*;
|
||||
use gst::subclass::prelude::*;
|
||||
use gst::EventView;
|
||||
|
@ -316,17 +313,16 @@ struct NeedTranscodeHead {
|
|||
|
||||
impl NeedTranscodeHead {
|
||||
fn new_from_caps(caps: &gst::CapsRef) -> Result<Self, gst::LoggableError> {
|
||||
let s = caps.get_structure(0).ok_or_else(|| gst_loggable_error!(CAT, "Caps have no WMA data!"))?;
|
||||
let s = caps.structure(0).ok_or_else(|| loggable_error!(CAT, "Caps have no WMA data!"))?;
|
||||
|
||||
let wmaversion = s.get_some::<i32>("wmaversion").map_err(|_| gst_loggable_error!(CAT, "Caps have no wmaversion field"))?;
|
||||
let bitrate = s.get_some::<i32>("bitrate").map_err(|_| gst_loggable_error!(CAT, "Caps have no bitrate field"))?;
|
||||
let channels = s.get_some::<i32>("channels").map_err(|_| gst_loggable_error!(CAT, "Caps have no channels field"))?;
|
||||
let rate = s.get_some::<i32>("rate").map_err(|_| gst_loggable_error!(CAT, "Caps have no rate field"))?;
|
||||
let block_align = s.get_some::<i32>("block_align").map_err(|_| gst_loggable_error!(CAT, "Caps have no block_align field"))?;
|
||||
let depth = s.get_some::<i32>("depth").map_err(|_| gst_loggable_error!(CAT, "Caps have no depth field"))?;
|
||||
let wmaversion = s.get::<i32>("wmaversion").map_err(|_| loggable_error!(CAT, "Caps have no wmaversion field"))?;
|
||||
let bitrate = s.get::<i32>("bitrate").map_err(|_| loggable_error!(CAT, "Caps have no bitrate field"))?;
|
||||
let channels = s.get::<i32>("channels").map_err(|_| loggable_error!(CAT, "Caps have no channels field"))?;
|
||||
let rate = s.get::<i32>("rate").map_err(|_| loggable_error!(CAT, "Caps have no rate field"))?;
|
||||
let block_align = s.get::<i32>("block_align").map_err(|_| loggable_error!(CAT, "Caps have no block_align field"))?;
|
||||
let depth = s.get::<i32>("depth").map_err(|_| loggable_error!(CAT, "Caps have no depth field"))?;
|
||||
let codec_data_buf = s.get::<gst::Buffer>("codec_data")
|
||||
.map_err(|_| gst_loggable_error!(CAT, "Caps have no codec_data field"))?
|
||||
.ok_or_else(|| gst_loggable_error!(CAT, "Caps have NULL codec_data field"))?;
|
||||
.map_err(|_| loggable_error!(CAT, "Caps have no codec_data field"))?;
|
||||
|
||||
let mapped = codec_data_buf.into_mapped_buffer_readable().unwrap();
|
||||
let mut codec_data = Vec::new();
|
||||
|
@ -428,7 +424,7 @@ impl StreamState {
|
|||
let mut db = &mut db.open(true).fozdb;
|
||||
let db = match &mut db {
|
||||
Some(d) => d,
|
||||
None => { return Err(gst_loggable_error!(CAT, "Failed to open fossilize db!")) },
|
||||
None => { return Err(loggable_error!(CAT, "Failed to open fossilize db!")) },
|
||||
};
|
||||
|
||||
let mut found = db.has_entry(AUDIOCONV_FOZ_TAG_STREAM, self.cur_hash);
|
||||
|
@ -476,20 +472,20 @@ impl StreamState {
|
|||
self.buffers[0].0,
|
||||
&mut self.codec_info.as_ref().unwrap().serialize().as_slice(),
|
||||
fossilize::CRCCheck::WithCRC)
|
||||
.map_err(|e| gst_loggable_error!(CAT, "Unable to write stream header: {:?}", e))?;
|
||||
.map_err(|e| loggable_error!(CAT, "Unable to write stream header: {:?}", e))?;
|
||||
|
||||
db.write_entry(AUDIOCONV_FOZ_TAG_STREAM,
|
||||
self.cur_hash,
|
||||
&mut StreamStateSerializer::new(self),
|
||||
fossilize::CRCCheck::WithCRC)
|
||||
.map_err(|e| gst_loggable_error!(CAT, "Unable to write stream: {:?}", e))?;
|
||||
.map_err(|e| loggable_error!(CAT, "Unable to write stream: {:?}", e))?;
|
||||
|
||||
for buffer in self.buffers.iter() {
|
||||
db.write_entry(AUDIOCONV_FOZ_TAG_AUDIODATA,
|
||||
buffer.0,
|
||||
&mut buffer.1.as_slice(),
|
||||
fossilize::CRCCheck::WithCRC)
|
||||
.map_err(|e| gst_loggable_error!(CAT, "Unable to write audio data: {:?}", e))?;
|
||||
.map_err(|e| loggable_error!(CAT, "Unable to write audio data: {:?}", e))?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -555,7 +551,7 @@ impl AudioConvState {
|
|||
fn new() -> Result<AudioConvState, gst::LoggableError> {
|
||||
|
||||
let read_fozdb_path = std::env::var("MEDIACONV_AUDIO_TRANSCODED_FILE").map_err(|_| {
|
||||
gst_loggable_error!(CAT, "MEDIACONV_AUDIO_TRANSCODED_FILE is not set!")
|
||||
loggable_error!(CAT, "MEDIACONV_AUDIO_TRANSCODED_FILE is not set!")
|
||||
})?;
|
||||
|
||||
let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), AUDIOCONV_FOZ_NUM_TAGS) {
|
||||
|
@ -590,7 +586,7 @@ impl AudioConvState {
|
|||
|
||||
fn open_transcode_file(&mut self, buffer: gst::Buffer) -> io::Result<Box<[u8]>> {
|
||||
let mapped = buffer.into_mapped_buffer_readable().unwrap();
|
||||
let buf_len = mapped.get_size();
|
||||
let buf_len = mapped.size();
|
||||
|
||||
let hash = hash_data(mapped.as_slice(), buf_len, &mut self.hash_state)
|
||||
.map_err(|e|{ gst_warning!(CAT, "Hashing buffer failed! {}", e); io::ErrorKind::Other })?;
|
||||
|
@ -632,28 +628,26 @@ impl AudioConvState {
|
|||
/* if we can't, return the blank file */
|
||||
self.stream_state.needs_dump = true;
|
||||
|
||||
let buf = Box::new(*include_bytes!("../blank.ptna"));
|
||||
let buf = Box::new(*include_bytes!("../../blank.ptna"));
|
||||
|
||||
Ok(buf)
|
||||
}
|
||||
}
|
||||
|
||||
struct AudioConv {
|
||||
pub struct AudioConv {
|
||||
state: Mutex<Option<AudioConvState>>,
|
||||
sinkpad: gst::Pad,
|
||||
srcpad: gst::Pad,
|
||||
}
|
||||
|
||||
#[glib::object_subclass]
|
||||
impl ObjectSubclass for AudioConv {
|
||||
const NAME: &'static str = "ProtonAudioConverter";
|
||||
type Type = super::AudioConv;
|
||||
type ParentType = gst::Element;
|
||||
type Instance = gst::subclass::ElementInstanceStruct<Self>;
|
||||
type Class = subclass::simple::ClassStruct<Self>;
|
||||
|
||||
glib_object_subclass!();
|
||||
|
||||
fn with_class(klass: &subclass::simple::ClassStruct<Self>) -> Self {
|
||||
let templ = klass.get_pad_template("sink").unwrap();
|
||||
fn with_class(klass: &Self::Class) -> Self {
|
||||
let templ = klass.pad_template("sink").unwrap();
|
||||
let sinkpad = gst::Pad::builder_with_template(&templ, Some("sink"))
|
||||
.chain_function(|pad, parent, buffer| {
|
||||
AudioConv::catch_panic_pad_function(
|
||||
|
@ -670,7 +664,7 @@ impl ObjectSubclass for AudioConv {
|
|||
)
|
||||
}).build();
|
||||
|
||||
let templ = klass.get_pad_template("src").unwrap();
|
||||
let templ = klass.pad_template("src").unwrap();
|
||||
let srcpad = gst::Pad::builder_with_template(&templ, Some("src"))
|
||||
.query_function(|pad, parent, query| {
|
||||
AudioConv::catch_panic_pad_function(
|
||||
|
@ -682,7 +676,7 @@ impl ObjectSubclass for AudioConv {
|
|||
.activatemode_function(|pad, parent, mode, active| {
|
||||
AudioConv::catch_panic_pad_function(
|
||||
parent,
|
||||
|| Err(gst_loggable_error!(CAT, "Panic activating srcpad with mode")),
|
||||
|| Err(loggable_error!(CAT, "Panic activating srcpad with mode")),
|
||||
|audioconv, element| audioconv.src_activatemode(pad, element, mode, active)
|
||||
)
|
||||
}).build();
|
||||
|
@ -693,53 +687,59 @@ impl ObjectSubclass for AudioConv {
|
|||
srcpad,
|
||||
}
|
||||
}
|
||||
|
||||
fn class_init(klass: &mut subclass::simple::ClassStruct<Self>) {
|
||||
|
||||
klass.set_metadata(
|
||||
"Proton audio converter",
|
||||
"Codec/Parser",
|
||||
"Converts audio for Proton",
|
||||
"Andrew Eikum <aeikum@codeweavers.com>");
|
||||
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
{
|
||||
let caps = caps.get_mut().unwrap();
|
||||
caps.append(gst::Caps::builder("audio/x-wma").build());
|
||||
}
|
||||
let sink_pad_template = gst::PadTemplate::new(
|
||||
"sink",
|
||||
gst::PadDirection::Sink,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
klass.add_pad_template(sink_pad_template);
|
||||
|
||||
let caps = gst::Caps::builder("audio/x-opus").build();
|
||||
let src_pad_template = gst::PadTemplate::new(
|
||||
"src",
|
||||
gst::PadDirection::Src,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
klass.add_pad_template(src_pad_template);
|
||||
}
|
||||
}
|
||||
|
||||
impl ObjectImpl for AudioConv {
|
||||
glib_object_impl!();
|
||||
|
||||
fn constructed(&self, obj: &glib::Object) {
|
||||
fn constructed(&self, obj: &Self::Type) {
|
||||
self.parent_constructed(obj);
|
||||
|
||||
let element = obj.downcast_ref::<gst::Element>().unwrap();
|
||||
element.add_pad(&self.sinkpad).unwrap();
|
||||
element.add_pad(&self.srcpad).unwrap();
|
||||
obj.add_pad(&self.sinkpad).unwrap();
|
||||
obj.add_pad(&self.srcpad).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
impl ElementImpl for AudioConv {
|
||||
fn metadata() -> Option<&'static gst::subclass::ElementMetadata> {
|
||||
static ELEMENT_METADATA: Lazy<gst::subclass::ElementMetadata> = Lazy::new(|| {
|
||||
gst::subclass::ElementMetadata::new(
|
||||
"Proton audio converter",
|
||||
"Codec/Parser",
|
||||
"Converts audio for Proton",
|
||||
"Andrew Eikum <aeikum@codeweavers.com>")
|
||||
});
|
||||
|
||||
Some(&*ELEMENT_METADATA)
|
||||
}
|
||||
|
||||
fn pad_templates() -> &'static [gst::PadTemplate] {
|
||||
static PAD_TEMPLATES: Lazy<Vec<gst::PadTemplate>> = Lazy::new(|| {
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
{
|
||||
let caps = caps.get_mut().unwrap();
|
||||
caps.append(gst::Caps::builder("audio/x-wma").build());
|
||||
}
|
||||
let sink_pad_template = gst::PadTemplate::new(
|
||||
"sink",
|
||||
gst::PadDirection::Sink,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
|
||||
let caps = gst::Caps::builder("audio/x-opus").build();
|
||||
let src_pad_template = gst::PadTemplate::new(
|
||||
"src",
|
||||
gst::PadDirection::Src,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
|
||||
vec![src_pad_template, sink_pad_template]
|
||||
});
|
||||
|
||||
PAD_TEMPLATES.as_ref()
|
||||
}
|
||||
|
||||
fn change_state(
|
||||
&self,
|
||||
element: &gst::Element,
|
||||
element: &super::AudioConv,
|
||||
transition: gst::StateChange
|
||||
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
|
||||
|
||||
|
@ -797,7 +797,7 @@ impl AudioConv {
|
|||
fn chain(
|
||||
&self,
|
||||
_pad: &gst::Pad,
|
||||
_element: &gst::Element,
|
||||
_element: &super::AudioConv,
|
||||
buffer: gst::Buffer
|
||||
) -> Result<gst::FlowSuccess, gst::FlowError> {
|
||||
gst_log!(CAT, "Handling buffer {:?}", buffer);
|
||||
|
@ -849,7 +849,7 @@ impl AudioConv {
|
|||
let mut buffer = gst::Buffer::with_size(encoded_len as usize).unwrap();
|
||||
|
||||
if !pkt_is_header && padding_len > 0 {
|
||||
gst_audio::AudioClippingMeta::add(buffer.get_mut().unwrap(), gst::format::Default(Some(0)), gst::format::Default(Some(padding_len as u64)));
|
||||
gst_audio::AudioClippingMeta::add(buffer.get_mut().unwrap(), gst::format::Default(0), gst::format::Default(padding_len as u64));
|
||||
}
|
||||
|
||||
let mut writable = buffer.into_mapped_buffer_writable().unwrap();
|
||||
|
@ -872,7 +872,7 @@ impl AudioConv {
|
|||
fn sink_event(
|
||||
&self,
|
||||
pad: &gst::Pad,
|
||||
element: &gst::Element,
|
||||
element: &super::AudioConv,
|
||||
event: gst::Event
|
||||
) -> bool {
|
||||
gst_log!(CAT, obj:pad, "Got an event {:?}", event);
|
||||
|
@ -881,7 +881,7 @@ impl AudioConv {
|
|||
|
||||
let mut state = self.state.lock().unwrap();
|
||||
if let Some(state) = &mut *state {
|
||||
let head = match NeedTranscodeHead::new_from_caps(&event_caps.get_caps()){
|
||||
let head = match NeedTranscodeHead::new_from_caps(&event_caps.caps()){
|
||||
Ok(h) => h,
|
||||
Err(e) => {
|
||||
gst_error!(CAT, "Invalid WMA caps!");
|
||||
|
@ -920,7 +920,7 @@ impl AudioConv {
|
|||
fn src_query(
|
||||
&self,
|
||||
pad: &gst::Pad,
|
||||
element: &gst::Element,
|
||||
element: &super::AudioConv,
|
||||
query: &mut gst::QueryRef) -> bool
|
||||
{
|
||||
gst_log!(CAT, obj: pad, "got query: {:?}", query);
|
||||
|
@ -932,7 +932,7 @@ impl AudioConv {
|
|||
return res;
|
||||
}
|
||||
|
||||
let (flags, min, max, align) = peer_query.get_result();
|
||||
let (flags, min, max, align) = peer_query.result();
|
||||
|
||||
q.set(flags, min, max, align);
|
||||
true
|
||||
|
@ -944,7 +944,7 @@ impl AudioConv {
|
|||
fn src_activatemode(
|
||||
&self,
|
||||
_pad: &gst::Pad,
|
||||
_element: &gst::Element,
|
||||
_element: &super::AudioConv,
|
||||
mode: gst::PadMode,
|
||||
active: bool
|
||||
) -> Result<(), gst::LoggableError> {
|
||||
|
@ -953,13 +953,4 @@ impl AudioConv {
|
|||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||
gst::Element::register(
|
||||
Some(plugin),
|
||||
"protonaudioconverter",
|
||||
gst::Rank::Marginal,
|
||||
AudioConv::get_type())
|
||||
}
|
46
media-converter/src/audioconv/mod.rs
Normal file
46
media-converter/src/audioconv/mod.rs
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2020 Valve Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
use gst::glib;
|
||||
use gst::prelude::*;
|
||||
|
||||
mod imp;
|
||||
|
||||
glib::wrapper! {
|
||||
pub struct AudioConv(ObjectSubclass<imp::AudioConv>) @extends gst::Element, gst::Object;
|
||||
}
|
||||
|
||||
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||
gst::Element::register(
|
||||
Some(plugin),
|
||||
"protonaudioconverter",
|
||||
gst::Rank::Marginal,
|
||||
AudioConv::static_type())
|
||||
}
|
|
@ -28,11 +28,8 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
use glib;
|
||||
use glib::subclass;
|
||||
use glib::subclass::prelude::*;
|
||||
|
||||
use gst;
|
||||
use gst::glib;
|
||||
use gst::prelude::*;
|
||||
use gst::subclass::prelude::*;
|
||||
use gst::EventView;
|
||||
|
@ -64,7 +61,7 @@ static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
|||
Some("Proton audio converter bin"))
|
||||
});
|
||||
|
||||
struct AudioConvBin {
|
||||
pub struct AudioConvBin {
|
||||
audioconv: gst::Element,
|
||||
opusdec: gst::Element,
|
||||
capssetter: gst::Element,
|
||||
|
@ -72,21 +69,18 @@ struct AudioConvBin {
|
|||
sinkpad: gst::GhostPad,
|
||||
}
|
||||
|
||||
#[glib::object_subclass]
|
||||
impl ObjectSubclass for AudioConvBin {
|
||||
const NAME: &'static str = "ProtonAudioConverterBin";
|
||||
|
||||
type Type = super::AudioConvBin;
|
||||
type ParentType = gst::Bin;
|
||||
type Instance = gst::subclass::ElementInstanceStruct<Self>;
|
||||
type Class = subclass::simple::ClassStruct<Self>;
|
||||
|
||||
glib_object_subclass!();
|
||||
fn with_class(klass: &Self::Class) -> Self {
|
||||
|
||||
fn with_class(klass: &subclass::simple::ClassStruct<Self>) -> Self {
|
||||
|
||||
let templ = klass.get_pad_template("src").unwrap();
|
||||
let templ = klass.pad_template("src").unwrap();
|
||||
let srcpad = gst::GhostPad::builder_with_template(&templ, Some("src")).build();
|
||||
|
||||
let templ = klass.get_pad_template("sink").unwrap();
|
||||
let templ = klass.pad_template("sink").unwrap();
|
||||
let sinkpad = gst::GhostPad::builder_with_template(&templ, Some("sink"))
|
||||
.event_function(|pad, parent, event| {
|
||||
AudioConvBin::catch_panic_pad_function(
|
||||
|
@ -108,79 +102,86 @@ impl ObjectSubclass for AudioConvBin {
|
|||
sinkpad,
|
||||
}
|
||||
}
|
||||
|
||||
fn class_init(klass: &mut subclass::simple::ClassStruct<Self>) {
|
||||
klass.set_metadata("Proton audio converter with rate fixup",
|
||||
"Codec/Parser",
|
||||
"Converts audio for Proton, fixing up samplerates",
|
||||
"Andrew Eikum <aeikum@codeweavers.com>");
|
||||
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
{
|
||||
let caps = caps.get_mut().unwrap();
|
||||
caps.append(gst::Caps::builder("audio/x-wma").build());
|
||||
}
|
||||
let sink_pad_template = gst::PadTemplate::new(
|
||||
"sink",
|
||||
gst::PadDirection::Sink,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
klass.add_pad_template(sink_pad_template);
|
||||
|
||||
let caps = gst::Caps::builder("audio/x-raw").build();
|
||||
let src_pad_template = gst::PadTemplate::new(
|
||||
"src",
|
||||
gst::PadDirection::Src,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
klass.add_pad_template(src_pad_template);
|
||||
}
|
||||
}
|
||||
|
||||
impl ObjectImpl for AudioConvBin {
|
||||
glib_object_impl!();
|
||||
|
||||
fn constructed(&self, obj: &glib::Object) {
|
||||
fn constructed(&self, obj: &Self::Type) {
|
||||
self.parent_constructed(obj);
|
||||
|
||||
let bin = obj.downcast_ref::<gst::Bin>().unwrap();
|
||||
|
||||
bin.add(&self.audioconv).unwrap();
|
||||
bin.add(&self.opusdec).unwrap();
|
||||
bin.add(&self.capssetter).unwrap();
|
||||
obj.add(&self.audioconv).unwrap();
|
||||
obj.add(&self.opusdec).unwrap();
|
||||
obj.add(&self.capssetter).unwrap();
|
||||
|
||||
self.audioconv.link(&self.opusdec).unwrap();
|
||||
self.opusdec.link(&self.capssetter).unwrap();
|
||||
|
||||
self.sinkpad
|
||||
.set_target(Some(&self.audioconv.get_static_pad("sink").unwrap()))
|
||||
.set_target(Some(&self.audioconv.static_pad("sink").unwrap()))
|
||||
.unwrap();
|
||||
self.srcpad
|
||||
.set_target(Some(&self.capssetter.get_static_pad("src").unwrap()))
|
||||
.set_target(Some(&self.capssetter.static_pad("src").unwrap()))
|
||||
.unwrap();
|
||||
|
||||
bin.add_pad(&self.sinkpad).unwrap();
|
||||
bin.add_pad(&self.srcpad).unwrap();
|
||||
obj.add_pad(&self.sinkpad).unwrap();
|
||||
obj.add_pad(&self.srcpad).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
impl BinImpl for AudioConvBin { }
|
||||
|
||||
impl ElementImpl for AudioConvBin { }
|
||||
impl ElementImpl for AudioConvBin {
|
||||
fn metadata() -> Option<&'static gst::subclass::ElementMetadata> {
|
||||
static ELEMENT_METADATA: Lazy<gst::subclass::ElementMetadata> = Lazy::new(|| {
|
||||
gst::subclass::ElementMetadata::new(
|
||||
"Proton audio converter with rate fixup",
|
||||
"Codec/Parser",
|
||||
"Converts audio for Proton, fixing up samplerates",
|
||||
"Andrew Eikum <aeikum@codeweavers.com>")
|
||||
});
|
||||
|
||||
Some(&*ELEMENT_METADATA)
|
||||
}
|
||||
|
||||
fn pad_templates() -> &'static [gst::PadTemplate] {
|
||||
static PAD_TEMPLATES: Lazy<Vec<gst::PadTemplate>> = Lazy::new(|| {
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
{
|
||||
let caps = caps.get_mut().unwrap();
|
||||
caps.append(gst::Caps::builder("audio/x-wma").build());
|
||||
}
|
||||
let sink_pad_template = gst::PadTemplate::new(
|
||||
"sink",
|
||||
gst::PadDirection::Sink,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
|
||||
let caps = gst::Caps::builder("audio/x-raw").build();
|
||||
let src_pad_template = gst::PadTemplate::new(
|
||||
"src",
|
||||
gst::PadDirection::Src,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
|
||||
vec![src_pad_template, sink_pad_template]
|
||||
});
|
||||
|
||||
PAD_TEMPLATES.as_ref()
|
||||
}
|
||||
}
|
||||
|
||||
impl AudioConvBin {
|
||||
fn sink_event(
|
||||
&self,
|
||||
pad: &gst::GhostPad,
|
||||
element: &gst::Element,
|
||||
element: &super::AudioConvBin,
|
||||
event: gst::Event
|
||||
) -> bool {
|
||||
match event.view() {
|
||||
EventView::Caps(event_caps) => {
|
||||
/* set up capssetter with this rate */
|
||||
if let Some(s) = event_caps.get_caps().get_structure(0) {
|
||||
if let Some(s) = event_caps.caps().structure(0) {
|
||||
|
||||
if let Ok(override_rate) = s.get_some::<i32>("rate") {
|
||||
if let Ok(override_rate) = s.get::<i32>("rate") {
|
||||
|
||||
let mut rate_caps = gst::Caps::new_empty();
|
||||
{
|
||||
|
@ -200,19 +201,10 @@ impl AudioConvBin {
|
|||
}
|
||||
|
||||
/* forward on to the real pad */
|
||||
self.audioconv.get_static_pad("sink").unwrap()
|
||||
self.audioconv.static_pad("sink").unwrap()
|
||||
.send_event(event)
|
||||
},
|
||||
_ => pad.event_default(Some(element), event)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||
gst::Element::register(
|
||||
Some(plugin),
|
||||
"protonaudioconverterbin",
|
||||
gst::Rank::Marginal + 1,
|
||||
AudioConvBin::get_type()
|
||||
)
|
||||
}
|
47
media-converter/src/audioconvbin/mod.rs
Normal file
47
media-converter/src/audioconvbin/mod.rs
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright (c) 2020 Valve Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
use gst::glib;
|
||||
use gst::prelude::*;
|
||||
|
||||
mod imp;
|
||||
|
||||
glib::wrapper! {
|
||||
pub struct AudioConvBin(ObjectSubclass<imp::AudioConvBin>) @extends gst::Bin, gst::Element, gst::Object;
|
||||
}
|
||||
|
||||
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||
gst::Element::register(
|
||||
Some(plugin),
|
||||
"protonaudioconverterbin",
|
||||
gst::Rank::Marginal + 1,
|
||||
AudioConvBin::static_type()
|
||||
)
|
||||
}
|
|
@ -28,8 +28,6 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#[macro_use]
|
||||
extern crate glib;
|
||||
#[macro_use]
|
||||
extern crate gstreamer as gst;
|
||||
extern crate gstreamer_base as gst_base;
|
||||
|
@ -148,7 +146,7 @@ fn plugin_init(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
gst_plugin_define!(
|
||||
plugin_define!(
|
||||
protonmediaconverter,
|
||||
env!("CARGO_PKG_DESCRIPTION"),
|
||||
plugin_init,
|
||||
|
|
|
@ -28,10 +28,6 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
use glib;
|
||||
use glib::subclass;
|
||||
use glib::subclass::prelude::*;
|
||||
|
||||
use crate::format_hash;
|
||||
use crate::HASH_SEED;
|
||||
use crate::box_array;
|
||||
|
@ -39,6 +35,7 @@ use crate::copy_into_array;
|
|||
use crate::BufferedReader;
|
||||
|
||||
use gst;
|
||||
use gst::glib;
|
||||
use gst::prelude::*;
|
||||
use gst::subclass::prelude::*;
|
||||
use gst::EventView;
|
||||
|
@ -240,14 +237,14 @@ impl<'a> Read for PadReader<'a> {
|
|||
Ok(buf) => {
|
||||
let to_copy;
|
||||
|
||||
if self.offs + buf.get_size() < self.stride {
|
||||
to_copy = buf.get_size();
|
||||
if self.offs + buf.size() < self.stride {
|
||||
to_copy = buf.size();
|
||||
self.offs += to_copy;
|
||||
}else if self.offs < self.stride {
|
||||
to_copy = self.stride - self.offs;
|
||||
self.offs = self.stride;
|
||||
}else{
|
||||
to_copy = buf.get_size();
|
||||
to_copy = buf.size();
|
||||
self.offs += self.stride;
|
||||
};
|
||||
|
||||
|
@ -301,7 +298,7 @@ impl VideoConvState {
|
|||
fn new() -> Result<VideoConvState, gst::LoggableError> {
|
||||
|
||||
let read_fozdb_path = std::env::var("MEDIACONV_VIDEO_TRANSCODED_FILE").map_err(|_| {
|
||||
gst_loggable_error!(CAT, "MEDIACONV_VIDEO_TRANSCODED_FILE is not set!")
|
||||
loggable_error!(CAT, "MEDIACONV_VIDEO_TRANSCODED_FILE is not set!")
|
||||
})?;
|
||||
|
||||
let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), VIDEOCONV_FOZ_NUM_TAGS) {
|
||||
|
@ -343,7 +340,7 @@ impl VideoConvState {
|
|||
gst_log!(CAT, "No transcoded video for {}. Substituting a blank video.", format_hash(hash));
|
||||
|
||||
self.transcode_hash = None;
|
||||
self.our_duration = Some(include_bytes!("../blank.mkv").len() as u64);
|
||||
self.our_duration = Some(include_bytes!("../../blank.mkv").len() as u64);
|
||||
|
||||
false
|
||||
}
|
||||
|
@ -353,11 +350,11 @@ impl VideoConvState {
|
|||
Some(hash) => {
|
||||
let read_fozdb = self.read_fozdb.as_mut().unwrap();
|
||||
read_fozdb.read_entry(self.transcoded_tag, hash, offs as u64, out, fossilize::CRCCheck::WithoutCRC)
|
||||
.map_err(|e| gst_loggable_error!(CAT, "Error reading ogvdata: {:?}", e))
|
||||
.map_err(|e| loggable_error!(CAT, "Error reading ogvdata: {:?}", e))
|
||||
},
|
||||
|
||||
None => {
|
||||
let blank = include_bytes!("../blank.mkv");
|
||||
let blank = include_bytes!("../../blank.mkv");
|
||||
|
||||
let to_copy = std::cmp::min(blank.len() - offs, out.len());
|
||||
|
||||
|
@ -369,22 +366,20 @@ impl VideoConvState {
|
|||
}
|
||||
}
|
||||
|
||||
struct VideoConv {
|
||||
pub struct VideoConv {
|
||||
state: Mutex<Option<VideoConvState>>,
|
||||
sinkpad: gst::Pad,
|
||||
srcpad: gst::Pad,
|
||||
}
|
||||
|
||||
#[glib::object_subclass]
|
||||
impl ObjectSubclass for VideoConv {
|
||||
const NAME: &'static str = "ProtonVideoConverter";
|
||||
type Type = super::VideoConv;
|
||||
type ParentType = gst::Element;
|
||||
type Instance = gst::subclass::ElementInstanceStruct<Self>;
|
||||
type Class = subclass::simple::ClassStruct<Self>;
|
||||
|
||||
glib_object_subclass!();
|
||||
|
||||
fn with_class(klass: &subclass::simple::ClassStruct<Self>) -> Self {
|
||||
let templ = klass.get_pad_template("sink").unwrap();
|
||||
fn with_class(klass: &Self::Class) -> Self {
|
||||
let templ = klass.pad_template("sink").unwrap();
|
||||
let sinkpad = gst::Pad::builder_with_template(&templ, Some("sink"))
|
||||
.event_function(|pad, parent, event| {
|
||||
VideoConv::catch_panic_pad_function(
|
||||
|
@ -394,13 +389,13 @@ impl ObjectSubclass for VideoConv {
|
|||
)
|
||||
}).build();
|
||||
|
||||
let templ = klass.get_pad_template("src").unwrap();
|
||||
let templ = klass.pad_template("src").unwrap();
|
||||
let srcpad = gst::Pad::builder_with_template(&templ, Some("src"))
|
||||
.getrange_function(|pad, parent, offset, in_buf, size| {
|
||||
VideoConv::catch_panic_pad_function(
|
||||
parent,
|
||||
|| Err(gst::FlowError::Error),
|
||||
|videoconv, element| videoconv.get_range(pad, element, offset, in_buf, size)
|
||||
|videoconv, element| videoconv.range(pad, element, offset, in_buf, size)
|
||||
)
|
||||
})
|
||||
.query_function(|pad, parent, query| {
|
||||
|
@ -413,7 +408,7 @@ impl ObjectSubclass for VideoConv {
|
|||
.activatemode_function(|pad, parent, mode, active| {
|
||||
VideoConv::catch_panic_pad_function(
|
||||
parent,
|
||||
|| Err(gst_loggable_error!(CAT, "Panic activating srcpad with mode")),
|
||||
|| Err(loggable_error!(CAT, "Panic activating srcpad with mode")),
|
||||
|videoconv, element| videoconv.src_activatemode(pad, element, mode, active)
|
||||
)
|
||||
}).build();
|
||||
|
@ -424,61 +419,68 @@ impl ObjectSubclass for VideoConv {
|
|||
srcpad,
|
||||
}
|
||||
}
|
||||
|
||||
fn class_init(klass: &mut subclass::simple::ClassStruct<Self>) {
|
||||
|
||||
klass.set_metadata(
|
||||
"Proton video converter",
|
||||
"Codec/Parser",
|
||||
"Converts video for Proton",
|
||||
"Andrew Eikum <aeikum@codeweavers.com>");
|
||||
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
{
|
||||
let caps = caps.get_mut().unwrap();
|
||||
caps.append(gst::Caps::builder("video/x-ms-asf").build());
|
||||
caps.append(gst::Caps::builder("video/x-msvideo").build());
|
||||
caps.append(gst::Caps::builder("video/mpeg").build());
|
||||
caps.append(gst::Caps::builder("video/quicktime").build());
|
||||
}
|
||||
let sink_pad_template = gst::PadTemplate::new(
|
||||
"sink",
|
||||
gst::PadDirection::Sink,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
klass.add_pad_template(sink_pad_template);
|
||||
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
{
|
||||
let caps = caps.get_mut().unwrap();
|
||||
caps.append(gst::Caps::builder("video/x-matroska").build());
|
||||
caps.append(gst::Caps::builder("application/ogg").build());
|
||||
}
|
||||
let src_pad_template = gst::PadTemplate::new(
|
||||
"src",
|
||||
gst::PadDirection::Src,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
klass.add_pad_template(src_pad_template);
|
||||
}
|
||||
}
|
||||
|
||||
impl ObjectImpl for VideoConv {
|
||||
glib_object_impl!();
|
||||
|
||||
fn constructed(&self, obj: &glib::Object) {
|
||||
fn constructed(&self, obj: &Self::Type) {
|
||||
self.parent_constructed(obj);
|
||||
|
||||
let element = obj.downcast_ref::<gst::Element>().unwrap();
|
||||
element.add_pad(&self.sinkpad).unwrap();
|
||||
element.add_pad(&self.srcpad).unwrap();
|
||||
obj.add_pad(&self.sinkpad).unwrap();
|
||||
obj.add_pad(&self.srcpad).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
impl ElementImpl for VideoConv {
|
||||
fn metadata() -> Option<&'static gst::subclass::ElementMetadata> {
|
||||
static ELEMENT_METADATA: Lazy<gst::subclass::ElementMetadata> = Lazy::new(|| {
|
||||
gst::subclass::ElementMetadata::new(
|
||||
"Proton video converter",
|
||||
"Codec/Parser",
|
||||
"Converts video for Proton",
|
||||
"Andrew Eikum <aeikum@codeweavers.com>"
|
||||
)
|
||||
});
|
||||
|
||||
Some(&*ELEMENT_METADATA)
|
||||
}
|
||||
|
||||
fn pad_templates() -> &'static [gst::PadTemplate] {
|
||||
static PAD_TEMPLATES: Lazy<Vec<gst::PadTemplate>> = Lazy::new(|| {
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
{
|
||||
let caps = caps.get_mut().unwrap();
|
||||
caps.append(gst::Caps::builder("video/x-ms-asf").build());
|
||||
caps.append(gst::Caps::builder("video/x-msvideo").build());
|
||||
caps.append(gst::Caps::builder("video/mpeg").build());
|
||||
caps.append(gst::Caps::builder("video/quicktime").build());
|
||||
}
|
||||
let sink_pad_template = gst::PadTemplate::new(
|
||||
"sink",
|
||||
gst::PadDirection::Sink,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
|
||||
let mut caps = gst::Caps::new_empty();
|
||||
{
|
||||
let caps = caps.get_mut().unwrap();
|
||||
caps.append(gst::Caps::builder("video/x-matroska").build());
|
||||
caps.append(gst::Caps::builder("application/ogg").build());
|
||||
}
|
||||
let src_pad_template = gst::PadTemplate::new(
|
||||
"src",
|
||||
gst::PadDirection::Src,
|
||||
gst::PadPresence::Always,
|
||||
&caps).unwrap();
|
||||
|
||||
vec![src_pad_template, sink_pad_template]
|
||||
});
|
||||
|
||||
PAD_TEMPLATES.as_ref()
|
||||
}
|
||||
|
||||
fn change_state(
|
||||
&self,
|
||||
element: &gst::Element,
|
||||
element: &super::VideoConv,
|
||||
transition: gst::StateChange
|
||||
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
|
||||
|
||||
|
@ -541,10 +543,10 @@ impl <'a> Read for StreamSerializer<'a> {
|
|||
}
|
||||
|
||||
impl VideoConv {
|
||||
fn get_range(
|
||||
fn range(
|
||||
&self,
|
||||
_pad: &gst::Pad,
|
||||
_element: &gst::Element,
|
||||
_element: &super::VideoConv,
|
||||
offset: u64,
|
||||
in_buf: Option<&mut gst::BufferRef>,
|
||||
requested_size: u32,
|
||||
|
@ -577,7 +579,7 @@ impl VideoConv {
|
|||
.map_err(|e| { e.log(); gst::FlowError::Error })?;
|
||||
}
|
||||
|
||||
if readed > 0 || buf.get_size() == 0 {
|
||||
if readed > 0 || buf.size() == 0 {
|
||||
buf.set_size(readed);
|
||||
return Ok(gst::PadGetRangeSuccess::FilledBuffer);
|
||||
}
|
||||
|
@ -597,7 +599,7 @@ impl VideoConv {
|
|||
|
||||
let mut b = map.into_buffer();
|
||||
|
||||
if readed > 0 || b.get_size() == 0 {
|
||||
if readed > 0 || b.size() == 0 {
|
||||
b.get_mut().unwrap().set_size(readed);
|
||||
return Ok(gst::PadGetRangeSuccess::NewBuffer(b));
|
||||
}
|
||||
|
@ -610,7 +612,7 @@ impl VideoConv {
|
|||
fn sink_event(
|
||||
&self,
|
||||
pad: &gst::Pad,
|
||||
element: &gst::Element,
|
||||
element: &super::VideoConv,
|
||||
event: gst::Event
|
||||
) -> bool {
|
||||
gst_log!(CAT, obj:pad, "Got an event {:?}", event);
|
||||
|
@ -654,9 +656,8 @@ impl VideoConv {
|
|||
let mut query = gst::query::Duration::new(gst::Format::Bytes);
|
||||
|
||||
if self.sinkpad.peer_query(&mut query) {
|
||||
state.upstream_duration = match query.get_result() {
|
||||
gst::format::GenericFormattedValue::Bytes(b) =>
|
||||
*b,
|
||||
state.upstream_duration = match query.result().try_into().unwrap() {
|
||||
Some(gst::format::Bytes(size)) => Some(size),
|
||||
_ => None,
|
||||
}
|
||||
}else{
|
||||
|
@ -676,7 +677,7 @@ impl VideoConv {
|
|||
fn src_query(
|
||||
&self,
|
||||
pad: &gst::Pad,
|
||||
element: &gst::Element,
|
||||
element: &super::VideoConv,
|
||||
query: &mut gst::QueryRef) -> bool
|
||||
{
|
||||
gst_log!(CAT, obj: pad, "got query: {:?}", query);
|
||||
|
@ -688,7 +689,7 @@ impl VideoConv {
|
|||
return res;
|
||||
}
|
||||
|
||||
let (flags, min, max, align) = peer_query.get_result();
|
||||
let (flags, min, max, align) = peer_query.result();
|
||||
|
||||
q.set(flags, min, max, align);
|
||||
q.add_scheduling_modes(&[gst::PadMode::Pull]);
|
||||
|
@ -708,8 +709,8 @@ impl VideoConv {
|
|||
}
|
||||
|
||||
if let Some(sz) = state.our_duration {
|
||||
if q.get_format() == gst::Format::Bytes {
|
||||
q.set(gst::format::Bytes::from(sz));
|
||||
if q.format() == gst::Format::Bytes {
|
||||
q.set(gst::format::Bytes(sz));
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
@ -769,7 +770,7 @@ impl VideoConv {
|
|||
|
||||
if let Ok(hash) = hash {
|
||||
if !state.begin_transcode(hash) {
|
||||
self.dump_upstream_data(hash).map_err(|_| gst_loggable_error!(CAT, "Dumping file to disk failed"))?;
|
||||
self.dump_upstream_data(hash).map_err(|_| loggable_error!(CAT, "Dumping file to disk failed"))?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -780,7 +781,7 @@ impl VideoConv {
|
|||
fn src_activatemode(
|
||||
&self,
|
||||
_pad: &gst::Pad,
|
||||
_element: &gst::Element,
|
||||
_element: &super::VideoConv,
|
||||
mode: gst::PadMode,
|
||||
active: bool
|
||||
) -> Result<(), gst::LoggableError> {
|
||||
|
@ -792,7 +793,7 @@ impl VideoConv {
|
|||
|
||||
let mut state = match &mut *state {
|
||||
Some(s) => s,
|
||||
None => { return Err(gst_loggable_error!(CAT, "VideoConv not yet in READY state?")); }
|
||||
None => { return Err(loggable_error!(CAT, "VideoConv not yet in READY state?")); }
|
||||
};
|
||||
|
||||
/* once we're initted in pull mode, we can start transcoding */
|
||||
|
@ -801,13 +802,4 @@ impl VideoConv {
|
|||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||
gst::Element::register(
|
||||
Some(plugin),
|
||||
"protonvideoconverter",
|
||||
gst::Rank::Marginal,
|
||||
VideoConv::get_type())
|
||||
}
|
46
media-converter/src/videoconv/mod.rs
Normal file
46
media-converter/src/videoconv/mod.rs
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2020 Valve Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
use gst::glib;
|
||||
use gst::prelude::*;
|
||||
|
||||
mod imp;
|
||||
|
||||
glib::wrapper! {
|
||||
pub struct VideoConv(ObjectSubclass<imp::VideoConv>) @extends gst::Element, gst::Object;
|
||||
}
|
||||
|
||||
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||
gst::Element::register(
|
||||
Some(plugin),
|
||||
"protonvideoconverter",
|
||||
gst::Rank::Marginal,
|
||||
VideoConv::static_type())
|
||||
}
|
Loading…
Reference in a new issue